@ampeco/public-api-mcp 3.257.2 → 3.258.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.
@@ -1,5 +1,88 @@
1
1
  {
2
2
  "endpoints": [
3
+ {
4
+ "path": "/public-api/actions/admin/v1.0/{admin}/end-all-access",
5
+ "method": "POST",
6
+ "operationId": "adminEndAllAccess",
7
+ "summary": "Admin / End all access",
8
+ "description": "Experimental endpoint — not yet a stable contract. This action 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. End all browser sessions, remembered browser access and application access for the target administrator. This does not disable the administrator or prevent a new sign-in. The authenticated Public API principal must itself be a concrete human global or operator administrator, not an API-only administrator. The target must also be a concrete human global or operator administrator. Existing administrator-management permissions, role hierarchy and operator scope apply; another administrator is never substituted for the authenticated principal. The accepted operation durably records its progress. A `202` response does not guarantee that both browser sessions and application access have been ended: inspect `data.outcome` for the actual state. Pending work is retried independently with bounded backoff, up to five total attempts including the initial attempt. If work remains after the fifth attempt, the operation becomes `blocked` with `blockedReason` set to `retry_exhausted`. An operation also becomes `blocked` if its actor or subject is unavailable. A blocked outcome includes `blockedReason` when available. The response never includes a session count. No request body or includes are supported.",
9
+ "tags": [
10
+ "action / admin"
11
+ ],
12
+ "responses": {
13
+ "202": {
14
+ "description": "Accepted - the response contains the actual termination outcome"
15
+ },
16
+ "401": {
17
+ "description": "Access token is missing or invalid"
18
+ },
19
+ "403": {
20
+ "description": "You do not have permission to perform the action"
21
+ },
22
+ "404": {
23
+ "description": "The record is not found"
24
+ },
25
+ "422": {
26
+ "description": "The payload you provided is invalid"
27
+ }
28
+ }
29
+ },
30
+ {
31
+ "path": "/public-api/actions/admin/v1.0/{admin}/terminate-sessions",
32
+ "method": "POST",
33
+ "operationId": "adminTerminateSessions",
34
+ "summary": "Admin / Terminate sessions",
35
+ "description": "Experimental endpoint — not yet a stable contract. This action 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. End the selected active tracked browser sessions for the target administrator. Unselected sessions, remembered browser access and application access are unchanged. The authenticated Public API principal must itself be a concrete human global or operator administrator, not an API-only administrator. The target must also be a concrete human global or operator administrator. Existing administrator-management permissions, role hierarchy and operator scope apply; another administrator is never substituted for the authenticated principal. Obtain session IDs from the administrator sessions listing. Supply between 1 and 100 distinct UUIDs. Every selected session must still be active and belong to the target administrator when the action executes. A `409` indicates a selection-state conflict, including a session that has ended, expired or no longer belongs to the eligible selection; no selected sessions are ended on conflict. A `422` indicates malformed input, including a missing, empty, oversized or duplicate selection, or a malformed UUID. A successful `202` response has `data.outcome` equal to `selected_sessions_ended` and includes `endedSessionCount`. Includes are not supported.",
36
+ "tags": [
37
+ "action / admin"
38
+ ],
39
+ "requestBody": {
40
+ "required": true,
41
+ "content": {
42
+ "application/json": {
43
+ "schema": {
44
+ "type": "object",
45
+ "properties": {
46
+ "sessionIds": {
47
+ "type": "array",
48
+ "items": {
49
+ "type": "string",
50
+ "format": "uuid"
51
+ },
52
+ "minItems": 1,
53
+ "maxItems": 100,
54
+ "uniqueItems": true,
55
+ "description": "Distinct active browser session IDs belonging to the target administrator, obtained from the administrator sessions listing."
56
+ }
57
+ },
58
+ "required": [
59
+ "sessionIds"
60
+ ]
61
+ }
62
+ }
63
+ }
64
+ },
65
+ "responses": {
66
+ "202": {
67
+ "description": "Accepted - all selected sessions have been ended"
68
+ },
69
+ "401": {
70
+ "description": "Access token is missing or invalid"
71
+ },
72
+ "403": {
73
+ "description": "You do not have permission to perform the action"
74
+ },
75
+ "404": {
76
+ "description": "The record is not found"
77
+ },
78
+ "409": {
79
+ "description": "The selected sessions are no longer all active sessions of the target administrator. No selected sessions were ended."
80
+ },
81
+ "422": {
82
+ "description": "The payload you provided is invalid"
83
+ }
84
+ }
85
+ },
3
86
  {
4
87
  "path": "/public-api/actions/charge-point/v1.0/{chargePoint}/change-availability",
5
88
  "method": "POST",
@@ -3770,6 +3853,7 @@
3770
3853
  "ChargePointSyncConfigurationNotification",
3771
3854
  "CircuitConsumptionNotification",
3772
3855
  "circuit.changed",
3856
+ "CoOperatorInsightChangedNotification",
3773
3857
  "DiagnosticsStatusNotification",
3774
3858
  "FirmwareStatusNotification",
3775
3859
  "HardwareStatusNotification",
@@ -3809,7 +3893,8 @@
3809
3893
  "cdr.received",
3810
3894
  "chargingProfile.applied",
3811
3895
  "installerJob.changed",
3812
- "corporateBilling.limitReached"
3896
+ "corporateBilling.limitReached",
3897
+ "SignedFirmwareStatusNotification"
3813
3898
  ]
3814
3899
  }
3815
3900
  },
@@ -3911,6 +3996,69 @@
3911
3996
  }
3912
3997
  }
3913
3998
  },
3999
+ {
4000
+ "path": "/public-api/actions/partner-discount-change/v1.0/{discountChange}/cancel",
4001
+ "method": "POST",
4002
+ "operationId": "partnerDiscountChangeCancel",
4003
+ "summary": "Partner discount change / Cancel",
4004
+ "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. Cancel a scheduled change without changing the current discount. No request body is required. Corporate billing must be enabled; any other state returns 409. A successful action returns an empty 202 response. **Required permission:** `Partners.update` on the visible parent partner. Missing, out-of-scope or wrong-parent identifiers return 404; a visible partner without edit permission returns 403.",
4005
+ "tags": [
4006
+ "action / partner discount change"
4007
+ ],
4008
+ "responses": {
4009
+ "202": {
4010
+ "description": "Accepted"
4011
+ },
4012
+ "401": {
4013
+ "description": "Access token is missing or invalid"
4014
+ },
4015
+ "403": {
4016
+ "description": "You do not have permission to perform the action"
4017
+ },
4018
+ "404": {
4019
+ "description": "The record is not found"
4020
+ },
4021
+ "409": {
4022
+ "description": "The request could not be completed due to a conflict with the current state of the resource. The operation may succeed if retried."
4023
+ },
4024
+ "429": {
4025
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
4026
+ }
4027
+ }
4028
+ },
4029
+ {
4030
+ "path": "/public-api/actions/partner-discount-change/v1.0/{discountChange}/end-now",
4031
+ "method": "POST",
4032
+ "operationId": "partnerDiscountChangeEndNow",
4033
+ "summary": "Partner discount change / End now",
4034
+ "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. End an active limited change now and apply its revert discount atomically. No request body is required. Corporate billing must be enabled and the stored revertDiscount must be present; otherwise return 409 without changing the rate or change state. If an attempted revert rate save fails, return 424 after rollback, retaining the pre-action rate and change state. A successful action returns an empty 202 response. **Required permission:** `Partners.update` on the visible parent partner. Missing, out-of-scope or wrong-parent identifiers return 404; a visible partner without edit permission returns 403.",
4035
+ "tags": [
4036
+ "action / partner discount change"
4037
+ ],
4038
+ "responses": {
4039
+ "202": {
4040
+ "description": "Accepted"
4041
+ },
4042
+ "401": {
4043
+ "description": "Access token is missing or invalid"
4044
+ },
4045
+ "403": {
4046
+ "description": "You do not have permission to perform the action"
4047
+ },
4048
+ "404": {
4049
+ "description": "The record is not found"
4050
+ },
4051
+ "409": {
4052
+ "description": "The request could not be completed due to a conflict with the current state of the resource. The operation may succeed if retried."
4053
+ },
4054
+ "424": {
4055
+ "description": "The requested operation cannot be completed because something it depends on is currently unavailable, such as an external system (e.g., a charge point) that is disconnected or unreachable, or required reference data (e.g., an exchange rate) that is missing. The `message` property carries the reason."
4056
+ },
4057
+ "429": {
4058
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
4059
+ }
4060
+ }
4061
+ },
3914
4062
  {
3915
4063
  "path": "/public-api/actions/partner-invite-corporate-billing-policy/v1.0/{corporateBillingPolicy}/disable",
3916
4064
  "method": "POST",
@@ -4127,6 +4275,60 @@
4127
4275
  }
4128
4276
  }
4129
4277
  },
4278
+ {
4279
+ "path": "/public-api/actions/partner-revenue/v1.0/{partnerRevenue}/set-custom-fields",
4280
+ "method": "POST",
4281
+ "operationId": "partnerRevenueSetCustomFields",
4282
+ "summary": "Partner revenue / set custom fields",
4283
+ "description": "⚠️ Experimental endpoint — not yet a stable contract. This action 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. Set the current custom field values of a partner revenue without changing the revenue's financial data. This action requires permission to view the revenue and the `PartnerRevenues.update-custom-fields` permission. Send a JSON object containing the required `customFields` object. Omitted identifiers remain unchanged, while `null` clears the corresponding value. When custom fields are enabled for partner revenues, an empty object succeeds as a no-op. Invalid or unavailable identifiers and invalid values return `422` validation errors keyed by `customFields.<identifier>`, and no submitted values are changed. If custom fields are disabled for the tenant or partner revenue, the action returns `412 Precondition Failed`, including for an empty object. A `404` response means the revenue was not found.",
4284
+ "tags": [
4285
+ "action / partner revenue"
4286
+ ],
4287
+ "requestBody": {
4288
+ "required": true,
4289
+ "content": {
4290
+ "application/json": {
4291
+ "schema": {
4292
+ "type": "object",
4293
+ "properties": {
4294
+ "customFields": {
4295
+ "type": "object",
4296
+ "additionalProperties": true,
4297
+ "description": "Custom field values keyed by their administrator-defined identifiers. The accepted type for each identifier is defined by the tenant's custom field configuration. Boolean values are JSON booleans; text and long text values are strings; email values are email-formatted strings; URL values are HTTP or HTTPS URL strings; number values use canonical base-10 decimal strings from `-99999999999999.999999` through `99999999999999.999999` with up to six fractional digits and no insignificant trailing fractional zeroes; date values are ISO 8601 `YYYY-MM-DD` strings; date-time values are ISO 8601 timestamps with a UTC offset; and JSON values may use any JSON-serializable value. Decimal strings are the precision-safe number request representation. JSON numeric inputs remain accepted for compatibility, but their precision may depend on the client's number handling."
4298
+ }
4299
+ },
4300
+ "required": [
4301
+ "customFields"
4302
+ ],
4303
+ "additionalProperties": false
4304
+ }
4305
+ }
4306
+ }
4307
+ },
4308
+ "responses": {
4309
+ "202": {
4310
+ "description": "Accepted - the response body contains the current v1.2 revenue listing item after applying the submitted values"
4311
+ },
4312
+ "401": {
4313
+ "description": "Access token is missing or invalid"
4314
+ },
4315
+ "403": {
4316
+ "description": "You do not have permission to perform the action"
4317
+ },
4318
+ "404": {
4319
+ "description": "The record is not found"
4320
+ },
4321
+ "412": {
4322
+ "description": "A precondition for performing this action is not met. The response message states which precondition failed."
4323
+ },
4324
+ "422": {
4325
+ "description": "The payload you provided is invalid"
4326
+ },
4327
+ "429": {
4328
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
4329
+ }
4330
+ }
4331
+ },
4130
4332
  {
4131
4333
  "path": "/public-api/actions/partner-settlement-report/v1.0/{partnerSettlementReport}/issue-partner-invoice",
4132
4334
  "method": "POST",
@@ -8035,6 +8237,16 @@
8035
8237
  "schema": {
8036
8238
  "type": "object",
8037
8239
  "properties": {
8240
+ "name": {
8241
+ "type": "string",
8242
+ "maxLength": 255,
8243
+ "description": "Optional notification name. Omission or an empty or spaces-only string leaves it unset. Surrounding whitespace is trimmed. Explicit null is rejected."
8244
+ },
8245
+ "description": {
8246
+ "type": "string",
8247
+ "maxLength": 1000,
8248
+ "description": "Optional internal-only plain-text description, not included in event payloads. Omission or an empty or spaces-only string leaves it unset. Surrounding whitespace is trimmed; internal line breaks are preserved. Explicit null is rejected."
8249
+ },
8038
8250
  "id": {
8039
8251
  "type": "number"
8040
8252
  },
@@ -8059,6 +8271,7 @@
8059
8271
  "ChargePointSyncConfigurationNotification",
8060
8272
  "CircuitConsumptionNotification",
8061
8273
  "circuit.changed",
8274
+ "CoOperatorInsightChangedNotification",
8062
8275
  "DiagnosticsStatusNotification",
8063
8276
  "FirmwareStatusNotification",
8064
8277
  "HardwareStatusNotification",
@@ -8098,7 +8311,8 @@
8098
8311
  "cdr.received",
8099
8312
  "chargingProfile.applied",
8100
8313
  "installerJob.changed",
8101
- "corporateBilling.limitReached"
8314
+ "corporateBilling.limitReached",
8315
+ "SignedFirmwareStatusNotification"
8102
8316
  ]
8103
8317
  }
8104
8318
  },
