@ampeco/public-api-mcp 3.232.1 → 3.233.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4080,6 +4080,87 @@
4080
4080
  }
4081
4081
  }
4082
4082
  },
4083
+ {
4084
+ "path": "/public-api/actions/reimbursement-record/v1.0/{reimbursementRecord}/issue-credit",
4085
+ "method": "POST",
4086
+ "operationId": "reimbursementRecordIssueCredit",
4087
+ "summary": "Reimbursement record / Issue credit",
4088
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Creates and returns a new reimbursement record with negated amounts that reverses the original record. A record that is already reversed, or is itself a reversing record, cannot be reversed again. This is not an accounting credit note against an invoice — reimbursement records are stateless computed entries, so a credit is the reimbursement-domain analogue of a correcting entry.",
4089
+ "tags": [
4090
+ "action / reimbursement record"
4091
+ ],
4092
+ "requestBody": {
4093
+ "required": true,
4094
+ "content": {
4095
+ "application/json": {
4096
+ "schema": {
4097
+ "type": "object",
4098
+ "properties": {
4099
+ "creditReason": {
4100
+ "type": "string",
4101
+ "minLength": 1,
4102
+ "maxLength": 500,
4103
+ "description": "Reason for issuing the credit."
4104
+ }
4105
+ },
4106
+ "required": [
4107
+ "creditReason"
4108
+ ]
4109
+ }
4110
+ }
4111
+ }
4112
+ },
4113
+ "responses": {
4114
+ "201": {
4115
+ "description": "Credit record created"
4116
+ },
4117
+ "401": {
4118
+ "description": "Access token is missing or invalid"
4119
+ },
4120
+ "403": {
4121
+ "description": "You do not have permission to perform the action"
4122
+ },
4123
+ "404": {
4124
+ "description": "The record is not found"
4125
+ },
4126
+ "409": {
4127
+ "description": "The request could not be completed due to a conflict with the current state of the resource. The operation may succeed if retried."
4128
+ },
4129
+ "422": {
4130
+ "description": "The payload you provided is invalid"
4131
+ },
4132
+ "429": {
4133
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
4134
+ }
4135
+ }
4136
+ },
4137
+ {
4138
+ "path": "/public-api/actions/reimbursement-report/v1.0/{reimbursementReport}/regenerate",
4139
+ "method": "POST",
4140
+ "operationId": "reimbursementReportRegenerate",
4141
+ "summary": "Reimbursement report / Regenerate",
4142
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Discards the report and rebuilds it from the current reimbursement records on the next generation run. The discarded report id no longer resolves after regeneration; fetch the replacement from the reports listing (its constituent records point to it via `filter[reportId]`). Processing is asynchronous — the response returns immediately with `202 Accepted`.",
4143
+ "tags": [
4144
+ "action / reimbursement report"
4145
+ ],
4146
+ "responses": {
4147
+ "202": {
4148
+ "description": "Regeneration accepted"
4149
+ },
4150
+ "401": {
4151
+ "description": "Access token is missing or invalid"
4152
+ },
4153
+ "403": {
4154
+ "description": "You do not have permission to perform the action"
4155
+ },
4156
+ "404": {
4157
+ "description": "The record is not found"
4158
+ },
4159
+ "429": {
4160
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
4161
+ }
4162
+ }
4163
+ },
4083
4164
  {
4084
4165
  "path": "/public-api/actions/reservation/v1.0/{reservation}/cancel",
4085
4166
  "method": "POST",
@@ -33874,6 +33955,24 @@
33874
33955
  "description": "The provided amount should be excluding VAT."
33875
33956
  }
33876
33957
  }
33958
+ },
33959
+ "reimbursementFees": {
33960
+ "type": "object",
33961
+ "properties": {
33962
+ "perSession": {
33963
+ "type": "number",
33964
+ "format": "float",
33965
+ "minimum": 0,
33966
+ "description": "Flat fee charged for every reimbursed charging session, in the contract's currency."
33967
+ },
33968
+ "perPeriod": {
33969
+ "type": "number",
33970
+ "format": "float",
33971
+ "minimum": 0,
33972
+ "description": "Flat fee charged for every reimbursement period, in the contract's currency."
33973
+ }
33974
+ },
33975
+ "description": "Home-charging reimbursement fees configured on the contract itself and charged to the partner for reimbursed charging sessions and reimbursement periods. Only available when the home-charging reimbursement feature is enabled for the operator. All other home-charging reimbursement settings are managed on the partner resource."
33877
33976
  }
33878
33977
  },
33879
33978
  "required": [
@@ -34093,6 +34192,24 @@
34093
34192
  "description": "The provided amount should be excluding VAT."
34094
34193
  }
34095
34194
  }
34195
+ },
34196
+ "reimbursementFees": {
34197
+ "type": "object",
34198
+ "properties": {
34199
+ "perSession": {
34200
+ "type": "number",
34201
+ "format": "float",
34202
+ "minimum": 0,
34203
+ "description": "Flat fee charged for every reimbursed charging session, in the contract's currency."
34204
+ },
34205
+ "perPeriod": {
34206
+ "type": "number",
34207
+ "format": "float",
34208
+ "minimum": 0,
34209
+ "description": "Flat fee charged for every reimbursement period, in the contract's currency."
34210
+ }
34211
+ },
34212
+ "description": "Home-charging reimbursement fees configured on the contract itself and charged to the partner for reimbursed charging sessions and reimbursement periods. Only available when the home-charging reimbursement feature is enabled for the operator. All other home-charging reimbursement settings are managed on the partner resource."
34096
34213
  }
34097
34214
  },
34098
34215
  "required": [
@@ -34305,6 +34422,26 @@
34305
34422
  "description": "The provided amount should be excluding VAT."
34306
34423
  }
34307
34424
  }
34425
+ },
34426
+ "reimbursementFees": {
34427
+ "type": "object",
34428
+ "properties": {
34429
+ "perSession": {
34430
+ "type": "number",
34431
+ "format": "float",
34432
+ "minimum": 0,
34433
+ "nullable": true,
34434
+ "description": "Flat fee charged for every reimbursed charging session, in the contract's currency. Send `null` to clear the fee; when both fees are cleared no fee entry is generated for the period. `0` is an explicit zero fee and still generates a fee entry."
34435
+ },
34436
+ "perPeriod": {
34437
+ "type": "number",
34438
+ "format": "float",
34439
+ "minimum": 0,
34440
+ "nullable": true,
34441
+ "description": "Flat fee charged for every reimbursement period, in the contract's currency. Send `null` to clear the fee; when both fees are cleared no fee entry is generated for the period. `0` is an explicit zero fee and still generates a fee entry."
34442
+ }
34443
+ },
34444
+ "description": "Home-charging reimbursement fees configured on the contract itself and charged to the partner for reimbursed charging sessions and reimbursement periods. Only applied when the home-charging reimbursement feature is enabled for the operator. All other home-charging reimbursement settings are managed on the partner resource."
34308
34445
  }
34309
34446
  },
34310
34447
  "description": "All fields are optional for partial updates. Only provided fields are updated."
@@ -37626,7 +37763,7 @@
37626
37763
  "method": "POST",
37627
37764
  "operationId": "partnerInviteCreateV2_0",
37628
37765
  "summary": "Partner invite / Create",
