OCPI v2.2.1
Introduction
This API uses the oAuth2 client credentials grant type to secure all the communications. For more information, check the Authentication/Authorization guide.
The OCPI API is organized around REST and GraphQL. Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.
This API provides users with the ability to manage credentials, locations, sessions, tariffs, tokens and charge detail records (CDRs) for electric vehicle (EV) charging infrastructure. Additionally, the GraphQL endpoint allows for more flexible queries and mutations against the data.
This API uses the oAuth2 client credentials grant type to secure all communications. All requests to the API must be authenticated using a bearer token. For more information, check the Authentication/Authorization guide.
Use Cases
The OCPI API provides a robust and efficient way for operators to manage their electric vehicle (EV) charging infrastructure. By leveraging both REST and GraphQL endpoints, users can streamline operations, enhance real-time data access, and improve the overall user experience for both administrators and end-users.
-
Digital Transformation for Charging Network Operators
The OCPI API enables operators to modernize their charging infrastructure management with a simple and intuitive user interface, real-time data access, and comprehensive functionalities.
-
New Digital Experience for Operators
Operators can now interact with a user-friendly digital platform that simplifies the process of managing locations, sessions, tariffs, tokens, and CDRs. The API supports intuitive UIs and provides preview options for real-time data visualization.
-
Real-Time Data Management
With real-time data capabilities, operators can create, update, and synchronize data across all connected systems instantly. This reduces the time and effort required to manage the charging infrastructure and ensures data consistency across the network.
-
Improved Session and Tariff Management
Operators can efficiently manage charging sessions and pricing tariffs, ensuring accurate billing and optimal resource utilization. Access detailed information about specific sessions, including start/end times, energy consumption, and costs. Access comprehensive tariff information to ensure transparent and accurate billing.
-
Flexible Data Queries
Use GraphQL to perform complex queries and retrieve customized data sets for detailed analysis.
Benefits
The primary focus is on enhancing the management experience for EV charging network operators. The benefits of using the OCPI API include:
-
Enhanced Operational Efficiency
Simplified resource management with intuitive interfaces and real-time synchronization of data across multiple systems.
-
Flexibility and Customization
Ability to perform complex queries and operations using GraphQL and use detailed and customizable data retrieval options.
-
Improved Data Accuracy and Reliability
Real-time data validation and error feedback and a comprehensive logging and monitoring of all API interactions.
-
Security and Compliance
Secure communications using OAuth2 client credentials. Compliance with industry standards for data protection.
-
Real-Time Error Feedback
The API provides immediate validation and error feedback for all operations, reducing the likelihood of data entry errors and enabling operators to quickly identify and resolve issues.
-
Comprehensive Reporting and Analytics
The OCPI API supports detailed reporting and analytics, providing operators with valuable insights into the performance and utilization of their charging infrastructure.
Quick Start Guide for EMobility OCPI API
This API is secured by OAuth 2.0. It uses the 'Client Credentials' Grant Type to allow the API consumer to access data. The process is details with the diagram below.
Base URLs
Auth API
| Environment | Base URL |
|---|---|
| UAT | https://api-test.shell.com/ |
| PROD | https://api.shell.com/ |
EMobility OCPI API
| Environment | Base URL |
|---|---|
| UAT | https://{TBD}/ |
| PROD | https://{TBD}/ |
1. Request Client ID and Secret
Contact Shell API Team in order to request access to OAuth authentication.
2. Generate and provide Client ID and Secret
Shell API team will generate the credentials and you will be intimated via email with all the details.
3. Request Access Token
Once you receive the credentials next step is to call the /token.oauth2 endpoint to authenticate. Below are the key parameters.
Key request parameters
| Element | Value |
|---|---|
| Method | POST |
| Endpoint | /v2/oauth/token |
| Headers | Content-Type: application/x-www-form-urlencoded |
| Body | _clientid: ********** |
_clientsecret: ********* |
|
_granttype: client_credentials |
Sample request
curl --location --request POST 'https://api-test.shell.com/v2/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=**************' \
--data-urlencode 'client_secret=**************' \
--data-urlencode 'grant_type=client_credentials'
4. Get an access token
On receiving the request Shell Authorizaton system will verify all the parameters in the request and, if everything checks out, it will generate your access token and return it in the response.
Key response parameters
The response will contain the following parameters:
| Element | Value |
|---|---|
| access_token | The token to be used to call the functional APIs |
| expires_in | The amount of seconds until the access token expires |
| token_type | Bearer |
Sample response
{
"access_token": "**************",
"expires_in": "899",
"token_type": "Bearer"
}
Note: Make a note that the expires_in is always in seconds.
5. Call the Functional API
While calling Shell API’s include the following in the header of the request. Note the space after Bearer.
Authorization: "Bearer " + access_token
Note: This endpoint doesn't return refresh token. Hence in case the bearer token expires the same endpoint should be called to retrieve new bearer token
Troubleshooting authentication
The following table lists common authentication errors and possible causes:
| HTTP Status Code | Value | Possible causes |
|---|---|---|
| 400 | Bad request | Missing or incorrect parameters or header values |
| 401 | Unauthorized |
All error scenarios are returned with a response body and identifier. Few examples below for
Example 1 : HTTP 400 - Bad Request
{
"ErrorCode": "invalid_request",
"Error": "Unsupported grant type : client_credential"
}
Example 2 : HTTP 401 - Unauthorized
{
"ErrorCode": "invalid_client",
"Error": "ClientId is Invalid"
}
Fundamentals
Requests
The EMobility OCPI API provides a set of endpoints, each with its unique path. It is based on REST principles. Data resources are accessed via standard HTTPS requests in UTF-8 format. List of verbs in EMobility OCPI API:
- GET - Retrieve data.
Responses
The responses always include a JSON object. Check the API documentation to find descriptions of common responses for each endpoint.
Response Status Codes
The EMobility OCPI API uses the following response status codes defined in RFC 2616 and RFC 6585.
- 200 - The request has succeeded. The Partner application can read the result of the request in the body and the headers of the response.
- 400 - Bad request. Due to malformed syntax, the server could not understand the request. The body will contain more information.
- 401 - Unauthorized. The request requires user authentication, and it has been refused for those credentials.
- 403 - Forbidden. The server understood the request but is refusing to fulfill it.
- 404 - Not Found - The requested resource could not be found. This error can be due to a temporary or permanent condition.
- 422 - Unprocessable content. The server understood the request but is unable to process it.
- 500 - Internal Server Error. This error should not happen but if you receive it, something went wrong, please report it to us.
Client Status Codes
Requests that reach the endpoints should return an OCPI response message with a status_code field as defined below.
- 1xxx - The request has succeeded.
- 2xxx - Client errors – The data sent by the client can not be processed by the server.
- 3xxx - Server errors – The server encountered an internal error.
- 4xxx - Hub errors – For errors that a Hub encounters while routing messages, the following OCPI status codes shall be used.
1xxx: Success
- 1000 - Generic success code.
- 19xx - Reserved range for custom success status codes (1900-1999).
2xxx: Client errors
- 2000 - Generic client error.
- 2001 - Invalid or missing parameters.
- 2002 - Not enough information, for example: Authorization request with too little information.
- 2003 - Unknown Location, for example: Command: START_SESSION with unknown location.
- 2004 - Unknown Token, for example: 'real-time' authorization of an unknown Token.
- 29xx - Reserved range for custom client error status codes (2900-2999).
3xxx: Server errors
- 3000 - Generic server error.
- 3001 - Unable to use the client’s API. For example during the credentials registration: When the initializing party requests data from the other party during the open POST call to its credentials endpoint. If one of the GETs can not be processed, the party should return this error in the POST response.
- 3002 - Unsupported version.
- 3003 - No matching endpoints or expected endpoints missing between parties. Used during the registration process if the two parties do not have any mutual modules or endpoints available, or the minimum expected by the other party implementation.
- 39xx - Reserved range for custom server error status codes (3900-3999).
4xxx: Hub errors
- 4000 - Generic error.
- 4001 - Unknown receiver (TO address is unknown).
- 4002 - Timeout on forwarded request (message is forwarded, but request times out).
- 4003 -Connection problem (receiving party is not connected).
- 49xx - Reserved range for custom hub error status codes (4900-4999).
Response Schemas
All success scenarios are returned with the same response body structure:
{
"data": [{}],
"status_code": 0,
"status_message": "string",
"timestamp": "2024-07-16T16:54:24.063Z"
}
| KEY | VALUE TYPE | VALUE DESCRIPTION |
|---|---|---|
| _statuscode | Int | Response code, as listed in Status Codes, indicates how the request was handled. To avoid confusion with HTTP codes, at least four digits are used. |
| _statusmessage | String | An optional status message which may help when debugging. |
| timestamp | String | The time this message was generated. |
| data | Array or Object or String | Contains the actual response data object or list of objects from each request, depending on the cardinality of the response data, this is an array (card. * or +), or a single object (card. 1 or ?) |
Response Error Schemas
All error scenarios are returned with the same response body structure:
{
"status_code": 0,
"status_message": "string",
"timestamp": "2024-07-16T16:54:24.063Z"
}
| KEY | VALUE TYPE | VALUE DESCRIPTION |
|---|---|---|
| _statuscode | Int | Response code, as listed in Status Codes, indicates how the request was handled. To avoid confusion with HTTP codes, at least four digits are used. |
| _statusmessage | String | An optional status message which may help when debugging. |
| timestamp | String | The time this message was generated. |
Versioning
Your API version controls the API behavior you see (what properties you see in responses, what parameters you're allowed to send in requests, and so on). Your version is set in the URL. When a breaking change is introduced to the EMobility OCPI API, an updated version is released. The current version is v1. This is the only version available at this moment.
Backwards-compatible changes
We consider the following changes to be backward-compatible:
- Adding new API resources.
- Adding new optional request parameters to existing API endpoints.
- Adding new properties to existing API responses.
- Changing the order of properties in existing API responses.
- Changing the length or format of opaque strings, such as object IDs, error messages, and other human-readable strings.
Pagination
All GET methods that return a list of objects have pagination, this allows a client and server to control the amount of objects returned in the response to a GET request, while still enabling the client to retrieve all objects by doing multiple request with different parameters. Without pagination the server had to return all objects in one response that could potentially contain millions of objects. To enable pagination of the returned list of objects, additional URL parameters are allowed for the GET request.
Pagination request
| PARAMETER | DESCRIPTION |
|---|---|
| offset | The offset of the first object returned. Default is 0 (the first object). |
| limit | Maximum number of objects to GET. Note: the server might decide to return fewer objects, either because there are no more objects, or the server limits the maximum number of objects to return. This is to prevent, for example, overloading the system. |
Example: With offset=0 and limit=10 the server shall return the first 10 records (if 10 objects match the request). Then next page starts with offset=10.
Pagination response
HTTP headers that have to be added to any paginated GET response.
| HTTP HEADER | DESCRIPTION |
|---|---|
| Link | Link to the ‘next’ page should be provided, when this is NOT the last page. The Link should also contain any filters present in the original request. See example below. |
| X-Total-Count | (Custom HTTP Header) Total number of objects available in the server system that match the given query (including the given query parameters, for example: date_to and date_from but excluding limit and offset) and that are available to this client. For example: The CPO server might return fewer CDR objects to an eMSP than the total number of CDRs available in the CPO system. |
| X-Limit | (Custom HTTP Header) Number of objects that are returned. Note that this is an upper limit; if there are not enough remaining objects to return, fewer objects than this upper limit number will be returned. |
Cardinality
| SYMBOL | DESCRIPTION | TYPE |
|---|---|---|
| ? | An optional object. If not set, it might be null, or the field might be omitted. When the field is omitted and it has a default value, the value is the default value. | Object |
| 1 | Required object. | Object |
| * | A list of zero or more objects. If empty, it might be null, [] or the field might be omitted. | [Object] |
| + | A list of at least one object. | [Object] |
Security
The EMobility OCPI API forces HTTPS for all services using TLS (SSL).
The EMobility OCPI API does not require client side certificates for authentication, only server side certificates in order to setup a secure SSL connection.
Types
| TYPE | DESCRIPTION |
|---|---|
| DateTime | All timestamps are formatted as string(25) following RFC 3339, with some additional limitations. All timestamps SHALL be in UTC. The absence of the timezone designator implies a UTC timestamp. Fractional seconds MAY be used. |
| URL | An URL a string(255) type following the w3.org spec. |
| number | Numbers in OCPI are formatted as JSON numbers. Unless mentioned otherwise, numbers use 4 decimals and a sufficiently large amount of digits. |
| CiString | Case Insensitive String. Only printable ASCII allowed. (Non-printable characters like: Carriage returns, Tabs, Line breaks, etc are not allowed) |
List endpoints and resource name
- Get all Locations
- Get a particular Location
- Get a particular EVSE
- Get a particular Connector
- Get all Tariffs
- Get a particular Tariff
- Get all Sessions
- Get a particular Session
- Get all CDRs
- Get a particular CDR
- Send a command
Get all Locations
Introduction
This API, will return the private charging locations.
The API also provide further search options to filter the result set.
- Based on the last updated date between two given dates.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST QUERY PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _datefrom | DateTime | No | Only return Locations that have last_updated after this Date/Time. |
| _dateto | DateTime | No | Only return Locations that have last_updated before this Date/Time. |
| offset | int | No | The offset of the first object returned. Default is 0. |
| limit | int | No | Maximum number of objects to GET. |
Sample Request
curl --location '{{url}}/v1/locations/?date_from=xxx&date_to=yyy' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a array of JSON objects with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| country_code | CiString(2) | 1 | ISO 3166-1 alpha-3 code for the country of this location. |
| party_id | CiString(3) | 1 | ID of the CPO that 'owns' this Location (following the ISO-15118 standard). |
| id | CiString(36) | 1 | Uniquely identifies the location within the CPOs platform (and suboperator platforms). This field can never be changed, modified or renamed. |
| publish | boolean | 1 | Defines if a Location may be published on an website or app etc. When this is set to false, only tokens identified in the field: publish_allowed_to are allowed to be shown this Location. When the same location has EVSEs that may be published and may not be published, two 'Locations' should be created. |
| publish_allowed_to | PublishTokenType(JSON) | * | This field may only be used when the publish field is set to false. Only owners of Tokens that match all the set fields of one PublishToken in the list are allowed to be shown this location. |
| publish_allowed_to.uid | CiString(36) | ? | Unique ID by which this Token can be identified. |
| publish_allowed_to.type | TokenType(Enum) | ? | Type of the token. Could be AD_HOC_USER, APP_USER, OTHER or RFID. |
| publish_allowed_to.visual_number | string(64) | ? | Visual readable number/identification as printed on the Token (RFID card). |
| publish_allowed_to.issuer | string(64) | ? | Issuing company, most of the times the name of the company printed on the token (RFID card), not necessarily the eMSP. |
| publish_allowed_to.group_id | CiString(36) | ? | This ID groups a couple of tokens. This can be used to make two or more tokens work as one. |
| name | string(255) | ? | Display name of the location. |
| address | string(45) | 1 | Street/block name and house number if available. |
| city | string(45) | 1 | City or town. |
| postal_code | string(10) | ? | Postal code of the location. |
| state | string(20) | ? | State or province of the location, only to be used when relevant. |
| country | string(3) | 1 | ISO 3166-1 alpha-3 code for the country of this location. |
| coordinates | GeoLocation | 1 | Coordinates of the location. |
| coordinates.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| coordinates.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| related_locations | AdditionalGeoLocation(Array) | * | Geographical location of related points relevant to the user. |
| related_locations.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| related_locations.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| related_locations.name | DisplayText(JSON) | ? | Name of the point in local language or as written at the location. For example the street name of a parking lot entrance or it’s number. |
| related_locations.name.language | string(2) | 1 | Language Code ISO 639-1 |
| related_locations.name.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| parking_type | ParkingType(Enum) | ? | The general type of parking at the charge point location. Could be ALONG_MOTORWAY, PARKING_GARAGE, PARKING_LOT, ON_DRIVEWAY, ON_STREET or UNDERGROUND_GARAGE. |
| evses | EVSE(Array) | * | List of EVSEs that belong to this Location. |
| evses.uid | CiString(36) | 1 | Uniquely identifies the EVSE within the CPOs platform (and suboperator platforms). For example a database unique ID or the “EVSE ID”. This field can never be changed, modified or renamed. This is the ‘technical’ identification of the EVSE, not to be used as ‘human readable’ identification, use the field: evse_id for that. |
| evses.evse_id | CiString(48) | ? | Compliant with the following specification for EVSE ID from “eMI3 standard version V1.0” (http://emi3group.com/documents-links/) “Part 2: business objects.” Optional because: if an EVSE ID is to be re-used the EVSE ID can be removed from an EVSE that is removed (status: REMOVED) |
| evses.status | Status(Enum) | 1 | Indicates the current status of the EVSE. Could be AVAILABLE, BLOCKED, CHARGING, INOPERATIVE, OUTOFORDER, PLANNED, REMOVED, RESERVED or UNKNOWN. |
| evses.status_schedule | StatusSchedule(Array) | * | Indicates a planned status in the future of the EVSE. |
| evses.status_schedule.period_begin | DateTime | 1 | Begin of the scheduled period. |
| evses.status_schedule.period_end | DateTime | ? | End of the scheduled period, if known. |
| evses.status_schedule.status | Status(Enum) | 1 | Status value during the scheduled period. Could be AVAILABLE, BLOCKED, CHARGING, INOPERATIVE, OUTOFORDER, PLANNED, REMOVED, RESERVED or UNKNOWN. |
| evses.capabilities | Capability(Array) | * | List of functionalities that the EVSE is capable of. A list of CHARGING_PROFILE_CAPABLE, CHARGING_PREFERENCES_CAPABLE, CHIP_CARD_SUPPORT, CONTACTLESS_CARD_SUPPORT, CREDIT_CARD_PAYABLE, DEBIT_CARD_PAYABLE, PED_TERMINAL, REMOTE_START_STOP_CAPABLE, RESERVABLE, RFID_READER, START_SESSION_CONNECTOR_REQUIRED, TOKEN_GROUP_CAPABLE and UNLOCK_CAPABLE |
| evses.connectors | Connector(Array) | + | List of available connectors on the EVSE. |
| evses.connectors.id | CiString(36) | 1 | Identifier of the connector within the EVSE. Two connectors may have the same id as long as they do not belong to the same EVSE object. |
| evses.connectors.standard | ConnectorType(Enum) | 1 | The standard of the installed connector. Could be CHADEMO, CHAOJI, DOMESTICA, DOMESTIC_B, DOMESTIC_C, DOMESTIC_D, DOMESTIC_E, DOMESTIC_F, DOMESTIC_G, DOMESTIC_H, DOMESTIC_I, DOMESTIC_J, DOMESTIC_K, DOMESTIC_L, DOMESTIC_M, DOMESTIC_N, DOMESTIC_O, GBT_AC, GBT_DC, IEC_60309_2_single_16, IEC_60309_2_three_16, IEC_60309_2_three_32, IEC_60309_2_three_64, IEC_62196_T1, IEC_62196_T1_COMBO, IEC_62196_T2, IEC_62196_T2_COMBO, IEC_62196_T3A, IEC_62196_T3C, NEMA_5_20, NEMA_6_30, NEMA_6_50, NEMA_10_30, NEMA_10_50, NEMA_14_30, NEMA_14_50, PANTOGRAPH_BOTTOM UP, PANTOGRAPH_TOP_DOW N, TESLA_R or TESLA_S |
| evses.connectors.format | ConnectorFormat(Enum) | 1 | The format (socket/cable) of the installed connector. Could be SOCKET or CABLE. |
| evses.connectors.power_type | PowerType(Enum) | 1 | The type of power supplied by the connector. Could be AC_1_PHASE, AC_2_PHASE, AC_2_PHASE_SPLIT, AC_3_PHASE or DC |
| evses.connectors.max_voltage | int | 1 | Maximum voltage of the connector (line to neutral for AC_3_PHASE), in volt [V]. For example: DC Chargers might vary the voltage during charging when battery almost full. |
| evses.connectors.max_amperage | int | 1 | Maximum amperage of the connector, in ampere [A]. |
| evses.connectors.max_electric_power | int | ? | Maximum electric power that can be delivered by this connector, in Watts (W). When the maximum electric power is lower than the calculated value from voltage and amperage, this value should be set. For example: A DC Charge Point which can delivers up to 920V and up to 400A can be limited to a maximum of 150kW (max_electric_power = 150000). Depending on the car, it may supply max voltage or current, but not both at the same time. For AC Charge Points, the amount of phases used can also have influence on the maximum power. |
| evses.connectors.tariff_ids | [CString(36)] | * | Identifiers of the currently valid charging tariffs. Multiple tariffs are possible, but only one of each Tariff.type can be active at the same time. Tariffs with the same type are only allowed if they are not active at the same time: start_date_time and end_date_time period not overlapping. When preference-based smart charging is supported, one tariff for every possible ProfileType should be provided. These tell the user about the options they have at this Connector, and what the tariff is for every option. For a "free of charge" tariff, this field should be set and point to a defined "free of charge" tariff. |
| evses.connectors.terms_and_conditions | URL | ? | URL to the operator’s terms and conditions. |
| evses.connectors.last_updated | DateTime | 1 | Timestamp when this Connectors was last updated (or created). |
| evses.floor_level | string(4) | ? | Level on which the charging station is located (in garage buildings) in the locally displayed numbering scheme. |
| evses.coordinates | GeoLocation | ? | Coordinates of the EVSE. |
| evses.coordinates.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| evses.coordinates.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| evses.physical_reference | string(16) | ? | A number/string printed on the outside of the EVSE for visual identification. |
| evses.directions | DisplayText(Array) | * | Multi-language human-readable directions when more detailed information on how to reach the EVSE from the Location is required. |
| evses.directions.language | string(2) | 1 | Language Code ISO 639-1 |
| evses.directions.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| evses.parking_restrictions | ParkingRestriction(Array) | * | The restrictions that apply to the parking spot. Could be EV_ONLY, PLUGGED, DISABLED, CUSTOMERS and MOTORCYCLES. |
| evses.images | Image(Array) | * | Links to images related to the EVSE such as photos or logos. |
| evses.images.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| evses.images.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| evses.images.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| evses.images.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| evses.images.width | int(5) | ? | Width of the full scale image |
| evses.images.height | int(5) | ? | Height of the full scale image |
| evses.last_updated | DateTime | 1 | Timestamp when this EVSE or one of its Connectors was last updated (or created). |
| directions | DisplayText(Array) | * | Human-readable directions on how to reach the location. |
| directions.language | string(2) | 1 | Language Code ISO 639-1 |
| directions.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| operator | BusinessDetails(JSON) | ? | Information of the operator. When not specified, the information retrieved from the api_info endpoint should be used instead. |
| operator.name | String(100) | 1 | Name of the operator. |
| operator.website | URL | ? | Link to the operator’s website. |
| operator.logo | Image(JSON) | ? | Image link to the operator’s logo. |
| operator.logo.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| operator.logo.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| operator.logo.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| operator.logo.type | CiString(4) | 1 | Image type like: gif, jpeg, png, svg |
| operator.logo.width | int(5) | ? | Width of the full scale image |
| operator.logo.height | int(5) | ? | Height of the full scale image |
| suboperator | BusinessDetails(JSON) | ? | Information of the suboperator if available. |
| suboperator.name | String(100) | 1 | Name of the suboperator. |
| suboperator.website | URL | ? | Link to the suboperator’s website. |
| suboperator.logo | Image(JSON) | ? | Image link to the suboperator’s logo. |
| suboperator.logo.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| suboperator.logo.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| suboperator.logo.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| suboperator.logo.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| suboperator.logo.width | int(5) | ? | Width of the full scale image |
| suboperator.logo.height | int(5) | ? | Height of the full scale image |
| owner | BusinessDetails(JSON) | ? | Information of the owner if available. |
| owner.name | String(100) | 1 | Name of the owner. |
| owner.website | URL | ? | Link to the owner’s website. |
| owner.logo | Image(JSON) | ? | Image link to the owner’s logo. |
| owner.logo.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| owner.logo.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| owner.logo.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| owner.logo.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| owner.logo.width | int(5) | ? | Width of the full scale image |
| owner.logo.height | int(5) | ? | Height of the full scale image |
| facilities | Facility(Array of string) | * | Optional list of facilities this charge location directly belongs to. Could be HOTEL, RESTAURANT, CAFE, MALL, SUPERMARKET SPORT, RECREATION_AREA, NATURE, MUSEUM, BIKE_SHARING, BUS_STOP, TAXI_STAND, TRAM_STOP, METRO_STATION, TRAIN_STATION, AIRPORT, PARKING_LOT, CARPOOL_PARKING, FUEL_STATION or WIFI |
| time_zone | string(255) | ? | One of IANA tzdata’s TZ-values representing the time zone of the location. Examples: “Europe/Oslo”, “Europe/Zurich”. (http://www.iana.org/time-zones) |
| opening_times | Hours(JSON) | ? | The times when the EVSEs at the location can be accessed for charging. |
| opening_times.twentyfourseven | boolean | 1 | True to represent 24 hours a day and 7 days a week, except the given exceptions. |
| opening_times.regular_hours | RegularHours(Array) | * | Regular hours, weekday-based. Only to be used if twentyfourseven=false, then this field needs to contain at least one RegularHours object. |
| opening_times.regular_hours.weekday | int(1) | 1 | Number of day in the week, from Monday (1) till Sunday (7) |
| opening_times.regular_hours.period_begin | string(5) | 1 | Begin of the regular period given in hours and minutes. Must be in 24h format with leading zeros. Example: “18:15”. Hour/Minute separator: “:” Regex: [0-2][0-9]:[0-5][0-9] |
| opening_times.regular_hours.period_end | string(5) | 1 | End of the regular period, syntax as for period_begin. Must be later than period_begin. |
| opening_times.exceptional_openings | ExceptionalPeriod(Array) | * | Exceptions for specified calendar dates, time-range based. Periods the station is operating/accessible. Additional to regular hours. May overlap regular rules. |
| opening_times.exceptional_openings.period_begin | DateTime | 1 | Begin of the exception. |
| opening_times.exceptional_openings.period_end | DateTime | 1 | End of the exception. |
| opening_times.exceptional_closings | ExceptionalPeriod(Array) | * | Exceptions for specified calendar dates, time-range based. Periods the station is not operating/accessible. Overwriting regularHours and exceptionalOpenings. Should not overlap exceptionalOpenings. |
| opening_times.exceptional_closings.period_begin | DateTime | 1 | Begin of the exception. |
| opening_times.exceptional_closings.period_end | DateTime | 1 | End of the exception. |
| charging_when_closed | boolean | ? | Indicates if the EVSEs are still charging outside the opening hours of the location. E.g. when the parking garage closes its barriers over night, is it allowed to charge till the next morning? Default: true |
| images | Image(Array) | * | Links to images related to the location such as photos or logos. |
| images.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| images.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| images.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| images.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| images.width | int(5) | ? | Width of the full scale image |
| images.height | int(5) | ? | Height of the full scale image |
| energy_mix | EnergyMix(JSON) | ? | Details on the energy supplied at this location. |
| energy_mix.is_green_energy | boolean | 1 | True if 100% from regenerative sources. (CO2 and nuclear waste is zero) |
| energy_mix.energy_sources | EnergySource(Array) | * | Key-value pairs (enum + percentage) of energy sources of this location’s tariff. |
| energy_mix.energy_sources.source | EnergySourceCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR, GENERAL_FOSSIL, COAL, GAS, GENERAL_GREEN, SOLAR, WIND or WATER |
| energy_mix.energy_sources.percentage | number | 1 | Percentage of this source (0-100) in the mix. |
| energy_mix.environ_impact | EnvironmentalImpact(Array) | * | Key-value pairs (enum + percentage) of nuclear waste and CO2 exhaust of this location’s tariff. |
| energy_mix.environ_impact.category | EnvironmentalImpactCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR_WASTE or CARBON_DIOXIDE |
| energy_mix.environ_impact.amount | number | 1 | Percentage of this source (0-100) in the mix. |
| energy_mix.supplier_name | string(64) | ? | Name of the energy supplier, delivering the energy for this location or tariff. |
| energy_mix.energy_product_name | string(64) | ? | Name of the energy supplier's product/tariff plan used at this location. |
| last_updated | DateTime | 1 | Timestamp when this Location or one of its EVSEs or Connectors were last updated (or created). |
Sample Response
[
{
"id": "LOC1",
"type": "ON_STREET",
"name": "Gent Zuid",
"address": "F.Rooseveltlaan 3A",
"city": "Gent",
"postal_code": "9000",
"country": "BEL",
"coordinates": {
"latitude": "51.04759",
"longitude": "3.72994"
},
"evses": [
{
"uid": "3256",
"id": "BE-BEC-E041503001",
"status": "AVAILABLE",
"status_schedule": [],
"capabilities": ["RESERVABLE"],
"connectors": [
{
"id": "1",
"standard": "IEC_62196_T2",
"format": "CABLE",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "11",
"last_updated": "2015-03-16T10:10:02Z"
},
{
"id": "2",
"standard": "IEC_62196_T2",
"format": "SOCKET",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "11",
"last_updated": "2015-03-18T08:12:01Z"
}
],
"physical_reference": "1",
"floor_level": "-1",
"last_updated": "2015-06-28T08:12:01Z"
},
{
"uid": "3257",
"id": "BE-BEC-E041503002",
"status": "RESERVED",
"capabilities": ["RESERVABLE"],
"connectors": [
{
"id": "1",
"status": "RESERVED",
"standard": "IEC_62196_T2",
"format": "SOCKET",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "12"
}
],
"physical_reference": "2",
"floor_level": "-2",
"last_updated": "2015-06-29T20:39:09Z"
}
],
"operator": {
"name": "BeCharged"
},
"last_updated": "2015-06-29T20:39:09Z"
}
]
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get a particular Location
Introduction
This API, will return a private charging location.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST PATH PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _locationid | CiString(36) | Yes | Location.id of the Location object to retrieve. |
Sample Request
curl --location '{{url}}/v1/locations/LOC1' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| country_code | CiString(2) | 1 | ISO 3166-1 alpha-3 code for the country of this location. |
| party_id | CiString(3) | 1 | ID of the CPO that 'owns' this Location (following the ISO-15118 standard). |
| id | CiString(36) | 1 | Uniquely identifies the location within the CPOs platform (and suboperator platforms). This field can never be changed, modified or renamed. |
| publish | boolean | 1 | Defines if a Location may be published on an website or app etc. When this is set to false, only tokens identified in the field: publish_allowed_to are allowed to be shown this Location. When the same location has EVSEs that may be published and may not be published, two 'Locations' should be created. |
| publish_allowed_to | PublishTokenType(JSON) | * | This field may only be used when the publish field is set to false. Only owners of Tokens that match all the set fields of one PublishToken in the list are allowed to be shown this location. |
| publish_allowed_to.uid | CiString(36) | ? | Unique ID by which this Token can be identified. |
| publish_allowed_to.type | TokenType(Enum) | ? | Type of the token. Could be AD_HOC_USER, APP_USER, OTHER or RFID. |
| publish_allowed_to.visual_number | string(64) | ? | Visual readable number/identification as printed on the Token (RFID card). |
| publish_allowed_to.issuer | string(64) | ? | Issuing company, most of the times the name of the company printed on the token (RFID card), not necessarily the eMSP. |
| publish_allowed_to.group_id | CiString(36) | ? | This ID groups a couple of tokens. This can be used to make two or more tokens work as one. |
| name | string(255) | ? | Display name of the location. |
| address | string(45) | 1 | Street/block name and house number if available. |
| city | string(45) | 1 | City or town. |
| postal_code | string(10) | ? | Postal code of the location. |
| state | string(20) | ? | State or province of the location, only to be used when relevant. |
| country | string(3) | 1 | ISO 3166-1 alpha-3 code for the country of this location. |
| coordinates | GeoLocation | 1 | Coordinates of the location. |
| coordinates.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| coordinates.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| related_locations | AdditionalGeoLocation(Array) | * | Geographical location of related points relevant to the user. |
| related_locations.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| related_locations.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| related_locations.name | DisplayText(JSON) | ? | Name of the point in local language or as written at the location. For example the street name of a parking lot entrance or it’s number. |
| related_locations.name.language | string(2) | 1 | Language Code ISO 639-1 |
| related_locations.name.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| parking_type | ParkingType(Enum) | ? | The general type of parking at the charge point location. Could be ALONG_MOTORWAY, PARKING_GARAGE, PARKING_LOT, ON_DRIVEWAY, ON_STREET or UNDERGROUND_GARAGE. |
| evses | EVSE(Array) | * | List of EVSEs that belong to this Location. |
| evses.uid | CiString(36) | 1 | Uniquely identifies the EVSE within the CPOs platform (and suboperator platforms). For example a database unique ID or the “EVSE ID”. This field can never be changed, modified or renamed. This is the ‘technical’ identification of the EVSE, not to be used as ‘human readable’ identification, use the field: evse_id for that. |
| evses.evse_id | CiString(48) | ? | Compliant with the following specification for EVSE ID from “eMI3 standard version V1.0” (http://emi3group.com/documents-links/) “Part 2: business objects.” Optional because: if an EVSE ID is to be re-used the EVSE ID can be removed from an EVSE that is removed (status: REMOVED) |
| evses.status | Status(Enum) | 1 | Indicates the current status of the EVSE. Could be AVAILABLE, BLOCKED, CHARGING, INOPERATIVE, OUTOFORDER, PLANNED, REMOVED, RESERVED or UNKNOWN. |
| evses.status_schedule | StatusSchedule(Array) | * | Indicates a planned status in the future of the EVSE. |
| evses.status_schedule.period_begin | DateTime | 1 | Begin of the scheduled period. |
| evses.status_schedule.period_end | DateTime | ? | End of the scheduled period, if known. |
| evses.status_schedule.status | Status(Enum) | 1 | Status value during the scheduled period. Could be AVAILABLE, BLOCKED, CHARGING, INOPERATIVE, OUTOFORDER, PLANNED, REMOVED, RESERVED or UNKNOWN. |
| evses.capabilities | Capability(Array) | * | List of functionalities that the EVSE is capable of. A list of CHARGING_PROFILE_CAPABLE, CHARGING_PREFERENCES_CAPABLE, CHIP_CARD_SUPPORT, CONTACTLESS_CARD_SUPPORT, CREDIT_CARD_PAYABLE, DEBIT_CARD_PAYABLE, PED_TERMINAL, REMOTE_START_STOP_CAPABLE, RESERVABLE, RFID_READER, START_SESSION_CONNECTOR_REQUIRED, TOKEN_GROUP_CAPABLE and UNLOCK_CAPABLE |
| evses.connectors | Connector(Array) | + | List of available connectors on the EVSE. |
| evses.connectors.id | CiString(36) | 1 | Identifier of the connector within the EVSE. Two connectors may have the same id as long as they do not belong to the same EVSE object. |
| evses.connectors.standard | ConnectorType(Enum) | 1 | The standard of the installed connector. Could be CHADEMO, CHAOJI, DOMESTICA, DOMESTIC_B, DOMESTIC_C, DOMESTIC_D, DOMESTIC_E, DOMESTIC_F, DOMESTIC_G, DOMESTIC_H, DOMESTIC_I, DOMESTIC_J, DOMESTIC_K, DOMESTIC_L, DOMESTIC_M, DOMESTIC_N, DOMESTIC_O, GBT_AC, GBT_DC, IEC_60309_2_single_16, IEC_60309_2_three_16, IEC_60309_2_three_32, IEC_60309_2_three_64, IEC_62196_T1, IEC_62196_T1_COMBO, IEC_62196_T2, IEC_62196_T2_COMBO, IEC_62196_T3A, IEC_62196_T3C, NEMA_5_20, NEMA_6_30, NEMA_6_50, NEMA_10_30, NEMA_10_50, NEMA_14_30, NEMA_14_50, PANTOGRAPH_BOTTOM UP, PANTOGRAPH_TOP_DOW N, TESLA_R or TESLA_S |
| evses.connectors.format | ConnectorFormat | 1 | The format (socket/cable) of the installed connector. Could be SOCKET or CABLE. |
| evses.connectors.power_type | PowerType(Enum) | 1 | The type of power supplied by the connector. Could be AC_1_PHASE, AC_2_PHASE, AC_2_PHASE_SPLIT, AC_3_PHASE or DC |
| evses.connectors.max_voltage | int | 1 | Maximum voltage of the connector (line to neutral for AC_3_PHASE), in volt [V]. For example: DC Chargers might vary the voltage during charging when battery almost full. |
| evses.connectors.max_amperage | int | 1 | Maximum amperage of the connector, in ampere [A]. |
| evses.connectors.max_electric_power | int | ? | Maximum electric power that can be delivered by this connector, in Watts (W). When the maximum electric power is lower than the calculated value from voltage and amperage, this value should be set. For example: A DC Charge Point which can delivers up to 920V and up to 400A can be limited to a maximum of 150kW (max_electric_power = 150000). Depending on the car, it may supply max voltage or current, but not both at the same time. For AC Charge Points, the amount of phases used can also have influence on the maximum power. |
| evses.connectors.tariff_ids | [CString(36)] | * | Identifiers of the currently valid charging tariffs. Multiple tariffs are possible, but only one of each Tariff.type can be active at the same time. Tariffs with the same type are only allowed if they are not active at the same time: start_date_time and end_date_time period not overlapping. When preference-based smart charging is supported, one tariff for every possible ProfileType should be provided. These tell the user about the options they have at this Connector, and what the tariff is for every option. For a "free of charge" tariff, this field should be set and point to a defined "free of charge" tariff. |
| evses.connectors.terms_and_conditions | URL | ? | URL to the operator’s terms and conditions. |
| evses.connectors.last_updated | DateTime | 1 | Timestamp when this Connectors was last updated (or created). |
| evses.floor_level | string(4) | ? | Level on which the charging station is located (in garage buildings) in the locally displayed numbering scheme. |
| evses.coordinates | GeoLocation | ? | Coordinates of the EVSE. |
| evses.coordinates.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| evses.coordinates.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| evses.physical_reference | string(16) | ? | A number/string printed on the outside of the EVSE for visual identification. |
| evses.directions | DisplayText(Array) | * | Multi-language human-readable directions when more detailed information on how to reach the EVSE from the Location is required. |
| evses.directions.language | string(2) | 1 | Language Code ISO 639-1 |
| evses.directions.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| evses.parking_restrictions | ParkingRestriction(Array) | * | The restrictions that apply to the parking spot. Could be EV_ONLY, PLUGGED, DISABLED, CUSTOMERS and MOTORCYCLES. |
| evses.images | Image(Array) | * | Links to images related to the EVSE such as photos or logos. |
| evses.images.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| evses.images.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| evses.images.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| evses.images.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| evses.images.width | int(5) | ? | Width of the full scale image |
| evses.images.height | int(5) | ? | Height of the full scale image |
| evses.last_updated | DateTime | 1 | Timestamp when this EVSE or one of its Connectors was last updated (or created). |
| directions | DisplayText(Array) | * | Human-readable directions on how to reach the location. |
| directions.language | string(2) | 1 | Language Code ISO 639-1 |
| directions.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| operator | BusinessDetails(JSON) | ? | Information of the operator. When not specified, the information retrieved from the api_info endpoint should be used instead. |
| operator.name | String(100) | 1 | Name of the operator. |
| operator.website | URL | ? | Link to the operator’s website. |
| operator.logo | Image(JSON) | ? | Image link to the operator’s logo. |
| operator.logo.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| operator.logo.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| operator.logo.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| operator.logo.type | CiString(4) | 1 | Image type like: gif, jpeg, png, svg |
| operator.logo.width | int(5) | ? | Width of the full scale image |
| operator.logo.height | int(5) | ? | Height of the full scale image |
| suboperator | BusinessDetails(JSON) | ? | Information of the suboperator if available. |
| suboperator.name | String(100) | 1 | Name of the suboperator. |
| suboperator.website | URL | ? | Link to the suboperator’s website. |
| suboperator.logo | Image(JSON) | ? | Image link to the suboperator’s logo. |
| suboperator.logo.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| suboperator.logo.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| suboperator.logo.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| suboperator.logo.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| suboperator.logo.width | int(5) | ? | Width of the full scale image |
| suboperator.logo.height | int(5) | ? | Height of the full scale image |
| owner | BusinessDetails(JSON) | ? | Information of the owner if available. |
| owner.name | String(100) | 1 | Name of the owner. |
| owner.website | URL | ? | Link to the owner’s website. |
| owner.logo | Image(JSON) | ? | Image link to the owner’s logo. |
| owner.logo.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| owner.logo.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| owner.logo.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| owner.logo.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| owner.logo.width | int(5) | ? | Width of the full scale image |
| owner.logo.height | int(5) | ? | Height of the full scale image |
| facilities | Facility(Array of string) | * | Optional list of facilities this charge location directly belongs to. Could be HOTEL, RESTAURANT, CAFE, MALL, SUPERMARKET SPORT, RECREATION_AREA, NATURE, MUSEUM, BIKE_SHARING, BUS_STOP, TAXI_STAND, TRAM_STOP, METRO_STATION, TRAIN_STATION, AIRPORT, PARKING_LOT, CARPOOL_PARKING, FUEL_STATION or WIFI |
| time_zone | string(255) | ? | One of IANA tzdata’s TZ-values representing the time zone of the location. Examples: “Europe/Oslo”, “Europe/Zurich”. (http://www.iana.org/time-zones) |
| opening_times | Hours(JSON) | ? | The times when the EVSEs at the location can be accessed for charging. |
| opening_times.twentyfourseven | boolean | 1 | True to represent 24 hours a day and 7 days a week, except the given exceptions. |
| opening_times.regular_hours | RegularHours(Array) | * | Regular hours, weekday-based. Only to be used if twentyfourseven=false, then this field needs to contain at least one RegularHours object. |
| opening_times.regular_hours.weekday | int(1) | 1 | Number of day in the week, from Monday (1) till Sunday (7) |
| opening_times.regular_hours.period_begin | string(5) | 1 | Begin of the regular period given in hours and minutes. Must be in 24h format with leading zeros. Example: “18:15”. Hour/Minute separator: “:” Regex: [0-2][0-9]:[0-5][0-9] |
| opening_times.regular_hours.period_end | string(5) | 1 | End of the regular period, syntax as for period_begin. Must be later than period_begin. |
| opening_times.exceptional_openings | ExceptionalPeriod(Array) | * | Exceptions for specified calendar dates, time-range based. Periods the station is operating/accessible. Additional to regular hours. May overlap regular rules. |
| opening_times.exceptional_openings.period_begin | DateTime | 1 | Begin of the exception. |
| opening_times.exceptional_openings.period_end | DateTime | 1 | End of the exception. |
| opening_times.exceptional_closings | ExceptionalPeriod(Array) | * | Exceptions for specified calendar dates, time-range based. Periods the station is not operating/accessible. Overwriting regularHours and exceptionalOpenings. Should not overlap exceptionalOpenings. |
| opening_times.exceptional_closings.period_begin | DateTime | 1 | Begin of the exception. |
| opening_times.exceptional_closings.period_end | DateTime | 1 | End of the exception. |
| charging_when_closed | boolean | ? | Indicates if the EVSEs are still charging outside the opening hours of the location. E.g. when the parking garage closes its barriers over night, is it allowed to charge till the next morning? Default: true |
| images | Image(Array) | * | Links to images related to the location such as photos or logos. |
| images.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| images.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| images.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| images.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| images.width | int(5) | ? | Width of the full scale image |
| images.height | int(5) | ? | Height of the full scale image |
| energy_mix | EnergyMix(JSON) | ? | Details on the energy supplied at this location. |
| energy_mix.is_green_energy | boolean | 1 | True if 100% from regenerative sources. (CO2 and nuclear waste is zero) |
| energy_mix.energy_sources | EnergySource(Array) | * | Key-value pairs (enum + percentage) of energy sources of this location’s tariff. |
| energy_mix.energy_sources.source | EnergySourceCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR, GENERAL_FOSSIL, COAL, GAS, GENERAL_GREEN, SOLAR, WIND or WATER |
| energy_mix.energy_sources.percentage | number | 1 | Percentage of this source (0-100) in the mix. |
| energy_mix.environ_impact | EnvironmentalImpact(Array) | * | Key-value pairs (enum + percentage) of nuclear waste and CO2 exhaust of this location’s tariff. |
| energy_mix.environ_impact.category | EnvironmentalImpactCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR_WASTE or CARBON_DIOXIDE |
| energy_mix.environ_impact.amount | number | 1 | Percentage of this source (0-100) in the mix. |
| energy_mix.supplier_name | string(64) | ? | Name of the energy supplier, delivering the energy for this location or tariff. |
| energy_mix.energy_product_name | string(64) | ? | Name of the energy supplier's product/tariff plan used at this location. |
| last_updated | DateTime | 1 | Timestamp when this Location or one of its EVSEs or Connectors were last updated (or created). |
Sample Response
{
"id": "LOC1",
"type": "ON_STREET",
"name": "Gent Zuid",
"address": "F.Rooseveltlaan 3A",
"city": "Gent",
"postal_code": "9000",
"country": "BEL",
"coordinates": {
"latitude": "51.04759",
"longitude": "3.72994"
},
"evses": [
{
"uid": "3256",
"id": "BE-BEC-E041503001",
"status": "AVAILABLE",
"status_schedule": [],
"capabilities": ["RESERVABLE"],
"connectors": [
{
"id": "1",
"standard": "IEC_62196_T2",
"format": "CABLE",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "11",
"last_updated": "2015-03-16T10:10:02Z"
},
{
"id": "2",
"standard": "IEC_62196_T2",
"format": "SOCKET",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "11",
"last_updated": "2015-03-18T08:12:01Z"
}
],
"physical_reference": "1",
"floor_level": "-1",
"last_updated": "2015-06-28T08:12:01Z"
},
{
"uid": "3257",
"id": "BE-BEC-E041503002",
"status": "RESERVED",
"capabilities": ["RESERVABLE"],
"connectors": [
{
"id": "1",
"status": "RESERVED",
"standard": "IEC_62196_T2",
"format": "SOCKET",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "12"
}
],
"physical_reference": "2",
"floor_level": "-2",
"last_updated": "2015-06-29T20:39:09Z"
}
],
"operator": {
"name": "BeCharged"
},
"last_updated": "2015-06-29T20:39:09Z"
}
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get a particular EVSE
Introduction
This API, will return a EVSE from private charging location.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST PATH PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _locationid | CiString(36) | Yes | Location.id of the Location object to retrieve. |
| _evseuid | CiString(36) | Yes | Evse.uid, required when requesting an EVSE or Connector object. |
Sample Request
curl --location '{{url}}/v1/locations/LOC1/3256' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| uid | CiString(36) | 1 | Uniquely identifies the EVSE within the CPOs platform (and suboperator platforms). For example a database unique ID or the “EVSE ID”. This field can never be changed, modified or renamed. This is the ‘technical’ identification of the EVSE, not to be used as ‘human readable’ identification, use the field: evse_id for that. |
| evse_id | CiString(48) | ? | Compliant with the following specification for EVSE ID from “eMI3 standard version V1.0” (http://emi3group.com/documents-links/) “Part 2: business objects.” Optional because: if an EVSE ID is to be re-used the EVSE ID can be removed from an EVSE that is removed (status: REMOVED) |
| status | Status(Enum) | 1 | Indicates the current status of the EVSE. Could be AVAILABLE, BLOCKED, CHARGING, INOPERATIVE, OUTOFORDER, PLANNED, REMOVED, RESERVED or UNKNOWN. |
| status_schedule | StatusSchedule(Array) | * | Indicates a planned status in the future of the EVSE. |
| status_schedule.period_begin | DateTime | 1 | Begin of the scheduled period. |
| status_schedule.period_end | DateTime | ? | End of the scheduled period, if known. |
| status_schedule.status | Status(Enum) | 1 | Status value during the scheduled period. Could be AVAILABLE, BLOCKED, CHARGING, INOPERATIVE, OUTOFORDER, PLANNED, REMOVED, RESERVED or UNKNOWN. |
| capabilities | Capability(Array) | * | List of functionalities that the EVSE is capable of. A list of CHARGING_PROFILE_CAPABLE, CHARGING_PREFERENCES_CAPABLE, CHIP_CARD_SUPPORT, CONTACTLESS_CARD_SUPPORT, CREDIT_CARD_PAYABLE, DEBIT_CARD_PAYABLE, PED_TERMINAL, REMOTE_START_STOP_CAPABLE, RESERVABLE, RFID_READER, START_SESSION_CONNECTOR_REQUIRED, TOKEN_GROUP_CAPABLE and UNLOCK_CAPABLE |
| connectors | Connector(Array) | + | List of available connectors on the EVSE. |
| connectors.id | CiString(36) | 1 | Identifier of the connector within the EVSE. Two connectors may have the same id as long as they do not belong to the same EVSE object. |
| connectors.standard | ConnectorType(Enum) | 1 | The standard of the installed connector. Could be CHADEMO, CHAOJI, DOMESTICA, DOMESTIC_B, DOMESTIC_C, DOMESTIC_D, DOMESTIC_E, DOMESTIC_F, DOMESTIC_G, DOMESTIC_H, DOMESTIC_I, DOMESTIC_J, DOMESTIC_K, DOMESTIC_L, DOMESTIC_M, DOMESTIC_N, DOMESTIC_O, GBT_AC, GBT_DC, IEC_60309_2_single_16, IEC_60309_2_three_16, IEC_60309_2_three_32, IEC_60309_2_three_64, IEC_62196_T1, IEC_62196_T1_COMBO, IEC_62196_T2, IEC_62196_T2_COMBO, IEC_62196_T3A, IEC_62196_T3C, NEMA_5_20, NEMA_6_30, NEMA_6_50, NEMA_10_30, NEMA_10_50, NEMA_14_30, NEMA_14_50, PANTOGRAPH_BOTTOM UP, PANTOGRAPH_TOP_DOW N, TESLA_R or TESLA_S |
| evses.connectors.format | ConnectorFormat | 1 | The format (socket/cable) of the installed connector. Could be SOCKET or CABLE. |
| connectors.power_type | PowerType(Enum) | 1 | The type of power supplied by the connector. Could be AC_1_PHASE, AC_2_PHASE, AC_2_PHASE_SPLIT, AC_3_PHASE or DC |
| connectors.max_voltage | int | 1 | Maximum voltage of the connector (line to neutral for AC_3_PHASE), in volt [V]. For example: DC Chargers might vary the voltage during charging when battery almost full. |
| connectors.max_amperage | int | 1 | Maximum amperage of the connector, in ampere [A]. |
| connectors.max_electric_power | int | ? | Maximum electric power that can be delivered by this connector, in Watts (W). When the maximum electric power is lower than the calculated value from voltage and amperage, this value should be set. For example: A DC Charge Point which can delivers up to 920V and up to 400A can be limited to a maximum of 150kW (max_electric_power = 150000). Depending on the car, it may supply max voltage or current, but not both at the same time. For AC Charge Points, the amount of phases used can also have influence on the maximum power. |
| connectors.tariff_ids | [CString(36)] | * | Identifiers of the currently valid charging tariffs. Multiple tariffs are possible, but only one of each Tariff.type can be active at the same time. Tariffs with the same type are only allowed if they are not active at the same time: start_date_time and end_date_time period not overlapping. When preference-based smart charging is supported, one tariff for every possible ProfileType should be provided. These tell the user about the options they have at this Connector, and what the tariff is for every option. For a "free of charge" tariff, this field should be set and point to a defined "free of charge" tariff. |
| connectors.terms_and_conditions | URL | ? | URL to the operator’s terms and conditions. |
| connectors.last_updated | DateTime | 1 | Timestamp when this Connectors was last updated (or created). |
| floor_level | string(4) | ? | Level on which the charging station is located (in garage buildings) in the locally displayed numbering scheme. |
| coordinates | GeoLocation | ? | Coordinates of the EVSE. |
| coordinates.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| coordinates.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| physical_reference | string(16) | ? | A number/string printed on the outside of the EVSE for visual identification. |
| directions | DisplayText(Array) | * | Multi-language human-readable directions when more detailed information on how to reach the EVSE from the Location is required. |
| directions.language | string(2) | 1 | Language Code ISO 639-1 |
| directions.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| parking_restrictions | ParkingRestriction(Array) | * | The restrictions that apply to the parking spot. Could be EV_ONLY, PLUGGED, DISABLED, CUSTOMERS and MOTORCYCLES. |
| images | Image(Array) | * | Links to images related to the EVSE such as photos or logos. |
| images.url | URL | 1 | URL from where the image data can be fetched through a web browser. |
| images.thumbnail | URL | ? | URL from where a thumbnail of the image can be fetched through a webbrowser. |
| images.category | ImageCategory(Enum) | 1 | Describes what the image is used for. Could be CHARGER, ENTRANCE, LOCATION, NETWORK, OPERATOR, OTHER or OWNER |
| images.type | String(4) | 1 | Image type like: gif, jpeg, png, svg |
| images.width | int(5) | ? | Width of the full scale image |
| images.height | int(5) | ? | Height of the full scale image |
| last_updated | DateTime | 1 | Timestamp when this EVSE or one of its Connectors was last updated (or created). |
Sample Response
{
"uid": "3256",
"id": "BE-BEC-E041503001",
"status": "AVAILABLE",
"status_schedule": [],
"capabilities": ["RESERVABLE"],
"connectors": [
{
"id": "1",
"standard": "IEC_62196_T2",
"format": "CABLE",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "11",
"last_updated": "2015-03-16T10:10:02Z"
},
{
"id": "2",
"standard": "IEC_62196_T2",
"format": "SOCKET",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "11",
"last_updated": "2015-03-18T08:12:01Z"
}
],
"physical_reference": "1",
"floor_level": "-1",
"last_updated": "2015-06-28T08:12:01Z"
}
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get a particular Connector
Introduction
This API, will return a EVSE's Connector from private charging location.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST PATH PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _locationid | CiString(36) | Yes | Location.id of the Location object to retrieve. |
| _evseuid | CiString(36) | Yes | Evse.uid, required when requesting an EVSE or Connector object. |
| _connectorid | CiString(36) | Yes | Connector.id, required when requesting a Connector object. |
Sample Request
curl --location '{{url}}/v1/locations/LOC1/3256/1' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| id | CiString(36) | 1 | Identifier of the connector within the EVSE. Two connectors may have the same id as long as they do not belong to the same EVSE object. |
| standard | ConnectorType(Enum) | 1 | The standard of the installed connector. Could be CHADEMO, CHAOJI, DOMESTICA, DOMESTIC_B, DOMESTIC_C, DOMESTIC_D, DOMESTIC_E, DOMESTIC_F, DOMESTIC_G, DOMESTIC_H, DOMESTIC_I, DOMESTIC_J, DOMESTIC_K, DOMESTIC_L, DOMESTIC_M, DOMESTIC_N, DOMESTIC_O, GBT_AC, GBT_DC, IEC_60309_2_single_16, IEC_60309_2_three_16, IEC_60309_2_three_32, IEC_60309_2_three_64, IEC_62196_T1, IEC_62196_T1_COMBO, IEC_62196_T2, IEC_62196_T2_COMBO, IEC_62196_T3A, IEC_62196_T3C, NEMA_5_20, NEMA_6_30, NEMA_6_50, NEMA_10_30, NEMA_10_50, NEMA_14_30, NEMA_14_50, PANTOGRAPH_BOTTOM UP, PANTOGRAPH_TOP_DOW N, TESLA_R or TESLA_S |
| evses.connectors.format | ConnectorFormat | 1 | The format (socket/cable) of the installed connector. Could be SOCKET or CABLE. |
| power_type | PowerType(Enum) | 1 | The type of power supplied by the connector. Could be AC_1_PHASE, AC_2_PHASE, AC_2_PHASE_SPLIT, AC_3_PHASE or DC |
| max_voltage | int | 1 | Maximum voltage of the connector (line to neutral for AC_3_PHASE), in volt [V]. For example: DC Chargers might vary the voltage during charging when battery almost full. |
| max_amperage | int | 1 | Maximum amperage of the connector, in ampere [A]. |
| max_electric_power | int | ? | Maximum electric power that can be delivered by this connector, in Watts (W). When the maximum electric power is lower than the calculated value from voltage and amperage, this value should be set. For example: A DC Charge Point which can delivers up to 920V and up to 400A can be limited to a maximum of 150kW (max_electric_power = 150000). Depending on the car, it may supply max voltage or current, but not both at the same time. For AC Charge Points, the amount of phases used can also have influence on the maximum power. |
| tariff_ids | [CString(36)] | * | Identifiers of the currently valid charging tariffs. Multiple tariffs are possible, but only one of each Tariff.type can be active at the same time. Tariffs with the same type are only allowed if they are not active at the same time: start_date_time and end_date_time period not overlapping. When preference-based smart charging is supported, one tariff for every possible ProfileType should be provided. These tell the user about the options they have at this Connector, and what the tariff is for every option. For a "free of charge" tariff, this field should be set and point to a defined "free of charge" tariff. |
| terms_and_conditions | URL | ? | URL to the operator’s terms and conditions. |
| last_updated | DateTime | 1 | Timestamp when this Connectors was last updated (or created). |
Sample Response
{
"id": "1",
"standard": "IEC_62196_T2",
"format": "CABLE",
"power_type": "AC_3_PHASE",
"voltage": 220,
"amperage": 16,
"tariff_id": "11",
"last_updated": "2015-03-16T10:10:02Z"
}
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get all Tariffs
This API, will return the private charging tariffs.
The API also provide further search options to filter the result set.
- Based on the last updated date between two given dates.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST QUERY PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _datefrom | DateTime | No | Only return Tariffs that have last_updated after this Date/Time. |
| _dateto | DateTime | No | Only return Tariffs that have last_updated before this Date/Time. |
| offset | int | No | The offset of the first object returned. Default is 0. |
| limit | int | No | Maximum number of objects to GET. |
Sample Request
curl --location '{{url}}/v1/tariffs/?date_from=xxx&date_to=yyy' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a array of JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the CPO that owns this Tariff. |
| party_id | CiString(3) | 1 | ID of the CPO that 'owns' this Tariff (following the ISO-15118 standard). |
| id | CiString(36) | 1 | Uniquely identifies the tariff within the CPO’s platform (and suboperator platforms). |
| currency | string(3) | 1 | ISO-4217 code of the currency of this tariff. |
| type | TariffType(Enum) | ? | Defines the type of the tariff. This allows for distinction in case of given Charging Preferences. When omitted, this tariff is valid for all sessions. Could be AD_HOC_PAYMENT, PROFILE_CHEAP, PROFILE_FAST, PROFILE_GREEN or REGULAR. |
| tariff_alt_text | DisplayText(Array) | * | List of multi-language alternative tariff info texts. |
| tariff_alt_text.language | string(2) | 1 | Language Code ISO 639-1 |
| tariff_alt_text.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| tariff_alt_url | URL | ? | URL to a web page that contains an explanation of the tariff information in human readable form. |
| min_price | Price(JSON) | ? | When this field is set, a Charging Session with this tariff will at least cost this amount. This is different from a FLAT fee (Start Tariff, Transaction Fee), as a FLAT fee is a fixed amount that has to be paid for any Charging Session. A minimum price indicates that when the cost of a Charging Session is lower than this amount, the cost of the Session will be equal to this amount. |
| min_price.excl_vat | number | 1 | Price/Cost excluding VAT. |
| min_price.incl_vat | number | ? | Price/Cost including VAT. |
| max_price | Price(JSON) | ? | When this field is set, a Charging Session with this tariff will NOT cost more than this amount. |
| max_price.excl_vat | number | 1 | Price/Cost excluding VAT. |
| max_price.incl_vat | number | ? | Price/Cost including VAT. |
| elements | TariffElement(Array) | + | List of Tariff Elements. |
| elements.price_components | PriceComponent(Array) | + | List of price components that describe the pricing of a tariff. |
| elements.price_components.type | TariffDimensionType(Enum) | 1 | Type of tariff dimension. Could be ENERGY, FLAT, PARKING_TIME or TIME. |
| elements.price_components.price | number | 1 | Price per unit (excl. VAT) for this tariff dimension. |
| elements.price_components.vat | number | ? | Applicable VAT percentage for this tariff dimension. If omitted, no VAT is applicable. Not providing a VAT is different from 0% VAT, which would be a value of 0.0 here. |
| elements.price_components.step_size | int | 1 | Minimum amount to be billed. This unit will be billed in this step_size blocks. Amounts that are less than this step_size are rounded up to the given step_size. For example: if type is TIME and step_size has a value of 300, then time will be billed in blocks of 5 minutes. If 6 minutes were used, 10 minutes (2 blocks of step_size) will be billed. |
| elements.restrictions | TariffRestrictions | ? | Restrictions that describe the applicability of a tariff. |
| elements.restrictions.start_time | string(5) | ? | Start time of day in local time, the time zone is defined in the time_zone field of the Location, for example 13:30, valid from this time of the day. Must be in 24h format with leading zeros. Hour/Minute separator: ":" Regex: ([0-1][0- 9]2[0-3]):[0-5][0-9] |
| elements.restrictions.end_time | string(5) | ? | End time of day in local time, the time zone is defined in the time_zone field of the Location, for example 19:45, valid until this time of the day. Same syntax as start_time. If end_time < start_time then the period wraps around to the next day. To stop at end of the day use: 00:00. |
| elements.restrictions.start_date | string(10) | ? | Start date in local time, the time zone is defined in the time_zone field of the Location, for example: 2015-12-24, valid from this day (inclusive). Regex: ([12][0-9]{3})-(0[1-9]1[0-2])-(0[1-9][12][0-9]3[01]) |
| elements.restrictions.end_date | string(10) | ? | End date in local time, the time zone is defined in the time_zone field of the Location, for example: 2015-12-27, valid until this day (exclusive). Same syntax as start_date. |
| elements.restrictions.min_kwh | number | ? | Minimum consumed energy in kWh, for example 20, valid from this amount of energy (inclusive) being used. |
| elements.restrictions.max_kwh | number | ? | Maximum consumed energy in kWh, for example 50, valid until this amount of energy (exclusive) being used. |
| elements.restrictions.min_current | number | ? | Sum of the minimum current (in Amperes) over all phases, for example 5. When the EV is charging with more than, or equal to, the defined amount of current, this TariffElement is/becomes active. If the charging current is or becomes lower, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the minimum current over the entire Charging Session. This restriction can make a TariffElement become active when the charging current is above the defined value, but the TariffElement MUST no longer be active when the charging current drops below the defined value. |
| elements.restrictions.max_current | number | ? | Sum of the maximum current (in Amperes) over all phases, for example 20. When the EV is charging with less than the defined amount of current, this TariffElement becomes/is active. If the charging current is or becomes higher, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the maximum current over the entire Charging Session. This restriction can make a TariffElement become active when the charging current is below this value, but the TariffElement MUST no longer be active when the charging current raises above the defined value. |
| elements.restrictions.min_power | number | ? | Minimum power in kW, for example 5. When the EV is charging with more than, or equal to, the defined amount of power, this TariffElement is/becomes active. If the charging power is or becomes lower, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the minimum power over the entire Charging Session. This restriction can make a TariffElement become active when the charging power is above this value, but the TariffElement MUST no longer be active when the charging power drops below the defined value. |
| elements.restrictions.max_power | number | ? | Maximum power in kW, for example 20. When the EV is charging with less than the defined amount of power, this TariffElement becomes/is active. If the charging power is or becomes higher, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the maximum power over the entire Charging Session. This restriction can make a TariffElement become active when the charging power is below this value, but the TariffElement MUST no longer be active when the charging power raises above the defined value. |
| elements.restrictions.min_duration | int | ? | Minimum duration in seconds the Charging Session MUST last (inclusive). When the duration of a Charging Session is longer than the defined value, this TariffElement is or becomes active. Before that moment, this TariffElement is not yet active. |
| elements.restrictions.max_duration | int | ? | Maximum duration in seconds the Charging Session MUST last (exclusive). When the duration of a Charging Session is shorter than the defined value, this TariffElement is or becomes active. After that moment, this TariffElement is no longer active. |
| elements.restrictions.day_of_week | DayOfWeek(Array) | * | Which day(s) of the week this TariffElement is active. Could be MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY and SUNDAY. |
| elements.restrictions.reservation | ReservationRestrictionType(Enum) | * | When this field is present, the TariffElement describes reservation costs. A reservation starts when the reservation is made, and ends when the driver starts charging on the reserved EVSE/Location, or when the reservation expires. A reservation can only have: FLAT and TIME TariffDimensions, where TIME is for the duration of the reservation. Could be RESERVATION or RESERVATION_EXPIRES. |
| start_date_time | DateTime | ? | The time when this tariff becomes active, in UTC, time_zone field of the Location can be used to convert to local time. Typically used for a new tariff that is already given with the location, before it becomes active. |
| end_date_time | DateTime | ? | The time after which this tariff is no longer valid, in UTC, time_zone field if the Location can be used to convert to local time. Typically used when this tariff is going to be replaced with a different tariff in the near future. |
| energy_mix | EnergyMix(JSON) | ? | Details on the energy supplied with this tariff. |
| energy_mix.is_green_energy | boolean | 1 | True if 100% from regenerative sources. (CO2 and nuclear waste is zero) |
| energy_mix.energy_sources | EnergySource(Array) | * | Key-value pairs (enum + percentage) of energy sources of this location’s tariff. |
| energy_mix.energy_sources.source | EnergySourceCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR, GENERAL_FOSSIL, COAL, GAS, GENERAL_GREEN, SOLAR, WIND or WATER |
| energy_mix.energy_sources.percentage | number | 1 | Percentage of this source (0-100) in the mix. |
| energy_mix.environ_impact | EnvironmentalImpact(Array) | * | Key-value pairs (enum + percentage) of nuclear waste and CO2 exhaust of this location’s tariff. |
| energy_mix.environ_impact.category | EnvironmentalImpactCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR_WASTE or CARBON_DIOXIDE |
| energy_mix.environ_impact.amount | number | 1 | Percentage of this source (0-100) in the mix. |
| energy_mix.supplier_name | string(64) | ? | Name of the energy supplier, delivering the energy for this location or tariff. |
| energy_mix.energy_product_name | string(64) | ? | Name of the energy supplier's product/tariff plan used at this location. |
| last_updated | DateTime | 1 | Timestamp when this Tariff was last updated (or created). |
Sample Response
[
{
"country_code": "DE",
"party_id": "ALL",
"id": "20",
"currency": "EUR",
"min_price": {
"excl_vat": 0.5,
"incl_vat": 0.55
},
"elements": [
{
"price_components": [
{
"type": "ENERGY",
"price": 0.25,
"vat": 10.0,
"step_size": 1
}
]
}
],
"last_updated": "2018-12-17T16:45:21Z"
},
{
"country_code": "DE",
"party_id": "ALL",
"id": "14",
"currency": "EUR",
"type": "REGULAR",
"tariff_alt_url": "https://company.com/tariffs/14",
"elements": [
{
"price_components": [
{
"type": "FLAT",
"price": 2.5,
"vat": 15.0,
"step_size": 1
}
]
},
{
"price_components": [
{
"type": "TIME",
"price": 1.0,
"vat": 20.0,
"step_size": 900
}
],
"restrictions": {
"max_current": 32.0
}
},
{
"price_components": [
{
"type": "TIME",
"price": 2.0,
"vat": 20.0,
"step_size": 600
}
],
"restrictions": {
"min_current": 32.0,
"day_of_week": [
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY"
]
}
},
{
"price_components": [
{
"type": "TIME",
"price": 1.25,
"vat": 20.0,
"step_size": 600
}
],
"restrictions": {
"min_current": 32.0,
"day_of_week": ["SATURDAY", "SUNDAY"]
}
},
{
"price_components": [
{
"type": "PARKING_TIME",
"price": 5.0,
"vat": 10.0,
"step_size": 300
}
],
"restrictions": {
"start_time": "09:00",
"end_time": "18:00",
"day_of_week": [
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY"
]
}
},
{
"price_components": [
{
"type": "PARKING_TIME",
"price": 6.0,
"vat": 10.0,
"step_size": 300
}
],
"restrictions": {
"start_time": "10:00",
"end_time": "17:00",
"day_of_week": ["SATURDAY"]
}
}
],
"last_updated": "2015-06-29T20:39:09Z"
}
]
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get a particular Tariff
This API, will return the private charging particular tariff.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST QUERY PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _tariffid | CiString(36) | Yes | Tariff.id of the Tariff object to retrieve. |
Sample Request
curl --location '{{url}}/v1/tariffs/{tariff_id}' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the CPO that owns this Tariff. |
| party_id | CiString(3) | 1 | ID of the CPO that 'owns' this Tariff (following the ISO-15118 standard). |
| id | CiString(36) | 1 | Uniquely identifies the tariff within the CPO’s platform (and suboperator platforms). |
| currency | string(3) | 1 | ISO-4217 code of the currency of this tariff. |
| type | TariffType(Enum) | ? | Defines the type of the tariff. This allows for distinction in case of given Charging Preferences. When omitted, this tariff is valid for all sessions. Could be AD_HOC_PAYMENT, PROFILE_CHEAP, PROFILE_FAST, PROFILE_GREEN or REGULAR. |
| tariff_alt_text | DisplayText(Array) | * | List of multi-language alternative tariff info texts. |
| tariff_alt_text.language | string(2) | 1 | Language Code ISO 639-1 |
| tariff_alt_text.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
| tariff_alt_url | URL | ? | URL to a web page that contains an explanation of the tariff information in human readable form. |
| min_price | Price(JSON) | ? | When this field is set, a Charging Session with this tariff will at least cost this amount. This is different from a FLAT fee (Start Tariff, Transaction Fee), as a FLAT fee is a fixed amount that has to be paid for any Charging Session. A minimum price indicates that when the cost of a Charging Session is lower than this amount, the cost of the Session will be equal to this amount. |
| min_price.excl_vat | number | 1 | Price/Cost excluding VAT. |
| min_price.incl_vat | number | ? | Price/Cost including VAT. |
| max_price | Price(JSON) | ? | When this field is set, a Charging Session with this tariff will NOT cost more than this amount. |
| max_price.excl_vat | number | 1 | Price/Cost excluding VAT. |
| max_price.incl_vat | number | ? | Price/Cost including VAT. |
| elements | TariffElement(Array) | + | List of Tariff Elements. |
| elements.price_components | PriceComponent(Array) | + | List of price components that describe the pricing of a tariff. |
| elements.price_components.type | TariffDimensionType(Enum) | 1 | Type of tariff dimension. Could be ENERGY, FLAT, PARKING_TIME or TIME. |
| elements.price_components.price | number | 1 | Price per unit (excl. VAT) for this tariff dimension. |
| elements.price_components.vat | number | ? | Applicable VAT percentage for this tariff dimension. If omitted, no VAT is applicable. Not providing a VAT is different from 0% VAT, which would be a value of 0.0 here. |
| elements.price_components.step_size | int | 1 | Minimum amount to be billed. This unit will be billed in this step_size blocks. Amounts that are less than this step_size are rounded up to the given step_size. For example: if type is TIME and step_size has a value of 300, then time will be billed in blocks of 5 minutes. If 6 minutes were used, 10 minutes (2 blocks of step_size) will be billed. |
| elements.restrictions | TariffRestrictions | ? | Restrictions that describe the applicability of a tariff. |
| elements.restrictions.start_time | string(5) | ? | Start time of day in local time, the time zone is defined in the time_zone field of the Location, for example 13:30, valid from this time of the day. Must be in 24h format with leading zeros. Hour/Minute separator: ":" Regex: ([0-1][0- 9]2[0-3]):[0-5][0-9] |
| elements.restrictions.end_time | string(5) | ? | End time of day in local time, the time zone is defined in the time_zone field of the Location, for example 19:45, valid until this time of the day. Same syntax as start_time. If end_time < start_time then the period wraps around to the next day. To stop at end of the day use: 00:00. |
| elements.restrictions.start_date | string(10) | ? | Start date in local time, the time zone is defined in the time_zone field of the Location, for example: 2015-12-24, valid from this day (inclusive). Regex: ([12][0-9]{3})-(0[1-9]1[0-2])-(0[1-9][12][0-9]3[01]) |
| elements.restrictions.end_date | string(10) | ? | End date in local time, the time zone is defined in the time_zone field of the Location, for example: 2015-12-27, valid until this day (exclusive). Same syntax as start_date. |
| elements.restrictions.min_kwh | number | ? | Minimum consumed energy in kWh, for example 20, valid from this amount of energy (inclusive) being used. |
| elements.restrictions.max_kwh | number | ? | Maximum consumed energy in kWh, for example 50, valid until this amount of energy (exclusive) being used. |
| elements.restrictions.min_current | number | ? | Sum of the minimum current (in Amperes) over all phases, for example 5. When the EV is charging with more than, or equal to, the defined amount of current, this TariffElement is/becomes active. If the charging current is or becomes lower, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the minimum current over the entire Charging Session. This restriction can make a TariffElement become active when the charging current is above the defined value, but the TariffElement MUST no longer be active when the charging current drops below the defined value. |
| elements.restrictions.max_current | number | ? | Sum of the maximum current (in Amperes) over all phases, for example 20. When the EV is charging with less than the defined amount of current, this TariffElement becomes/is active. If the charging current is or becomes higher, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the maximum current over the entire Charging Session. This restriction can make a TariffElement become active when the charging current is below this value, but the TariffElement MUST no longer be active when the charging current raises above the defined value. |
| elements.restrictions.min_power | number | ? | Minimum power in kW, for example 5. When the EV is charging with more than, or equal to, the defined amount of power, this TariffElement is/becomes active. If the charging power is or becomes lower, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the minimum power over the entire Charging Session. This restriction can make a TariffElement become active when the charging power is above this value, but the TariffElement MUST no longer be active when the charging power drops below the defined value. |
| elements.restrictions.max_power | number | ? | Maximum power in kW, for example 20. When the EV is charging with less than the defined amount of power, this TariffElement becomes/is active. If the charging power is or becomes higher, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the maximum power over the entire Charging Session. This restriction can make a TariffElement become active when the charging power is below this value, but the TariffElement MUST no longer be active when the charging power raises above the defined value. |
| elements.restrictions.min_duration | int | ? | Minimum duration in seconds the Charging Session MUST last (inclusive). When the duration of a Charging Session is longer than the defined value, this TariffElement is or becomes active. Before that moment, this TariffElement is not yet active. |
| elements.restrictions.max_duration | int | ? | Maximum duration in seconds the Charging Session MUST last (exclusive). When the duration of a Charging Session is shorter than the defined value, this TariffElement is or becomes active. After that moment, this TariffElement is no longer active. |
| elements.restrictions.day_of_week | DayOfWeek(Array) | * | Which day(s) of the week this TariffElement is active. Could be MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY and SUNDAY. |
| elements.restrictions.reservation | ReservationRestrictionType(Enum) | * | When this field is present, the TariffElement describes reservation costs. A reservation starts when the reservation is made, and ends when the driver starts charging on the reserved EVSE/Location, or when the reservation expires. A reservation can only have: FLAT and TIME TariffDimensions, where TIME is for the duration of the reservation. Could be RESERVATION or RESERVATION_EXPIRES. |
| start_date_time | DateTime | ? | The time when this tariff becomes active, in UTC, time_zone field of the Location can be used to convert to local time. Typically used for a new tariff that is already given with the location, before it becomes active. |
| end_date_time | DateTime | ? | The time after which this tariff is no longer valid, in UTC, time_zone field if the Location can be used to convert to local time. Typically used when this tariff is going to be replaced with a different tariff in the near future. |
| energy_mix | EnergyMix(JSON) | ? | Details on the energy supplied with this tariff. |
| energy_mix.is_green_energy | boolean | 1 | True if 100% from regenerative sources. (CO2 and nuclear waste is zero) |
| energy_mix.energy_sources | EnergySource(Array) | * | Key-value pairs (enum + percentage) of energy sources of this location’s tariff. |
| energy_mix.energy_sources.source | EnergySourceCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR, GENERAL_FOSSIL, COAL, GAS, GENERAL_GREEN, SOLAR, WIND or WATER |
| energy_mix.energy_sources.percentage | number | 1 | Percentage of this source (0-100) in the mix. |
| energy_mix.environ_impact | EnvironmentalImpact(Array) | * | Key-value pairs (enum + percentage) of nuclear waste and CO2 exhaust of this location’s tariff. |
| energy_mix.environ_impact.category | EnvironmentalImpactCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR_WASTE or CARBON_DIOXIDE |
| energy_mix.environ_impact.amount | number | 1 | Percentage of this source (0-100) in the mix. |
| energy_mix.supplier_name | string(64) | ? | Name of the energy supplier, delivering the energy for this location or tariff. |
| energy_mix.energy_product_name | string(64) | ? | Name of the energy supplier's product/tariff plan used at this location. |
| last_updated | DateTime | 1 | Timestamp when this Tariff was last updated (or created). |
Sample Response
{
"country_code": "DE",
"party_id": "ALL",
"id": "14",
"currency": "EUR",
"type": "REGULAR",
"tariff_alt_url": "https://company.com/tariffs/14",
"elements": [
{
"price_components": [
{
"type": "FLAT",
"price": 2.5,
"vat": 15.0,
"step_size": 1
}
]
},
{
"price_components": [
{
"type": "TIME",
"price": 1.0,
"vat": 20.0,
"step_size": 900
}
],
"restrictions": {
"max_current": 32.0
}
},
{
"price_components": [
{
"type": "TIME",
"price": 2.0,
"vat": 20.0,
"step_size": 600
}
],
"restrictions": {
"min_current": 32.0,
"day_of_week": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"]
}
},
{
"price_components": [
{
"type": "TIME",
"price": 1.25,
"vat": 20.0,
"step_size": 600
}
],
"restrictions": {
"min_current": 32.0,
"day_of_week": ["SATURDAY", "SUNDAY"]
}
},
{
"price_components": [
{
"type": "PARKING_TIME",
"price": 5.0,
"vat": 10.0,
"step_size": 300
}
],
"restrictions": {
"start_time": "09:00",
"end_time": "18:00",
"day_of_week": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"]
}
},
{
"price_components": [
{
"type": "PARKING_TIME",
"price": 6.0,
"vat": 10.0,
"step_size": 300
}
],
"restrictions": {
"start_time": "10:00",
"end_time": "17:00",
"day_of_week": ["SATURDAY"]
}
}
],
"last_updated": "2015-06-29T20:39:09Z"
}
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get all Sessions
This API, will return the private charging sessions.
The API also provide further search options to filter the result set.
- Based on the last updated date between two given dates.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST QUERY PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _datefrom | DateTime | No | Only return Sessions that have last_updated after this Date/Time. |
| _dateto | DateTime | No | Only return Sessions that have last_updated before this Date/Time. |
| offset | int | No | The offset of the first object returned. Default is 0. |
| limit | int | No | Maximum number of objects to GET. |
Sample Request
curl --location '{{url}}/v1/sessions/?date_from=xxx&date_to=yyy' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a array of JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the CPO that 'owns' this Session. |
| party_id | CiString(3) | 1 | ID of the CPO that 'owns' this Session (following the ISO-15118 standard). |
| id | CiString(36) | 1 | The unique id that identifies the charging session in the CPO platform. |
| start_date_time | DateTime | 1 | The timestamp when the session became ACTIVE in the Charge Point. When the session is still PENDING, this field SHALL be set to the time the Session was created at the Charge Point. When a Session goes from PENDING to ACTIVE, this field SHALL be updated to the moment the Session went to ACTIVE in the Charge Point. |
| end_date_time | DateTime | ? | The timestamp when the session was completed/finished, charging might have finished before the session ends, for example: EV is full, but parking cost also has to be paid. |
| kwh | number | 1 | How many kWh were charged. |
| cdr_token | CdrToken(JSON) | 1 | Token used to start this charging session, including all the relevant information to identify the unique token. |
| cdr_token.country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the MSP that 'owns' this Token. |
| cdr_token.party_id | CiString(3) | 1 | ID of the eMSP that 'owns' this Token (following the ISO-15118 standard). |
| cdr_token.uid | CiString(36) | 1 | Unique ID by which this Token can be identified. This is the field used by the CPO’s system (RFID reader on the Charge Point) to identify this token. Currently, in most cases: type=RFID, this is the RFID hidden ID as read by the RFID reader, but that is not a requirement. If this is a type=APP_USER Token, it will be a unique, by the eMSP, generated ID. |
| cdr_token.type | TokenType(Enum) | 1 | Type of the token. Could be AD_HOC_USER, APP_USER, OTHER or RFID. |
| cdr_token.contract_id | CiString(36) | 1 | Uniquely identifies the EV driver contract token within the eMSP’s platform (and suboperator platforms). Recommended to follow the specification for eMA ID from "eMI3 standard version V1.0" (http://emi3group.com/documents-links/) "Part 2: business objects." |
| auth_method | AuthMethod(Enum) | 1 | Method used for authentication. This might change during a session, for example when the session was started with a reservation: ReserveNow: COMMAND. When the driver arrives and starts charging using a Token that is whitelisted: WHITELIST. Could be AUTH_REQUEST, COMMAND or WHITELIST. |
| authorization_reference | CiString(36) | ? | Reference to the authorization given by the eMSP. When the eMSP provided an authorization_reference in either: real-time authorization, StartSession or ReserveNow this field SHALL contain the same value. When different authorization_reference values have been given by the eMSP that are relevant to this Session, the last given value SHALL be used here. |
| location_id | CiString(36) | 1 | Location.id of the Location object of this CPO, on which the charging session is/was happening. |
| evse_uid | CiString(36) | 1 | EVSE.uid of the EVSE of this Location on which the charging session is/was happening. Allowed to be set to: #NA when this session is created for a reservation, but no EVSE yet assigned to the driver. |
| connector_id | CiString(36) | 1 | Connector.id of the Connector of this Location where the charging session is/was happening. Allowed to be set to: #NA when this session is created for a reservation, but no connector yet assigned to the driver. |
| meter_id | string(255) | ? | Optional identification of the kWh meter. |
| currency | string(3) | 1 | ISO 4217 code of the currency used for this session. |
| charging_periods | ChargingPeriod(Array) | * | An optional list of Charging Periods that can be used to calculate and verify the total cost. |
| charging_periods.start_date_time | DateTime | 1 | Start timestamp of the charging period. A period ends when the next period starts. The last period ends when the session ends. |
| charging_periods.dimensions | CdrDimension(Array) | + | List of relevant values for this charging period. |
| charging_periods.dimensions.type | CdrDimensionType | 1 | Type of CDR dimension. Could be CURRENT, ENERGY, ENERGY_EXPORT, ENERGY_IMPORT, MAX_POWER, MAX_CURRENT, MIN_CURRENT, MIN_POWER, PARKING_TIME, POWER, RESERVATION_TIME, STATE_OF_CHARGE or TIME. |
| charging_periods.dimensions.volume | number | 1 | Volume of the dimension consumed, measured according to the dimension type. |
| charging_periods.tariff_id | CiString(36) | ? | Unique identifier of the Tariff that is relevant for this Charging Period. If not provided, no Tariff is relevant during this period. |
| total_cost | Price(JSON) | ? | The total cost of the session in the specified currency. This is the price that the eMSP will have to pay to the CPO. A total_cost of 0.00 means free of charge. When omitted, i.e. no price information is given in the Session object, it does not imply the session is/was free of charge. |
| total_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_cost.incl_vat | number | ? | Price/Cost including VAT. |
| status | SessionStatus(Enum) | 1 | The status of the session. Could be ACTIVE, COMPLETED, INVALID, PENDING or RESERVATION. |
| last_updated | DateTime | 1 | Timestamp when this Session was last updated (or created). |
Sample Response
[
{
"country_code": "NL",
"party_id": "STK",
"id": "101",
"start_date_time": "2020-03-09T10:17:09Z",
"kwh": 0.0,
"cdr_token": {
"uid": "123abc",
"type": "RFID",
"contract_id": "NL-TST-C12345678-S"
},
"auth_method": "WHITELIST",
"location_id": "LOC1",
"evse_uid": "3256",
"connector_id": "1",
"currency": "EUR",
"total_cost": {
"excl_vat": 2.5
},
"status": "PENDING",
"last_updated": "2020-03-09T10:17:09Z"
},
{
"country_code": "BE",
"party_id": "BEC",
"id": "101",
"start_date_time": "2015-06-29T22:39:09Z",
"end_date_time": "2015-06-29T23:50:16Z",
"kwh": 41.0,
"cdr_token": {
"uid": "123abc",
"type": "RFID",
"contract_id": "NL-TST-C12345678-S"
},
"auth_method": "WHITELIST",
"location_id": "LOC1",
"evse_uid": "3256",
"connector_id": "1",
"currency": "EUR",
"charging_periods": [
{
"start_date_time": "2015-06-29T22:39:09Z",
"dimensions": [
{
"type": "ENERGY",
"volume": 120
},
{
"type": "MAX_CURRENT",
"volume": 30
}
]
},
{
"start_date_time": "2015-06-29T22:40:54Z",
"dimensions": [
{
"type": "ENERGY",
"volume": 41000
},
{
"type": "MIN_CURRENT",
"volume": 34
}
]
},
{
"start_date_time": "2015-06-29T23:07:09Z",
"dimensions": [
{
"type": "PARKING_TIME",
"volume": 0.718
}
],
"tariff_id": "12"
}
],
"total_cost": {
"excl_vat": 8.5,
"incl_vat": 9.35
},
"status": "COMPLETED",
"last_updated": "2015-06-29T23:50:17Z"
}
]
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get a particular Session
This API, will return the private charging particular session.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST QUERY PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _sessionid | CiString(36) | Yes | Session.id of the Session for which the Charging Preferences are to be set. |
Sample Request
curl --location '{{url}}/v1/sessions/{session_id}' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the CPO that 'owns' this Session. |
| party_id | CiString(3) | 1 | ID of the CPO that 'owns' this Session (following the ISO-15118 standard). |
| id | CiString(36) | 1 | The unique id that identifies the charging session in the CPO platform. |
| start_date_time | DateTime | 1 | The timestamp when the session became ACTIVE in the Charge Point. When the session is still PENDING, this field SHALL be set to the time the Session was created at the Charge Point. When a Session goes from PENDING to ACTIVE, this field SHALL be updated to the moment the Session went to ACTIVE in the Charge Point. |
| end_date_time | DateTime | ? | The timestamp when the session was completed/finished, charging might have finished before the session ends, for example: EV is full, but parking cost also has to be paid. |
| kwh | number | 1 | How many kWh were charged. |
| cdr_token | CdrToken(JSON) | 1 | Token used to start this charging session, including all the relevant information to identify the unique token. |
| cdr_token.country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the MSP that 'owns' this Token. |
| cdr_token.party_id | CiString(3) | 1 | ID of the eMSP that 'owns' this Token (following the ISO-15118 standard). |
| cdr_token.uid | CiString(36) | 1 | Unique ID by which this Token can be identified. This is the field used by the CPO’s system (RFID reader on the Charge Point) to identify this token. Currently, in most cases: type=RFID, this is the RFID hidden ID as read by the RFID reader, but that is not a requirement. If this is a type=APP_USER Token, it will be a unique, by the eMSP, generated ID. |
| cdr_token.type | TokenType(Enum) | 1 | Type of the token. Could be AD_HOC_USER, APP_USER, OTHER or RFID. |
| cdr_token.contract_id | CiString(36) | 1 | Uniquely identifies the EV driver contract token within the eMSP’s platform (and suboperator platforms). Recommended to follow the specification for eMA ID from "eMI3 standard version V1.0" (http://emi3group.com/documents-links/) "Part 2: business objects." |
| auth_method | AuthMethod(Enum) | 1 | Method used for authentication. This might change during a session, for example when the session was started with a reservation: ReserveNow: COMMAND. When the driver arrives and starts charging using a Token that is whitelisted: WHITELIST. Could be AUTH_REQUEST, COMMAND or WHITELIST. |
| authorization_reference | CiString(36) | ? | Reference to the authorization given by the eMSP. When the eMSP provided an authorization_reference in either: real-time authorization, StartSession or ReserveNow this field SHALL contain the same value. When different authorization_reference values have been given by the eMSP that are relevant to this Session, the last given value SHALL be used here. |
| location_id | CiString(36) | 1 | Location.id of the Location object of this CPO, on which the charging session is/was happening. |
| evse_uid | CiString(36) | 1 | EVSE.uid of the EVSE of this Location on which the charging session is/was happening. Allowed to be set to: #NA when this session is created for a reservation, but no EVSE yet assigned to the driver. |
| connector_id | CiString(36) | 1 | Connector.id of the Connector of this Location where the charging session is/was happening. Allowed to be set to: #NA when this session is created for a reservation, but no connector yet assigned to the driver. |
| meter_id | string(255) | ? | Optional identification of the kWh meter. |
| currency | string(3) | 1 | ISO 4217 code of the currency used for this session. |
| charging_periods | ChargingPeriod(Array) | * | An optional list of Charging Periods that can be used to calculate and verify the total cost. |
| charging_periods.start_date_time | DateTime | 1 | Start timestamp of the charging period. A period ends when the next period starts. The last period ends when the session ends. |
| charging_periods.dimensions | CdrDimension(Array) | + | List of relevant values for this charging period. |
| charging_periods.dimensions.type | CdrDimensionType | 1 | Type of CDR dimension. Could be CURRENT, ENERGY, ENERGY_EXPORT, ENERGY_IMPORT, MAX_POWER, MAX_CURRENT, MIN_CURRENT, MIN_POWER, PARKING_TIME, POWER, RESERVATION_TIME, STATE_OF_CHARGE or TIME. |
| charging_periods.dimensions.volume | number | 1 | Volume of the dimension consumed, measured according to the dimension type. |
| charging_periods.tariff_id | CiString(36) | ? | Unique identifier of the Tariff that is relevant for this Charging Period. If not provided, no Tariff is relevant during this period. |
| total_cost | Price(JSON) | ? | The total cost of the session in the specified currency. This is the price that the eMSP will have to pay to the CPO. A total_cost of 0.00 means free of charge. When omitted, i.e. no price information is given in the Session object, it does not imply the session is/was free of charge. |
| total_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_cost.incl_vat | number | ? | Price/Cost including VAT. |
| status | SessionStatus(Enum) | 1 | The status of the session. Could be ACTIVE, COMPLETED, INVALID, PENDING or RESERVATION. |
| last_updated | DateTime | 1 | Timestamp when this Session was last updated (or created). |
Sample Response
{
"country_code": "BE",
"party_id": "BEC",
"id": "101",
"start_date_time": "2015-06-29T22:39:09Z",
"end_date_time": "2015-06-29T23:50:16Z",
"kwh": 41.0,
"cdr_token": {
"uid": "123abc",
"type": "RFID",
"contract_id": "NL-TST-C12345678-S"
},
"auth_method": "WHITELIST",
"location_id": "LOC1",
"evse_uid": "3256",
"connector_id": "1",
"currency": "EUR",
"charging_periods": [
{
"start_date_time": "2015-06-29T22:39:09Z",
"dimensions": [
{
"type": "ENERGY",
"volume": 120
},
{
"type": "MAX_CURRENT",
"volume": 30
}
]
},
{
"start_date_time": "2015-06-29T22:40:54Z",
"dimensions": [
{
"type": "ENERGY",
"volume": 41000
},
{
"type": "MIN_CURRENT",
"volume": 34
}
]
},
{
"start_date_time": "2015-06-29T23:07:09Z",
"dimensions": [
{
"type": "PARKING_TIME",
"volume": 0.718
}
],
"tariff_id": "12"
}
],
"total_cost": {
"excl_vat": 8.5,
"incl_vat": 9.35
},
"status": "COMPLETED",
"last_updated": "2015-06-29T23:50:17Z"
}
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get all CDRs
This API, will return the private charging CDRs.
The API also provide further search options to filter the result set.
- Based on the last updated date between two given dates.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST QUERY PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _datefrom | DateTime | No | Only return CDRs that have last_updated after this Date/Time. |
| _dateto | DateTime | No | Only return CDRs that have last_updated before this Date/Time. |
| offset | int | No | The offset of the first object returned. Default is 0. |
| limit | int | No | Maximum number of objects to GET. |
Sample Request
curl --location '{{url}}/v1/cdrs/?date_from=xxx&date_to=yyy' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a array of JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the CPO that 'owns' this CDR. |
| party_id | CiString(3) | 1 | ID of the CPO that 'owns' this CDR (following the ISO-15118 standard). |
| id | CiString(39) | 1 | Uniquely identifies the CDR, the ID SHALL be unique per country_code/party_id combination. This field is longer than the usual 36 characters to allow for credit CDRs to have something appended to the original ID. Normal (non-credit) CDRs SHALL only have an ID with a maximum length of 36. |
| start_date_time | DateTime | 1 | Start timestamp of the charging session, or in the case of a reservation (before the start of a session) the start of the reservation. |
| end_date_time | DateTime | 1 | The timestamp when the session was completed/finished, charging might have finished before the session ends, for example: EV is full, but parking cost also has to be paid. |
| session_id | CiString(36) | ? | Unique ID of the Session for which this CDR is sent. Is only allowed to be omitted when the CPO has not implemented the Sessions module or this CDR is the result of a reservation that never became a charging session, thus no OCPI Session. |
| cdr_token | CdrToken(JSON) | 1 | Token used to start this charging session, including all the relevant information to identify the unique token. |
| cdr_token.country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the MSP that 'owns' this Token. |
| cdr_token.party_id | CiString(3) | 1 | ID of the eMSP that 'owns' this Token (following the ISO-15118 standard). |
| cdr_token.uid | CiString(36) | 1 | Unique ID by which this Token can be identified. This is the field used by the CPO’s system (RFID reader on the Charge Point) to identify this token. Currently, in most cases: type=RFID, this is the RFID hidden ID as read by the RFID reader, but that is not a requirement. If this is a type=APP_USER Token, it will be a unique, by the eMSP, generated ID. |
| cdr_token.type | TokenType(Enum) | 1 | Type of the token. Could be AD_HOC_USER, APP_USER, OTHER or RFID. |
| cdr_token.contract_id | CiString(36) | 1 | Uniquely identifies the EV driver contract token within the eMSP’s platform (and suboperator platforms). Recommended to follow the specification for eMA ID from "eMI3 standard version V1.0" (http://emi3group.com/documents-links/) "Part 2: business objects." |
| auth_method | AuthMethod(Enum) | 1 | Method used for authentication. Multiple AuthMethods are possible during a charging session, for example when the session was started with a reservation: ReserveNow: COMMAND. When the driver arrives and starts charging using a Token that is whitelisted: WHITELIST. The last method SHALL be used in the CDR. Could be AUTH_REQUEST, COMMAND or WHITELIST. |
| authorization_reference | CiString(36) | ? | Reference to the authorization given by the eMSP. When the eMSP provided an authorization_reference in either: real-time authorization, StartSession or ReserveNow, this field SHALL contain the same value. When different authorization_reference values have been given by the eMSP that are relevant to this Session, the last given value SHALL be used here. |
| cdr_location | CdrLocation(JSON) | 1 | Location where the charging session took place, including only the relevant EVSE and Connector. |
| cdr_location.id | CiString(36) | 1 | Uniquely identifies the location within the CPO’s platform (and suboperator platforms). This field can never be changed, modified or renamed. |
| cdr_location.name | string(255) | ? | Display name of the location. |
| cdr_location.address | string(45) | 1 | Street/block name and house number if available. |
| cdr_location.city | string(45) | 1 | City or town. |
| cdr_location.postal_code | string(10) | ? | Postal code of the location, may only be omitted when the location has no postal code: in some countries charging locations at highways don’t have postal codes. |
| cdr_location.state | string(20) | ? | State only to be used when relevant. |
| cdr_location.country | string(3) | 1 | ISO 3166-1 alpha-3 code for the country of this location. |
| cdr_location.coordinates | GeoLocation | 1 | Coordinates of the location. |
| cdr_location.coordinates.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| cdr_location.coordinates.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| cdr_location.evse_uid | CiString(36) | 1 | Uniquely identifies the EVSE within the CPO’s platform (and suboperator platforms). For example a database unique ID or the actual EVSE ID. This field can never be changed, modified or renamed. This is the technical identification of the EVSE, not to be used as human readable identification, use the field: evse_id for that. Allowed to be set to: #NA when this CDR is created for a reservation that never resulted in a charging session. |
| cdr_location.evse_id | CiString(48) | 1 | Compliant with the following specification for EVSE ID from "eMI3 standard version V1.0" (http://emi3group.com/documents-links/) "Part 2: business objects.". Allowed to be set to: #NA when this CDR is created for a reservation that never resulted in a charging session. |
| cdr_location.connector_id | CiString(36) | 1 | Identifier of the connector within the EVSE. Allowed to be set to: #NA when this CDR is created for a reservation that never resulted in a charging session. |
| cdr_location.connector_standard | ConnectorType(Enum) | 1 | The standard of the installed connector. When this CDR is created for a reservation that never resulted in a charging session, this field can be set to any value and should be ignored by the Receiver. Could be CHADEMO, CHAOJI, DOMESTICA, DOMESTIC_B, DOMESTIC_C, DOMESTIC_D, DOMESTIC_E, DOMESTIC_F, DOMESTIC_G, DOMESTIC_H, DOMESTIC_I, DOMESTIC_J, DOMESTIC_K, DOMESTIC_L, DOMESTIC_M, DOMESTIC_N, DOMESTIC_O, GBT_AC, GBT_DC, IEC_60309_2_single_16, IEC_60309_2_three_16, IEC_60309_2_three_32, IEC_60309_2_three_64, IEC_62196_T1, IEC_62196_T1_COMBO, IEC_62196_T2, IEC_62196_T2_COMBO, IEC_62196_T3A, IEC_62196_T3C, NEMA_5_20, NEMA_6_30, NEMA_6_50, NEMA_10_30, NEMA_10_50, NEMA_14_30, NEMA_14_50, PANTOGRAPH_BOTTOM UP, PANTOGRAPH_TOP_DOW N, TESLA_R or TESLA_S |
| cdr_location.connector_format | ConnectorFormat(Enum) | 1 | The format (socket/cable) of the installed connector. When this CDR is created for a reservation that never resulted in a charging session, this field can be set to any value and should be ignored by the Receiver. Could be SOCKET or CABLE. |
| cdr_location.connector_power_type | PowerType(Enum) | 1 | When this CDR is created for a reservation that never resulted in a charging session, this field can be set to any value and should be ignored by the Receiver. Could be AC_1_PHASE, AC_2_PHASE, AC_2_PHASE_SPLIT, AC_3_PHASE or DC |
| meter_id | string(255) | ? | Identification of the Meter inside the Charge Point. |
| currency | string(3) | 1 | Currency of the CDR in ISO 4217 Code. |
| tariffs | Tariff(Array) | * | List of relevant Tariff Elements, see: Tariff. When relevant, a Free of Charge tariff should also be in this list, and point to a defined Free of Charge Tariff. |
| tariffs.country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the CPO that owns this Tariff. |
| tariffs.party_id | CiString(3) | 1 | ID of the CPO that 'owns' this Tariff (following the ISO-15118 standard). |
| tariffs.id | CiString(36) | 1 | Uniquely identifies the tariff within the CPO’s platform (and suboperator platforms). |
| tariffs.currency | string(3) | 1 | ISO-4217 code of the currency of this tariff. |
| tariffs.type | TariffType(Enum) | ? | Defines the type of the tariff. This allows for distinction in case of given Charging Preferences. When omitted, this tariff is valid for all sessions. Could be AD_HOC_PAYMENT, PROFILE_CHEAP, PROFILE_FAST, PROFILE_GREEN or REGULAR. |
| tariffs.tariff_alt_text | DisplayText(Array) | * | List of multi-language alternative tariff info texts. |
| tariffs.tariff_alt_text.language | string(2) | 1 | Language Code ISO 639-1 |
| tariffs.tariff_alt_text.text | string(512) | 1 | Text to be displayed to an end user. No markup, html etc. allowed. |
| tariffs.tariff_alt_url | URL | ? | URL to a web page that contains an explanation of the tariff information in human readable form. |
| tariffs.min_price | Price(JSON) | ? | When this field is set, a Charging Session with this tariff will at least cost this amount. This is different from a FLAT fee (Start Tariff, Transaction Fee), as a FLAT fee is a fixed amount that has to be paid for any Charging Session. A minimum price indicates that when the cost of a Charging Session is lower than this amount, the cost of the Session will be equal to this amount. |
| tariffs.min_price.excl_vat | number | 1 | Price/Cost excluding VAT. |
| tariffs.min_price.incl_vat | number | ? | Price/Cost including VAT. |
| tariffs.max_price | Price(JSON) | ? | When this field is set, a Charging Session with this tariff will NOT cost more than this amount. |
| tariffs.max_price.excl_vat | number | 1 | Price/Cost excluding VAT. |
| tariffs.max_price.incl_vat | number | ? | Price/Cost including VAT. |
| tariffs.elements | TariffElement(Array) | + | List of Tariff Elements. |
| tariffs.elements.price_components | PriceComponent(Array) | + | List of price components that describe the pricing of a tariff. |
| tariffs.elements.price_components.type | TariffDimensionType(Enum) | 1 | Type of tariff dimension. Could be ENERGY, FLAT, PARKING_TIME or TIME. |
| tariffs.elements.price_components.price | number | 1 | Price per unit (excl. VAT) for this tariff dimension. |
| tariffs.elements.price_components.vat | number | ? | Applicable VAT percentage for this tariff dimension. If omitted, no VAT is applicable. Not providing a VAT is different from 0% VAT, which would be a value of 0.0 here. |
| tariffs.elements.price_components.step_size | int | 1 | Minimum amount to be billed. This unit will be billed in this step_size blocks. Amounts that are less than this step_size are rounded up to the given step_size. For example: if type is TIME and step_size has a value of 300, then time will be billed in blocks of 5 minutes. If 6 minutes were used, 10 minutes (2 blocks of step_size) will be billed. |
| tariffs.elements.restrictions | TariffRestrictions | ? | Restrictions that describe the applicability of a tariff. |
| tariffs.elements.restrictions.start_time | string(5) | ? | Start time of day in local time, the time zone is defined in the time_zone field of the Location, for example 13:30, valid from this time of the day. Must be in 24h format with leading zeros. Hour/Minute separator: ":" Regex: ([0-1][0-9]2[0-3]):[0-5][0-9] |
| tariffs.elements.restrictions.end_time | string(5) | ? | End time of day in local time, the time zone is defined in the time_zone field of the Location, for example 19:45, valid until this time of the day. Same syntax as start_time. If end_time < start_time then the period wraps around to the next day. To stop at end of the day use: 00:00. |
| tariffs.elements.restrictions.start_date | string(10) | ? | Start date in local time, the time zone is defined in the time_zone field of the Location, for example: 2015-12-24, valid from this day (inclusive). Regex: ([12][0-9]{3})-(0[1-9]1[0-2])-(0[1-9][12][0-9]3[01]) |
| tariffs.elements.restrictions.end_date | string(10) | ? | End date in local time, the time zone is defined in the time_zone field of the Location, for example: 2015-12-27, valid until this day (exclusive). Same syntax as start_date. |
| tariffs.elements.restrictions.min_kwh | number | ? | Minimum consumed energy in kWh, for example 20, valid from this amount of energy (inclusive) being used. |
| tariffs.elements.restrictions.max_kwh | number | ? | Maximum consumed energy in kWh, for example 50, valid until this amount of energy (exclusive) being used. |
| tariffs.elements.restrictions.min_current | number | ? | Sum of the minimum current (in Amperes) over all phases, for example 5. When the EV is charging with more than, or equal to, the defined amount of current, this TariffElement is/becomes active. If the charging current is or becomes lower, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the minimum current over the entire Charging Session. This restriction can make a TariffElement become active when the charging current is above the defined value, but the TariffElement MUST no longer be active when the charging current drops below the defined value. |
| tariffs.elements.restrictions.max_current | number | ? | Sum of the maximum current (in Amperes) over all phases, for example 20. When the EV is charging with less than the defined amount of current, this TariffElement becomes/is active. If the charging current is or becomes higher, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the maximum current over the entire Charging Session. This restriction can make a TariffElement become active when the charging current is below this value, but the TariffElement MUST no longer be active when the charging current raises above the defined value. |
| tariffs.elements.restrictions.min_power | number | ? | Minimum power in kW, for example 5. When the EV is charging with more than, or equal to, the defined amount of power, this TariffElement is/becomes active. If the charging power is or becomes lower, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the minimum power over the entire Charging Session. This restriction can make a TariffElement become active when the charging power is above this value, but the TariffElement MUST no longer be active when the charging power drops below the defined value. |
| tariffs.elements.restrictions.max_power | number | ? | Maximum power in kW, for example 20. When the EV is charging with less than the defined amount of power, this TariffElement becomes/is active. If the charging power is or becomes higher, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the maximum power over the entire Charging Session. This restriction can make a TariffElement become active when the charging power is below this value, but the TariffElement MUST no longer be active when the charging power raises above the defined value. |
| tariffs.elements.restrictions.min_duration | int | ? | Minimum duration in seconds the Charging Session MUST last (inclusive). When the duration of a Charging Session is longer than the defined value, this TariffElement is or becomes active. Before that moment, this TariffElement is not yet active. |
| tariffs.elements.restrictions.max_duration | int | ? | Maximum duration in seconds the Charging Session MUST last (exclusive). When the duration of a Charging Session is shorter than the defined value, this TariffElement is or becomes active. After that moment, this TariffElement is no longer active. |
| tariffs.elements.restrictions.day_of_week | DayOfWeek(Array) | * | Which day(s) of the week this TariffElement is active. Could be MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY and SUNDAY. |
| tariffs.elements.restrictions.reservation | ReservationRestrictionType(Enum) | * | When this field is present, the TariffElement describes reservation costs. A reservation starts when the reservation is made, and ends when the driver starts charging on the reserved EVSE/Location, or when the reservation expires. A reservation can only have: FLAT and TIME TariffDimensions, where TIME is for the duration of the reservation. Could be RESERVATION or RESERVATION_EXPIRES. |
| tariffs.start_date_time | DateTime | ? | The time when this tariff becomes active, in UTC, time_zone field of the Location can be used to convert to local time. Typically used for a new tariff that is already given with the location, before it becomes active. |
| tariffs.end_date_time | DateTime | ? | The time after which this tariff is no longer valid, in UTC, time_zone field if the Location can be used to convert to local time. Typically used when this tariff is going to be replaced with a different tariff in the near future. |
| tariffs.energy_mix | EnergyMix(JSON) | ? | Details on the energy supplied with this tariff. |
| tariffs.energy_mix.is_green_energy | boolean | 1 | True if 100% from regenerative sources. (CO2 and nuclear waste is zero) |
| tariffs.energy_mix.energy_sources | EnergySource(Array) | * | Key-value pairs (enum + percentage) of energy sources of this location’s tariff. |
| tariffs.energy_mix.energy_sources.source | EnergySourceCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR, GENERAL_FOSSIL, COAL, GAS, GENERAL_GREEN, SOLAR, WIND or WATER |
| tariffs.energy_mix.energy_sources.percentage | number | 1 | Percentage of this source (0-100) in the mix. |
| tariffs.energy_mix.environ_impact | EnvironmentalImpact(Array) | * | Key-value pairs (enum + percentage) of nuclear waste and CO2 exhaust of this location’s tariff. |
| tariffs.energy_mix.environ_impact.category | EnvironmentalImpactCategory(Enum) | 1 | The type of environmental impact. Could be NUCLEAR_WASTE or CARBON_DIOXIDE |
| tariffs.energy_mix.environ_impact.amount | number | 1 | Percentage of this impact (0-100) in the mix. |
| tariffs.energy_mix.supplier_name | string(64) | ? | Name of the energy supplier, delivering the energy for this location or tariff. |
| tariffs.energy_mix.energy_product_name | string(64) | ? | Name of the energy supplier's product/tariff plan used at this location. |
| tariffs.last_updated | DateTime | 1 | Timestamp when this Tariff was last updated (or created). |
| charging_periods | ChargingPeriod(Array) | + | List of Charging Periods that make up this charging session. A session consists of 1 or more periods, where each period has a different relevant Tariff. |
| charging_periods.start_date_time | DateTime | 1 | Start timestamp of the charging period. A period ends when the next period starts. The last period ends when the session ends. |
| charging_periods.dimensions | CdrDimension(Array) | + | List of relevant values for this charging period. |
| charging_periods.dimensions.type | CdrDimensionType | 1 | Type of CDR dimension. Could be CURRENT, ENERGY, ENERGY_EXPORT, ENERGY_IMPORT, MAX_POWER, MAX_CURRENT, MIN_CURRENT, MIN_POWER, PARKING_TIME, POWER, RESERVATION_TIME, STATE_OF_CHARGE or TIME. |
| charging_periods.dimensions.volume | number | 1 | Volume of the dimension consumed, measured according to the dimension type. |
| charging_periods.tariff_id | CiString(36) | ? | Unique identifier of the Tariff that is relevant for this Charging Period. If not provided, no Tariff is relevant during this period. |
| signed_data | SignedData | 1 | Data signed to ensure integrity and authenticity. |
| signed_data.encoding_method | CiString(36) | 1 | The name of the encoding used in the SignedData field. This is the name given to the encoding by a company or group of companies. See note below. |
| signed_data.encoding_method_version | int | ? | Version of the EncodingMethod (when applicable). |
| signed_data.public_key | string(512) | ? | Public key used to sign the data, base64 encoded. |
| signed_data.signed_values | SignedValue(Array of Enum) | + | One or more signed values. Could be nature, plain_data and signed_data. |
| signed_data.url | string(512) | ? | URL that can be shown to an EV driver. This URL gives the EV driver the possibility to check the signed data from a charging session. |
| total_cost | Price(JSON) | 1 | Total sum of all the costs of this transaction in the specified currency. |
| total_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_cost.incl_vat | number | ? | Price/Cost including VAT. |
| total_fixed_cost | Price(JSON) | ? | Total sum of all the fixed costs in the specified currency, except fixed price components of parking and reservation. The cost not depending on amount of time/energy used etc. Can contain costs like a start tariff. |
| total_energy | number | 1 | Total amount of energy used during the charging session, in the specified unit. |
| total_energy_cost | Price(JSON) | ? | Total sum of all the cost of all the energy used, in the specified currency. |
| total_energy_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_energy_cost.incl_vat | number | ? | Price/Cost including VAT. |
| total_time | number | 1 | Total duration of the charging session (including the duration of charging and not charging), in hours. |
| total_time_cost | Price(JSON) | ? | Total sum of all the cost related to duration of charging during this transaction, in the specified currency. |
| total_time_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_time_cost.incl_vat | number | ? | Price/Cost including VAT. |
| total_parking_time | number | ? | Total duration of the charging session where the EV was not charging (no energy was transferred between EVSE and EV), in hours. |
| total_parking_cost | Price(JSON) | ? | Total sum of all the cost related to parking of this transaction, including fixed price components, in the specified currency. |
| total_parking_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_parking_cost.incl_vat | number | ? | Price/Cost including VAT. |
| total_reservation_cost | Price(JSON) | ? | Total sum of all the cost related to a reservation of a Charge Point, including fixed price components, in the specified currency. |
| total_reservation_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_reservation_cost.incl_vat | number | ? | Price/Cost including VAT. |
| remark | string(255) | ? | Optional remark, can be used to provide additional human-readable information to the CDR, for example: reason why a transaction was stopped. |
| invoice_reference_id | CiString(39) | ? | This field can be used to reference an invoice, that will later be sent for this CDR. Making it easier to link a CDR to a given invoice. Maybe even group CDRs that will be on the same invoice. |
| credit | boolean | ? | When set to true, this is a Credit CDR, and the field credit_reference_id needs to be set as well. |
| credit_reference_id | CiString(39) | ? | Is required to be set for a Credit CDR. This SHALL contain the id of the CDR for which this is a Credit CDR. |
| home_charging_compensation | boolean | ? | When set to true, this CDR is for a charging session using the home charger of the EV Driver for which the energy cost needs to be financially compensated to the EV Driver. |
| last_updated | DateTime | 1 | Timestamp when this CDR was last updated (or created). |
Sample Response
[
{
"country_code": "BE",
"party_id": "BEC",
"id": "12345",
"start_date_time": "2015-06-29T21:39:09Z",
"end_date_time": "2015-06-29T23:37:32Z",
"cdr_token": {
"uid": "012345678",
"type": "RFID",
"contract_id": "DE8ACC12E46L89"
},
"auth_method": "WHITELIST",
"cdr_location": {
"id": "LOC1",
"name": "Gent Zuid",
"address": "F.Rooseveltlaan 3A",
"city": "Gent",
"postal_code": "9000",
"country": "BEL",
"coordinates": {
"latitude": "3.729944",
"longitude": "51.047599"
},
"evse_uid": "3256",
"evse_id": "BE*BEC*E041503003",
"connector_id": "1",
"connector_standard": "IEC_62196_T2",
"connector_format": "SOCKET",
"connector_power_type": "AC_1_PHASE"
},
"currency": "EUR",
"tariffs": [
{
"country_code": "BE",
"party_id": "BEC",
"id": "12",
"currency": "EUR",
"elements": [
{
"price_components": [
{
"type": "TIME",
"price": 2.0,
"vat": 10.0,
"step_size": 300
}
]
}
],
"last_updated": "2015-02-02T14:15:01Z"
}
],
"charging_periods": [
{
"start_date_time": "2015-06-29T21:39:09Z",
"dimensions": [
{
"type": "TIME",
"volume": 1.973
}
],
"tariff_id": "12"
}
],
"total_cost": {
"excl_vat": 4.0,
"incl_vat": 4.4
},
"total_energy": 15.342,
"total_time": 1.973,
"total_time_cost": {
"excl_vat": 4.0,
"incl_vat": 4.4
},
"last_updated": "2015-06-29T22:01:13Z"
}
]
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Get a particular CDR
This API, will return the private charging particular CDR.
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request query parameters
| REQUEST QUERY PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| _cdrid | CiString(36) | Yes | CDR.id of the CDR for which the Charging Preferences are to be set. |
Sample Request
curl --location '{{url}}/v1/cdrs/{cdr_id}' \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a JSON object with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the CPO that 'owns' this CDR. |
| party_id | CiString(3) | 1 | ID of the CPO that 'owns' this CDR (following the ISO-15118 standard). |
| id | CiString(39) | 1 | Uniquely identifies the CDR, the ID SHALL be unique per country_code/party_id combination. This field is longer than the usual 36 characters to allow for credit CDRs to have something appended to the original ID. Normal (non-credit) CDRs SHALL only have an ID with a maximum length of 36. |
| start_date_time | DateTime | 1 | Start timestamp of the charging session, or in the case of a reservation (before the start of a session) the start of the reservation. |
| end_date_time | DateTime | 1 | The timestamp when the session was completed/finished, charging might have finished before the session ends, for example: EV is full, but parking cost also has to be paid. |
| session_id | CiString(36) | ? | Unique ID of the Session for which this CDR is sent. Is only allowed to be omitted when the CPO has not implemented the Sessions module or this CDR is the result of a reservation that never became a charging session, thus no OCPI Session. |
| cdr_token | CdrToken(JSON) | 1 | Token used to start this charging session, including all the relevant information to identify the unique token. |
| cdr_token.country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the MSP that 'owns' this Token. |
| cdr_token.party_id | CiString(3) | 1 | ID of the eMSP that 'owns' this Token (following the ISO-15118 standard). |
| cdr_token.uid | CiString(36) | 1 | Unique ID by which this Token can be identified. This is the field used by the CPO’s system (RFID reader on the Charge Point) to identify this token. Currently, in most cases: type=RFID, this is the RFID hidden ID as read by the RFID reader, but that is not a requirement. If this is a type=APP_USER Token, it will be a unique, by the eMSP, generated ID. |
| cdr_token.type | TokenType(Enum) | 1 | Type of the token. Could be AD_HOC_USER, APP_USER, OTHER or RFID. |
| cdr_token.contract_id | CiString(36) | 1 | Uniquely identifies the EV driver contract token within the eMSP’s platform (and suboperator platforms). Recommended to follow the specification for eMA ID from "eMI3 standard version V1.0" (http://emi3group.com/documents-links/) "Part 2: business objects." |
| auth_method | AuthMethod(Enum) | 1 | Method used for authentication. Multiple AuthMethods are possible during a charging session, for example when the session was started with a reservation: ReserveNow: COMMAND. When the driver arrives and starts charging using a Token that is whitelisted: WHITELIST. The last method SHALL be used in the CDR. Could be AUTH_REQUEST, COMMAND or WHITELIST. |
| authorization_reference | CiString(36) | ? | Reference to the authorization given by the eMSP. When the eMSP provided an authorization_reference in either: real-time authorization, StartSession or ReserveNow, this field SHALL contain the same value. When different authorization_reference values have been given by the eMSP that are relevant to this Session, the last given value SHALL be used here. |
| cdr_location | CdrLocation(JSON) | 1 | Location where the charging session took place, including only the relevant EVSE and Connector. |
| cdr_location.id | CiString(36) | 1 | Uniquely identifies the location within the CPO’s platform (and suboperator platforms). This field can never be changed, modified or renamed. |
| cdr_location.name | string(255) | ? | Display name of the location. |
| cdr_location.address | string(45) | 1 | Street/block name and house number if available. |
| cdr_location.city | string(45) | 1 | City or town. |
| cdr_location.postal_code | string(10) | ? | Postal code of the location, may only be omitted when the location has no postal code: in some countries charging locations at highways don’t have postal codes. |
| cdr_location.state | string(20) | ? | State only to be used when relevant. |
| cdr_location.country | string(3) | 1 | ISO 3166-1 alpha-3 code for the country of this location. |
| cdr_location.coordinates | GeoLocation | 1 | Coordinates of the location. |
| cdr_location.coordinates.latitude | String(10) | 1 | Latitude of the point in decimal degree. Example: 50.770774. Decimal separator: “.” Regex: -?[0-9]{1,2}.[0-9]{6} |
| cdr_location.coordinates.longitude | String(11) | 1 | Longitude of the point in decimal degree. Example: -126.104965. Decimal separator: “.” Regex: -?[0-9]{1,3}.[0-9]{6} |
| cdr_location.evse_uid | CiString(36) | 1 | Uniquely identifies the EVSE within the CPO’s platform (and suboperator platforms). For example a database unique ID or the actual EVSE ID. This field can never be changed, modified or renamed. This is the technical identification of the EVSE, not to be used as human readable identification, use the field: evse_id for that. Allowed to be set to: #NA when this CDR is created for a reservation that never resulted in a charging session. |
| cdr_location.evse_id | CiString(48) | 1 | Compliant with the following specification for EVSE ID from "eMI3 standard version V1.0" (http://emi3group.com/documents-links/) "Part 2: business objects.". Allowed to be set to: #NA when this CDR is created for a reservation that never resulted in a charging session. |
| cdr_location.connector_id | CiString(36) | 1 | Identifier of the connector within the EVSE. Allowed to be set to: #NA when this CDR is created for a reservation that never resulted in a charging session. |
| cdr_location.connector_standard | ConnectorType(Enum) | 1 | The standard of the installed connector. When this CDR is created for a reservation that never resulted in a charging session, this field can be set to any value and should be ignored by the Receiver. Could be CHADEMO, CHAOJI, DOMESTICA, DOMESTIC_B, DOMESTIC_C, DOMESTIC_D, DOMESTIC_E, DOMESTIC_F, DOMESTIC_G, DOMESTIC_H, DOMESTIC_I, DOMESTIC_J, DOMESTIC_K, DOMESTIC_L, DOMESTIC_M, DOMESTIC_N, DOMESTIC_O, GBT_AC, GBT_DC, IEC_60309_2_single_16, IEC_60309_2_three_16, IEC_60309_2_three_32, IEC_60309_2_three_64, IEC_62196_T1, IEC_62196_T1_COMBO, IEC_62196_T2, IEC_62196_T2_COMBO, IEC_62196_T3A, IEC_62196_T3C, NEMA_5_20, NEMA_6_30, NEMA_6_50, NEMA_10_30, NEMA_10_50, NEMA_14_30, NEMA_14_50, PANTOGRAPH_BOTTOM UP, PANTOGRAPH_TOP_DOW N, TESLA_R or TESLA_S |
| cdr_location.connector_format | ConnectorFormat(Enum) | 1 | The format (socket/cable) of the installed connector. When this CDR is created for a reservation that never resulted in a charging session, this field can be set to any value and should be ignored by the Receiver. Could be SOCKET or CABLE. |
| cdr_location.connector_power_type | PowerType(Enum) | 1 | When this CDR is created for a reservation that never resulted in a charging session, this field can be set to any value and should be ignored by the Receiver. Could be AC_1_PHASE, AC_2_PHASE, AC_2_PHASE_SPLIT, AC_3_PHASE or DC |
| meter_id | string(255) | ? | Identification of the Meter inside the Charge Point. |
| currency | string(3) | 1 | Currency of the CDR in ISO 4217 Code. |
| tariffs | Tariff(Array) | * | List of relevant Tariff Elements, see: Tariff. When relevant, a Free of Charge tariff should also be in this list, and point to a defined Free of Charge Tariff. |
| tariffs.country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the CPO that owns this Tariff. |
| tariffs.party_id | CiString(3) | 1 | ID of the CPO that 'owns' this Tariff (following the ISO-15118 standard). |
| tariffs.id | CiString(36) | 1 | Uniquely identifies the tariff within the CPO’s platform (and suboperator platforms). |
| tariffs.currency | string(3) | 1 | ISO-4217 code of the currency of this tariff. |
| tariffs.type | TariffType(Enum) | ? | Defines the type of the tariff. This allows for distinction in case of given Charging Preferences. When omitted, this tariff is valid for all sessions. Could be AD_HOC_PAYMENT, PROFILE_CHEAP, PROFILE_FAST, PROFILE_GREEN or REGULAR. |
| tariffs.tariff_alt_text | DisplayText(Array) | * | List of multi-language alternative tariff info texts. |
| tariffs.tariff_alt_text.language | string(2) | 1 | Language Code ISO 639-1 |
| tariffs.tariff_alt_text.text | string(512) | 1 | Text to be displayed to an end user. No markup, html etc. allowed. |
| tariffs.tariff_alt_url | URL | ? | URL to a web page that contains an explanation of the tariff information in human readable form. |
| tariffs.min_price | Price(JSON) | ? | When this field is set, a Charging Session with this tariff will at least cost this amount. This is different from a FLAT fee (Start Tariff, Transaction Fee), as a FLAT fee is a fixed amount that has to be paid for any Charging Session. A minimum price indicates that when the cost of a Charging Session is lower than this amount, the cost of the Session will be equal to this amount. |
| tariffs.min_price.excl_vat | number | 1 | Price/Cost excluding VAT. |
| tariffs.min_price.incl_vat | number | ? | Price/Cost including VAT. |
| tariffs.max_price | Price(JSON) | ? | When this field is set, a Charging Session with this tariff will NOT cost more than this amount. |
| tariffs.max_price.excl_vat | number | 1 | Price/Cost excluding VAT. |
| tariffs.max_price.incl_vat | number | ? | Price/Cost including VAT. |
| tariffs.elements | TariffElement(Array) | + | List of Tariff Elements. |
| tariffs.elements.price_components | PriceComponent(Array) | + | List of price components that describe the pricing of a tariff. |
| tariffs.elements.price_components.type | TariffDimensionType(Enum) | 1 | Type of tariff dimension. Could be ENERGY, FLAT, PARKING_TIME or TIME. |
| tariffs.elements.price_components.price | number | 1 | Price per unit (excl. VAT) for this tariff dimension. |
| tariffs.elements.price_components.vat | number | ? | Applicable VAT percentage for this tariff dimension. If omitted, no VAT is applicable. Not providing a VAT is different from 0% VAT, which would be a value of 0.0 here. |
| tariffs.elements.price_components.step_size | int | 1 | Minimum amount to be billed. This unit will be billed in this step_size blocks. Amounts that are less than this step_size are rounded up to the given step_size. For example: if type is TIME and step_size has a value of 300, then time will be billed in blocks of 5 minutes. If 6 minutes were used, 10 minutes (2 blocks of step_size) will be billed. |
| tariffs.elements.restrictions | TariffRestrictions | ? | Restrictions that describe the applicability of a tariff. |
| tariffs.elements.restrictions.start_time | string(5) | ? | Start time of day in local time, the time zone is defined in the time_zone field of the Location, for example 13:30, valid from this time of the day. Must be in 24h format with leading zeros. Hour/Minute separator: ":" Regex: ([0-1][0-9]2[0-3]):[0-5][0-9] |
| tariffs.elements.restrictions.end_time | string(5) | ? | End time of day in local time, the time zone is defined in the time_zone field of the Location, for example 19:45, valid until this time of the day. Same syntax as start_time. If end_time < start_time then the period wraps around to the next day. To stop at end of the day use: 00:00. |
| tariffs.elements.restrictions.start_date | string(10) | ? | Start date in local time, the time zone is defined in the time_zone field of the Location, for example: 2015-12-24, valid from this day (inclusive). Regex: ([12][0-9]{3})-(0[1-9]1[0-2])-(0[1-9][12][0-9]3[01]) |
| tariffs.elements.restrictions.end_date | string(10) | ? | End date in local time, the time zone is defined in the time_zone field of the Location, for example: 2015-12-27, valid until this day (exclusive). Same syntax as start_date. |
| tariffs.elements.restrictions.min_kwh | number | ? | Minimum consumed energy in kWh, for example 20, valid from this amount of energy (inclusive) being used. |
| tariffs.elements.restrictions.max_kwh | number | ? | Maximum consumed energy in kWh, for example 50, valid until this amount of energy (exclusive) being used. |
| tariffs.elements.restrictions.min_current | number | ? | Sum of the minimum current (in Amperes) over all phases, for example 5. When the EV is charging with more than, or equal to, the defined amount of current, this TariffElement is/becomes active. If the charging current is or becomes lower, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the minimum current over the entire Charging Session. This restriction can make a TariffElement become active when the charging current is above the defined value, but the TariffElement MUST no longer be active when the charging current drops below the defined value. |
| tariffs.elements.restrictions.max_current | number | ? | Sum of the maximum current (in Amperes) over all phases, for example 20. When the EV is charging with less than the defined amount of current, this TariffElement becomes/is active. If the charging current is or becomes higher, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the maximum current over the entire Charging Session. This restriction can make a TariffElement become active when the charging current is below this value, but the TariffElement MUST no longer be active when the charging current raises above the defined value. |
| tariffs.elements.restrictions.min_power | number | ? | Minimum power in kW, for example 5. When the EV is charging with more than, or equal to, the defined amount of power, this TariffElement is/becomes active. If the charging power is or becomes lower, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the minimum power over the entire Charging Session. This restriction can make a TariffElement become active when the charging power is above this value, but the TariffElement MUST no longer be active when the charging power drops below the defined value. |
| tariffs.elements.restrictions.max_power | number | ? | Maximum power in kW, for example 20. When the EV is charging with less than the defined amount of power, this TariffElement becomes/is active. If the charging power is or becomes higher, this TariffElement is not or no longer valid and becomes inactive. This describes NOT the maximum power over the entire Charging Session. This restriction can make a TariffElement become active when the charging power is below this value, but the TariffElement MUST no longer be active when the charging power raises above the defined value. |
| tariffs.elements.restrictions.min_duration | int | ? | Minimum duration in seconds the Charging Session MUST last (inclusive). When the duration of a Charging Session is longer than the defined value, this TariffElement is or becomes active. Before that moment, this TariffElement is not yet active. |
| tariffs.elements.restrictions.max_duration | int | ? | Maximum duration in seconds the Charging Session MUST last (exclusive). When the duration of a Charging Session is shorter than the defined value, this TariffElement is or becomes active. After that moment, this TariffElement is no longer active. |
| tariffs.elements.restrictions.day_of_week | DayOfWeek(Array) | * | Which day(s) of the week this TariffElement is active. Could be MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY and SUNDAY. |
| tariffs.elements.restrictions.reservation | ReservationRestrictionType(Enum) | * | When this field is present, the TariffElement describes reservation costs. A reservation starts when the reservation is made, and ends when the driver starts charging on the reserved EVSE/Location, or when the reservation expires. A reservation can only have: FLAT and TIME TariffDimensions, where TIME is for the duration of the reservation. Could be RESERVATION or RESERVATION_EXPIRES. |
| tariffs.start_date_time | DateTime | ? | The time when this tariff becomes active, in UTC, time_zone field of the Location can be used to convert to local time. Typically used for a new tariff that is already given with the location, before it becomes active. |
| tariffs.end_date_time | DateTime | ? | The time after which this tariff is no longer valid, in UTC, time_zone field if the Location can be used to convert to local time. Typically used when this tariff is going to be replaced with a different tariff in the near future. |
| tariffs.energy_mix | EnergyMix(JSON) | ? | Details on the energy supplied with this tariff. |
| tariffs.energy_mix.is_green_energy | boolean | 1 | True if 100% from regenerative sources. (CO2 and nuclear waste is zero) |
| tariffs.energy_mix.energy_sources | EnergySource(Array) | * | Key-value pairs (enum + percentage) of energy sources of this location’s tariff. |
| tariffs.energy_mix.energy_sources.source | EnergySourceCategory(Enum) | 1 | The type of energy source. Could be NUCLEAR, GENERAL_FOSSIL, COAL, GAS, GENERAL_GREEN, SOLAR, WIND or WATER |
| tariffs.energy_mix.energy_sources.percentage | number | 1 | Percentage of this source (0-100) in the mix. |
| tariffs.energy_mix.environ_impact | EnvironmentalImpact(Array) | * | Key-value pairs (enum + percentage) of nuclear waste and CO2 exhaust of this location’s tariff. |
| tariffs.energy_mix.environ_impact.category | EnvironmentalImpactCategory(Enum) | 1 | The type of environmental impact. Could be NUCLEAR_WASTE or CARBON_DIOXIDE |
| tariffs.energy_mix.environ_impact.amount | number | 1 | Percentage of this impact (0-100) in the mix. |
| tariffs.energy_mix.supplier_name | string(64) | ? | Name of the energy supplier, delivering the energy for this location or tariff. |
| tariffs.energy_mix.energy_product_name | string(64) | ? | Name of the energy supplier's product/tariff plan used at this location. |
| tariffs.last_updated | DateTime | 1 | Timestamp when this Tariff was last updated (or created). |
| charging_periods | ChargingPeriod(Array) | + | List of Charging Periods that make up this charging session. A session consists of 1 or more periods, where each period has a different relevant Tariff. |
| charging_periods.start_date_time | DateTime | 1 | Start timestamp of the charging period. A period ends when the next period starts. The last period ends when the session ends. |
| charging_periods.dimensions | CdrDimension(Array) | + | List of relevant values for this charging period. |
| charging_periods.dimensions.type | CdrDimensionType | 1 | Type of CDR dimension. Could be CURRENT, ENERGY, ENERGY_EXPORT, ENERGY_IMPORT, MAX_POWER, MAX_CURRENT, MIN_CURRENT, MIN_POWER, PARKING_TIME, POWER, RESERVATION_TIME, STATE_OF_CHARGE or TIME. |
| charging_periods.dimensions.volume | number | 1 | Volume of the dimension consumed, measured according to the dimension type. |
| charging_periods.tariff_id | CiString(36) | ? | Unique identifier of the Tariff that is relevant for this Charging Period. If not provided, no Tariff is relevant during this period. |
| signed_data | SignedData | 1 | Data signed to ensure integrity and authenticity. |
| signed_data.encoding_method | CiString(36) | 1 | The name of the encoding used in the SignedData field. This is the name given to the encoding by a company or group of companies. See note below. |
| signed_data.encoding_method_version | int | ? | Version of the EncodingMethod (when applicable). |
| signed_data.public_key | string(512) | ? | Public key used to sign the data, base64 encoded. |
| signed_data.signed_values | SignedValue(Array of Enum) | + | One or more signed values. Could be nature, plain_data and signed_data. |
| signed_data.url | string(512) | ? | URL that can be shown to an EV driver. This URL gives the EV driver the possibility to check the signed data from a charging session. |
| total_cost | Price(JSON) | 1 | Total sum of all the costs of this transaction in the specified currency. |
| total_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_cost.incl_vat | number | ? | Price/Cost including VAT. |
| total_fixed_cost | Price(JSON) | ? | Total sum of all the fixed costs in the specified currency, except fixed price components of parking and reservation. The cost not depending on amount of time/energy used etc. Can contain costs like a start tariff. |
| total_energy | number | 1 | Total amount of energy used during the charging session, in the specified unit. |
| total_energy_cost | Price(JSON) | ? | Total sum of all the cost of all the energy used, in the specified currency. |
| total_energy_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_energy_cost.incl_vat | number | ? | Price/Cost including VAT. |
| total_time | number | 1 | Total duration of the charging session (including the duration of charging and not charging), in hours. |
| total_time_cost | Price(JSON) | ? | Total sum of all the cost related to duration of charging during this transaction, in the specified currency. |
| total_time_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_time_cost.incl_vat | number | ? | Price/Cost including VAT. |
| total_parking_time | number | ? | Total duration of the charging session where the EV was not charging (no energy was transferred between EVSE and EV), in hours. |
| total_parking_cost | Price(JSON) | ? | Total sum of all the cost related to parking of this transaction, including fixed price components, in the specified currency. |
| total_parking_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_parking_cost.incl_vat | number | ? | Price/Cost including VAT. |
| total_reservation_cost | Price(JSON) | ? | Total sum of all the cost related to a reservation of a Charge Point, including fixed price components, in the specified currency. |
| total_reservation_cost.excl_vat | number | 1 | Price/Cost excluding VAT. |
| total_reservation_cost.incl_vat | number | ? | Price/Cost including VAT. |
| remark | string(255) | ? | Optional remark, can be used to provide additional human-readable information to the CDR, for example: reason why a transaction was stopped. |
| invoice_reference_id | CiString(39) | ? | This field can be used to reference an invoice, that will later be sent for this CDR. Making it easier to link a CDR to a given invoice. Maybe even group CDRs that will be on the same invoice. |
| credit | boolean | ? | When set to true, this is a Credit CDR, and the field credit_reference_id needs to be set as well. |
| credit_reference_id | CiString(39) | ? | Is required to be set for a Credit CDR. This SHALL contain the id of the CDR for which this is a Credit CDR. |
| home_charging_compensation | boolean | ? | When set to true, this CDR is for a charging session using the home charger of the EV Driver for which the energy cost needs to be financially compensated to the EV Driver. |
| last_updated | DateTime | 1 | Timestamp when this CDR was last updated (or created). |
Sample Response
{
"country_code": "BE",
"party_id": "BEC",
"id": "12345",
"start_date_time": "2015-06-29T21:39:09Z",
"end_date_time": "2015-06-29T23:37:32Z",
"cdr_token": {
"uid": "012345678",
"type": "RFID",
"contract_id": "DE8ACC12E46L89"
},
"auth_method": "WHITELIST",
"cdr_location": {
"id": "LOC1",
"name": "Gent Zuid",
"address": "F.Rooseveltlaan 3A",
"city": "Gent",
"postal_code": "9000",
"country": "BEL",
"coordinates": {
"latitude": "3.729944",
"longitude": "51.047599"
},
"evse_uid": "3256",
"evse_id": "BE*BEC*E041503003",
"connector_id": "1",
"connector_standard": "IEC_62196_T2",
"connector_format": "SOCKET",
"connector_power_type": "AC_1_PHASE"
},
"currency": "EUR",
"tariffs": [
{
"country_code": "BE",
"party_id": "BEC",
"id": "12",
"currency": "EUR",
"elements": [
{
"price_components": [
{
"type": "TIME",
"price": 2.0,
"vat": 10.0,
"step_size": 300
}
]
}
],
"last_updated": "2015-02-02T14:15:01Z"
}
],
"charging_periods": [
{
"start_date_time": "2015-06-29T21:39:09Z",
"dimensions": [
{
"type": "TIME",
"volume": 1.973
}
],
"tariff_id": "12"
}
],
"total_cost": {
"excl_vat": 4.0,
"incl_vat": 4.4
},
"total_energy": 15.342,
"total_time": 1.973,
"total_time_cost": {
"excl_vat": 4.0,
"incl_vat": 4.4
},
"last_updated": "2015-06-29T22:01:13Z"
}
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
Send a command
Introduction
This API, will enable remote commands to be sent to a Location/EVSE.
The following commands are supported:
- CANCEL_RESERVATION
- RESERVE_NOW
- START_SESSION
- STOP_SESSION
- UNLOCK_CONNECTOR
The complete list of query parameters and its details are provided in the OAS specification which can be used to filter down the search result based on the user journey.
Headers parameters
| HEADER PARAMETER | DATA TYPE | LIMITS (MIN/MAX) | NULLABLE | DESCRIPTION |
|---|---|---|---|---|
| Authorization | String | N/A | No | This is a Bearer token. It should be the token you got when you requested an Access Token before. Example: Bearer xxxxxxxxxx |
Request path parameters
| REQUEST PATH PARAMETER | DATA TYPE | REQUIRED | VALUE |
|---|---|---|---|
| command | CommandType(enum) | Yes | Type of command that is requested. Could be CANCEL_RESERVATION, RESERVE_NOW, START_SESSION, STOP_SESSION or UNLOCK_CONNECTOR |
Request body parameters
Depending on the command the body could be one of the following options:
CANCEL_RESERVATION
| REQUEST BODY PARAMETER | DATA TYPE | CARDINALITY | VALUE |
|---|---|---|---|
| response_url | URL | 1 | URL that the CommandResult POST should be sent to. This URL might contain a unique ID to distinguish between CancelReservation requests. |
| reservation_id | CiString(36) | 1 | Reservation ID, unique for this reservation. If the Charge Point already has a reservation that matches this reservation_id, the Charge Point will replace the reservation. |
RESERVE_NOW
| REQUEST BODY PARAMETER | DATA TYPE | CARDINALITY | VALUE |
|---|---|---|---|
| response_url | URL | 1 | URL that the CommandResult POST should be sent to. This URL might contain a unique ID to distinguish between ReserveNow requests. |
| token | Token | 1 | Token object for how to reserve this Charge Point (and specific EVSE). |
| token.country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the MSP that 'owns' this Token. |
| token.party_id | CiString(3) | 1 | ID of the eMSP that 'owns' this Token (following the ISO-15118 standard). |
| token.uid | CiString(36) | 1 | Unique ID by which this Token, combined with the Token type, can be identified. This is the field used by CPO system (RFID reader on the Charge Point) to identify this token. |
| token.type | TokenType(enum) | 1 | Type of the token. Could be AD_HOC_USER, APP_USER, OTHER or RFID. |
| token.contract_id | CiString(36) | 1 | Uniquely identifies the EV Driver contract token within the eMSP’s platform (and suboperator platforms). |
| token.visual_number | string(64) | ? | Visual readable number/identification as printed on the Token (RFID card), might be equal to the contract_id. |
| token.issuer | string(64) | 1 | Issuing company, most of the times the name of the company printed on the token (RFID card), not necessarily the eMSP. |
| token.group_id | CiString(36) | ? | This ID groups a couple of tokens. Can be used to make two or more tokens work as one, so that a session can be started with one token and stopped with another. Beware that OCPP 1.5/1.6 only support group_ids (it is called parentId in OCPP 1.5/1.6) with a maximum length of 20. |
| token.valid | boolean | 1 | Indicates if this Token is valid. |
| token.whitelist | WhitelistType(enum) | 1 | Indicates what type of white-listing is allowed. Could be ALWAYS, ALLOWED, ALLOWED_OFFLINE OR NEVER. |
| token.language | string(2) | ? | Language Code ISO 639-1. This optional field indicates the Token owner’s preferred interface language. If not provided or not supported, then the CPO is free to choose its own language. |
| token.default_profile_type | ProfileType(enum) | ? | The default Charging Preference. When provided, and a charging session is started on a Charge Point that supports Preference-based Smart Charging and this ProfileType, the Charge Point can start using this ProfileType without needing to be set via: Set Charging Preferences. Could be CHEAP, FAST, GREEN or REGULAR. |
| token.energy_contract | EnergyContract | ? | When the Charge Point supports using your own energy supplier/contract at a Charge Point, information about the energy supplier/contract is needed so the CPO knows which energy supplier to use. NOTE: In a lot of countries it is currently not allowed/possible to use a drivers own energy supplier/contract at a Charge Point. |
| token.energy_contract.supplier_name | string(64) | 1 | Name of the energy supplier for this token. |
| token.energy_contract.contract_id | string(64) | ? | Contract ID at the energy supplier, that belongs to the owner of this token. |
| token.last_updated | DateTime | 1 | Timestamp when this Token was last updated (or created). |
| expiry_date | DateTime | 1 | The Date/Time when this reservation ends, in UTC. |
| reservation_id | CiString(36) | 1 | Reservation ID, unique for this reservation. If the Receiver (typically CPO) already has a reservation that matches this reservation ID, it will replace the reservation. |
| location_id | CiString(36) | 1 | Location ID of the Location (belonging to the CPO this request is sent to) for which to reserve an EVSE. |
| evse_uid | CiString(36) | ? | Optional EVSE UID of the EVSE of this Location if a specific EVSE has to be reserved. |
| authorization_reference | CiString(36) | ? | Reference to the authorization given by the eMSP, when given. This reference will be provided in the relevant Session and/or CDR. |
START_SESSION
| REQUEST BODY PARAMETER | DATA TYPE | CARDINALITY | VALUE |
|---|---|---|---|
| response_url | URL | 1 | URL that the CommandResult POST should be sent to. This URL might contain a unique ID to distinguish between StartSession requests. |
| token | Token | 1 | Token object the Charge Point has to use to start a new session. The Token provided in this request is authorized by the eMSP. |
| token.country_code | CiString(2) | 1 | ISO-3166 alpha-2 country code of the MSP that 'owns' this Token. |
| token.party_id | CiString(3) | 1 | ID of the eMSP that 'owns' this Token (following the ISO-15118 standard). |
| token.uid | CiString(36) | 1 | Unique ID by which this Token, combined with the Token type, can be identified. This is the field used by CPO system (RFID reader on the Charge Point) to identify this token. |
| token.type | TokenType(enum) | 1 | Type of the token. Could be AD_HOC_USER, APP_USER, OTHER or RFID. |
| token.contract_id | CiString(36) | 1 | Uniquely identifies the EV Driver contract token within the eMSP’s platform (and suboperator platforms). |
| token.visual_number | string(64) | ? | Visual readable number/identification as printed on the Token (RFID card), might be equal to the contract_id. |
| token.issuer | string(64) | 1 | Issuing company, most of the times the name of the company printed on the token (RFID card), not necessarily the eMSP. |
| token.group_id | CiString(36) | ? | This ID groups a couple of tokens. Can be used to make two or more tokens work as one, so that a session can be started with one token and stopped with another. Beware that OCPP 1.5/1.6 only support group_ids (it is called parentId in OCPP 1.5/1.6) with a maximum length of 20. |
| token.valid | boolean | 1 | Indicates if this Token is valid. |
| token.whitelist | WhitelistType(enum) | 1 | Indicates what type of white-listing is allowed. Could be ALWAYS, ALLOWED, ALLOWED_OFFLINE OR NEVER. |
| token.language | string(2) | ? | Language Code ISO 639-1. This optional field indicates the Token owner’s preferred interface language. If not provided or not supported, then the CPO is free to choose its own language. |
| token.default_profile_type | ProfileType(enum) | ? | The default Charging Preference. When provided, and a charging session is started on a Charge Point that supports Preference-based Smart Charging and this ProfileType, the Charge Point can start using this ProfileType without needing to be set via: Set Charging Preferences. Could be CHEAP, FAST, GREEN or REGULAR. |
| token.energy_contract | EnergyContract | ? | When the Charge Point supports using your own energy supplier/contract at a Charge Point, information about the energy supplier/contract is needed so the CPO knows which energy supplier to use. NOTE: In a lot of countries it is currently not allowed/possible to use a drivers own energy supplier/contract at a Charge Point. |
| token.energy_contract.supplier_name | string(64) | 1 | Name of the energy supplier for this token. |
| token.energy_contract.contract_id | string(64) | ? | Contract ID at the energy supplier, that belongs to the owner of this token. |
| token.last_updated | DateTime | 1 | Timestamp when this Token was last updated (or created). |
| location_id | CiString(36) | 1 | Location ID of the Location (belonging to the CPO this request is sent to) on which a session is to be started. |
| evse_uid | CiString(36) | ? | Optional EVSE UID of the EVSE of this Location on which a session is to be started. Required when connector_id is set. |
| connector_id | CiString(36) | ? | Optional Connector ID of the Connector of the EVSE on which a session is to be started. Required when START_SESSION_CONNECTOR_REQUIRED capability is set on the EVSE. |
| authorization_reference | CiString(36) | ? | Reference to the authorization given by the eMSP, when given, this reference will be provided in the relevant Session and/or CDR. |
STOP_SESSION
| REQUEST BODY PARAMETER | DATA TYPE | CARDINALITY | VALUE |
|---|---|---|---|
| response_url | URL | 1 | URL that the CommandResult POST should be sent to. This URL might contain a unique ID to distinguish between StopSession requests. |
| session_id | CiString(36) | 1 | Session ID of the Session that is requested to be stopped. |
UNLOCK_CONNECTOR
| REQUEST BODY PARAMETER | DATA TYPE | CARDINALITY | VALUE |
|---|---|---|---|
| response_url | URL | 1 | URL that the CommandResult POST should be sent to. This URL might contain a unique ID to distinguish between UnlockConnector requests. |
| location_id | CiString(36) | 1 | Location.id of the Location (belonging to the CPO this request is sent to) for which it is requested to unlock the connector. |
| evse_uid | CiString(36) | 1 | EVSE.uid of the EVSE of this Location for which it is requested to unlock the connector. |
| connector_id | CiString(36) | 1 | Connector.id of the Connector of this Location for which it is requested to unlock. |
Sample Request
curl --location '{{url}}/v1/commands/{path parameter} \
--header 'Authorization: Bearer ***' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
"response_url": "https://example.com/your-response-url",
"session_id": "your-session-id"}'
Response
On success the response will have a 200 OK status and the data property from body of the response will contain a array of JSON objects with:
| KEY | VALUE TYPE | CARDINALITY | DESCRIPTION |
|---|---|---|---|
| result | CommandResultType | 1 | Result of the command request as sent by the Charge Point to the CPO. Could be ACCEPTED, CANCELED_RESERVATION, EVSE_OCCUPIED, EVSE_INOPERATIVE, FAILED, NOT_SUPPORTED, REJECTED, TIMEOUT and UNKNOWN_RESERVATION |
| message | DisplayText | * | Human-readable description of the reason (if one can be provided), multiple languages can be provided. |
| message.language | string(2) | 1 | Language Code ISO 639-1 |
| message.text | string(512) | 1 | Text to be displayed to a end user. No markup, html etc. allowed. |
Sample Response
{
"result": "REJECTED",
"message": [
{
"language": "en",
"text": "The reservation has been rejected due to an invalid session ID."
},
{
"language": "es",
"text": "La reserva ha sido rechazada debido a un ID de sesión inválido."
}
]
}
Exception Handling
The format of errors is always the same and specified in the Fundamentals section.