@@ -8262,6 +8476,16 @@
8262
8476
  "schema": {
8263
8477
  "type": "object",
8264
8478
  "properties": {
8479
+ "name": {
8480
+ "type": "string",
8481
+ "maxLength": 255,
8482
+ "description": "Optional notification name. Omission or an empty or spaces-only string leaves it unset. Surrounding whitespace is trimmed. Explicit null is rejected."
8483
+ },
8484
+ "description": {
8485
+ "type": "string",
8486
+ "maxLength": 1000,
8487
+ "description": "Optional internal-only plain-text description, not included in event payloads. Omission or an empty or spaces-only string leaves it unset. Surrounding whitespace is trimmed; internal line breaks are preserved. Explicit null is rejected."
8488
+ },
8265
8489
  "id": {
8266
8490
  "type": "number"
8267
8491
  },
@@ -8286,6 +8510,7 @@
8286
8510
  "ChargePointSyncConfigurationNotification",
8287
8511
  "CircuitConsumptionNotification",
8288
8512
  "circuit.changed",
8513
+ "CoOperatorInsightChangedNotification",
8289
8514
  "DiagnosticsStatusNotification",
8290
8515
  "FirmwareStatusNotification",
8291
8516
  "HardwareStatusNotification",
@@ -8325,7 +8550,8 @@
8325
8550
  "cdr.received",
8326
8551
  "chargingProfile.applied",
8327
8552
  "installerJob.changed",
8328
- "corporateBilling.limitReached"
8553
+ "corporateBilling.limitReached",
8554
+ "SignedFirmwareStatusNotification"
8329
8555
  ]
8330
8556
  }
8331
8557
  },
@@ -8783,116 +9009,155 @@
8783
9009
  }
8784
9010
  },