37629
- "description": "Create a partner invite. **Experimental endpoint — not yet a stable contract.** `partner-invites/v2.0` ships as **experimental / beta**. While experimental, its schema and behaviour may change **without a version bump — including breaking changes within `v2.0` itself**. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed.",
37766
+ "description": "Create a partner invite. Reimbursement coverage of specific RFIDs and vehicles (`allow`) can be declared here only when the invited email address resolves to an existing user of the partner's operator — the listed RFIDs and vehicles must belong to that user. When no such user exists yet, coverage of specific entities is rejected with a validation error; create the invite without it and declare the covered set via the update endpoint once the invite is accepted. **Experimental endpoint — not yet a stable contract.** `partner-invites/v2.0` ships as **experimental / beta**. While experimental, its schema and behaviour may change **without a version bump — including breaking changes within `v2.0` itself**. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed.",
37630
37767
  "tags": [
37631
37768
  "resource / partner invites"
37632
37769
  ],
@@ -37717,6 +37854,70 @@
37717
37854
  "corporateBillingPolicyId": {
37718
37855
  "type": "integer",
37719
37856
  "description": "The corporate billing policy ID to assign. Must reference an active policy that belongs to the partner."
37857
+ },
37858
+ "reimbursement": {
37859
+ "type": "object",
37860
+ "properties": {
37861
+ "policyId": {
37862
+ "type": "integer",
37863
+ "description": "The home-charging reimbursement policy attached to the invite. Must reference an active policy that belongs to the partner or has no partner. Omitted from the response when no policy is attached."
37864
+ },
37865
+ "restrictions": {
37866
+ "type": "object",
37867
+ "properties": {
37868
+ "rfids": {
37869
+ "type": "object",
37870
+ "properties": {
37871
+ "type": {
37872
+ "type": "string",
37873
+ "enum": [
37874
+ "none",
37875
+ "allow"
37876
+ ],
37877
+ "description": "Discriminator for a reimbursement coverage sub-restriction: - **none**: All of the invite's attached entities of this kind are covered. - **allow**: Only the explicitly listed entities are covered."
37878
+ },
37879
+ "rfidIds": {
37880
+ "type": "array",
37881
+ "items": {
37882
+ "type": "integer"
37883
+ },
37884
+ "description": "The covered set of RFID IDs. Required and must be non-empty when type is `allow`; each must belong to the invited user. Listed RFIDs that are not yet attached are attached automatically, and attached RFIDs left off the list are detached. Omitted when type is `none`."
37885
+ }
37886
+ },
37887
+ "required": [
37888
+ "type"
37889
+ ],
37890
+ "description": "Reimbursement coverage for the invite's RFIDs."
37891
+ },
37892
+ "vehicles": {
37893
+ "type": "object",
37894
+ "properties": {
37895
+ "type": {
37896
+ "type": "string",
37897
+ "enum": [
37898
+ "none",
37899
+ "allow"
37900
+ ],
37901
+ "description": "Discriminator for a reimbursement coverage sub-restriction: - **none**: All of the invite's attached entities of this kind are covered. - **allow**: Only the explicitly listed entities are covered."
37902
+ },
37903
+ "vehicleIds": {
37904
+ "type": "array",
37905
+ "items": {
37906
+ "type": "integer"
37907
+ },
37908
+ "description": "The covered set of vehicle IDs. Required and must be non-empty when type is `allow`; each must belong to the invited user. Listed vehicles that are not yet attached are attached automatically, and attached vehicles left off the list are detached. Omitted when type is `none`."
37909
+ }
37910
+ },
37911
+ "required": [
37912
+ "type"
37913
+ ],
37914
+ "description": "Reimbursement coverage for the invite's vehicles."
37915
+ }
37916
+ },
37917
+ "description": "Which of the invite's RFIDs and vehicles are covered by reimbursement. On read this reports the current covered set. On write the submitted list declares the covered set: listed RFIDs/vehicles are attached automatically (they must belong to the invited user), and attached entities left off the list are detached."
37918
+ }
37919
+ },
37920
+ "description": "Home-charging reimbursement settings for the invite. Ignored when home-charging reimbursement is disabled."
37720
37921
  }
37721
37922
  },
37722
37923
  "required": [
@@ -37851,6 +38052,71 @@
37851
38052
  "type": "integer",
37852
38053
  "nullable": true,
37853
38054
  "description": "The corporate billing policy ID to assign. Must reference an active policy that belongs to the partner. Send `null` to clear any assigned policy; omit the field to leave the current value unchanged."
38055
+ },
38056
+ "reimbursement": {
38057
+ "type": "object",
38058
+ "properties": {
38059
+ "policyId": {
38060
+ "type": "integer",
38061
+ "nullable": true,
38062
+ "description": "The home-charging reimbursement policy ID to attach. Must reference an active policy that belongs to the partner or has no partner. Send `null` to detach any policy; omit the field to leave the current value unchanged."
38063
+ },
38064
+ "restrictions": {
38065
+ "type": "object",
38066
+ "properties": {
38067
+ "rfids": {
38068
+ "type": "object",
38069
+ "properties": {
38070
+ "type": {
38071
+ "type": "string",
38072
+ "enum": [
38073
+ "none",
38074
+ "allow"
38075
+ ],
38076
+ "description": "Discriminator for a reimbursement coverage sub-restriction: - **none**: All of the invite's attached entities of this kind are covered. - **allow**: Only the explicitly listed entities are covered."
38077
+ },
38078
+ "rfidIds": {
38079
+ "type": "array",
38080
+ "items": {
38081
+ "type": "integer"
38082
+ },
38083
+ "description": "The covered set of RFID IDs. Required and must be non-empty when type is `allow`; each must belong to the invited user. Listed RFIDs that are not yet attached are attached automatically, and attached RFIDs left off the list are detached. Omitted when type is `none`."
38084
+ }
38085
+ },
38086
+ "required": [
38087
+ "type"
38088
+ ],
38089
+ "description": "Reimbursement coverage for the invite's RFIDs."
38090
+ },
38091
+ "vehicles": {
38092
+ "type": "object",
38093
+ "properties": {
38094
+ "type": {
38095
+ "type": "string",
38096
+ "enum": [
38097
+ "none",
38098
+ "allow"
38099
+ ],
38100
+ "description": "Discriminator for a reimbursement coverage sub-restriction: - **none**: All of the invite's attached entities of this kind are covered. - **allow**: Only the explicitly listed entities are covered."
38101
+ },
38102
+ "vehicleIds": {
38103
+ "type": "array",
38104
+ "items": {
38105
+ "type": "integer"
38106
+ },
38107
+ "description": "The covered set of vehicle IDs. Required and must be non-empty when type is `allow`; each must belong to the invited user. Listed vehicles that are not yet attached are attached automatically, and attached vehicles left off the list are detached. Omitted when type is `none`."
38108
+ }
38109
+ },
38110
+ "required": [
38111
+ "type"
38112
+ ],
38113
+ "description": "Reimbursement coverage for the invite's vehicles."
38114
+ }
38115
+ },
38116
+ "description": "Which of the invite's RFIDs and vehicles are covered by reimbursement. On read this reports the current covered set. On write the submitted list declares the covered set: listed RFIDs/vehicles are attached automatically (they must belong to the invited user), and attached entities left off the list are detached."
38117
+ }
38118
+ },
38119
+ "description": "Home-charging reimbursement settings for the invite. Omit the object to leave every reimbursement setting unchanged. Ignored when home-charging reimbursement is disabled."
37854
38120
  }
37855
38121
  },
37856
38122
  "description": "Partner invite update payload."
@@ -37945,6 +38211,16 @@
37945
38211
  "format": "date",
37946
38212
  "description": "Include partner invoices whose due date is on or before the given date (inclusive)."
37947
38213
  },