8785
9011
  {
8786
- "path": "/public-api/resources/authorizations/v1.0/{authorization}",
9012
+ "path": "/public-api/resources/admins/v1.0/{admin}/sessions",
8787
9013
  "method": "GET",
8788
- "operationId": "authorizationReadDeprecated",
8789
- "summary": "Authorization / Read",
8790
- "deprecated": true,
9014
+ "operationId": "adminSessionsListing",
9015
+ "summary": "Admin / List active sessions",
9016
+ "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. List active tracked browser sessions for the target administrator. Sessions that have ended, expired or been invalidated by a session-version change are excluded. This listing does not include application credentials or untracked browser sessions. The authenticated Public API principal must itself be a concrete human global or operator administrator, not an API-only administrator. The target must also be a concrete human global or operator administrator. Existing administrator-view permissions, role hierarchy and operator scope apply; another administrator is never substituted for the authenticated principal. Results use cursor pagination only and are ordered by descending session ID. Use the returned IDs with the terminate-sessions action. The listing is a snapshot: a session may become ineligible before a termination request executes. Includes are not supported.",
8791
9017
  "tags": [
8792
- "resource / authorizations"
8793
- ],
8794
- "parameters": {
8795
- "path": {
8796
- "authorization": {
8797
- "description": "The authorization ID to fetch",
8798
- "type": "string",
8799
- "required": true
8800
- }
8801
- }
8802
- },
8803
- "responses": {
8804
- "200": {
8805
- "description": "Success"
8806
- },
8807
- "401": {
8808
- "description": "Access token is missing or invalid"
8809
- },
8810
- "403": {
8811
- "description": "You do not have permission to perform the action"
8812
- },
8813
- "404": {
8814
- "description": "The record is not found"
8815
- },
8816
- "429": {
8817
- "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
8818
- }
8819
- }
8820
- },
8821
- {
8822
- "path": "/public-api/resources/authorizations/v2.0",
8823
- "method": "GET",
8824
- "operationId": "authorizationsListing",
8825
- "summary": "Authorizations / Listing",
8826
- "description": "**Deprecated:** Use v2.1 endpoint instead. This endpoint does not distinguish between RFID and MAC address (Autocharge) authorizations - both return `id_tag` as the method.",
8827
- "deprecated": true,
8828
- "tags": [
8829
- "resource / authorizations"
9018
+ "resource / admins"
8830
9019
  ],
8831
9020
  "parameters": {
8832
9021
  "query": {
8833
- "filter": {
8834
- "schema": {
8835
- "type": "object",
8836
- "properties": {
8837
- "operatorId": {
8838
- "example": "1",
8839
- "oneOf": [
8840
- {
8841
- "type": "string",
8842
- "format": "integer"
8843
- },
8844
- {
8845
- "type": "array",
8846
- "items": {
8847
- "type": "string",
8848
- "format": "integer"
8849
- }
8850
- }
8851
- ],
8852
- "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`"
8853
- },
8854
- "createdAfter": {
8855
- "type": "string",
8856
- "format": "date-time",
8857
- "description": "ISO 8601 formatted date. Lists only the authorizations created after this datetime"
8858
- },
8859
- "createdBefore": {
8860
- "type": "string",
8861
- "format": "date-time",
8862
- "description": "ISO 8601 formatted date. Lists only the authorizations created before this datetime"
8863
- },
8864
- "lastUpdatedAfter": {
8865
- "type": "string",
8866
- "format": "date-time",
8867
- "description": "ISO 8601 formatted date. Lists only the authorizations that were last updated after this datetime"
8868
- },
8869
- "lastUpdatedBefore": {
8870
- "type": "string",
8871
- "format": "date-time",
8872
- "description": "ISO 8601 formatted date. Lists only the authorizations that were last updated before this datetime"
8873
- },
8874
- "status": {
8875
- "type": "string",
8876
- "description": "Lists only authorizations with one of the following statuses: \"accepted\", \"rejected\", \"pending\""
8877
- },
8878
- "method": {
8879
- "type": "string",
8880
- "description": "Lists only authorizations with one of the following methods: \"user_device\", \"id_tag\", \"mac_address\", \"admin\", \"plug_and_charge\", \"roaming\", \"payment_terminal\", \"plug_and_charge_iso15118\""
8881
- },
8882
- "partnerId": {
8883
- "type": "integer",
8884
- "description": "Lists only authorizations of users who are associated to a particular partner"
8885
- }
8886
- }
8887
- }
8888
- },
8889
- "page": {
8890
- "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.",
8891
- "type": "integer",
8892
- "default": 1
8893
- },
8894
9022
  "per_page": {
8895
- "description": "The numbers of items to return. Used in both page and cursor pagination to declare the page size.",
9023
+ "description": "The number of items to return per page.",
9024
+ "type": "integer",
9025
+ "minimum": 1,
9026
+ "maximum": 100,
9027
+ "default": 100
9028
+ },
9029
+ "cursor": {
9030
+ "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",
9031
+ "type": "string"
9032
+ }
9033
+ }
9034
+ },
9035
+ "responses": {
9036
+ "200": {
9037
+ "description": "Success"
9038
+ },
9039
+ "401": {
9040
+ "description": "Access token is missing or invalid"
9041
+ },
9042
+ "403": {
9043
+ "description": "You do not have permission to perform the action"
9044
+ },
9045
+ "404": {
9046
+ "description": "The record is not found"
9047
+ }
9048
+ }
9049
+ },
9050
+ {
9051
+ "path": "/public-api/resources/authorizations/v1.0/{authorization}",
9052
+ "method": "GET",
9053
+ "operationId": "authorizationReadDeprecated",
9054
+ "summary": "Authorization / Read",
9055
+ "deprecated": true,
9056
+ "tags": [
9057
+ "resource / authorizations"
9058
+ ],
9059
+ "parameters": {
9060
+ "path": {
9061
+ "authorization": {
9062
+ "description": "The authorization ID to fetch",
9063
+ "type": "string",
9064
+ "required": true
9065
+ }
9066
+ }
9067
+ },
9068
+ "responses": {
9069
+ "200": {
9070
+ "description": "Success"
9071
+ },
9072
+ "401": {
9073
+ "description": "Access token is missing or invalid"
9074
+ },
9075
+ "403": {
9076
+ "description": "You do not have permission to perform the action"
9077
+ },
9078
+ "404": {
9079
+ "description": "The record is not found"
9080
+ },
9081
+ "429": {
9082
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
9083
+ }
9084
+ }
9085
+ },
9086
+ {
9087
+ "path": "/public-api/resources/authorizations/v2.0",
9088
+ "method": "GET",
9089
+ "operationId": "authorizationsListing",
9090
+ "summary": "Authorizations / Listing",
9091
+ "description": "**Deprecated:** Use v2.1 endpoint instead. This endpoint does not distinguish between RFID and MAC address (Autocharge) authorizations - both return `id_tag` as the method.",
9092
+ "deprecated": true,
9093
+ "tags": [
9094
+ "resource / authorizations"
9095
+ ],
9096
+ "parameters": {
9097
+ "query": {
9098
+ "filter": {
9099
+ "schema": {
9100
+ "type": "object",
9101
+ "properties": {
9102
+ "operatorId": {
9103
+ "example": "1",
9104
+ "oneOf": [
9105
+ {
9106
+ "type": "string",
9107
+ "format": "integer"
9108
+ },
9109
+ {
9110
+ "type": "array",
9111
+ "items": {
9112
+ "type": "string",
9113
+ "format": "integer"
9114
+ }
9115
+ }
9116
+ ],
9117
+ "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`"
9118
+ },
9119
+ "createdAfter": {
9120
+ "type": "string",
9121
+ "format": "date-time",
9122
+ "description": "ISO 8601 formatted date. Lists only the authorizations created after this datetime"
9123
+ },
9124
+ "createdBefore": {
9125
+ "type": "string",
9126
+ "format": "date-time",
9127
+ "description": "ISO 8601 formatted date. Lists only the authorizations created before this datetime"
9128
+ },
9129
+ "lastUpdatedAfter": {
9130
+ "type": "string",
9131
+ "format": "date-time",
9132
+ "description": "ISO 8601 formatted date. Lists only the authorizations that were last updated after this datetime"
9133
+ },
9134
+ "lastUpdatedBefore": {
9135
+ "type": "string",
9136
+ "format": "date-time",
9137
+ "description": "ISO 8601 formatted date. Lists only the authorizations that were last updated before this datetime"
9138
+ },
9139
+ "status": {
9140
+ "type": "string",
9141
+ "description": "Lists only authorizations with one of the following statuses: \"accepted\", \"rejected\", \"pending\""
9142
+ },
9143
+ "method": {
9144
+ "type": "string",
9145
+ "description": "Lists only authorizations with one of the following methods: \"user_device\", \"id_tag\", \"mac_address\", \"admin\", \"plug_and_charge\", \"roaming\", \"payment_terminal\", \"plug_and_charge_iso15118\""
9146
+ },
9147
+ "partnerId": {
9148
+ "type": "integer",
9149
+ "description": "Lists only authorizations of users who are associated to a particular partner"
9150
+ }
9151
+ }
9152
+ }
9153
+ },
9154
+ "page": {
9155
+ "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.",
9156
+ "type": "integer",
9157
+ "default": 1
9158
+ },
9159
+ "per_page": {
9160
+ "description": "The numbers of items to return. Used in both page and cursor pagination to declare the page size.",
8896
9161
  "type": "integer",
8897
9162
  "minimum": 1,
8898
9163
  "maximum": 100,
@@ -9661,6 +9926,9 @@
9661
9926
  "403": {
9662
9927
  "description": "You do not have permission to perform the action"
9663
9928
  },
9929
+ "422": {
9930
+ "description": "The payload you provided is invalid"
9931
+ },
9664
9932
  "429": {
9665
9933
  "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
9666
9934
  }
@@ -9688,6 +9956,9 @@
9688
9956
  "404": {
9689
9957
  "description": "The record is not found"
9690
9958
  },
9959
+ "422": {
9960
+ "description": "The payload you provided is invalid"
9961
+ },
9691
9962
  "429": {
9692
9963
  "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
9693
9964
  }
@@ -12727,15 +12998,135 @@
12727
12998
  "type": "boolean",
12728
12999
  "description": "When disabled, this EVSE will not be listed or counted in the Faults & connectivity loss widget or lens. The charge point will still appear for charge point-level faults (network loss, hardware faulted). Defaults to true."
12729
13000
  },
12730
- "powerOptions": {
13001
+ "externalId": {
13002
+ "type": "string"
13003
+ },
13004
+ "capabilityOverrides": {
12731
13005
  "type": "object",
12732
13006
  "properties": {
12733
- "maxOutputVoltage": {
12734
- "type": "integer",
12735
- "minimum": 1,
12736
- "maximum": 1000,
12737
- "description": "Maximum output voltage for DC charging."
13007
+ "rfidReader": {
13008
+ "type": "string",
13009
+ "enum": [
13010
+ "auto",
13011
+ "force_enable",
13012
+ "force_disable"
13013
+ ],
13014
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12738
13015
  },
13016
+ "creditCardPayable": {
13017
+ "type": "string",
13018
+ "enum": [
13019
+ "auto",
13020
+ "force_enable",
13021
+ "force_disable"
13022
+ ],
13023
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13024
+ },
13025
+ "contactlessCardSupport": {
13026
+ "type": "string",
13027
+ "enum": [
13028
+ "auto",
13029
+ "force_enable",
13030
+ "force_disable"
13031
+ ],
13032
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13033
+ },
13034
+ "debitCardPayable": {
13035
+ "type": "string",
13036
+ "enum": [
13037
+ "auto",
13038
+ "force_enable",
13039
+ "force_disable"
13040
+ ],
13041
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13042
+ },
13043
+ "chipCardSupport": {
13044
+ "type": "string",
13045
+ "enum": [
13046
+ "auto",
13047
+ "force_enable",
13048
+ "force_disable"
13049
+ ],
13050
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13051
+ },
13052
+ "pedTerminal": {
13053
+ "type": "string",
13054
+ "enum": [
13055
+ "auto",
13056
+ "force_enable",
13057
+ "force_disable"
13058
+ ],
13059
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13060
+ },
13061
+ "remoteStartStop": {
13062
+ "type": "string",
13063
+ "enum": [
13064
+ "auto",
13065
+ "force_enable",
13066
+ "force_disable"
13067
+ ],
13068
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13069
+ },
13070
+ "unlockCapable": {
13071
+ "type": "string",
13072
+ "enum": [
13073
+ "auto",
13074
+ "force_enable",
13075
+ "force_disable"
13076
+ ],
13077
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13078
+ },
13079
+ "reservable": {
13080
+ "type": "string",
13081
+ "enum": [
13082
+ "auto",
13083
+ "force_enable",
13084
+ "force_disable"
13085
+ ],
13086
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13087
+ },
13088
+ "chargingProfileCapable": {
13089
+ "type": "string",
13090
+ "enum": [
13091
+ "auto",
13092
+ "force_enable",
13093
+ "force_disable"
13094
+ ],
13095
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13096
+ },
13097
+ "chargingPreferencesCapable": {
13098
+ "type": "string",
13099
+ "enum": [
13100
+ "auto",
13101
+ "force_enable",
13102
+ "force_disable"
13103
+ ],
13104
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13105
+ },
13106
+ "startSessionConnectorRequired": {
13107
+ "type": "string",
13108
+ "enum": [
13109
+ "auto",
13110
+ "force_enable",
13111
+ "force_disable"
13112
+ ],
13113
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13114
+ },
13115
+ "tokenGroupCapable": {
13116
+ "type": "string",
13117
+ "enum": [
13118
+ "auto",
13119
+ "force_enable",
13120
+ "force_disable"
13121
+ ],
13122
+ "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13123
+ }
13124
+ },
13125
+ "description": "Manual overrides for individual EVSE capabilities. Each property is independent. Send `force_enable` or `force_disable` to set or replace an override. Send `auto` to clear an existing override (the capability returns to automated detection). Omit a property to leave its current override unchanged."
13126
+ },
13127
+ "powerOptions": {
13128
+ "type": "object",
13129
+ "properties": {
12739
13130
  "maxPower": {
12740
13131
  "type": "integer",
12741
13132
  "nullable": true,
@@ -12748,6 +13139,7 @@
12748
13139
  "380",
12749
13140
  "400",
12750
13141
  "480",
13142
+ "600",
12751
13143
  "120",
12752
13144
  "208",
12753
13145
  "240",
@@ -12796,134 +13188,22 @@
12796
13188
  ],
12797
13189
  "nullable": true,
12798
13190
  "description": "Specifies the active line conductors used in the circuit. - `L1_L2` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L2_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L2` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L3` - Valid when `phases` = `single_phase` in electrical configuration `star`"
12799
- }
12800
- }
12801
- },
12802
- "externalId": {
12803
- "type": "string"
12804
- },
12805
- "capabilityOverrides": {
12806
- "type": "object",
12807
- "properties": {
12808
- "rfidReader": {
12809
- "type": "string",
12810
- "enum": [
12811
- "auto",
12812
- "force_enable",
12813
- "force_disable"
12814
- ],
12815
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12816
- },
12817
- "creditCardPayable": {
12818
- "type": "string",
12819
- "enum": [
12820
- "auto",
12821
- "force_enable",
12822
- "force_disable"
12823
- ],
12824
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12825
- },
12826
- "contactlessCardSupport": {
12827
- "type": "string",
12828
- "enum": [
12829
- "auto",
12830
- "force_enable",
12831
- "force_disable"
12832
- ],
12833
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12834
- },
12835
- "debitCardPayable": {
12836
- "type": "string",
12837
- "enum": [
12838
- "auto",
12839
- "force_enable",
12840
- "force_disable"
12841
- ],
12842
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12843
- },
12844
- "chipCardSupport": {
12845
- "type": "string",
12846
- "enum": [
12847
- "auto",
12848
- "force_enable",
12849
- "force_disable"
12850
- ],
12851
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12852
- },
12853
- "pedTerminal": {
12854
- "type": "string",
12855
- "enum": [
12856
- "auto",
12857
- "force_enable",
12858
- "force_disable"
12859
- ],
12860
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12861
- },
12862
- "remoteStartStop": {
12863
- "type": "string",
12864
- "enum": [
12865
- "auto",
12866
- "force_enable",
12867
- "force_disable"
12868
- ],
12869
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12870
13191
  },
12871
- "unlockCapable": {
12872
- "type": "string",
12873
- "enum": [
12874
- "auto",
12875
- "force_enable",
12876
- "force_disable"
12877
- ],
12878
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12879
- },
12880
- "reservable": {
12881
- "type": "string",
12882
- "enum": [
12883
- "auto",
12884
- "force_enable",
12885
- "force_disable"
12886
- ],
12887
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12888
- },
12889
- "chargingProfileCapable": {
12890
- "type": "string",
12891
- "enum": [
12892
- "auto",
12893
- "force_enable",
12894
- "force_disable"
12895
- ],
12896
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12897
- },
12898
- "chargingPreferencesCapable": {
12899
- "type": "string",
12900
- "enum": [
12901
- "auto",
12902
- "force_enable",
12903
- "force_disable"
12904
- ],
12905
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
12906
- },
12907
- "startSessionConnectorRequired": {
12908
- "type": "string",
12909
- "enum": [
12910
- "auto",
12911
- "force_enable",
12912
- "force_disable"
12913
- ],
12914
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13192
+ "maxOutputVoltage": {
13193
+ "type": "integer",
13194
+ "minimum": 1,
13195
+ "maximum": 1000,
13196
+ "nullable": true,
13197
+ "description": "Maximum output voltage for DC charging, in V. Leave empty to share the input voltage via roaming connections. Only relevant for the dc current type - providing a value for any other current type is rejected with a validation error."
12915
13198
  },
12916
- "tokenGroupCapable": {
12917
- "type": "string",
12918
- "enum": [
12919
- "auto",
12920
- "force_enable",
12921
- "force_disable"
12922
- ],
12923
- "description": "Override value for an EVSE capability: - **auto**: Use automated detection logic (default) - **force_enable**: Always include this capability - **force_disable**: Never include this capability"
13199
+ "efficiencyPercent": {
13200
+ "type": "number",
13201
+ "minimum": 90,
13202
+ "maximum": 100,
13203
+ "description": "Stored efficiency override for a local DC EVSE. Supply a number from 90 to 100; invalid supplied local values return 422. Values are rounded to two decimal places when stored and take effect on the next DLM cycle. Without an override, DLM uses 95% for calculations. Omit this property for no override. Roaming EVSEs ignore this property."
12924
13204
  }
12925
13205
  },
12926
- "description": "Manual overrides for individual EVSE capabilities. Each property is independent. Send `force_enable` or `force_disable` to set or replace an override. Send `auto` to clear an existing override (the capability returns to automated detection). Omit a property to leave its current override unchanged."
13206
+ "description": "Optional efficiencyPercent sets a stored override for a local DC EVSE. Supply a number from 90 to 100; invalid supplied local values return 422. Values are rounded to two decimal places when stored and applied on the next DLM cycle; without an override DLM uses 95%. Roaming EVSEs ignore this property. Omit the property for no override."
12927
13207
  }
12928
13208
  },
12929
13209
  "required": [
@@ -13112,78 +13392,6 @@
13112
13392
  "type": "boolean",
13113
13393
  "description": "When disabled, this EVSE will not be listed or counted in the Faults & connectivity loss widget or lens. The charge point will still appear for charge point-level faults (network loss, hardware faulted). Defaults to true."
13114
13394
  },
13115
- "powerOptions": {
13116
- "type": "object",
13117
- "properties": {
13118
- "maxOutputVoltage": {
13119
- "type": "integer",
13120
- "minimum": 1,
13121
- "maximum": 1000,
13122
- "description": "Maximum output voltage for DC charging."
13123
- },
13124
- "maxPower": {
13125
- "type": "integer",
13126
- "nullable": true,
13127
- "description": "Maximum power of the EVSE in W (Watts)."
13128
- },
13129
- "maxVoltage": {
13130
- "type": "string",
13131
- "enum": [
13132
- "230",
13133
- "380",
13134
- "400",
13135
- "480",
13136
- "120",
13137
- "208",
13138
- "240",
13139
- "110-130",
13140
- "220-240",
13141
- "277"
13142
- ],
13143
- "nullable": true,
13144
- "description": "The maximum intake (input) voltage of the EVSE. For the ac current type the output voltage is the same as this intake voltage, while for the dc current type the output voltage can differ and is exposed separately in maxOutputVoltage. The maxVoltage of a charge point can fluctuate. Hence, when creating a charge point in the system, the maxVoltage is given as a range. For OCPI purposes it maps as follows: 220-240 = 230 110-130 = 120 400 = 400 380 = 380"
13145
- },
13146
- "maxAmperage": {
13147
- "type": "number",
13148
- "nullable": true
13149
- },
13150
- "phases": {
13151
- "type": "string",
13152
- "enum": [
13153
- "single_phase",
13154
- "three_phase",
13155
- "split_phase"
13156
- ],
13157
- "nullable": true
13158
- },
13159
- "phaseRotation": {
13160
- "type": "string",
13161
- "enum": [
13162
- "RST",
13163
- "RTS",
13164
- "SRT",
13165
- "STR",
13166
- "TRS",
13167
- "TSR"
13168
- ],
13169
- "nullable": true,
13170
- "description": "`R` stands for `L1`, </br> `S` - for `L2` </br> `T` - for `L3` </br> So for example `RST` = `L1`, `L2`, `L3`, while `RTS` = `L1`, `L3`, `L2`, etc. </br> We are deriving the connected phase from this property for single phase if connectedPhase is not provided. Please don't rely on this property anymore as this functionality will be turned of in near future. Pass the correct connectedPhase instead. If you pass both properties (connectedPhase and phaseRotation) only connectedPhase will be taken into consideration for determining the phase."
13171
- },
13172
- "connectedPhase": {
13173
- "type": "string",
13174
- "enum": [
13175
- "L1",
13176
- "L2",
13177
- "L3",
13178
- "L1_L2",
13179
- "L1_L3",
13180
- "L2_L3"
13181
- ],
13182
- "nullable": true,
13183
- "description": "Specifies the active line conductors used in the circuit. - `L1_L2` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L2_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L2` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L3` - Valid when `phases` = `single_phase` in electrical configuration `star`"
13184
- }
13185
- }
13186
- },
13187
13395
  "externalId": {
13188
13396
  "type": "string"
13189
13397
  },
@@ -13309,6 +13517,86 @@
13309
13517
  }
13310
13518
  },
13311
13519
  "description": "Manual overrides for individual EVSE capabilities. Each property is independent. Send `force_enable` or `force_disable` to set or replace an override. Send `auto` to clear an existing override (the capability returns to automated detection). Omit a property to leave its current override unchanged."
13520
+ },
13521
+ "powerOptions": {
13522
+ "type": "object",
13523
+ "properties": {
13524
+ "maxPower": {
13525
+ "type": "integer",
13526
+ "nullable": true,
13527
+ "description": "Maximum power of the EVSE in W (Watts)."
13528
+ },
13529
+ "maxVoltage": {
13530
+ "type": "string",
13531
+ "enum": [
13532
+ "230",
13533
+ "380",
13534
+ "400",
13535
+ "480",
13536
+ "600",
13537
+ "120",
13538
+ "208",
13539
+ "240",
13540
+ "110-130",
13541
+ "220-240",
13542
+ "277"
13543
+ ],
13544
+ "nullable": true,
13545
+ "description": "The maximum intake (input) voltage of the EVSE. For the ac current type the output voltage is the same as this intake voltage, while for the dc current type the output voltage can differ and is exposed separately in maxOutputVoltage. The maxVoltage of a charge point can fluctuate. Hence, when creating a charge point in the system, the maxVoltage is given as a range. For OCPI purposes it maps as follows: 220-240 = 230 110-130 = 120 400 = 400 380 = 380"
13546
+ },
13547
+ "maxAmperage": {
13548
+ "type": "number",
13549
+ "nullable": true
13550
+ },
13551
+ "phases": {
13552
+ "type": "string",
13553
+ "enum": [
13554
+ "single_phase",
13555
+ "three_phase",
13556
+ "split_phase"
13557
+ ],
13558
+ "nullable": true
13559
+ },
13560
+ "phaseRotation": {
13561
+ "type": "string",
13562
+ "enum": [
13563
+ "RST",
13564
+ "RTS",
13565
+ "SRT",
13566
+ "STR",
13567
+ "TRS",
13568
+ "TSR"
13569
+ ],
13570
+ "nullable": true,
13571
+ "description": "`R` stands for `L1`, </br> `S` - for `L2` </br> `T` - for `L3` </br> So for example `RST` = `L1`, `L2`, `L3`, while `RTS` = `L1`, `L3`, `L2`, etc. </br> We are deriving the connected phase from this property for single phase if connectedPhase is not provided. Please don't rely on this property anymore as this functionality will be turned of in near future. Pass the correct connectedPhase instead. If you pass both properties (connectedPhase and phaseRotation) only connectedPhase will be taken into consideration for determining the phase."
13572
+ },
13573
+ "connectedPhase": {
13574
+ "type": "string",
13575
+ "enum": [
13576
+ "L1",
13577
+ "L2",
13578
+ "L3",
13579
+ "L1_L2",
13580
+ "L1_L3",
13581
+ "L2_L3"
13582
+ ],
13583
+ "nullable": true,
13584
+ "description": "Specifies the active line conductors used in the circuit. - `L1_L2` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L2_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L2` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L3` - Valid when `phases` = `single_phase` in electrical configuration `star`"
13585
+ },
13586
+ "maxOutputVoltage": {
13587
+ "type": "integer",
13588
+ "minimum": 1,
13589
+ "maximum": 1000,
13590
+ "nullable": true,
13591
+ "description": "Maximum output voltage for DC charging, in V. Leave empty to share the input voltage via roaming connections. Only relevant for the dc current type - providing a value for any other current type is rejected with a validation error."
13592
+ },
13593
+ "efficiencyPercent": {
13594
+ "type": "number",
13595
+ "nullable": true,
13596
+ "description": "Stored efficiency override for a local DC EVSE. New or changed values must be numbers from 90 to 100; invalid supplied local values return 422. An unchanged numeric value, including a historical value outside this range, is accepted without rewriting storage even when switching to AC; AC responses hide the retained value. Changed values are rounded to two decimal places when stored and take effect on the next DLM cycle. Without an override, DLM uses 95% for calculations. Omission preserves the stored override. Sending powerOptions: null clears the other power options but retains any stored efficiency override; send powerOptions: {efficiencyPercent: null} to clear the override. Roaming EVSEs ignore this property."
13597
+ }
13598
+ },
13599
+ "description": "Set efficiencyPercent to a number from 90 to 100 only for a local DC EVSE; invalid new or changed local values return 422. An unchanged numeric value is accepted even when outside this range or when changing to AC, and its stored value is left untouched. New values are rounded to two decimal places when stored and used by the next DLM cycle; without an override DLM uses 95%. Omission preserves the stored override even when changing to AC. Sending powerOptions: null clears the other power options but retains any stored efficiency override; send powerOptions: {efficiencyPercent: null} to clear the override. Roaming EVSEs ignore this property."
13312
13600
  }
13313
13601
  }
13314
13602
  }
@@ -13441,11 +13729,17 @@
13441
13729
  "enabled",
13442
13730
  "disabled"
13443
13731
  ]
13732
+ },
13733
+ "externalId": {
13734
+ "type": "string",
13735
+ "maxLength": 255,
13736
+ "description": "An optional external identifier for integration purposes"
13444
13737
  }
13445
13738
  },
13446
13739
  "required": [
13447
13740
  "type"
13448
- ]
13741
+ ],
13742
+ "description": "Omit optional externalId when no identifier is available. Supplied non-string or longer-than-255-character values return 422 without creating a connector. Identifiers are not unique across connectors."
13449
13743
  }
13450
13744
  }
13451
13745
  }
@@ -13588,8 +13882,15 @@
13588
13882
  "enabled",
13589
13883
  "disabled"
13590
13884
  ]
13885
+ },
13886
+ "externalId": {
13887
+ "type": "string",
13888
+ "maxLength": 255,
13889
+ "nullable": true,
13890
+ "description": "An optional external identifier for integration purposes"
13591
13891
  }
13592
- }
13892
+ },
13893
+ "description": "Set or replace externalId, or send null or an empty string to clear it. Omission preserves the current identifier. Supplied non-string or longer-than-255-character values return 422 without changing the connector. Identifiers are not unique across connectors."
13593
13894
  }
13594
13895
  }
13595
13896
  }
@@ -15125,6 +15426,7 @@
15125
15426
  "380",
15126
15427
  "400",
15127
15428
  "480",
15429
+ "600",
15128
15430
  "120",
15129
15431
  "208",
15130
15432
  "240",
@@ -15256,6 +15558,7 @@
15256
15558
  "380",
15257
15559
  "400",
15258
15560
  "480",
15561
+ "600",
15259
15562
  "120",
15260
15563
  "208",
15261
15564
  "240",
@@ -15387,6 +15690,7 @@
15387
15690
  "380",
15388
15691
  "400",
15389
15692
  "480",
15693
+ "600",
15390
15694
  "120",
15391
15695
  "208",
15392
15696
  "240",
@@ -16172,6 +16476,7 @@
16172
16476
  "380",
16173
16477
  "400",
16174
16478
  "480",
16479
+ "600",
16175
16480
  "120",
16176
16481
  "208",
16177
16482
  "240",
@@ -16435,6 +16740,7 @@
16435
16740
  "380",
16436
16741
  "400",
16437
16742
  "480",
16743
+ "600",
16438
16744
  "120",
16439
16745
  "208",
16440
16746
  "240",
@@ -18149,6 +18455,171 @@
18149
18455
  }
18150
18456
  }
18151
18457
  },
18458
+ {
18459
+ "path": "/public-api/resources/cooperator-insights/v1.0",
18460
+ "method": "GET",
18461
+ "operationId": "cooperatorInsightsListing",
18462
+ "summary": "CoOperator insights / listing",
18463
+ "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 API insights in descending ID order. Requires a Public API token whose service admin has the Access CoOperator permission and an installed, enabled CoOperator app. Every request is rejected with `403` while CoOperator's in-process mode is not enabled for the tenant. Only insights submitted through this API are visible. An operator-level admin sees every insight of its operator, including those submitted by its partner and sub-operator admins; a partner or sub-operator admin sees only the insights submitted by admins of its own partner or sub-operator; a global admin sees all of them. Admins of any other kind, such as installation and maintenance companies, are refused with `403`. An insight submitted by a global admin is visible only to global admins. Inaccessible insight IDs are not exposed and return `404`. A `failed` insight exposes no failure details. Callers should enforce their own polling timeout because stale `pending` insights are not automatically expired.",
18464
+ "tags": [
18465
+ "resource / cooperator insights"
18466
+ ],
18467
+ "parameters": {
18468
+ "query": {
18469
+ "per_page": {
18470
+ "description": "The number of items to return per page.",
18471
+ "type": "integer",
18472
+ "minimum": 1,
18473
+ "maximum": 100,
18474
+ "default": 100
18475
+ },
18476
+ "cursor": {
18477
+ "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",
18478
+ "type": "string"
18479
+ },
18480
+ "filter": {
18481
+ "schema": {
18482
+ "type": "object",
18483
+ "properties": {
18484
+ "state": {
18485
+ "type": "string",
18486
+ "enum": [
18487
+ "pending",
18488
+ "completed",
18489
+ "failed"
18490
+ ],
18491
+ "description": "Current processing state: - `pending` — The analysis is queued or in progress. - `completed` — The analysis completed and `content` is available. - `failed` — The analysis could not be completed."
18492
+ },
18493
+ "createdAfter": {
18494
+ "type": "string",
18495
+ "format": "date-time",
18496
+ "description": "Return insights created at or after this moment."
18497
+ },
18498
+ "createdBefore": {
18499
+ "type": "string",
18500
+ "format": "date-time",
18501
+ "description": "Return insights created at or before this moment."
18502
+ }
18503
+ }
18504
+ }
18505
+ }
18506
+ }
18507
+ },
18508
+ "responses": {
18509
+ "200": {
18510
+ "description": "Success"
18511
+ },
18512
+ "401": {
18513
+ "description": "Access token is missing or invalid"
18514
+ },
18515
+ "403": {
18516
+ "description": "You do not have permission to perform the action"
18517
+ },
18518
+ "422": {
18519
+ "description": "The payload you provided is invalid"
18520
+ },
18521
+ "429": {
18522
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
18523
+ }
18524
+ }
18525
+ },
18526
+ {
18527
+ "path": "/public-api/resources/cooperator-insights/v1.0",
18528
+ "method": "POST",
18529
+ "operationId": "cooperatorInsightCreate",
18530
+ "summary": "CoOperator insight / create",
18531
+ "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. Submit one question for a single, fully automatic, read-only analysis, for example \"What happened to user 123?\". CoOperator never asks a follow-up question and never waits for confirmation: it always answers with its best effort using the platform data the token's service admin can access, states any assumption it made, and reports what it could not determine. Requests for a change are analysed but never carried out. Poll the read endpoint with the returned `id` until the state is `completed` or `failed`, or subscribe to the `CoOperatorInsightChangedNotification` webhook through notifications v2.0, which delivers the insight in this same shape as soon as it leaves `pending`. The webhook reaches operator-level and global subscriptions only, see its own documentation for the recipient rule. One analysis runs per administrator at a time: a request made while the token's service admin already has a `pending` insight that can still execute is refused with `409`. Once that insight has completed or failed, a new request is accepted. Creation is not idempotent: every accepted request is a new insight, so retry only after reading the state of the one you already have. Requires a Public API token whose service admin has the Access CoOperator permission and an installed, enabled CoOperator app. Every request is rejected with `403` while CoOperator's in-process mode is not enabled for the tenant. `message` and `context` are treated as untrusted input and are not returned by the insight resource. The caller must retain its own copy. Allowance is checked when the request is accepted and an exhausted allowance returns `429`. This best-effort check reserves and refunds nothing, can permit a small overshoot from concurrent requests, and does not prevent already accepted work from completing after the allowance is exhausted.",
18532
+ "tags": [
18533
+ "resource / cooperator insights"
18534
+ ],
18535
+ "requestBody": {
18536
+ "required": true,
18537
+ "content": {
18538
+ "application/json": {
18539
+ "schema": {
18540
+ "type": "object",
18541
+ "properties": {
18542
+ "message": {
18543
+ "type": "string",
18544
+ "minLength": 1,
18545
+ "maxLength": 10000,
18546
+ "description": "Untrusted question or analysis request. It is not returned by the insight resource, so the caller must retain its own copy."
18547
+ },
18548
+ "context": {
18549
+ "type": "object",
18550
+ "additionalProperties": {
18551
+ "oneOf": [
18552
+ {
18553
+ "type": "string",
18554
+ "maxLength": 1000
18555
+ },
18556
+ {
18557
+ "type": "number"
18558
+ },
18559
+ {
18560
+ "type": "boolean"
18561
+ }
18562
+ ]
18563
+ },
18564
+ "description": "Optional untrusted scalar context with property names up to 100 characters and string values up to 1000 characters. Empty strings and null values are rejected, so omit a property that has no value. It is not returned by the insight resource, so the caller must retain its own copy."
18565
+ }
18566
+ },
18567
+ "required": [
18568
+ "message"
18569
+ ],
18570
+ "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."
18571
+ }
18572
+ }
18573
+ }
18574
+ },
18575
+ "responses": {
18576
+ "202": {
18577
+ "description": "Accepted"
18578
+ },
18579
+ "401": {
18580
+ "description": "Access token is missing or invalid"
18581
+ },
18582
+ "403": {
18583
+ "description": "You do not have permission to perform the action"
18584
+ },
18585
+ "409": {
18586
+ "description": "The request could not be completed due to a conflict with the current state of the resource. The operation may succeed if retried."
18587
+ },
18588
+ "422": {
18589
+ "description": "The payload you provided is invalid"
18590
+ },
18591
+ "429": {
18592
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
18593
+ }
18594
+ }
18595
+ },
18596
+ {
18597
+ "path": "/public-api/resources/cooperator-insights/v1.0/{insight}",
18598
+ "method": "GET",
18599
+ "operationId": "cooperatorInsightRead",
18600
+ "summary": "CoOperator insight / read",
18601
+ "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 one API insight. Requires a Public API token whose service admin has the Access CoOperator permission and an installed, enabled CoOperator app. Every request is rejected with `403` while CoOperator's in-process mode is not enabled for the tenant. Only insights submitted through this API are visible. An operator-level admin sees every insight of its operator, including those submitted by its partner and sub-operator admins; a partner or sub-operator admin sees only the insights submitted by admins of its own partner or sub-operator; a global admin sees all of them. Admins of any other kind, such as installation and maintenance companies, are refused with `403`. An insight submitted by a global admin is visible only to global admins. Inaccessible insight IDs are not exposed and return `404`. A `failed` insight exposes no failure details. Callers should enforce their own polling timeout because stale `pending` insights are not automatically expired.",
18602
+ "tags": [
18603
+ "resource / cooperator insights"
18604
+ ],
18605
+ "responses": {
18606
+ "200": {
18607
+ "description": "Success"
18608
+ },
18609
+ "401": {
18610
+ "description": "Access token is missing or invalid"
18611
+ },
18612
+ "403": {
18613
+ "description": "You do not have permission to perform the action"
18614
+ },
18615
+ "404": {
18616
+ "description": "The record is not found"
18617
+ },
18618
+ "429": {
18619
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
18620
+ }
18621
+ }
18622
+ },
18152
18623
  {
18153
18624
  "path": "/public-api/resources/cp-models/v1.0",
18154
18625
  "method": "GET",
@@ -24056,6 +24527,7 @@
24056
24527
  "380",
24057
24528
  "400",
24058
24529
  "480",
24530
+ "600",
24059
24531
  "120",
24060
24532
  "208",
24061
24533
  "240",
@@ -24662,6 +25134,31 @@
24662
25134
  "dc"
24663
25135
  ],