38214
+ "periodFrom": {
38215
+ "type": "string",
38216
+ "format": "date",
38217
+ "description": "Include partner invoices whose billing period starts on or after the given date (inclusive)."
38218
+ },
38219
+ "periodTo": {
38220
+ "type": "string",
38221
+ "format": "date",
38222
+ "description": "Include partner invoices whose billing period ends on or before the given date (inclusive)."
38223
+ },
37948
38224
  "externalId": {
37949
38225
  "type": "string",
37950
38226
  "maxLength": 255,
@@ -42043,7 +42319,7 @@
42043
42319
  },
42044
42320
  "password": {
42045
42321
  "type": "string",
42046
- "description": "Password meeting security requirements"
42322
+ "description": "Password with a minimum length of 6 characters. It must match passwordConfirmation."
42047
42323
  },
42048
42324
  "passwordConfirmation": {
42049
42325
  "type": "string",
@@ -42181,7 +42457,7 @@
42181
42457
  },
42182
42458
  "password": {
42183
42459
  "type": "string",
42184
- "description": "New password meeting security requirements. If provided, passwordConfirmation is required."
42460
+ "description": "New password with a minimum length of 6 characters. If provided, it must match passwordConfirmation."
42185
42461
  },
42186
42462
  "passwordConfirmation": {
42187
42463
  "type": "string",
@@ -47416,114 +47692,702 @@
47416
47692
  }
47417
47693
  },