24664
25136
  "description": "Filter EVSEs by current type. If 'ac', only AC EVSEs will be returned. If 'dc', only DC EVSEs will be returned. If not provided, all EVSEs will be returned."
25137
+ },
25138
+ "hardwareStatus": {
25139
+ "type": "array",
25140
+ "items": {
25141
+ "type": "string",
25142
+ "enum": [
25143
+ "available",
25144
+ "preparing",
25145
+ "charging",
25146
+ "suspendedEV",
25147
+ "suspendedEVSE",
25148
+ "finishing",
25149
+ "reserved",
25150
+ "unavailable",
25151
+ "faulted",
25152
+ "occupied"
25153
+ ],
25154
+ "example": "suspendedEV",
25155
+ "description": "EVSE hardware status: - **available**: EVSE is available for use - **preparing**: EVSE is preparing to charge (e.g., cable plugged in, awaiting authorization) - **charging**: EVSE is actively charging a vehicle - **suspendedEV**: Charging is suspended by the EV (vehicle-side pause) - **suspendedEVSE**: Charging is suspended by the EVSE (charger-side pause) - **finishing**: Charging session is finishing - **reserved**: EVSE is reserved - **unavailable**: EVSE is not available for use - **faulted**: EVSE is in a faulted state - **occupied**: EVSE is occupied"
25156
+ },
25157
+ "example": [
25158
+ "occupied",
25159
+ "suspendedEVSE"
25160
+ ],
25161
+ "description": "Filter by any of the supplied case-sensitive hardware statuses (OR). Send a one-element array for a single status. Blank array members, including `filter[hardwareStatus][]=` in the query, and a blank scalar are ignored; an all-blank array does not filter results. A nonblank scalar, unknown status or incorrectly cased status returns 422. Can be combined with chargePointId and other filters."
24665
25162
  }
24666
25163
  }
24667
25164
  }
@@ -24785,78 +25282,6 @@
24785
25282
  "type": "boolean",
24786
25283
  "description": "When disabled, this EVSE will not be listed or counted in the Faults & connectivity loss widget or lens. The charge point will still appear for charge point-level faults (network loss, hardware faulted). Defaults to true."
24787
25284
  },
24788
- "powerOptions": {
24789
- "type": "object",
24790
- "properties": {
24791
- "maxOutputVoltage": {
24792
- "type": "integer",
24793
- "minimum": 1,
24794
- "maximum": 1000,
24795
- "description": "Maximum output voltage for DC charging."
24796
- },
24797
- "maxPower": {
24798
- "type": "integer",
24799
- "nullable": true,
24800
- "description": "Maximum power of the EVSE in W (Watts)."
24801
- },
24802
- "maxVoltage": {
24803
- "type": "string",
24804
- "enum": [
24805
- "230",
24806
- "380",
24807
- "400",
24808
- "480",
24809
- "120",
24810
- "208",
24811
- "240",
24812
- "110-130",
24813
- "220-240",
24814
- "277"
24815
- ],
24816
- "nullable": true,
24817
- "description": "The maximum intake (input) voltage of the EVSE. For the ac current type the output voltage is the same as this intake voltage, while for the dc current type the output voltage can differ and is exposed separately in maxOutputVoltage. The maxVoltage of a charge point can fluctuate. Hence, when creating a charge point in the system, the maxVoltage is given as a range. For OCPI purposes it maps as follows: 220-240 = 230 110-130 = 120 400 = 400 380 = 380"
24818
- },
24819
- "maxAmperage": {
24820
- "type": "number",
24821
- "nullable": true
24822
- },
24823
- "phases": {
24824
- "type": "string",
24825
- "enum": [
24826
- "single_phase",
24827
- "three_phase",
24828
- "split_phase"
24829
- ],
24830
- "nullable": true
24831
- },
24832
- "phaseRotation": {
24833
- "type": "string",
24834
- "enum": [
24835
- "RST",
24836
- "RTS",
24837
- "SRT",
24838
- "STR",
24839
- "TRS",
24840
- "TSR"
24841
- ],
24842
- "nullable": true,
24843
- "description": "`R` stands for `L1`, </br> `S` - for `L2` </br> `T` - for `L3` </br> So for example `RST` = `L1`, `L2`, `L3`, while `RTS` = `L1`, `L3`, `L2`, etc. </br> We are deriving the connected phase from this property for single phase if connectedPhase is not provided. Please don't rely on this property anymore as this functionality will be turned of in near future. Pass the correct connectedPhase instead. If you pass both properties (connectedPhase and phaseRotation) only connectedPhase will be taken into consideration for determining the phase."
24844
- },
24845
- "connectedPhase": {
24846
- "type": "string",
24847
- "enum": [
24848
- "L1",
24849
- "L2",
24850
- "L3",
24851
- "L1_L2",
24852
- "L1_L3",
24853
- "L2_L3"
24854
- ],
24855
- "nullable": true,
24856
- "description": "Specifies the active line conductors used in the circuit. - `L1_L2` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L2_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L2` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L3` - Valid when `phases` = `single_phase` in electrical configuration `star`"
24857
- }
24858
- }
24859
- },
24860
25285
  "externalId": {
24861
25286
  "type": "string"
24862
25287
  },
@@ -24982,6 +25407,87 @@
24982
25407
  }
24983
25408
  },
24984
25409
  "description": "Manual overrides for individual EVSE capabilities. Each property is independent. Send `force_enable` or `force_disable` to set or replace an override. Send `auto` to clear an existing override (the capability returns to automated detection). Omit a property to leave its current override unchanged."
25410
+ },
25411
+ "powerOptions": {
25412
+ "type": "object",
25413
+ "properties": {
25414
+ "maxPower": {
25415
+ "type": "integer",
25416
+ "nullable": true,
25417
+ "description": "Maximum power of the EVSE in W (Watts)."
25418
+ },
25419
+ "maxVoltage": {
25420
+ "type": "string",
25421
+ "enum": [
25422
+ "230",
25423
+ "380",
25424
+ "400",
25425
+ "480",
25426
+ "600",
25427
+ "120",
25428
+ "208",
25429
+ "240",
25430
+ "110-130",
25431
+ "220-240",
25432
+ "277"
25433
+ ],
25434
+ "nullable": true,
25435
+ "description": "The maximum intake (input) voltage of the EVSE. For the ac current type the output voltage is the same as this intake voltage, while for the dc current type the output voltage can differ and is exposed separately in maxOutputVoltage. The maxVoltage of a charge point can fluctuate. Hence, when creating a charge point in the system, the maxVoltage is given as a range. For OCPI purposes it maps as follows: 220-240 = 230 110-130 = 120 400 = 400 380 = 380"
25436
+ },
25437
+ "maxAmperage": {
25438
+ "type": "number",
25439
+ "nullable": true
25440
+ },
25441
+ "phases": {
25442
+ "type": "string",
25443
+ "enum": [
25444
+ "single_phase",
25445
+ "three_phase",
25446
+ "split_phase"
25447
+ ],
25448
+ "nullable": true
25449
+ },
25450
+ "phaseRotation": {
25451
+ "type": "string",
25452
+ "enum": [
25453
+ "RST",
25454
+ "RTS",
25455
+ "SRT",
25456
+ "STR",
25457
+ "TRS",
25458
+ "TSR"
25459
+ ],
25460
+ "nullable": true,
25461
+ "description": "`R` stands for `L1`, </br> `S` - for `L2` </br> `T` - for `L3` </br> So for example `RST` = `L1`, `L2`, `L3`, while `RTS` = `L1`, `L3`, `L2`, etc. </br> We are deriving the connected phase from this property for single phase if connectedPhase is not provided. Please don't rely on this property anymore as this functionality will be turned of in near future. Pass the correct connectedPhase instead. If you pass both properties (connectedPhase and phaseRotation) only connectedPhase will be taken into consideration for determining the phase."
25462
+ },
25463
+ "connectedPhase": {
25464
+ "type": "string",
25465
+ "enum": [
25466
+ "L1",
25467
+ "L2",
25468
+ "L3",
25469
+ "L1_L2",
25470
+ "L1_L3",
25471
+ "L2_L3"
25472
+ ],
25473
+ "nullable": true,
25474
+ "description": "Specifies the active line conductors used in the circuit. - `L1_L2` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L2_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L2` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L3` - Valid when `phases` = `single_phase` in electrical configuration `star`"
25475
+ },
25476
+ "maxOutputVoltage": {
25477
+ "type": "integer",
25478
+ "minimum": 1,
25479
+ "maximum": 1000,
25480
+ "nullable": true,
25481
+ "description": "Maximum output voltage for DC charging, in V. Leave empty to share the input voltage via roaming connections. Only relevant for the dc current type - providing a value for any other current type is rejected with a validation error."
25482
+ },
25483
+ "efficiencyPercent": {
25484
+ "type": "number",
25485
+ "minimum": 90,
25486
+ "maximum": 100,
25487
+ "description": "Stored efficiency override for a local DC EVSE. Supply a number from 90 to 100; invalid supplied local values return 422. Values are rounded to two decimal places when stored and take effect on the next DLM cycle. Without an override, DLM uses 95% for calculations. Omit this property for no override. Roaming EVSEs ignore this property."
25488
+ }
25489
+ },
25490
+ "description": "Optional efficiencyPercent sets a stored override for a local DC EVSE. Supply a number from 90 to 100; invalid supplied local values return 422. Values are rounded to two decimal places when stored and applied on the next DLM cycle; without an override DLM uses 95%. Roaming EVSEs ignore this property. Omit the property for no override."
24985
25491
  }
24986
25492
  },
24987
25493
  "required": [
@@ -25174,78 +25680,6 @@
25174
25680
  "type": "boolean",
25175
25681
  "description": "When disabled, this EVSE will not be listed or counted in the Faults & connectivity loss widget or lens. The charge point will still appear for charge point-level faults (network loss, hardware faulted). Defaults to true."
25176
25682
  },
25177
- "powerOptions": {
25178
- "type": "object",
25179
- "properties": {
25180
- "maxOutputVoltage": {
25181
- "type": "integer",
25182
- "minimum": 1,
25183
- "maximum": 1000,
25184
- "description": "Maximum output voltage for DC charging."
25185
- },
25186
- "maxPower": {
25187
- "type": "integer",
25188
- "nullable": true,
25189
- "description": "Maximum power of the EVSE in W (Watts)."
25190
- },
25191
- "maxVoltage": {
25192
- "type": "string",
25193
- "enum": [
25194
- "230",
25195
- "380",
25196
- "400",
25197
- "480",
25198
- "120",
25199
- "208",
25200
- "240",
25201
- "110-130",
25202
- "220-240",
25203
- "277"
25204
- ],
25205
- "nullable": true,
25206
- "description": "The maximum intake (input) voltage of the EVSE. For the ac current type the output voltage is the same as this intake voltage, while for the dc current type the output voltage can differ and is exposed separately in maxOutputVoltage. The maxVoltage of a charge point can fluctuate. Hence, when creating a charge point in the system, the maxVoltage is given as a range. For OCPI purposes it maps as follows: 220-240 = 230 110-130 = 120 400 = 400 380 = 380"
25207
- },
25208
- "maxAmperage": {
25209
- "type": "number",
25210
- "nullable": true
25211
- },
25212
- "phases": {
25213
- "type": "string",
25214
- "enum": [
25215
- "single_phase",
25216
- "three_phase",
25217
- "split_phase"
25218
- ],
25219
- "nullable": true
25220
- },
25221
- "phaseRotation": {
25222
- "type": "string",
25223
- "enum": [
25224
- "RST",
25225
- "RTS",
25226
- "SRT",
25227
- "STR",
25228
- "TRS",
25229
- "TSR"
25230
- ],
25231
- "nullable": true,
25232
- "description": "`R` stands for `L1`, </br> `S` - for `L2` </br> `T` - for `L3` </br> So for example `RST` = `L1`, `L2`, `L3`, while `RTS` = `L1`, `L3`, `L2`, etc. </br> We are deriving the connected phase from this property for single phase if connectedPhase is not provided. Please don't rely on this property anymore as this functionality will be turned of in near future. Pass the correct connectedPhase instead. If you pass both properties (connectedPhase and phaseRotation) only connectedPhase will be taken into consideration for determining the phase."
25233
- },
25234
- "connectedPhase": {
25235
- "type": "string",
25236
- "enum": [
25237
- "L1",
25238
- "L2",
25239
- "L3",
25240
- "L1_L2",
25241
- "L1_L3",
25242
- "L2_L3"
25243
- ],
25244
- "nullable": true,
25245
- "description": "Specifies the active line conductors used in the circuit. - `L1_L2` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L2_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L2` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L3` - Valid when `phases` = `single_phase` in electrical configuration `star`"
25246
- }
25247
- }
25248
- },
25249
25683
  "externalId": {
25250
25684
  "type": "string"
25251
25685
  },
@@ -25371,6 +25805,86 @@
25371
25805
  }
25372
25806
  },
25373
25807
  "description": "Manual overrides for individual EVSE capabilities. Each property is independent. Send `force_enable` or `force_disable` to set or replace an override. Send `auto` to clear an existing override (the capability returns to automated detection). Omit a property to leave its current override unchanged."
25808
+ },
25809
+ "powerOptions": {
25810
+ "type": "object",
25811
+ "properties": {
25812
+ "maxPower": {
25813
+ "type": "integer",
25814
+ "nullable": true,
25815
+ "description": "Maximum power of the EVSE in W (Watts)."
25816
+ },
25817
+ "maxVoltage": {
25818
+ "type": "string",
25819
+ "enum": [
25820
+ "230",
25821
+ "380",
25822
+ "400",
25823
+ "480",
25824
+ "600",
25825
+ "120",
25826
+ "208",
25827
+ "240",
25828
+ "110-130",
25829
+ "220-240",
25830
+ "277"
25831
+ ],
25832
+ "nullable": true,
25833
+ "description": "The maximum intake (input) voltage of the EVSE. For the ac current type the output voltage is the same as this intake voltage, while for the dc current type the output voltage can differ and is exposed separately in maxOutputVoltage. The maxVoltage of a charge point can fluctuate. Hence, when creating a charge point in the system, the maxVoltage is given as a range. For OCPI purposes it maps as follows: 220-240 = 230 110-130 = 120 400 = 400 380 = 380"
25834
+ },
25835
+ "maxAmperage": {
25836
+ "type": "number",
25837
+ "nullable": true
25838
+ },
25839
+ "phases": {
25840
+ "type": "string",
25841
+ "enum": [
25842
+ "single_phase",
25843
+ "three_phase",
25844
+ "split_phase"
25845
+ ],
25846
+ "nullable": true
25847
+ },
25848
+ "phaseRotation": {
25849
+ "type": "string",
25850
+ "enum": [
25851
+ "RST",
25852
+ "RTS",
25853
+ "SRT",
25854
+ "STR",
25855
+ "TRS",
25856
+ "TSR"
25857
+ ],
25858
+ "nullable": true,
25859
+ "description": "`R` stands for `L1`, </br> `S` - for `L2` </br> `T` - for `L3` </br> So for example `RST` = `L1`, `L2`, `L3`, while `RTS` = `L1`, `L3`, `L2`, etc. </br> We are deriving the connected phase from this property for single phase if connectedPhase is not provided. Please don't rely on this property anymore as this functionality will be turned of in near future. Pass the correct connectedPhase instead. If you pass both properties (connectedPhase and phaseRotation) only connectedPhase will be taken into consideration for determining the phase."
25860
+ },
25861
+ "connectedPhase": {
25862
+ "type": "string",
25863
+ "enum": [
25864
+ "L1",
25865
+ "L2",
25866
+ "L3",
25867
+ "L1_L2",
25868
+ "L1_L3",
25869
+ "L2_L3"
25870
+ ],
25871
+ "nullable": true,
25872
+ "description": "Specifies the active line conductors used in the circuit. - `L1_L2` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L2_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1_L3` - Valid when `phases` = `split_phase` in electrical configuration `star` or `phases` = `single_phase` in electrical configuration `delta` - `L1` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L2` - Valid when `phases` = `single_phase` in electrical configuration `star` - `L3` - Valid when `phases` = `single_phase` in electrical configuration `star`"
25873
+ },
25874
+ "maxOutputVoltage": {
25875
+ "type": "integer",
25876
+ "minimum": 1,
25877
+ "maximum": 1000,
25878
+ "nullable": true,
25879
+ "description": "Maximum output voltage for DC charging, in V. Leave empty to share the input voltage via roaming connections. Only relevant for the dc current type - providing a value for any other current type is rejected with a validation error."
25880
+ },
25881
+ "efficiencyPercent": {
25882
+ "type": "number",
25883
+ "nullable": true,
25884
+ "description": "Stored efficiency override for a local DC EVSE. New or changed values must be numbers from 90 to 100; invalid supplied local values return 422. An unchanged numeric value, including a historical value outside this range, is accepted without rewriting storage even when switching to AC; AC responses hide the retained value. Changed values are rounded to two decimal places when stored and take effect on the next DLM cycle. Without an override, DLM uses 95% for calculations. Omission preserves the stored override. Sending powerOptions: null clears the other power options but retains any stored efficiency override; send powerOptions: {efficiencyPercent: null} to clear the override. Roaming EVSEs ignore this property."
25885
+ }
25886
+ },
25887
+ "description": "Set efficiencyPercent to a number from 90 to 100 only for a local DC EVSE; invalid new or changed local values return 422. An unchanged numeric value is accepted even when outside this range or when changing to AC, and its stored value is left untouched. New values are rounded to two decimal places when stored and used by the next DLM cycle; without an override DLM uses 95%. Omission preserves the stored override even when changing to AC. Sending powerOptions: null clears the other power options but retains any stored efficiency override; send powerOptions: {efficiencyPercent: null} to clear the override. Roaming EVSEs ignore this property."
25374
25888
  }
25375
25889
  }
25376
25890
  }
@@ -32211,13 +32725,13 @@
32211
32725
  "method": "GET",
32212
32726
  "operationId": "locationRead",
32213
32727
  "summary": "Location / Read",
32214
- "description": "Get a location",
32728
+ "description": "Get a location. Full access returns the existing location representation. If full access is unavailable, a partner or sub-operator with location view permission can read a restricted public representation when the location has at least one non-deleted public charge point or roaming charge point through a non-deleted charging zone. A roaming charge point qualifies when it has a current EVSE linked to a roaming EVSE. Full access takes precedence at mixed locations. Neither the location's enabled status nor a current charge point's enabled status limits this restricted read. Deleted charge points and charging zones do not qualify. The restricted representation exposes only `id`, `operatorId`, `roamingOperatorId`, `isRoaming`, `name`, `description`, `shortDescription`, `additionalDescription`, `geoposition`, `address`, `streetAddress`, `city`, `region` or `state` according to country, `country`, `postCode`, `timezone`, `workingHours`, `facilities`, `accessMethods`, `accessibilityType` and `lastUpdatedAt` when those properties are present under the existing response rules. `accessibilityType` is always present; invalid or missing stored values use `free_publicly_accessible` in this representation. Requested `include[]=locationImage` and `include[]=images` may add `locationImage` and `images`; other requested includes are ignored. Restricted `workingHours` contains only `isAlwaysOpen` and, when the location is not always open, `hours`. It excludes user-group IDs and administrative charging controls. In particular, the restricted representation never exposes `status`, `externalId`, `tags`, `roaming`, `parkingType`, `paymentOptions`, `acceptedPaymentBrands`, `createdAt`, `averagePrice`, `locationPin`, `chargingZones`, `partnerIds`, `externalAppData` or `notes`. Newly added full-response fields are not automatically public. This exception affects only this v2 detail read: location listings, v1, admin access and mutations retain their existing permissions and output. Site managers do not receive the restricted exception, even for unmanaged public locations; operators and reimbursement-only accounts do not receive it either. Missing or deleted locations return 404; existing locations without qualifying current charge points, location view permission, or the required operator scope return 403.",
32215
32729
  "tags": [
32216
32730
  "resource / locations"
32217
32731
  ],
32218
32732
  "responses": {
32219
32733
  "200": {
32220
- "description": "Location returned"
32734
+ "description": "Full or restricted public location returned"
32221
32735
  },
32222
32736
  "401": {
32223
32737
  "description": "Access token is missing or invalid"
@@ -32228,6 +32742,9 @@
32228
32742
  "404": {
32229
32743
  "description": "The record is not found"
32230
32744
  },
32745
+ "422": {
32746
+ "description": "The payload you provided is invalid"
32747
+ },
32231
32748
  "429": {
32232
32749
  "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
32233
32750
  }
@@ -39721,7 +40238,7 @@
39721
40238
  "method": "POST",
39722
40239
  "operationId": "partnerInviteCreateV2_0",
39723
40240
  "summary": "Partner invite / Create",
39724
- "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.",
40241
+ "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, since the listed entities are validated against that user — listed RFIDs must belong to the invite's partner and must either belong to that user or have no owner, and listed vehicles must belong to the invite's partner. 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. Declaring coverage of specific entities also assigns them to the invited user: listed RFIDs with no owner get that user as their owner, and that user is added to the users of listed vehicles they are not yet a user of. This happens when the invite is accepted if it is still pending, or as part of the write itself when the invite is already accepted — including on the update endpoint. **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.",
39725
40242
  "tags": [
39726
40243
  "resource / partner invites"
39727
40244
  ],
@@ -39850,7 +40367,7 @@
39850
40367
  "items": {
39851
40368
  "type": "integer"
39852
40369
  },
39853
- "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`."
40370
+ "description": "The covered set of RFID IDs. Required and must be non-empty when type is `allow`; each must belong to the invite's partner, and must either belong to the invited user or have no owner. Listed RFIDs that are not yet attached are attached automatically, and attached RFIDs left off the list are detached. A listed RFID with no owner is assigned to the invited user when the invite is accepted if it is still pending, or as part of the write itself when the invite is already accepted. Omitted when type is `none`."
39854
40371
  }
39855
40372
  },