47418
47694
  {
47419
- "path": "/public-api/resources/provisioning-certificates/v2.0",
47420
- "method": "POST",
47421
- "operationId": "createPcId",
47422
- "summary": "Provisioning Certificate / Create",
47423
- "description": "Create Provisioning Certificate",
47695
+ "path": "/public-api/resources/provisioning-certificates/v2.0",
47696
+ "method": "POST",
47697
+ "operationId": "createPcId",
47698
+ "summary": "Provisioning Certificate / Create",
47699
+ "description": "Create Provisioning Certificate",
47700
+ "tags": [
47701
+ "resource / provisioning certificate"
47702
+ ],
47703
+ "requestBody": {
47704
+ "required": true,
47705
+ "content": {
47706
+ "application/json": {
47707
+ "schema": {
47708
+ "type": "object",
47709
+ "properties": {
47710
+ "id": {
47711
+ "type": "integer"
47712
+ },
47713
+ "pcId": {
47714
+ "type": "string"
47715
+ },
47716
+ "name": {
47717
+ "type": "string"
47718
+ },
47719
+ "vehicleType": {
47720
+ "type": "string",
47721
+ "enum": [
47722
+ "company",
47723
+ "private"
47724
+ ]
47725
+ },
47726
+ "userId": {
47727
+ "type": "integer"
47728
+ }
47729
+ },
47730
+ "required": [
47731
+ "pcId",
47732
+ "name",
47733
+ "vehicleType",
47734
+ "userId"
47735
+ ]
47736
+ }
47737
+ }
47738
+ }
47739
+ },
47740
+ "responses": {
47741
+ "201": {
47742
+ "description": "Provisioning Certificate created successfully"
47743
+ },
47744
+ "401": {
47745
+ "description": "Access token is missing or invalid"
47746
+ },
47747
+ "403": {
47748
+ "description": "You do not have permission to perform the action"
47749
+ },
47750
+ "404": {
47751
+ "description": "The record is not found"
47752
+ },
47753
+ "422": {
47754
+ "description": "The payload you provided is invalid"
47755
+ },
47756
+ "429": {
47757
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47758
+ }
47759
+ }
47760
+ },
47761
+ {
47762
+ "path": "/public-api/resources/provisioning-certificates/v2.0/{provisioningCertificate}",
47763
+ "method": "GET",
47764
+ "operationId": "getPcId",
47765
+ "summary": "Provisioning Certificate / Read",
47766
+ "description": "Get a Provisioning Certificate",
47767
+ "tags": [
47768
+ "resource / provisioning certificate"
47769
+ ],
47770
+ "responses": {
47771
+ "200": {
47772
+ "description": "Provisioning Certificate returned"
47773
+ },
47774
+ "401": {
47775
+ "description": "Access token is missing or invalid"
47776
+ },
47777
+ "403": {
47778
+ "description": "You do not have permission to perform the action"
47779
+ },
47780
+ "404": {
47781
+ "description": "The record is not found"
47782
+ },
47783
+ "422": {
47784
+ "description": "The payload you provided is invalid"
47785
+ },
47786
+ "429": {
47787
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47788
+ }
47789
+ }
47790
+ },
47791
+ {
47792
+ "path": "/public-api/resources/provisioning-certificates/v2.0/{provisioningCertificate}",
47793
+ "method": "DELETE",
47794
+ "operationId": "deletePcId",
47795
+ "summary": "Provisioning Certificates / Delete",
47796
+ "description": "Delete a provisioning certificate.",
47797
+ "tags": [
47798
+ "resource / provisioning certificate"
47799
+ ],
47800
+ "responses": {
47801
+ "204": {
47802
+ "description": "Provisioning certificate deleted successfully"
47803
+ },
47804
+ "401": {
47805
+ "description": "Access token is missing or invalid"
47806
+ },
47807
+ "403": {
47808
+ "description": "You do not have permission to perform the action"
47809
+ },
47810
+ "404": {
47811
+ "description": "The record is not found"
47812
+ },
47813
+ "422": {
47814
+ "description": "The payload you provided is invalid"
47815
+ },
47816
+ "429": {
47817
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47818
+ }
47819
+ }
47820
+ },
47821
+ {
47822
+ "path": "/public-api/resources/provisioning-certificates/v2.0/{provisioningCertificate}",
47823
+ "method": "PATCH",
47824
+ "operationId": "updatePcId",
47825
+ "summary": "Provisioning Certificate / Update",
47826
+ "description": "Update a Provisioning Certificate",
47827
+ "tags": [
47828
+ "resource / provisioning certificate"
47829
+ ],
47830
+ "requestBody": {
47831
+ "required": true,
47832
+ "content": {
47833
+ "application/json": {
47834
+ "schema": {
47835
+ "type": "object",
47836
+ "properties": {
47837
+ "id": {
47838
+ "type": "integer"
47839
+ },
47840
+ "pcId": {
47841
+ "type": "string"
47842
+ },
47843
+ "name": {
47844
+ "type": "string"
47845
+ },
47846
+ "vehicleType": {
47847
+ "type": "string",
47848
+ "enum": [
47849
+ "company",
47850
+ "private"
47851
+ ]
47852
+ },
47853
+ "userId": {
47854
+ "type": "integer"
47855
+ }
47856
+ }
47857
+ }
47858
+ }
47859
+ }
47860
+ },
47861
+ "responses": {
47862
+ "200": {
47863
+ "description": "Provisioning Certificate updated successfully"
47864
+ },
47865
+ "401": {
47866
+ "description": "Access token is missing or invalid"
47867
+ },
47868
+ "403": {
47869
+ "description": "You do not have permission to perform the action"
47870
+ },
47871
+ "404": {
47872
+ "description": "The record is not found"
47873
+ },
47874
+ "422": {
47875
+ "description": "The payload you provided is invalid"
47876
+ },
47877
+ "429": {
47878
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47879
+ }
47880
+ }
47881
+ },
47882
+ {
47883
+ "path": "/public-api/resources/receipts/v2.0",
47884
+ "method": "GET",
47885
+ "operationId": "receiptsListing",
47886
+ "summary": "Receipts / Listing",
47887
+ "description": "Get all receipts",
47888
+ "tags": [
47889
+ "resource / receipts"
47890
+ ],
47891
+ "parameters": {
47892
+ "query": {
47893
+ "page": {
47894
+ "description": "DEPRECATED - Sunset date: Mon, 01 Jun 2026 The page number to fetch (defaults to 1). Not used in cursor pagination. **This parameter is deprecated and will be removed on Mon, 01 Jun 2026.** Use cursor pagination instead for better performance and consistency. See the cursor parameter below for details.",
47895
+ "type": "integer",
47896
+ "default": 1
47897
+ },
47898
+ "per_page": {
47899
+ "description": "The numbers of items to return. Used in both page and cursor pagination to declare the page size.",
47900
+ "type": "integer",
47901
+ "minimum": 1,
47902
+ "maximum": 100,
47903
+ "default": 100
47904
+ },
47905
+ "cursor": {
47906
+ "description": "The cursor to fetch the next page. **Do not construct this value manually.** Use one of the following methods: - Use the value from the previous response's `links.next` to fetch the next page - Pass an empty string (e.g., `?cursor` or `?cursor=`) to initiate cursor pagination on the first page",
47907
+ "type": "string"
47908
+ },
47909
+ "filter": {
47910
+ "schema": {
47911
+ "type": "object",
47912
+ "properties": {
47913
+ "operatorId": {
47914
+ "example": "1",
47915
+ "oneOf": [
47916
+ {
47917
+ "type": "string",
47918
+ "format": "integer"
47919
+ },
47920
+ {
47921
+ "type": "array",
47922
+ "items": {
47923
+ "type": "string",
47924
+ "format": "integer"
47925
+ }
47926
+ }
47927
+ ],
47928
+ "description": "Filter by operator ID(s). **For operator-scoped tokens:** If provided, must match the token's operator. Returns empty results if a different operator ID is specified. **For global admin tokens:** Returns resources from the specified operator(s). Multiple IDs can be provided to filter by multiple operators. **Usage examples:** - Single operator: `?filter[operatorId]=1` - Multiple operators: `?filter[operatorId][]=1&filter[operatorId][]=2`"
47929
+ },
47930
+ "userId": {
47931
+ "type": "string",
47932
+ "format": "integer",
47933
+ "description": "Only list Receipts with a certain user id"
47934
+ },
47935
+ "taxId": {
47936
+ "type": "string",
47937
+ "format": "integer",
47938
+ "description": "Only list Receipts with specific VAT id"
47939
+ },
47940
+ "paymentStatus": {
47941
+ "type": "string",
47942
+ "enum": [
47943
+ "pending",
47944
+ "paid",
47945
+ "partially_paid"
47946
+ ]
47947
+ },
47948
+ "partnerId": {
47949
+ "type": "string",
47950
+ "format": "integer",
47951
+ "description": "Only list Receipts issued from a specific Partner"
47952
+ },
47953
+ "periodStart": {
47954
+ "type": "string",
47955
+ "format": "date-time",
47956
+ "description": "ISO 8601 formatted date"
47957
+ },
47958
+ "periodEnd": {
47959
+ "type": "string",
47960
+ "format": "date-time",
47961
+ "description": "ISO 8601 formatted date"
47962
+ },
47963
+ "issuedFrom": {
47964
+ "type": "string",
47965
+ "format": "date",
47966
+ "description": "Filter receipts issued on or after this date (inclusive)"
47967
+ },
47968
+ "issuedTo": {
47969
+ "type": "string",
47970
+ "format": "date",
47971
+ "description": "Filter receipts issued on or before this date (inclusive)"
47972
+ }
47973
+ }
47974
+ }
47975
+ }
47976
+ }
47977
+ },
47978
+ "responses": {
47979
+ "200": {
47980
+ "description": "Success"
47981
+ },
47982
+ "401": {
47983
+ "description": "Access token is missing or invalid"
47984
+ },
47985
+ "403": {
47986
+ "description": "You do not have permission to perform the action"
47987
+ },
47988
+ "429": {
47989
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47990
+ }
47991
+ }
47992
+ },
47993
+ {
47994
+ "path": "/public-api/resources/receipts/v2.0/{receipt}",
47995
+ "method": "GET",
47996
+ "operationId": "receiptRead",
47997
+ "summary": "Receipt / Read",
47998
+ "description": "Get a single receipt",
47999
+ "tags": [
48000
+ "resource / receipts"
48001
+ ],
48002
+ "parameters": {
48003
+ "path": {
48004
+ "receipt": {
48005
+ "description": "The Receipt ID",
48006
+ "type": "integer",
48007
+ "required": true
48008
+ }
48009
+ }
48010
+ },
48011
+ "responses": {
48012
+ "200": {
48013
+ "description": "Success"
48014
+ },
48015
+ "401": {
48016
+ "description": "Access token is missing or invalid"
48017
+ },
48018
+ "403": {
48019
+ "description": "You do not have permission to perform the action"
48020
+ },
48021
+ "404": {
48022
+ "description": "The record is not found"
48023
+ },
48024
+ "429": {
48025
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
48026
+ }
48027
+ }
48028
+ },
48029
+ {
48030
+ "path": "/public-api/resources/reimbursement-policies/v1.0",
48031
+ "method": "GET",
48032
+ "operationId": "reimbursementPoliciesListing",
48033
+ "summary": "Reimbursement policies / Listing",
48034
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Get all reimbursement policies.",
48035
+ "tags": [
48036
+ "resource / reimbursement policies"
48037
+ ],
48038
+ "parameters": {
48039
+ "query": {
48040
+ "per_page": {
48041
+ "description": "The number of items to return per page.",
48042
+ "type": "integer",
48043
+ "minimum": 1,
48044
+ "maximum": 100,
48045
+ "default": 100
48046
+ },
48047
+ "cursor": {
48048
+ "description": "The cursor to fetch the next page. **Do not construct this value manually.** Use one of the following methods: - Use the value from the previous response's `links.next` to fetch the next page - Pass an empty string (e.g., `?cursor` or `?cursor=`) to initiate cursor pagination on the first page",
48049
+ "type": "string"
48050
+ },
48051
+ "filter": {
48052
+ "schema": {
48053
+ "type": "object",
48054
+ "properties": {
48055
+ "partnerId": {
48056
+ "type": "integer"
48057
+ },
48058
+ "isActive": {
48059
+ "type": "boolean",
48060
+ "description": "When `true`, returns only policies that are active today (the current date falls within the `validityStartsOn`/`validityEndsOn` window). When `false`, returns only policies that are not active today."
48061
+ },
48062
+ "electricityRateSource": {
48063
+ "type": "string",
48064
+ "enum": [
48065
+ "policy",
48066
+ "charge_point"
48067
+ ],
48068
+ "description": "Origin of the per-kWh rate used to reimburse a home-charging session: - **policy**: The electricity rate linked to the policy provides the rate. `electricityRateId` is required and must belong to the same operator as the policy. - **charge_point**: The rate set by the owner on their personal charge point in the mobile app provides the rate. `electricityRateId` must not be set."
48069
+ }
48070
+ }
48071
+ }
48072
+ }
48073
+ }
48074
+ },
48075
+ "responses": {
48076
+ "200": {
48077
+ "description": "Success"
48078
+ },
48079
+ "400": {
48080
+ "description": "Bad Request"
48081
+ },
48082
+ "401": {
48083
+ "description": "Access token is missing or invalid"
48084
+ },
48085
+ "403": {
48086
+ "description": "You do not have permission to perform the action"
48087
+ },
48088
+ "422": {
48089
+ "description": "The payload you provided is invalid"
48090
+ },
48091
+ "429": {
48092
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
48093
+ }
48094
+ }
48095
+ },
48096
+ {
48097
+ "path": "/public-api/resources/reimbursement-policies/v1.0",
48098
+ "method": "POST",
48099
+ "operationId": "reimbursementPolicyCreate",
48100
+ "summary": "Reimbursement policy / Create",
48101
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Create a reimbursement policy.",
48102
+ "tags": [
48103
+ "resource / reimbursement policies"
48104
+ ],
48105
+ "requestBody": {
48106
+ "required": true,
48107
+ "content": {
48108
+ "application/json": {
48109
+ "schema": {
48110
+ "type": "object",
48111
+ "properties": {
48112
+ "name": {
48113
+ "type": "string",
48114
+ "maxLength": 255
48115
+ },
48116
+ "electricityRateSource": {
48117
+ "type": "string",
48118
+ "enum": [
48119
+ "policy",
48120
+ "charge_point"
48121
+ ],
48122
+ "description": "Origin of the per-kWh rate used to reimburse a home-charging session: - **policy**: The electricity rate linked to the policy provides the rate. `electricityRateId` is required and must belong to the same operator as the policy. - **charge_point**: The rate set by the owner on their personal charge point in the mobile app provides the rate. `electricityRateId` must not be set."
48123
+ },
48124
+ "validityStartsOn": {
48125
+ "type": "string",
48126
+ "format": "date",
48127
+ "description": "Uses the YYYY-MM-DD date format."
48128
+ },
48129
+ "partnerId": {
48130
+ "type": "integer",
48131
+ "description": "Partner the policy is scoped to. When not set, the policy applies to every partner of the operator."
48132
+ },
48133
+ "partnerContractId": {
48134
+ "type": "integer",
48135
+ "description": "Partner contract the policy is scoped to. Requires `partnerId` and must belong to that partner. When not set, the policy is not scoped to a specific contract."
48136
+ },
48137
+ "electricityRateId": {
48138
+ "type": "integer",
48139
+ "description": "Linked electricity rate providing the reimbursement rate. Set only when `electricityRateSource` is `policy`, where it is required."
48140
+ },
48141
+ "validityEndsOn": {
48142
+ "type": "string",
48143
+ "format": "date",
48144
+ "description": "Uses the YYYY-MM-DD date format."
48145
+ },
48146
+ "operatorId": {
48147
+ "type": "integer",
48148
+ "example": 1,
48149
+ "description": "Required for global admin tokens. Omit for operator-scoped tokens (defaults to the token's operator)."
48150
+ }
48151
+ },
48152
+ "required": [
48153
+ "name",
48154
+ "electricityRateSource",
48155
+ "validityStartsOn"
48156
+ ],
48157
+ "description": "Reimbursement policy create schema. The policy defines how a home-charging session's reimbursement rate is resolved and the validity window during which it applies."
48158
+ }
48159
+ }
48160
+ }
48161
+ },
48162
+ "responses": {
48163
+ "201": {
48164
+ "description": "Created"
48165
+ },
48166
+ "401": {
48167
+ "description": "Access token is missing or invalid"
48168
+ },
48169
+ "403": {
48170
+ "description": "You do not have permission to perform the action"
48171
+ },
48172
+ "422": {
48173
+ "description": "The payload you provided is invalid"
48174
+ },
48175
+ "429": {
48176
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
48177
+ }
48178
+ }
48179
+ },
48180
+ {
48181
+ "path": "/public-api/resources/reimbursement-policies/v1.0/{reimbursementPolicy}",
48182
+ "method": "GET",
48183
+ "operationId": "reimbursementPolicyRead",
48184
+ "summary": "Reimbursement policy / Read",
48185
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Get a single reimbursement policy.",
48186
+ "tags": [
48187
+ "resource / reimbursement policies"
48188
+ ],
48189
+ "responses": {
48190
+ "200": {
48191
+ "description": "Success"
48192
+ },
48193
+ "401": {
48194
+ "description": "Access token is missing or invalid"
48195
+ },
48196
+ "403": {
48197
+ "description": "You do not have permission to perform the action"
48198
+ },
48199
+ "404": {
48200
+ "description": "The record is not found"
48201
+ },
48202
+ "429": {
48203
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
48204
+ }
48205
+ }
48206
+ },
48207
+ {
48208
+ "path": "/public-api/resources/reimbursement-policies/v1.0/{reimbursementPolicy}",
48209
+ "method": "DELETE",
48210
+ "operationId": "reimbursementPolicyDelete",
48211
+ "summary": "Reimbursement policy / Delete",
48212
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Delete a reimbursement policy. Deletion is rejected while the policy is attached to partner invites.",
48213
+ "tags": [
48214
+ "resource / reimbursement policies"
48215
+ ],
48216
+ "responses": {
48217
+ "204": {
48218
+ "description": "No content"
48219
+ },
48220
+ "401": {
48221
+ "description": "Access token is missing or invalid"
48222
+ },
48223
+ "403": {
48224
+ "description": "You do not have permission to perform the action"
48225
+ },
48226
+ "404": {
48227
+ "description": "The record is not found"
48228
+ },
48229
+ "409": {
48230
+ "description": "The request could not be completed due to a conflict with the current state of the resource. The operation may succeed if retried."
48231
+ },
48232
+ "422": {
48233
+ "description": "The payload you provided is invalid"
48234
+ },
48235
+ "429": {
48236
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
48237
+ }
48238
+ }
48239
+ },
48240
+ {
48241
+ "path": "/public-api/resources/reimbursement-policies/v1.0/{reimbursementPolicy}",
48242
+ "method": "PATCH",
48243
+ "operationId": "reimbursementPolicyUpdate",
48244
+ "summary": "Reimbursement policy / Update",
48245
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Update a reimbursement policy.",
48246
+ "tags": [
48247
+ "resource / reimbursement policies"
48248
+ ],
48249
+ "requestBody": {
48250
+ "required": true,
48251
+ "content": {
48252
+ "application/json": {
48253
+ "schema": {
48254
+ "type": "object",
48255
+ "properties": {
48256
+ "name": {
48257
+ "type": "string",
48258
+ "maxLength": 255
48259
+ },
48260
+ "electricityRateSource": {
48261
+ "type": "string",
48262
+ "enum": [
48263
+ "policy",
48264
+ "charge_point"
48265
+ ],
48266
+ "description": "Origin of the per-kWh rate used to reimburse a home-charging session: - **policy**: The electricity rate linked to the policy provides the rate. `electricityRateId` is required and must belong to the same operator as the policy. - **charge_point**: The rate set by the owner on their personal charge point in the mobile app provides the rate. `electricityRateId` must not be set."
48267
+ },
48268
+ "validityStartsOn": {
48269
+ "type": "string",
48270
+ "format": "date",
48271
+ "description": "Uses the YYYY-MM-DD date format."
48272
+ },
48273
+ "partnerId": {
48274
+ "type": "integer",
48275
+ "nullable": true,
48276
+ "description": "Partner the policy is scoped to. Set to `null` to apply the policy to every partner of the operator. Clearing the partner also clears `partnerContractId`."
48277
+ },
48278
+ "partnerContractId": {
48279
+ "type": "integer",
48280
+ "nullable": true,
48281
+ "description": "Partner contract the policy is scoped to. Set to `null` to remove the contract scope. Requires `partnerId` and must belong to that partner."
48282
+ },
48283
+ "electricityRateId": {
48284
+ "type": "integer",
48285
+ "nullable": true,
48286
+ "description": "Linked electricity rate providing the reimbursement rate. Required when `electricityRateSource` is `policy`; set to `null` (or omit) otherwise."
48287
+ },
48288
+ "validityEndsOn": {
48289
+ "type": "string",
48290
+ "format": "date",
48291
+ "nullable": true,
48292
+ "description": "Date (inclusive) until which the policy is valid, in the YYYY-MM-DD date format. Set to `null` to remove the end date. Must be after `validityStartsOn`."
48293
+ }
48294
+ },
48295
+ "description": "Reimbursement policy update schema. The policy defines how a home-charging session's reimbursement rate is resolved and the validity window during which it applies."
48296
+ }
48297
+ }
48298
+ }
48299
+ },
48300
+ "responses": {
48301
+ "200": {
48302
+ "description": "Success"
48303
+ },
48304
+ "401": {
48305
+ "description": "Access token is missing or invalid"
48306
+ },
48307
+ "403": {
48308
+ "description": "You do not have permission to perform the action"
48309
+ },
48310
+ "404": {
48311
+ "description": "The record is not found"
48312
+ },
48313
+ "422": {
48314
+ "description": "The payload you provided is invalid"
48315
+ },
48316
+ "429": {
48317
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
48318
+ }
48319
+ }
48320
+ },
48321
+ {
48322
+ "path": "/public-api/resources/reimbursement-records/v1.0",
48323
+ "method": "GET",
48324
+ "operationId": "reimbursementRecordsListing",
48325
+ "summary": "Reimbursement records / Listing",
48326
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Get all reimbursement records. A record is one immutable computed reimbursement entry per charging session, including the reversing (credit) records that cancel earlier entries. For the periodic aggregates that group these records per beneficiary, payer and period, use the reimbursement reports listing.",
47424
48327
  "tags": [
47425
- "resource / provisioning certificate"
48328
+ "resource / reimbursement records"
47426
48329
  ],
47427
- "requestBody": {
47428
- "required": true,
47429
- "content": {
47430
- "application/json": {
48330
+ "parameters": {
48331
+ "query": {
48332
+ "per_page": {
48333
+ "description": "The number of items to return per page.",
48334
+ "type": "integer",
48335
+ "minimum": 1,
48336
+ "maximum": 100,
48337
+ "default": 100
48338
+ },
48339
+ "cursor": {
48340
+ "description": "The cursor to fetch the next page. **Do not construct this value manually.** Use one of the following methods: - Use the value from the previous response's `links.next` to fetch the next page - Pass an empty string (e.g., `?cursor` or `?cursor=`) to initiate cursor pagination on the first page",
48341
+ "type": "string"
48342
+ },
48343
+ "filter": {
47431
48344
  "schema": {
47432
48345
  "type": "object",
47433
48346
  "properties": {
47434
- "id": {
48347
+ "sessionId": {
47435
48348
  "type": "integer"
47436
48349
  },
47437
- "pcId": {
47438
- "type": "string"
48350
+ "reportId": {
48351
+ "type": "integer",
48352
+ "description": "Constituent records of a reimbursement report."
47439
48353
  },
47440
- "name": {
47441
- "type": "string"
48354
+ "beneficiaryUserId": {
48355
+ "type": "integer"
47442
48356
  },
47443
- "vehicleType": {
47444
- "type": "string",
47445
- "enum": [
47446
- "company",
47447
- "private"
47448
- ]
48357
+ "payerPartnerId": {
48358
+ "type": "integer"
47449
48359
  },
47450
- "userId": {
48360
+ "payerOperatorId": {
48361
+ "type": "integer"
48362
+ },
48363
+ "payerPartnerContractId": {
47451
48364
  "type": "integer"
48365
+ },
48366
+ "isCredited": {
48367
+ "type": "boolean",
48368
+ "description": "true returns records that have been reversed by a credit record; false returns records not yet reversed. Reversing (credit) records themselves match false."
48369
+ },
48370
+ "periodFrom": {
48371
+ "type": "string",
48372
+ "format": "date",
48373
+ "description": "Return records whose period overlaps on or after this date."
48374
+ },
48375
+ "periodTo": {
48376
+ "type": "string",
48377
+ "format": "date",
48378
+ "description": "Return records whose period overlaps on or before this date."
47452
48379
  }
47453
- },
47454
- "required": [
47455
- "pcId",
47456
- "name",
47457
- "vehicleType",
47458
- "userId"
47459
- ]
48380
+ }
47460
48381
  }
47461
48382
  }
47462
48383
  }
47463
48384
  },
47464
- "responses": {
47465
- "201": {
47466
- "description": "Provisioning Certificate created successfully"
47467
- },
47468
- "401": {
47469
- "description": "Access token is missing or invalid"
47470
- },
47471
- "403": {
47472
- "description": "You do not have permission to perform the action"
47473
- },
47474
- "404": {
47475
- "description": "The record is not found"
47476
- },
47477
- "422": {
47478
- "description": "The payload you provided is invalid"
47479
- },
47480
- "429": {
47481
- "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47482
- }
47483
- }
47484
- },
47485
- {
47486
- "path": "/public-api/resources/provisioning-certificates/v2.0/{provisioningCertificate}",
47487
- "method": "GET",
47488
- "operationId": "getPcId",
47489
- "summary": "Provisioning Certificate / Read",
47490
- "description": "Get a Provisioning Certificate",
47491
- "tags": [
47492
- "resource / provisioning certificate"
47493
- ],
47494
48385
  "responses": {
47495
48386
  "200": {
47496
- "description": "Provisioning Certificate returned"
47497
- },
47498
- "401": {
47499
- "description": "Access token is missing or invalid"
47500
- },
47501
- "403": {
47502
- "description": "You do not have permission to perform the action"
47503
- },
47504
- "404": {
47505
- "description": "The record is not found"
47506
- },
47507
- "422": {
47508
- "description": "The payload you provided is invalid"
48387
+ "description": "Success"
47509
48388
  },
47510
- "429": {
47511
- "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47512
- }
47513
- }
47514
- },
47515
- {
47516
- "path": "/public-api/resources/provisioning-certificates/v2.0/{provisioningCertificate}",
47517
- "method": "DELETE",
47518
- "operationId": "deletePcId",
47519
- "summary": "Provisioning Certificates / Delete",
47520
- "description": "Delete a provisioning certificate.",
47521
- "tags": [
47522
- "resource / provisioning certificate"
47523
- ],
47524
- "responses": {
47525
- "204": {
47526
- "description": "Provisioning certificate deleted successfully"
48389
+ "400": {
48390
+ "description": "Bad Request"
47527
48391
  },
47528
48392
  "401": {
47529
48393
  "description": "Access token is missing or invalid"
@@ -47531,9 +48395,6 @@
47531
48395
  "403": {
47532
48396
  "description": "You do not have permission to perform the action"
47533
48397
  },
47534
- "404": {
47535
- "description": "The record is not found"
47536
- },
47537
48398
  "422": {
47538
48399
  "description": "The payload you provided is invalid"
47539
48400
  },
@@ -47543,48 +48404,17 @@
47543
48404
  }
47544
48405
  },
47545
48406
  {
47546
- "path": "/public-api/resources/provisioning-certificates/v2.0/{provisioningCertificate}",
47547
- "method": "PATCH",
47548
- "operationId": "updatePcId",
47549
- "summary": "Provisioning Certificate / Update",
47550
- "description": "Update a Provisioning Certificate",
48407
+ "path": "/public-api/resources/reimbursement-records/v1.0/{reimbursementRecord}",
48408
+ "method": "GET",
48409
+ "operationId": "reimbursementRecordRead",
48410
+ "summary": "Reimbursement record / Read",
48411
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Get a single reimbursement record — the immutable computed reimbursement entry for one charging session.",
47551
48412
  "tags": [
47552
- "resource / provisioning certificate"
48413
+ "resource / reimbursement records"
47553
48414
  ],
47554
- "requestBody": {
47555
- "required": true,
47556
- "content": {
47557
- "application/json": {
47558
- "schema": {
47559
- "type": "object",
47560
- "properties": {
47561
- "id": {
47562
- "type": "integer"
47563
- },
47564
- "pcId": {
47565
- "type": "string"
47566
- },
47567
- "name": {
47568
- "type": "string"
47569
- },
47570
- "vehicleType": {
47571
- "type": "string",
47572
- "enum": [
47573
- "company",
47574
- "private"
47575
- ]
47576
- },
47577
- "userId": {
47578
- "type": "integer"
47579
- }
47580
- }
47581
- }
47582
- }
47583
- }
47584
- },
47585
48415
  "responses": {
47586
48416
  "200": {
47587
- "description": "Provisioning Certificate updated successfully"
48417
+ "description": "Success"
47588
48418
  },
47589
48419
  "401": {
47590
48420
  "description": "Access token is missing or invalid"
@@ -47595,32 +48425,24 @@
47595
48425
  "404": {
47596
48426
  "description": "The record is not found"
47597
48427
  },
47598
- "422": {
47599
- "description": "The payload you provided is invalid"
47600
- },
47601
48428
  "429": {
47602
48429
  "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47603
48430
  }
47604
48431
  }
47605
48432
  },
47606
48433
  {
47607
- "path": "/public-api/resources/receipts/v2.0",
48434
+ "path": "/public-api/resources/reimbursement-reports/v1.0",
47608
48435
  "method": "GET",
47609
- "operationId": "receiptsListing",
47610
- "summary": "Receipts / Listing",
47611
- "description": "Get all receipts",
48436
+ "operationId": "reimbursementReportsListing",
48437
+ "summary": "Reimbursement reports / Listing",
48438
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Get all reimbursement reports. A report is a periodic aggregate that groups the reimbursement records sharing a beneficiary, payer and period, and exposes their totals. For the per-session entries behind those totals, use the reimbursement records listing.",
47612
48439
  "tags": [
47613
- "resource / receipts"
48440
+ "resource / reimbursement reports"
47614
48441
  ],
47615
48442
  "parameters": {
47616
48443
  "query": {
47617
- "page": {
47618
- "description": "DEPRECATED - Sunset date: Mon, 01 Jun 2026 The page number to fetch (defaults to 1). Not used in cursor pagination. **This parameter is deprecated and will be removed on Mon, 01 Jun 2026.** Use cursor pagination instead for better performance and consistency. See the cursor parameter below for details.",
47619
- "type": "integer",
47620
- "default": 1
47621
- },
47622
48444
  "per_page": {
47623
- "description": "The numbers of items to return. Used in both page and cursor pagination to declare the page size.",
48445
+ "description": "The number of items to return per page.",
47624
48446
  "type": "integer",
47625
48447
  "minimum": 1,
47626
48448
  "maximum": 100,
@@ -47634,65 +48456,40 @@
47634
48456
  "schema": {
47635
48457
  "type": "object",
47636
48458
  "properties": {
47637
- "operatorId": {
47638
- "example": "1",
47639
- "oneOf": [
47640
- {
47641
- "type": "string",
47642
- "format": "integer"
47643
- },
47644
- {
47645
- "type": "array",
47646
- "items": {
47647
- "type": "string",
47648
- "format": "integer"
47649
- }
47650
- }
47651
- ],
47652
- "description": "Filter by operator ID(s). **For operator-scoped tokens:** If provided, must match the token's operator. Returns empty results if a different operator ID is specified. **For global admin tokens:** Returns resources from the specified operator(s). Multiple IDs can be provided to filter by multiple operators. **Usage examples:** - Single operator: `?filter[operatorId]=1` - Multiple operators: `?filter[operatorId][]=1&filter[operatorId][]=2`"
47653
- },
47654
- "userId": {
48459
+ "reimbursementType": {
47655
48460
  "type": "string",
47656
- "format": "integer",
47657
- "description": "Only list Receipts with a certain user id"
48461
+ "enum": [
48462
+ "company",
48463
+ "private",
48464
+ "public"
48465
+ ],
48466
+ "example": "company",
48467
+ "description": "The home-charging reimbursement classification of the session: - **company**: The session is reimbursed as company charging. - **private**: The session is reimbursed as private charging. - **public**: The session is reimbursed as public charging."
47658
48468
  },
47659
- "taxId": {
47660
- "type": "string",
47661
- "format": "integer",
47662
- "description": "Only list Receipts with specific VAT id"
48469
+ "beneficiaryUserId": {
48470
+ "type": "integer"
47663
48471
  },
47664
- "paymentStatus": {
47665
- "type": "string",
47666
- "enum": [
47667
- "pending",
47668
- "paid",
47669
- "partially_paid"
47670
- ]
48472
+ "payerPartnerContractId": {
48473
+ "type": "integer"
47671
48474
  },
47672
- "partnerId": {
47673
- "type": "string",
47674
- "format": "integer",
47675
- "description": "Only list Receipts issued from a specific Partner"
48475
+ "payerPartnerId": {
48476
+ "type": "integer"
47676
48477
  },
47677
- "periodStart": {
47678
- "type": "string",
47679
- "format": "date-time",
47680
- "description": "ISO 8601 formatted date"
48478
+ "payerOperatorId": {
48479
+ "type": "integer"
47681
48480
  },
47682
- "periodEnd": {
47683
- "type": "string",
47684
- "format": "date-time",
47685
- "description": "ISO 8601 formatted date"
48481
+ "reimbursementPolicyId": {
48482
+ "type": "integer"
47686
48483
  },
47687
- "issuedFrom": {
48484
+ "periodFrom": {
47688
48485
  "type": "string",
47689
48486
  "format": "date",
47690
- "description": "Filter receipts issued on or after this date (inclusive)"
48487
+ "description": "Return reports whose period overlaps on or after this date."
47691
48488
  },
47692
- "issuedTo": {
48489
+ "periodTo": {
47693
48490
  "type": "string",
47694
48491
  "format": "date",
47695
- "description": "Filter receipts issued on or before this date (inclusive)"
48492
+ "description": "Return reports whose period overlaps on or before this date."
47696
48493
  }
47697
48494
  }
47698
48495
  }
@@ -47703,35 +48500,32 @@
47703
48500
  "200": {
47704
48501
  "description": "Success"
47705
48502
  },
48503
+ "400": {
48504
+ "description": "Bad Request"
48505
+ },
47706
48506
  "401": {
47707
48507
  "description": "Access token is missing or invalid"
47708
48508
  },
47709
48509
  "403": {
47710
48510
  "description": "You do not have permission to perform the action"
47711
48511
  },
48512
+ "422": {
48513
+ "description": "The payload you provided is invalid"
48514
+ },
47712
48515
  "429": {
47713
48516
  "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
47714
48517
  }
47715
48518
  }
47716
48519
  },
47717
48520
  {
47718
- "path": "/public-api/resources/receipts/v2.0/{receipt}",
48521
+ "path": "/public-api/resources/reimbursement-reports/v1.0/{reimbursementReport}",
47719
48522
  "method": "GET",
47720
- "operationId": "receiptRead",
47721
- "summary": "Receipt / Read",
47722
- "description": "Get a single receipt",
48523
+ "operationId": "reimbursementReportRead",
48524
+ "summary": "Reimbursement report / Read",
48525
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Get a single reimbursement report — the periodic aggregate over the reimbursement records sharing a beneficiary, payer and period. The report exposes its aggregated totals; its constituent records can be fetched from the reimbursement records listing via `filter[reportId]`.",
47723
48526
  "tags": [
47724
- "resource / receipts"
48527
+ "resource / reimbursement reports"
47725
48528
  ],
47726
- "parameters": {
47727
- "path": {
47728
- "receipt": {
47729
- "description": "The Receipt ID",
47730
- "type": "integer",
47731
- "required": true
47732
- }
47733
- }
47734
- },
47735
48529
  "responses": {
47736
48530
  "200": {
47737
48531
  "description": "Success"
@@ -50676,6 +51470,11 @@
50676
51470
  "type": "boolean",
50677
51471
  "default": false
50678
51472
  },
51473
+ "withDurationBreakdown": {
51474
+ "description": "Return the charging and idle duration breakdown, including billable and grace-period seconds. Each session reports only the charging periods it owns. When an extending session is billed together with the session it extends, the grace period is consumed once along the combined timeline of both sessions, so the two responses can be summed without double counting.",
51475
+ "type": "boolean",
51476
+ "default": false
51477
+ },
50679
51478
  "include": {
50680
51479
  "description": "Include additional information in the response. The following options are available:<br> - `externalAppData`: Include external application data in the response<br> - `chargingProfile`: Include the TX charging profile applied to the session in the response<br> - `vehicle`: Include the nested `vehicle` object describing the vehicle associated with the session",
50681
51480
  "schema": {
@@ -50848,6 +51647,91 @@
50848
51647
  }
50849
51648
  }
50850
51649
  },
51650
+ {
51651
+ "path": "/public-api/resources/sharing-invites/v1.0",
51652
+ "method": "GET",
51653
+ "operationId": "sharingInvitesListing",
51654
+ "summary": "Sharing invites / Listing",
51655
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Get all sharing invites. A sharing invite represents a personal charge point owner sharing their charge point with another user.",
51656
+ "tags": [
51657
+ "resource / sharing invites"
51658
+ ],
51659
+ "parameters": {
51660
+ "query": {
51661
+ "per_page": {
51662
+ "description": "The number of items to return per page.",
51663
+ "type": "integer",
51664
+ "minimum": 1,
51665
+ "maximum": 100,
51666
+ "default": 100
51667
+ },
51668
+ "cursor": {
51669
+ "description": "The cursor to fetch the next page. **Do not construct this value manually.** Use one of the following methods: - Use the value from the previous response's `links.next` to fetch the next page - Pass an empty string (e.g., `?cursor` or `?cursor=`) to initiate cursor pagination on the first page",
51670
+ "type": "string"
51671
+ },
51672
+ "filter": {
51673
+ "schema": {
51674
+ "type": "object",
51675
+ "properties": {
51676
+ "chargePointId": {
51677
+ "type": "integer"
51678
+ },
51679
+ "userId": {
51680
+ "type": "integer"
51681
+ }
51682
+ }
51683
+ }
51684
+ }
51685
+ }
51686
+ },
51687
+ "responses": {
51688
+ "200": {
51689
+ "description": "Success"
51690
+ },
51691
+ "400": {
51692
+ "description": "Bad Request"
51693
+ },
51694
+ "401": {
51695
+ "description": "Access token is missing or invalid"
51696
+ },
51697
+ "403": {
51698
+ "description": "You do not have permission to perform the action"
51699
+ },
51700
+ "422": {
51701
+ "description": "The payload you provided is invalid"
51702
+ },
51703
+ "429": {
51704
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
51705
+ }
51706
+ }
51707
+ },
51708
+ {
51709
+ "path": "/public-api/resources/sharing-invites/v1.0/{sharingInvite}",
51710
+ "method": "GET",
51711
+ "operationId": "sharingInviteRead",
51712
+ "summary": "Sharing invite / Read",
51713
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This resource ships as experimental / beta. While experimental, its schema and behaviour may change without a version bump — including breaking changes within v1.0 itself. Anyone consuming it does so for evaluation only, or by coordinating adoption with their account manager so changes can be sequenced with them. It graduates to a stable, version-locked contract (where the normal breaking-change rules apply) only when this experimental notice is removed. Get a single sharing invite.",
51714
+ "tags": [
51715
+ "resource / sharing invites"
51716
+ ],
51717
+ "responses": {
51718
+ "200": {
51719
+ "description": "Success"
51720
+ },
51721
+ "401": {
51722
+ "description": "Access token is missing or invalid"
51723
+ },
51724
+ "403": {
51725
+ "description": "You do not have permission to perform the action"
51726
+ },
51727
+ "404": {
51728
+ "description": "The record is not found"
51729
+ },
51730
+ "429": {
51731
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
51732
+ }
51733
+ }
51734
+ },
50851
51735
  {
50852
51736
  "path": "/public-api/resources/sub-operators/v1.0",
50853
51737
  "method": "GET",
@@ -70181,7 +71065,7 @@
70181
71065
  ],
70182
71066
  "info": {
70183
71067
  "title": "Public API",
70184
- "version": "3.232.1",
71068
+ "version": "3.233.0",
70185
71069
  "description": "The Public API provides server-to-server integration capabilities for your EV charging platform.\n\n**Authentication.** Existing integrations continue to work unchanged — long-lived UUID admin tokens are sent in `Authorization: Bearer ...` with no exchange required. Two security schemes are documented for OpenAPI client tooling, both resulting in the same Bearer header at the wire level:\n - `bearerAuth` — the token in the `Authorization: Bearer ...` header is either a long-lived UUID admin token (issued via the admin UI, used directly) or a short-lived access token previously obtained via OAuth.\n - `oauth2ClientCredentials` - a `client_id` / `client_secret` pair should be exchanged for a short-lived access token at `/public-api/oauth/token` per RFC 6749 Section 4.4 (Client Credentials Grant), and the short-lived token should be used in the `Authorization: Bearer ...` header. The OAuth `client_secret` itself cannot be sent directly as a bearer token — it must be exchanged first.\n"
70186
71070
  },
70187
71071
  "servers": [
@@ -70195,18 +71079,18 @@
70195
71079
  }
70196
71080
  }
70197
71081
  ],
70198
- "buildTimestamp": "2026-08-17T08:28:28.680Z",
71082
+ "buildTimestamp": "2026-08-17T10:41:20.311Z",
70199
71083
  "stats": {
70200
- "totalEndpoints": 624,
70201
- "originalSize": 5492259,
70202
- "optimizedSize": 1545702,
70203
- "reductionPercent": 71.86,
70204
- "buildDuration": 1538,
71084
+ "totalEndpoints": 637,
71085
+ "originalSize": 5601430,
71086
+ "optimizedSize": 1579580,
71087
+ "reductionPercent": 71.8,
71088
+ "buildDuration": 900,
70205
71089
  "responseSchemas": {
70206
- "total": 624,
70207
- "withSchemas": 624,
70208
- "totalSchemaSize": 3144146,
70209
- "averageSchemaSize": 5039
71090
+ "total": 637,
71091
+ "withSchemas": 637,
71092
+ "totalSchemaSize": 3207606,
71093
+ "averageSchemaSize": 5035
70210
71094
  }
70211
71095
  }
70212
71096
  }