39856
40373
  "required": [
@@ -39874,7 +40391,7 @@
39874
40391
  "items": {
39875
40392
  "type": "integer"
39876
40393
  },
39877
- "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`."
40394
+ "description": "The covered set of vehicle IDs. Required and must be non-empty when type is `allow`; each must belong to the invite's partner. Listed vehicles that are not yet attached are attached automatically, and attached vehicles left off the list are detached. The invited user is added to the users of a listed vehicle they are not yet a user of when the invite is accepted if it is still pending, or as part of the write itself when the invite is already accepted. Omitted when type is `none`."
39878
40395
  }
39879
40396
  },
39880
40397
  "required": [
@@ -39883,7 +40400,7 @@
39883
40400
  "description": "Reimbursement coverage for the invite's vehicles."
39884
40401
  }
39885
40402
  },
39886
- "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."
40403
+ "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 (RFIDs must belong to the invite's partner and must either belong to the invited user or have no owner, and vehicles must belong to the invite's partner), and attached entities left off the list are detached. Listed RFIDs that have no owner are assigned to the invited user, and the invited user is added to the users of listed vehicles they are not yet a user of — when the invite is accepted if it is still pending, or as part of the write itself when the invite is already accepted."
39887
40404
  }
39888
40405
  },
39889
40406
  "description": "Home-charging reimbursement settings for the invite. Ignored when home-charging reimbursement is disabled."
@@ -39990,7 +40507,7 @@
39990
40507
  "method": "PATCH",
39991
40508
  "operationId": "partnerInviteUpdateV2_0",
39992
40509
  "summary": "Partner invite / Update",
39993
- "description": "Update 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.",
40510
+ "description": "Update a partner invite. Declaring reimbursement coverage of specific RFIDs and vehicles (`allow`) also assigns them to the invited user: listed RFIDs with no owner get that user as their owner, and that user is added to the users of listed vehicles they are not yet a user of. When the invite is still pending this happens once it is accepted; when the invite is already accepted it happens as part of this request. Listed RFIDs must belong to the invite's partner and must either belong to the invited user or have no owner, and listed vehicles must belong to the invite's partner. **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.",
39994
40511
  "tags": [
39995
40512
  "resource / partner invites"
39996
40513
  ],
@@ -40049,7 +40566,7 @@
40049
40566
  "items": {
40050
40567
  "type": "integer"
40051
40568
  },
40052
- "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`."
40569
+ "description": "The covered set of RFID IDs. Required and must be non-empty when type is `allow`; each must belong to the invite's partner, and must either belong to the invited user or have no owner. Listed RFIDs that are not yet attached are attached automatically, and attached RFIDs left off the list are detached. A listed RFID with no owner is assigned to the invited user when the invite is accepted if it is still pending, or as part of the write itself when the invite is already accepted. Omitted when type is `none`."
40053
40570
  }
40054
40571
  },
40055
40572
  "required": [
@@ -40073,7 +40590,7 @@
40073
40590
  "items": {
40074
40591
  "type": "integer"
40075
40592
  },
40076
- "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`."
40593
+ "description": "The covered set of vehicle IDs. Required and must be non-empty when type is `allow`; each must belong to the invite's partner. Listed vehicles that are not yet attached are attached automatically, and attached vehicles left off the list are detached. The invited user is added to the users of a listed vehicle they are not yet a user of when the invite is accepted if it is still pending, or as part of the write itself when the invite is already accepted. Omitted when type is `none`."
40077
40594
  }
40078
40595
  },
40079
40596
  "required": [
@@ -40082,7 +40599,7 @@
40082
40599
  "description": "Reimbursement coverage for the invite's vehicles."
40083
40600
  }
40084
40601
  },
40085
- "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."
40602
+ "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 (RFIDs must belong to the invite's partner and must either belong to the invited user or have no owner, and vehicles must belong to the invite's partner), and attached entities left off the list are detached. Listed RFIDs that have no owner are assigned to the invited user, and the invited user is added to the users of listed vehicles they are not yet a user of — when the invite is accepted if it is still pending, or as part of the write itself when the invite is already accepted."
40086
40603
  }
40087
40604
  },
40088
40605
  "description": "Home-charging reimbursement settings for the invite. Omit the object to leave every reimbursement setting unchanged. Ignored when home-charging reimbursement is disabled."
@@ -40460,6 +40977,7 @@
40460
40977
  "type": "string",
40461
40978
  "enum": [
40462
40979
  "electricity-tax-reimbursement",
40980
+ "home-charging-reimbursement",
40463
40981
  "private-evse-access-fee",
40464
40982
  "session-cpo"
40465
40983
  ],
@@ -40504,6 +41022,11 @@
40504
41022
  "type": "string",
40505
41023
  "format": "date-time",
40506
41024
  "description": "ISO 8601 formatted date. Lists only the revenue records that were last updated on and before this datetime"
41025
+ },
41026
+ "customFields": {
41027
+ "type": "object",
41028
+ "additionalProperties": true,
41029
+ "description": "Filter a resource listing by administrator-defined custom fields using literal dotted keys such as `filter[customFields.reference]=INV-42`, not nested `filter[customFields][reference]` keys. Text, email and URL fields accept a single string and use case- and accent-insensitive substring matching; `%`, `_` and backslashes are matched literally. Boolean fields accept `true`, `false`, `1` or `0` as strings, or boolean and integer equivalents. Number, date and date-time fields accept inclusive `filter[customFields.<identifier>][from]` and/or `filter[customFields.<identifier>][to]` bounds, including one-sided ranges. Number bounds are decimal strings from `-99999999999999.999999` to `99999999999999.999999` with at most six fractional places, compared without rounding. Dates use `YYYY-MM-DD` calendar dates; date-times use ISO 8601, with offsets normalized to UTC and no offset interpreted as UTC. Long text and JSON fields are not filterable. Custom-field criteria combine with each other and the resource's other filters using AND. Empty criteria have no effect. Malformed values for usable fields return a property-bound `422` validation error. See each listing operation for how it handles unsupported nonempty criteria."
40507
41030
  }
40508
41031
  }
40509
41032
  }
@@ -40525,11 +41048,17 @@
40525
41048
  "200": {
40526
41049
  "description": "Success"
40527
41050
  },
41051
+ "400": {
41052
+ "description": "Bad Request"
41053
+ },
40528
41054
  "401": {
40529
41055
  "description": "Access token is missing or invalid"
40530
41056
  },
40531
41057
  "403": {
40532
41058
  "description": "You do not have permission to perform the action"
41059
+ },
41060
+ "422": {
41061
+ "description": "The payload you provided is invalid"
40533
41062
  }
40534
41063
  }
40535
41064
  },
@@ -43381,7 +43910,8 @@
43381
43910
  "discount": {
43382
43911
  "type": "number",
43383
43912
  "format": "decimal",
43384
- "nullable": true
43913
+ "nullable": true,
43914
+ "description": "The current discount. An active or scheduled discount change can replace this value when it starts or ends; see the partner's discount changes."
43385
43915
  }
43386
43916
  }
43387
43917
  },
@@ -44442,7 +44972,8 @@
44442
44972
  "discount": {
44443
44973
  "type": "number",
44444
44974
  "format": "decimal",
44445
- "nullable": true
44975
+ "nullable": true,
44976
+ "description": "The current discount. An active or scheduled discount change can replace this value when it starts or ends; see the partner's discount changes."
44446
44977
  }
44447
44978
  }
44448
44979
  },
@@ -44880,6 +45411,343 @@
44880
45411
  }
44881
45412
  }
44882
45413
  },
45414
+ {
45415
+ "path": "/public-api/resources/partners/v2.0/{partner}/discount-changes",
45416
+ "method": "GET",
45417
+ "operationId": "partnerDiscountChangesListing",
45418
+ "summary": "Partner discount changes / Listing",
45419
+ "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 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. List the partner’s discount schedule history, including when corporate billing is disabled. Results use cursor pagination, newest ID first, with a default and maximum page size of 100. Filters are inclusive and ignore unfilled values. Use updatedAfter and updatedBefore to poll both manual and automatic changes. **Required permission:** `Partners.update` on the visible parent partner. Missing, out-of-scope or wrong-parent identifiers return 404; a visible partner without edit permission returns 403.",
45420
+ "tags": [
45421
+ "resource / partners"
45422
+ ],
45423
+ "parameters": {
45424
+ "query": {
45425
+ "filter": {
45426
+ "schema": {
45427
+ "type": "object",
45428
+ "properties": {
45429
+ "status": {
45430
+ "oneOf": [
45431
+ {
45432
+ "type": "string",
45433
+ "enum": [
45434
+ "scheduled",
45435
+ "active",
45436
+ "completed",
45437
+ "cancelled",
45438
+ "failed"
45439
+ ],
45440
+ "description": "Discount change lifecycle state: * `scheduled` — Waiting for its start boundary. * `active` — The limited change has started and awaits its end. * `completed` — The change has finished, or its permanent rate has been applied. * `cancelled` — The change was cancelled without applying its future boundary. * `failed` — Applying a scheduled discount boundary failed."
45441
+ },
45442
+ {
45443
+ "type": "string",
45444
+ "minLength": 0,
45445
+ "maxLength": 0
45446
+ },
45447
+ {
45448
+ "type": "array",
45449
+ "items": {
45450
+ "oneOf": [
45451
+ {
45452
+ "type": "string",
45453
+ "enum": [
45454
+ "scheduled",
45455
+ "active",
45456
+ "completed",
45457
+ "cancelled",
45458
+ "failed"
45459
+ ],
45460
+ "description": "Discount change lifecycle state: * `scheduled` — Waiting for its start boundary. * `active` — The limited change has started and awaits its end. * `completed` — The change has finished, or its permanent rate has been applied. * `cancelled` — The change was cancelled without applying its future boundary. * `failed` — Applying a scheduled discount boundary failed."
45461
+ },
45462
+ {
45463
+ "type": "string",
45464
+ "minLength": 0,
45465
+ "maxLength": 0
45466
+ }
45467
+ ]
45468
+ }
45469
+ }
45470
+ ],
45471
+ "description": "Filter by one status or an array of statuses (for example, filter[status][0]=scheduled&filter[status][1]=active). Empty values, including empty array elements, are ignored. An array containing only empty elements applies no status filter."
45472
+ },
45473
+ "startsAfter": {
45474
+ "oneOf": [
45475
+ {
45476
+ "type": "string",
45477
+ "format": "date-time"
45478
+ },
45479
+ {
45480
+ "type": "string",
45481
+ "minLength": 0,
45482
+ "maxLength": 0
45483
+ }
45484
+ ],
45485
+ "description": "Include changes starting on or after this ISO 8601 timestamp, inclusively. Empty values are ignored."
45486
+ },
45487
+ "startsBefore": {
45488
+ "oneOf": [
45489
+ {
45490
+ "type": "string",
45491
+ "format": "date-time"
45492
+ },
45493
+ {
45494
+ "type": "string",
45495
+ "minLength": 0,
45496
+ "maxLength": 0
45497
+ }
45498
+ ],
45499
+ "description": "Include changes starting on or before this ISO 8601 timestamp, inclusively. Empty values are ignored."
45500
+ },
45501
+ "updatedAfter": {
45502
+ "oneOf": [
45503
+ {
45504
+ "type": "string",
45505
+ "format": "date-time"
45506
+ },
45507
+ {
45508
+ "type": "string",
45509
+ "minLength": 0,
45510
+ "maxLength": 0
45511
+ }
45512
+ ],
45513
+ "description": "Include changes updated on or after this ISO 8601 timestamp, inclusively, by an administrator or automatically. Uses update time, not creation time. Empty values are ignored."
45514
+ },
45515
+ "updatedBefore": {
45516
+ "oneOf": [
45517
+ {
45518
+ "type": "string",
45519
+ "format": "date-time"
45520
+ },
45521
+ {
45522
+ "type": "string",
45523
+ "minLength": 0,
45524
+ "maxLength": 0
45525
+ }
45526
+ ],
45527
+ "description": "Include changes updated on or before this ISO 8601 timestamp, inclusively. Empty values are ignored."
45528
+ }
45529
+ }
45530
+ }
45531
+ },
45532
+ "per_page": {
45533
+ "description": "The number of items to return per page.",
45534
+ "type": "integer",
45535
+ "minimum": 1,
45536
+ "maximum": 100,
45537
+ "default": 100
45538
+ },
45539
+ "cursor": {
45540
+ "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",
45541
+ "type": "string"
45542
+ }
45543
+ }
45544
+ },
45545
+ "responses": {
45546
+ "200": {
45547
+ "description": "Success"
45548
+ },
45549
+ "401": {
45550
+ "description": "Access token is missing or invalid"
45551
+ },
45552
+ "403": {
45553
+ "description": "You do not have permission to perform the action"
45554
+ },
45555
+ "404": {
45556
+ "description": "The record is not found"
45557
+ },
45558
+ "422": {
45559
+ "description": "The payload you provided is invalid"
45560
+ },
45561
+ "429": {
45562
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
45563
+ }
45564
+ }
45565
+ },
45566
+ {
45567
+ "path": "/public-api/resources/partners/v2.0/{partner}/discount-changes",
45568
+ "method": "POST",
45569
+ "operationId": "partnerDiscountChangeCreate",
45570
+ "summary": "Partner discount change / Create",
45571
+ "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 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. Create a future scheduled discount change for a partner with corporate billing enabled. Invalid fields or conditional revert combinations return 422 with API field names. Overlapping periods return 409 with message `Another scheduled discount change already covers this period.` Disabled corporate billing returns 409. The schedule does not change discounts captured for existing sessions. **Required permission:** `Partners.update` on the visible parent partner. Missing, out-of-scope or wrong-parent identifiers return 404; a visible partner without edit permission returns 403.",
45572
+ "tags": [
45573
+ "resource / partners"
45574
+ ],
45575
+ "requestBody": {
45576
+ "required": true,
45577
+ "content": {
45578
+ "application/json": {
45579
+ "schema": {
45580
+ "type": "object",
45581
+ "properties": {
45582
+ "discount": {
45583
+ "type": "number",
45584
+ "minimum": 0,
45585
+ "maximum": 100,
45586
+ "example": 12.5,
45587
+ "description": "Discount percentage, with at most two decimal places. Must be a JSON number, not a string."
45588
+ },
45589
+ "startsAt": {
45590
+ "type": "string",
45591
+ "format": "date-time",
45592
+ "example": "2027-01-01T00:00:00Z",
45593
+ "description": "Start timestamp. Requests must use a valid ISO 8601 timestamp with an explicit timezone or offset and minute precision (zero seconds and zero fractional seconds). Values are converted to UTC; responses use UTC."
45594
+ },
45595
+ "endsAt": {
45596
+ "type": "string",
45597
+ "format": "date-time",
45598
+ "example": "2027-02-01T00:00:00Z",
45599
+ "description": "End timestamp for a limited change. Requests require an explicit timezone or offset and minute precision (zero seconds and zero fractional seconds). Responses use UTC and may include seconds when ended early. Omitted for permanent changes."
45600
+ },
45601
+ "revertDiscount": {
45602
+ "type": "number",
45603
+ "minimum": 0,
45604
+ "maximum": 100,
45605
+ "example": 0,
45606
+ "description": "Discount percentage to apply when the limited change ends, with at most two decimal places. Must be a JSON number, not a string. Required when creating a limited change; omitted for permanent changes. May be omitted in incomplete historical records."
45607
+ },
45608
+ "note": {
45609
+ "type": "string",
45610
+ "maxLength": 16000,
45611
+ "description": "Optional note. Omitted in responses when empty."
45612
+ }
45613
+ },
45614
+ "required": [
45615
+ "discount",
45616
+ "startsAt"
45617
+ ],
45618
+ "description": "Create a scheduled change with a future start. For a limited change, endsAt must be after startsAt and revertDiscount is required. For a permanent change, omit both endsAt and revertDiscount. Optional properties cannot be null. Periods must not overlap; adjacent periods are allowed. A permanent change represents a point in the schedule, not an indefinite occupied period."
45619
+ }
45620
+ }
45621
+ }
45622
+ },
45623
+ "responses": {
45624
+ "201": {
45625
+ "description": "Success"
45626
+ },
45627
+ "401": {
45628
+ "description": "Access token is missing or invalid"
45629
+ },
45630
+ "403": {
45631
+ "description": "You do not have permission to perform the action"
45632
+ },
45633
+ "404": {
45634
+ "description": "The record is not found"
45635
+ },
45636
+ "409": {
45637
+ "description": "The request could not be completed due to a conflict with the current state of the resource. The operation may succeed if retried."
45638
+ },
45639
+ "422": {
45640
+ "description": "The payload you provided is invalid"
45641
+ },
45642
+ "429": {
45643
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
45644
+ }
45645
+ }
45646
+ },
45647
+ {
45648
+ "path": "/public-api/resources/partners/v2.0/{partner}/discount-changes/{discountChange}",
45649
+ "method": "GET",
45650
+ "operationId": "partnerDiscountChangeRead",
45651
+ "summary": "Partner discount change / Read",
45652
+ "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 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. Read one discount change belonging to the visible partner, including historical changes when corporate billing is disabled. Optional values are omitted, not null. Failure metadata is omitted as a whole when historical required metadata is incomplete. **Required permission:** `Partners.update` on the visible parent partner. Missing, out-of-scope or wrong-parent identifiers return 404; a visible partner without edit permission returns 403.",
45653
+ "tags": [
45654
+ "resource / partners"
45655
+ ],
45656
+ "responses": {
45657
+ "200": {
45658
+ "description": "Success"
45659
+ },
45660
+ "401": {
45661
+ "description": "Access token is missing or invalid"
45662
+ },
45663
+ "403": {
45664
+ "description": "You do not have permission to perform the action"
45665
+ },
45666
+ "404": {
45667
+ "description": "The record is not found"
45668
+ },
45669
+ "429": {
45670
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
45671
+ }
45672
+ }
45673
+ },
45674
+ {
45675
+ "path": "/public-api/resources/partners/v2.0/{partner}/discount-changes/{discountChange}",
45676
+ "method": "PATCH",
45677
+ "operationId": "partnerDiscountChangeUpdate",
45678
+ "summary": "Partner discount change / Update",
45679
+ "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 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. Partially edit a scheduled or active change under the current stored state. Omitted properties are preserved; only endsAt and note can be cleared with null. Unchanged active start and discount values are accepted. An empty or semantically identical edit leaves timestamps, actor, reason and audit unchanged, even when a scheduled start is due but not processed. Effective edits record the administrator and clear the automatic reason. Invalid supplied fields, conditional revert combinations and clearing an active end return 422 with API field names. For effective edits, an invalid startsAt or endsAt supplied in the request returns 422; when only an omitted stored timestamp blocks the edit, the response is 409 without field-validation errors. If both supplied and omitted timestamps fail validation, the supplied-field errors return 422. Disabled billing, terminal states and changed active start or discount return 409. Overlap returns 409 with message `Another scheduled discount change already covers this period.` **Required permission:** `Partners.update` on the visible parent partner. Missing, out-of-scope or wrong-parent identifiers return 404; a visible partner without edit permission returns 403.",
45680
+ "tags": [
45681
+ "resource / partners"
45682
+ ],
45683
+ "requestBody": {
45684
+ "required": true,
45685
+ "content": {
45686
+ "application/json": {
45687
+ "schema": {
45688
+ "type": "object",
45689
+ "properties": {
45690
+ "discount": {
45691
+ "type": "number",
45692
+ "minimum": 0,
45693
+ "maximum": 100,
45694
+ "example": 12.5,
45695
+ "description": "Discount percentage, with at most two decimal places. Must be a JSON number, not a string."
45696
+ },
45697
+ "startsAt": {
45698
+ "type": "string",
45699
+ "format": "date-time",
45700
+ "example": "2027-01-01T00:00:00Z",
45701
+ "description": "Start timestamp. Requests must use a valid ISO 8601 timestamp with an explicit timezone or offset and minute precision (zero seconds and zero fractional seconds). Values are converted to UTC; responses use UTC."
45702
+ },
45703
+ "endsAt": {
45704
+ "type": "string",
45705
+ "format": "date-time",
45706
+ "example": "2027-02-01T00:00:00Z",
45707
+ "description": "End timestamp for a limited change. Requests require an explicit timezone or offset and minute precision (zero seconds and zero fractional seconds). Responses use UTC and may include seconds when ended early. Omitted for permanent changes."
45708
+ },
45709
+ "revertDiscount": {
45710
+ "type": "number",
45711
+ "minimum": 0,
45712
+ "maximum": 100,
45713
+ "example": 0,
45714
+ "description": "Discount percentage to apply when the limited change ends, with at most two decimal places. Must be a JSON number, not a string. Required when creating a limited change; omitted for permanent changes. May be omitted in incomplete historical records."
45715
+ },
45716
+ "note": {
45717
+ "type": "string",
45718
+ "maxLength": 16000,
45719
+ "description": "Optional note. Omitted in responses when empty."
45720
+ }
45721
+ },
45722
+ "description": "Partial edit of a scheduled or active change. Omission preserves each stored value. Only endsAt and note accept explicit null. A revertDiscount without an effective end is invalid. Active startsAt and discount cannot change, but numerically identical percentages and equivalent UTC start instants are accepted. Empty or semantically identical edits preserve timestamps, actor, reason and audit history, including due-but-unprocessed scheduled changes. Malformed input and prohibited combinations remain invalid. Effective scheduled edits require a future start and validate the entire resulting period. An invalid supplied startsAt or endsAt returns 422 with that API field's validation errors; an edit blocked only by an omitted stored timestamp returns 409 without field-validation errors. Supplied-field validation errors take precedence when both supplied and omitted timestamps are invalid. Terminal states and disabled corporate billing reject even a no-op. Effective edits record the administrator and clear the automatic reason."
45723
+ }
45724
+ }
45725
+ }
45726
+ },
45727
+ "responses": {
45728
+ "200": {
45729
+ "description": "Success"
45730
+ },
45731
+ "401": {
45732
+ "description": "Access token is missing or invalid"
45733
+ },
45734
+ "403": {
45735
+ "description": "You do not have permission to perform the action"
45736
+ },
45737
+ "404": {
45738
+ "description": "The record is not found"
45739
+ },
45740
+ "409": {
45741
+ "description": "The request could not be completed due to a conflict with the current state of the resource. The operation may succeed if retried."
45742
+ },
45743
+ "422": {
45744
+ "description": "The payload you provided is invalid"
45745
+ },
45746
+ "429": {
45747
+ "description": "Too many requests. Please try again later. For more information, please check the rate limit headers X-RateLimit-*"
45748
+ }
45749
+ }
45750
+ },
44883
45751
  {
44884
45752
  "path": "/public-api/resources/partners/v2.0/{partner}/notes",
44885
45753
  "method": "GET",
@@ -50885,6 +51753,15 @@
50885
51753
  "schema": {
50886
51754
  "type": "object",
50887
51755
  "properties": {
51756
+ "type": {
51757
+ "type": "string",
51758
+ "enum": [
51759
+ "user",
51760
+ "partner"
51761
+ ],
51762
+ "example": "user",
51763
+ "description": "The kind of aggregate a reimbursement report represents: - **user**: The report aggregates the records owed to a single beneficiary user. - **partner**: The report aggregates the records owed by a single payer partner contract."
51764
+ },
50888
51765
  "reimbursementType": {
50889
51766
  "type": "string",
50890
51767
  "enum": [
@@ -74007,7 +74884,7 @@
74007
74884
  ],
74008
74885
  "info": {
74009
74886
  "title": "Public API",
74010
- "version": "3.257.2",
74887
+ "version": "3.258.0",
74011
74888
  "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"
74012
74889
  },
74013
74890
  "servers": [
@@ -74021,18 +74898,18 @@
74021
74898
  }
74022
74899
  }
74023
74900
  ],
74024
- "buildTimestamp": "2026-10-05T10:14:39.537Z",
74901
+ "buildTimestamp": "2026-10-06T08:04:45.296Z",
74025
74902
  "stats": {
74026
- "totalEndpoints": 666,
74027
- "originalSize": 6403121,
74028
- "optimizedSize": 1774310,
74029
- "reductionPercent": 72.29,
74030
- "buildDuration": 2675,
74903
+ "totalEndpoints": 679,
74904
+ "originalSize": 6525064,
74905
+ "optimizedSize": 1829203,
74906
+ "reductionPercent": 71.97,
74907
+ "buildDuration": 1693,
74031
74908
  "responseSchemas": {
74032
- "total": 666,
74033
- "withSchemas": 666,
74034
- "totalSchemaSize": 3687990,
74035
- "averageSchemaSize": 5538
74909
+ "total": 679,
74910
+ "withSchemas": 679,
74911
+ "totalSchemaSize": 3739771,
74912
+ "averageSchemaSize": 5508
74036
74913
  }
74037
74914
  }
74038
74915
  }