Environments
We provide multiple environments, each with unique data access policies, and live/mocked vendors.
Environments are isolated from each other. Client credentials are tied to a specific environment and cannot be reused across environments.
Copy linkProduction
Features the latest stable software, live vendors, and strict data access controls.
Name | URL |
---|---|
API | https://enode-api.production.enode.io |
OAuth Authorization | https://oauth.production.enode.io/oauth2/auth |
OAuth Token | https://oauth.production.enode.io/oauth2/token |
Link UI | https://link.production.enode.io |
Copy linkSandbox
Includes the latest stable software and mocked vendors/vehicles/chargers.
Name | URL |
---|---|
API | https://enode-api.sandbox.enode.io |
OAuth Authorization | https://oauth.sandbox.enode.io/oauth2/auth |
OAuth Token | https://oauth.sandbox.enode.io/oauth2/token |
Link UI | https://link.sandbox.enode.io |
Authentication
The Enode API uses OAuth 2.0 client access tokens to authenticate requests coming from your server.
Copy linkAPI credentials
Access to the Enode API starts with a client and the API credentials belonging to that client: the client ID and client secret. Clients are a way of organizing data, are completely separated from each other, and are tied to a specific environmentAPI.
The API credentials used to get an access tokenAPI, which in turn is used to access client-wide endpointsAPI and user-specific endpointsAPI.
Key | Description |
---|---|
Client ID | The identifier for your client, referred to as the client_id . |
Client secret | The secret for your client, referred to as the client_secret . |
Copy linkGetting an access token
The access token allows you to authenticate as your client, authorizing access to all data and functionality within your client. The token is obtained via the standard OAuth 2.0 client credentials grant, using the API credentialsAPI and the corresponding OAuth URLsAPI for the environment of your client.
Token request example
curl https://oauth.{YOUR_CLIENT_ENVIRONMENT}.enode.io/oauth2/token \
-X POST \
-u {YOUR_CLIENT_ID}:{YOUR_CLIENT_SECRET} \
-d "grant_type=client_credentials"
After requesting the token URL as described above, you’ll receive a response containing your access token. This access token should be cached on your server until it expires and subsequently needs to be refreshedAPI.
As with the API credentials, the access token must be kept secret.
Token response example
{
"access_token": "{YOUR_ACCESS_TOKEN}",
"expires_in": 3599,
"scope": "",
"token_type": "bearer"
}
Copy linkRefreshing access tokens
The access token expires every hour, as described by the expires_in
key in the access token response. Once your token expires, your server should repeat the process to obtain a new access tokenAPI.
Copy linkAccessing the API with the access token
All API requests towards your client need to be authenticated via a bearer authentication header.
The bearer authorization header can be used on its own to access the client-wide endpoints (service healthAPI, tariffsAPI, user managementAPI and webhooksAPI).
Type | Value |
---|---|
Header | Authorization: Bearer {YOUR_ACCESS_TOKEN} |
Client resource request example
curl https://enode-api.{YOUR_CLIENT_ENVIRONMENT}.enode.io/health/ready \
-X POST \
-H "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
Copy linkAccessing user-specific endpoints
To access resources specific to a user, an additional header containing the user ID must be specified together with the general authorization header.
This additional header is needed for all general user endpoints (charging locationsAPI, meAPI, schedulesAPI and statisticsAPI) and device-specific endpoints (chargersAPI, HVACsAPI, solar invertersAPI and vehiclesAPI).
Type | Value |
---|---|
Header | Enode-User-Id: {USER_ID} |
User resource request example
curl https://enode-api.{YOUR_CLIENT_ENVIRONMENT}.enode.io/me \
-X GET \
-H "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
-H "Enode-User-Id: {USER_ID}" \
Response times
Interacting with pure-Enode resources such as Schedules and Charging Locations enjoys typical response times <200ms
, but when interacting with vehicles, a wide array of delays and timing characteristics come into play.
You don't need to know or handle any of the vendor-specifics that are the root cause of the variability, but it is recommended to be aware of the range of possible timings, so that they can be accounted for in your UX considerations.
Copy linkAPI GET requests
Copy linkGet Vehicle
When fetching a vehicle, you can specify which fields should be refreshed syncronously. Adding more fields typically incurs more delay, though with some vendors multiple fields are handled by one request behind the scenes.
It is recommended to only request the needed fields.
Field | Typical added delay |
---|---|
smartChargingPolicy | none |
chargeState | 8 seconds |
location | 8 seconds |
information | 8 seconds |
odometer | 8 seconds |
Copy linkList Vehicles
The characteristics of List Vehicles
are the same as Get Vehicle
- but delays are potentially multiplied by the number of vehicles present.
If the User has multiple vendors connected, then the entire request needs to wait for the slowest vendor to complete before we can respond. These delays can easily combine to reach 30 seconds
or more.
For this reason, List Vehicles
should be used only to discover occasional changes to the User's vehicle list. When you already know what vehicles you are interested in, use Get Vehicle
to fetch them.
Copy linkLink User
The Login
step typically takes <2 seconds
, but in rare cases can take up to 30 seconds
while details are negotiated/handled/retried behind the scenes, and initial vehicle data is fetched.
The final Accept
step is subject to the same delays as List Vehicles
Copy linkCharging commands
Charging commands have the greatest timing variability, as they are implemented in a variety of ways across vendors. Overall, typical delay is 15 seconds, maximum delay is 15 minutes.
Command implementation | Typical delay |
---|---|
native | 3-15 seconds |
synthetic A | 3-30 seconds |
synthetic B | 5-15 minutes |
Copy linkWebhooks
Our webhooks are usually implemented via polling behind the scenes, and the rate of polling dynamically adjusts for different situations as we strive for prompt updates without overloading the vehicle with requests.
The baseline maximum delay between a real-world change (such as a vehicle becoming plugged in) and the resulting webhook notification is 7 minutes
Vehicle context | Maximum delay |
---|---|
default | 7 minutes |
charging | 1 minute |
smartcharge PLAN:* | 2 minutes |
sleeping | 20 minutes |
If you want faster updates for a short time, you can call Get Vehicle
which always returns synchronous data from the Vehicle and also triggers a webhook if anything has changed.
A typical situation for this would be that a user has your app open and is expecting updates. In that situation you might poll Get Vehicle
every 15 seconds for a short period of time.
Errors and problems
Copy linkOAuth Authorization Request
Upon completing the Enode Link authorization process, the user will be redirected to your configured redirect URI. If an issue occurs, query parameters error
and error_description
will be set as described in Section 4.1.2.1 of the OAuth 2.0 specification:
Error | Error description |
---|---|
invalid_request | The request has a missing or invalid parameter, duplicate parameters, or is malformed. |
unauthorized_client | The client isn't authorized to request an authorization code with this method. |
access_denied | The resource owner or authorization server denied the request. |
unsupported_response_type | The authorization server doesn't support obtaining an authorization code with this method. |
invalid_scope | The requested scope is invalid, unknown, or malformed. |
server_error | The authorization server encountered an unexpected condition that prevented it from fulfilling the request. |
temporarily_unavailable | The authorization server is temporarily unable to handle the request due to overloading or maintenance. |
Sample
https://website.example/oauth_callback?state=e0a86fe5&error=access_denied&error_description=The+resource+owner+or+authorization+server+denied+the+request.
Copy linkErrors when accessing a User's resources
When using an access_token
to access a user's resources, you may encounter the following 4XX range HTTP Status Codes:
HTTP Status Code | Explanation |
---|---|
400 Bad Request | The request payload failed schema validation or parsing |
401 Unauthorized | Missing or invalid authentication details |
403 Forbidden | Authentication succeeded, but the user lacks access to the resource |
404 Not Found | Requested resource doesn't exist |
405 Method Not Allowed | Vendor unavailability prevented request completion |
408 Request Timeout | Vendor timeout prevented request completion |
409 Conflict | Vendor rejection prevented request completion |
424 Failed Dependency | Failed vendor requests prevented request completion |
429 Too Many Requests | Vendor rate limiting prevented request completion |
In all cases, an RFC7807 Problem Details body is returned to aid in debugging.
Sample
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
{
"type": "https://docs.enode.io/problems/bad-request",
"title": "Payload validation failed",
"detail": "\"authorizationRequest.scope\" is required",
}
Copy linkProblems
Title | Description |
---|---|
Bad request | Some part of the request was malformed. See associated detail message for more information. |
Enode Controlled Entity | This entity is currently managed by Smart Charging or Schedules and cannot accept manual commands. Either disable the feature controlling the target, or force charging to start through our External Start APIAPI. |
Entity Not Found | The requested entity was not found on the user's account. |
Failed Auth Challenge | The code the User entered in response to a login challenge was not correct. |
Forbidden | The current context is not allowed to access the requested resource. |
Not Found | The requested entity was not found on the user's account. If requesting vendor entities, ensure you're using the top level |
Permanently Invalid Credentials | The User's vendor credentials have become invalid. The User needs to relink their account. |
Server Error | A critical error has ocurred. An employee has been alerted and will work to remedy the situation |
Should Not Disturb | Making a call to the vendor would negatively impact the vendor resource. For example, a Kia vehicle's 12V battery has reached a critical state and we cannot send further requests. |
Timeout | A request timed out. If this problem was returned by a route that tried to communicate with vendor APIs, remove the fields query parameter to fetch the Enode hosted cache. This cache is updated every 10 minutes. |
Unauthorized | The request contained an invalid or expired token. |
Validation Error | The response we prepared failed to pass outgoing validation. An employee has been alerted and will work to remedy the situation. |
Vendor Not Yet Reached | This error is returned when a request for entity state fails on an entity where |
Vendor Rate Limited | Enode has sent too many requests to a vendor. |
Vendor Rejected | An action sent to a vendor was rejected. This typically happens when too many commands are sent in a short period of time. |
Unauthorized | The request contained an invalid or expired token. |
Vendor Unavailable | We were able to reach the vendor's server but were unable to make direct contact with the requested resource. For example, a Tesla vehicle was sleeping and we were unable to wake it. |
Versioning
Versioning
Enode's REST API is versioned. A dated version is released when breaking changes occur, while new features and bug fixes (additive changes) are available in all supported API versions.
You can view all available versions and updates in the changelog.
API clients are pinned to the latest API version upon creation, affecting all API requests and webhook events. API responses include an Enode-Version
header, and webhook events have a version
field.
You can override the API version on a specific request by sending an Enode-Version
in the request header. Note that webhook events are not affected by this and will still be sent with the client API version.
Breaking changes
Breaking changes will be released as a new version. When a new version is released, the previous version is supported for six months before deactivation. Enode staff will notify you in advance. Each API version comes with a migration guide explaining changes and upgrade suggestions.
We consider the following breaking changes
- Changing a request’s authorization or authentication requirements
- Adding a new required input parameter
- Changing input validation
- Removing an HTTP route or method
- Removing or renaming a response parameter
- Adding a new case to a response field documented as an enum.
All other additive changes are considered backwards compatible.
Chargers
EV Chargers provide charging data and can be controlled through the Control Charger endpointAPI and through Schedules
List Chargers
GET /chargers
List all available Chargers for the User.
Response
200Attributes
Charger IDs
Sample
[
"string"
]
Get Charge Action
GET /chargers/actions/{vendorActionId}
Returns the current state of the requested action.
Request
Path parameters
ID of the Action.
Response
200Attributes
The ID of the action.
ISO8601 UTC timestamp
ISO8601 UTC timestamp
ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the target.
Current state of the charge action.
PENDING
: The initial state. We are actively retrying commands and polling the chargeable device for changes inpowerDeliveryState
.CONFIRMED
: The chargeable has transitioned into the expectedpowerDeliveryState
state.FAILED
: The chargeable failed to respond to our attempts to start or stop charging within 30 minutes. We have given up sending actions to the device.CANCELLED
: A required precondition was not met during the 30 minutes period or a another conflicting action was sent to the same device, cancelling this one.
One of PENDING, CONFIRMED, FAILED, or CANCELLED
ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.
One of vehicle or charger
One of START or STOP
Information about why was this action not executed successfully.
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "PENDING",
"targetId": "string",
"targetType": "vehicle",
"kind": "START",
"failureReason": {
"type": "NO_RESPONSE",
"detail": "The chargeable device remained unreachable."
}
}
Other responses
Response 404
Action not found.
Get Charger
GET /chargers/{chargerId}
Request
Path parameters
ID of the Charger.
Query parameters
If you specify any fields here, we make a request to the Charger's OEM APIs and return the updated data.
This will slow down your integration. In cases of vendor downtime requests with fields may take up to a minute to complete, while requests without fields will always be fast. Enode polls all devices connected to our platform, so any cached data returned will not be older than 10 minutes (unless the vendor APIs are unavailable, in which case you can consult the lastSeen
& isReachable
fields on the charger).
By default, no fields are included, and the latest cached full Charger object will be returned.
Response
200Attributes
Charger ID
One of ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, or EVBOX
The last time the charger was successfully communicated with
Whether live data from the charger is currently reachable from Enode's perspective. This 'reachability' may refer to reading from a cache operated by the charger's cloud service if that service has determined that its cache is valid.
ID of the charging location the charger is currently positioned at (if any).
Descriptive information about the Charger
A collection of descriptors that describe the capabilities of this specific charger
Sample
{
"id": "2211e263-0362-4235-83f4-887bdf3ee414",
"vendor": "ZAPTEC",
"lastSeen": "2023-03-21T21:08:27.596Z",
"isReachable": true,
"chargingLocationId": "2211e263-d6d4-d6d4-d6d4-dbdd77ec82b6",
"chargeState": {
"isPluggedIn": true,
"isCharging": true,
"powerDeliveryState": "PLUGGED_IN:CHARGING",
"chargeRate": 6.939,
"lastUpdated": "2023-03-21T16:39:20.000Z",
"maxCurrent": 16
},
"information": {
"id": "2211e263-0362-4235-83f4-887bdf3ee414",
"brand": "Zaptec",
"model": "ZAPTEC PRO",
"year": null
},
"capabilities": {
"information": {
"interventionIds": [],
"isCapable": true
},
"chargeState": {
"interventionIds": [],
"isCapable": true
},
"startCharging": {
"interventionIds": [],
"isCapable": true
},
"stopCharging": {
"interventionIds": [],
"isCapable": true
},
"setMaxCurrent": {
"interventionIds": [
"dbdd77ec82b6-d6d4-d6d4-d6d4-dbdd77ec82b6"
],
"isCapable": false
}
}
}
Control Charging
POST /chargers/{chargerId}/charging
Register a request for a charger to start or stop charging. We retry sending the command until the charger's powerDeliveryState
field transitions to the expected state. Note that this API request will complete before any commands are sent to the charger. There can only be one vendor action active for any one target id at a time. If a new action is created, the old action will transition into the CANCELLED
state. You may react to transitions by listening for the user:vendor-action:updated
webhook event or by polling the charger action endpointAPI.
This endpoint returns an error with status code 422 if the charger is controlled by a schedule. To restore user control, either disable the schedule or use our Smart Override APIAPI to temporarily enable charging.
Request
Path parameters
ID of the Charger.
Attributes
Charging action to perform
One of START or STOP
Sample
{
"action": "START"
}
Response
200Attributes
The ID of the action.
ISO8601 UTC timestamp
ISO8601 UTC timestamp
ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the target.
Current state of the charge action.
PENDING
: The initial state. We are actively retrying commands and polling the chargeable device for changes inpowerDeliveryState
.CONFIRMED
: The chargeable has transitioned into the expectedpowerDeliveryState
state.FAILED
: The chargeable failed to respond to our attempts to start or stop charging within 30 minutes. We have given up sending actions to the device.CANCELLED
: A required precondition was not met during the 30 minutes period or a another conflicting action was sent to the same device, cancelling this one.
One of PENDING, CONFIRMED, FAILED, or CANCELLED
ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.
One of vehicle or charger
One of START or STOP
Information about why was this action not executed successfully.
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "PENDING",
"targetId": "string",
"targetType": "vehicle",
"kind": "START",
"failureReason": {
"type": "NO_RESPONSE",
"detail": "The chargeable device remained unreachable."
}
}
Other responses
Response 400
A precondition check failed, that is unlikely to change within 30 minutes. This occurs if the charger cannot perform the action, is fully charged, or is already in the desired state.
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Response 422
Charger controlled by a Schedule
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Set Max Current
POST /chargers/{chargerId}/max-current
Register a request for a change of the maxCurrent
field on a charger. We retry sending the command until the charger's maxCurrent
field transitions to the expected value. Note that this request will complete before any commands are sent to the charger. There can only be one vendor action active for any one target id at a time. If a new action is created, the old action transitions to the CANCELLED
state. You may react to transitions by listening for the user:vendor-action:updated
webhook event or polling Charger Get ActionAPI.
Request
Path parameters
ID of the Charger.
Attributes
Desired max current in ampere
Sample
{
"maxCurrent": 20
}
Response
200Attributes
The ID of the action.
ISO8601 UTC timestamp
ISO8601 UTC timestamp
ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the target.
Current state of the charge action.
PENDING
: The initial state. We are actively retrying commands and polling the chargeable device for changes inpowerDeliveryState
.CONFIRMED
: The chargeable has transitioned into the expectedpowerDeliveryState
state.FAILED
: The chargeable failed to respond to our attempts to start or stop charging within 30 minutes. We have given up sending actions to the device.CANCELLED
: A required precondition was not met during the 30 minutes period or a another conflicting action was sent to the same device, cancelling this one.
One of PENDING, CONFIRMED, FAILED, or CANCELLED
ID of the charger which this action is controlling.
One of charger
Target maximum current for charger
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "PENDING",
"targetId": "string",
"targetType": "charger",
"targetState": {
"maxCurrent": 20
}
}
Other responses
Response 400
A precondition check failed, that is unlikely to change within 30 minutes. This occurs if the charger cannot perform the action.
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Create Smart Override
POST /chargers/{chargerId}/smart-override
Overrides an active smart feature by forcing the charger to start charging. This feature is meant to be used in situations where the user wants to charge immediately without disabling other smart features. The override remains active until the charger stops charging, or until the Delete Smart OverrideAPI endpoint is called. When the override ends, the overriden smart feature will regain control of the charger. This endpoint should not be used for standard charge control, use the Control ChargingAPI endpoint instead.
Request
Path parameters
ID of the Charger.
Response
200Attributes
ISO8601 UTC timestamp at which the smart override was created.
ISO8601 UTC timestamp at which the smart override was ended. If null, the smart override is still active.
One of vehicle or charger
ID of the asset (Vehicle or Charger) to which this smart override applies.
The ID of Vendor Action responsible for starting charging on the target. Use the Vehicle Get ActionAPI or the Charger Get ActionAPI endpoints to monitor action results.
ID of the User
Sample
{
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"userId": "string",
"vendor": "AUDI"
}
End Smart Override
DELETE /chargers/{chargerId}/smart-override
Ends any active Smart Override for the charger specified by chargerId
. If previously configured, Schedules or Smart Charging will resume control over the target charger. Note that this does not mean the charger will stop charging, only that it will return to the state expected by the active Schedule or Smart Charging Plan.
Request
Path parameters
ID of the Charger.
Response
200Attributes
ISO8601 UTC timestamp at which the smart override was created.
ISO8601 UTC timestamp at which the smart override was ended. If null, the smart override is still active.
One of vehicle or charger
ID of the asset (Vehicle or Charger) to which this smart override applies.
The ID of Vendor Action responsible for starting charging on the target. Use the Vehicle Get ActionAPI or the Charger Get ActionAPI endpoints to monitor action results.
ID of the User
Sample
{
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"userId": "string",
"vendor": "AUDI"
}
Other responses
Response 404
No Smart Override Exists
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Charging Locations
A user creates charging Locations to denote locations where they pay for the power used to charge their vehicle, heat their home, etc. Smart Charging is active at these locations only.
List Charging Locations
GET /charging-locations
Returns a list of Charging Locations registered to the User
Response
200Attributes
The ID of the charging location.
User-supplied name for the Charging Location
Longitude in degrees
Latitude in degrees
An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to UTC
.
Sample
[
{
"name": "Enode",
"latitude": 59.9173985,
"longitude": 10.7197486,
"timezoneName": "Europe/Oslo",
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
]
Create Charging Location
POST /charging-locations
Request
Attributes
User-supplied name for the Charging Location
Longitude in degrees
Latitude in degrees
An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to UTC
.
Sample
{
"name": "Enode",
"latitude": 59.9173985,
"longitude": 10.7197486,
"timezoneName": "Europe/Oslo"
}
Response
200Attributes
The ID of the charging location.
User-supplied name for the Charging Location
Longitude in degrees
Latitude in degrees
An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to UTC
.
Sample
{
"name": "Enode",
"latitude": 59.9173985,
"longitude": 10.7197486,
"timezoneName": "Europe/Oslo",
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
Get Charging Location
GET /charging-locations/{chargingLocationId}
Request
Path parameters
ID of the ChargingLocation.
Response
200Attributes
The ID of the charging location.
User-supplied name for the Charging Location
Longitude in degrees
Latitude in degrees
An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to UTC
.
Sample
{
"name": "Enode",
"latitude": 59.9173985,
"longitude": 10.7197486,
"timezoneName": "Europe/Oslo",
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
Delete Charging Location
DELETE /charging-locations/{chargingLocationId}
Delete a Charging Location.
Request
Path parameters
ID of the ChargingLocation.
Response
200Attributes
The ID of the charging location.
User-supplied name for the Charging Location
Longitude in degrees
Latitude in degrees
An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to UTC
.
Sample
{
"name": "Enode",
"latitude": 59.9173985,
"longitude": 10.7197486,
"timezoneName": "Europe/Oslo",
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
Update Charging Location
PUT /charging-locations/{chargingLocationId}
Updates a charging location with new configuration.
Request
Path parameters
ID of the ChargingLocation.
Attributes
User-supplied name for the Charging Location
Longitude in degrees
Latitude in degrees
An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to UTC
.
Sample
{
"name": "Enode",
"latitude": 59.9173985,
"longitude": 10.7197486,
"timezoneName": "Europe/Oslo"
}
Response
200Attributes
The ID of the charging location.
User-supplied name for the Charging Location
Longitude in degrees
Latitude in degrees
An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to UTC
.
Sample
{
"name": "Enode",
"latitude": 59.9173985,
"longitude": 10.7197486,
"timezoneName": "Europe/Oslo",
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
Associate Charging Location With Tariff
PUT /charging-locations/{chargingLocationId}/tariff
Associates a tariff to a charging location and specifies time intervals for the tariff's rates at this location. Further requests will overwrite the existing intervals for the specified tariffId. Multiple tariffs can be associated with a Charging Location. To disassociate a particular tariff, send a request with the tariffId and an empty tariffInterval list.
Request
Path parameters
ID of the ChargingLocation.
Attributes
Energy Provider Tariff ID
List of time intervals at which to apply the specified tariff rates
Sample
{
"tariffId": "string",
"tariffIntervals": [
{
"name": "OFF-WEEKEND",
"weekdays": [
5,
6
],
"from": "00:00",
"to": "06:00"
},
{
"name": "PEAK-WEEKEND",
"weekdays": [
5,
6
],
"from": "06:00",
"to": "18:00"
},
{
"name": "OFF",
"weekdays": [
5,
6
],
"from": "18:00",
"to": "23:59"
},
{
"name": "PEAK",
"from": "00:00",
"to": "18:00"
}
]
}
Response
204Successful
Other responses
Response 400
Invalid tariffId, invalid rate name, or incomplete interval series.
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Response 404
Charging Location not found.
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Get Charging Location Tariff
GET /charging-locations/{chargingLocationId}/tariff
Get Tariff intervals for a given charging location.
Request
Path parameters
ID of the ChargingLocation.
Response
200Attributes
Weekday to apply the named tariff. A weekday starts with 0 for Monday, and ends with 6 for Sunday. If not specified, named tariff is applied for entire week
One of 0, 1, 2, 3, 4, 5, or 6
Interval from time (inclusive, UTC)
Interval to time (exclusive, UTC)
Energy Provider Tariff ID
Rate name
Sample
[
{
"weekday": 0,
"fromHourMinute": "00:00",
"toHourMinute": "06:00",
"tariffId": "testing-tariff-a",
"tariffName": "OFF-PEAK"
},
{
"weekday": 0,
"fromHourMinute": "06:00",
"toHourMinute": "18:00",
"tariffId": "testing-tariff-a",
"tariffName": "PEAK"
}
]
Other responses
Response 400
Invalid tariffId or rate name, or incomplete interval series
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Response 404
Charging Location not found
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
HVAC
HVAC units (heaters, heat pumps, air conditioning, thermostats, etc.) are controlled by altering the mode & target setpoints. This can be done directly using the Set Permanent HoldAPI endpoint, Return to ScheduleAPI, or via Schedules.
List HVAC units
GET /hvacs
Response
200Attributes
HVAC IDs
Sample
[
"string"
]
Get Action
GET /hvacs/actions/{vendorActionId}
Returns the current state of the requested action.
Request
Path parameters
ID of the Action.
Response
200Attributes
The ID of the action.
ISO8601 UTC timestamp
ISO8601 UTC timestamp
ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the target.
Current state of the charge action.
PENDING
: The initial state. We are actively retrying commands and polling the chargeable device for changes inpowerDeliveryState
.CONFIRMED
: The chargeable has transitioned into the expectedpowerDeliveryState
state.FAILED
: The chargeable failed to respond to our attempts to start or stop charging within 30 minutes. We have given up sending actions to the device.CANCELLED
: A required precondition was not met during the 30 minutes period or a another conflicting action was sent to the same device, cancelling this one.
One of PENDING, CONFIRMED, FAILED, or CANCELLED
ID of the entity asset (HVAC) which this action is controlling.
One of hvac
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "PENDING",
"targetId": "string",
"targetType": "hvac",
"target": {
"coolSetpoint": 0,
"mode": "COOL",
"holdType": "PERMANENT"
}
}
Other responses
Response 404
Action not found.
Get HVAC Unit
GET /hvacs/{hvacId}
Request
Path parameters
ID of the Hvac.
Response
200Attributes
HVAC device ID
One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, NEST, or MICROMATIC
The last time the HVAC unit was successfully communicated with
Whether live data from the HVAC unit is currently reachable from Enode's perspective. It can happen that this 'reachability' refers to reading from a cache operated by the vendor's cloud service, if that service has determined that its cache is valid.
ID of the charging location the HVAC unit is housed at (if any)
Whether the HVAC unit is actively heating or cooling.
Current air temperature reported by device in degrees Celsius.
The current rate of energy consumption in kW. An inactive HVAC will have a consumption rate of 0. This value is currently experimental and is typically estimated with a large margin of error.
The HVAC's mode.
One of HEAT, COOL, AUTO, or OFF
If mode allows, heat when currentTemperature
falls below this point.
If mode allows, cool when currentTemperature
rises above this point.
The duration the setpoints and mode are expected to be held. If SCHEDULED
, the device is being controlled by an OEM schedule configured on the device.
One of PERMANENT or SCHEDULED
Descriptive information about the HVAC unit
An object describing valid states for this HVAC device.
Sample
{
"id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
"vendor": "ADAX",
"lastSeen": "2020-04-07T17:04:26.000Z",
"isReachable": true,
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isActive": true,
"currentTemperature": 20.8,
"consumptionRate": 1.8,
"mode": "HEAT",
"heatSetpoint": 22,
"coolSetpoint": 24,
"holdType": "PERMANENT",
"information": {
"brand": "ADAX",
"model": "Neo Wi-Fi Skirting",
"displayName": "Bedroom Panel Heater",
"groupName": "Bedroom",
"category": "HEATING"
},
"capabilities": {
"capableModes": [
"HEAT",
"COOL",
"OFF"
],
"capableHoldTypes": [
"PERMANENT"
],
"coolSetpointRange": {
"min": 15,
"max": 25
},
"heatSetpointRange": {
"min": 15,
"max": 25
},
"setpointDifferenceRange": {
"min": 15,
"max": 25
}
}
}
Set HVAC Location
PUT /hvacs/{hvacId}
Update the chargingLocationId
field on an HVAC device.
Request
Path parameters
ID of the Hvac.
Attributes
Sample
{
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
Response
200Attributes
HVAC device ID
One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, NEST, or MICROMATIC
The last time the HVAC unit was successfully communicated with
Whether live data from the HVAC unit is currently reachable from Enode's perspective. It can happen that this 'reachability' refers to reading from a cache operated by the vendor's cloud service, if that service has determined that its cache is valid.
ID of the charging location the HVAC unit is housed at (if any)
Whether the HVAC unit is actively heating or cooling.
Current air temperature reported by device in degrees Celsius.
The current rate of energy consumption in kW. An inactive HVAC will have a consumption rate of 0. This value is currently experimental and is typically estimated with a large margin of error.
The HVAC's mode.
One of HEAT, COOL, AUTO, or OFF
If mode allows, heat when currentTemperature
falls below this point.
If mode allows, cool when currentTemperature
rises above this point.
The duration the setpoints and mode are expected to be held. If SCHEDULED
, the device is being controlled by an OEM schedule configured on the device.
One of PERMANENT or SCHEDULED
Descriptive information about the HVAC unit
An object describing valid states for this HVAC device.
Sample
{
"id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
"vendor": "ADAX",
"lastSeen": "2020-04-07T17:04:26.000Z",
"isReachable": true,
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isActive": true,
"currentTemperature": 20.8,
"consumptionRate": 1.8,
"mode": "HEAT",
"heatSetpoint": 22,
"coolSetpoint": 24,
"holdType": "PERMANENT",
"information": {
"brand": "ADAX",
"model": "Neo Wi-Fi Skirting",
"displayName": "Bedroom Panel Heater",
"groupName": "Bedroom",
"category": "HEATING"
},
"capabilities": {
"capableModes": [
"HEAT",
"COOL",
"OFF"
],
"capableHoldTypes": [
"PERMANENT"
],
"coolSetpointRange": {
"min": 15,
"max": 25
},
"heatSetpointRange": {
"min": 15,
"max": 25
},
"setpointDifferenceRange": {
"min": 15,
"max": 25
}
}
}
Set HVAC to follow device schedule
POST /hvacs/{hvacId}/follow-schedule
Tell an HVAC unit to follow the schedule set on the device. Only available if SCHEDULED
is present in the target's capabilities.capableHoldType
. This endpoint can be used to cancel permanent holds. We retry sending the command until the HVAC unit's fields transition to the expected values. Note that this request will complete before any commands are sent to the HVAC unit. You may react to transitions by listening for the user:vendor-action:updated
webhook event or polling the HVAC action endpointAPI.
Request
Path parameters
ID of the Hvac.
Response
200Attributes
The ID of the action.
ISO8601 UTC timestamp
ISO8601 UTC timestamp
ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the target.
Current state of the charge action.
PENDING
: The initial state. We are actively retrying commands and polling the chargeable device for changes inpowerDeliveryState
.CONFIRMED
: The chargeable has transitioned into the expectedpowerDeliveryState
state.FAILED
: The chargeable failed to respond to our attempts to start or stop charging within 30 minutes. We have given up sending actions to the device.CANCELLED
: A required precondition was not met during the 30 minutes period or a another conflicting action was sent to the same device, cancelling this one.
One of PENDING, CONFIRMED, FAILED, or CANCELLED
ID of the entity asset (HVAC) which this action is controlling.
One of hvac
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "PENDING",
"targetId": "string",
"targetType": "hvac",
"target": {
"holdType": "SCHEDULED"
}
}
Other responses
Response 400
A precondition check failed, that is unlikely to change within 30 minutes. This occurs if the HVAC cannot perform the action.
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Response 422
HVAC controlled by an Enode Schedule
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Set HVAC Mode as Permanent Hold
POST /hvacs/{hvacId}/permanent-hold
Tell an HVAC unit to enter a permanent hold. Only available if PERMANENT
is present in the target's capabilities.capableHoldType
. We retry sending the command until the HVAC unit's target
field transition to the expected value. Note that this request will complete before any commands are sent to the HVAC unit. You may react to transitions by listening for the user:vendor-action:updated
webhook event or polling the HVAC action endpointAPI.
Request
Path parameters
ID of the Hvac.
Attributes
One of COOL
Sample
{
"coolSetpoint": 0,
"mode": "COOL"
}
Response
200Attributes
The ID of the action.
ISO8601 UTC timestamp
ISO8601 UTC timestamp
ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the target.
Current state of the charge action.
PENDING
: The initial state. We are actively retrying commands and polling the chargeable device for changes inpowerDeliveryState
.CONFIRMED
: The chargeable has transitioned into the expectedpowerDeliveryState
state.FAILED
: The chargeable failed to respond to our attempts to start or stop charging within 30 minutes. We have given up sending actions to the device.CANCELLED
: A required precondition was not met during the 30 minutes period or a another conflicting action was sent to the same device, cancelling this one.
One of PENDING, CONFIRMED, FAILED, or CANCELLED
ID of the entity asset (HVAC) which this action is controlling.
One of hvac
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "PENDING",
"targetId": "string",
"targetType": "hvac",
"target": {
"coolSetpoint": 0,
"mode": "COOL",
"holdType": "PERMANENT"
}
}
Other responses
Response 400
A precondition check failed, that is unlikely to change within 30 minutes. This occurs if the HVAC cannot perform the action or the setpoints are invalid.
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Response 422
HVAC controlled by an Enode Schedule
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Me
The Me
endpoint returns metadata about the authenticated User.
Get My User
GET /me
Returns metadata about the authenticated User, including a list of vendors for which the User has provided credentials.
Response
200Attributes
The user's userID.
Sample
{
"id": "123456789-ABc",
"linkedVendors": [
{
"vendor": "CSISolar",
"vendorType": "vehicle",
"isValid": true
}
]
}
Disconnect Vendor
DELETE /me/vendors/{vendor}
Disconnect a single Vendor from the User's account.
All stored data about their Vendor account will be deleted, and any vehicles that were provided by that Vendor will disappear from the system.
Request
Path parameters
Vendor to be unlinked.
Response
204No Content
Schedules
Endpoints to manage schedules for Vehicles, Chargers and HVAC.
More information and examples are available in the Using Schedules guide.
Get Schedule
GET /schedules/{scheduleId}
Request
Path parameters
ID of the Schedule.
Response
200Attributes
ID of the Charging Location to which this schedule applies. The behavior of a null value differs based on the targetType
. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.
Whether this Schedule should be attempting to control the target's charge state.
When no rule is active, the default charge state for the target.
Each rule sets a value for shouldCharge
, either true
or false
. All other properties of the rule are optional filters that limit the times to which this rule applies.
Replaced by targetId
.
Replaced by targetType
.
One of vehicle or charger
Replaced by targetId
.
Replaced by targetType
.
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
Sample
{
"id": "string",
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"isEnabled": true,
"defaultShouldCharge": true,
"rules": [
{
"hourMinute": {
"from": "string",
"to": "string"
},
"fromTimestamp": "2020-04-07T17:04:26Z",
"toTimestamp": "2020-04-07T17:04:26Z",
"weekdays": [
0,
1,
2,
3,
4,
5
],
"shouldCharge": true
}
],
"chargeableId": "string",
"chargeableType": "vehicle",
"entityId": "string",
"entityType": "string",
"targetId": "string",
"targetType": "vehicle"
}
Delete Schedule
DELETE /schedules/{scheduleId}
Delete a Schedule
Request
Path parameters
ID of the Schedule.
Response
204No Content
Update Schedule
PUT /schedules/{scheduleId}
Does a partial update of a schedule.
Request
Path parameters
ID of the Schedule.
Attributes
ID of the Charging Location to which this schedule applies. The behavior of a null value differs based on the targetType
. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.
Whether this Schedule should be attempting to control the target's charge state.
When no rule is active, the default charge state for the target.
Each rule sets a value for shouldCharge
, either true
or false
. All other properties of the rule are optional filters that limit the times to which this rule applies.
Replaced by targetId
.
Replaced by targetType
.
Sample
{
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"isEnabled": true,
"defaultShouldCharge": true,
"rules": [
{
"hourMinute": {
"from": "string",
"to": "string"
},
"fromTimestamp": "2020-04-07T17:04:26Z",
"toTimestamp": "2020-04-07T17:04:26Z",
"weekdays": [
0,
1,
2,
3,
4,
5
],
"shouldCharge": true
}
],
"entityId": "string",
"entityType": "string"
}
Response
200Attributes
ID of the Charging Location to which this schedule applies. The behavior of a null value differs based on the targetType
. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.
Whether this Schedule should be attempting to control the target's charge state.
When no rule is active, the default charge state for the target.
Each rule sets a value for shouldCharge
, either true
or false
. All other properties of the rule are optional filters that limit the times to which this rule applies.
Replaced by targetId
.
Replaced by targetType
.
One of vehicle or charger
Replaced by targetId
.
Replaced by targetType
.
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
Sample
{
"id": "string",
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"isEnabled": true,
"defaultShouldCharge": true,
"rules": [
{
"hourMinute": {
"from": "string",
"to": "string"
},
"fromTimestamp": "2020-04-07T17:04:26Z",
"toTimestamp": "2020-04-07T17:04:26Z",
"weekdays": [
0,
1,
2,
3,
4,
5
],
"shouldCharge": true
}
],
"chargeableId": "string",
"chargeableType": "vehicle",
"entityId": "string",
"entityType": "string",
"targetId": "string",
"targetType": "vehicle"
}
List Schedules
GET /schedules
Returns a list of Schedules registered to the User.
Response
200Attributes
ID of the Charging Location to which this schedule applies. The behavior of a null value differs based on the targetType
. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.
Whether this Schedule should be attempting to control the target's charge state.
When no rule is active, the default charge state for the target.
Each rule sets a value for shouldCharge
, either true
or false
. All other properties of the rule are optional filters that limit the times to which this rule applies.
Replaced by targetId
.
Replaced by targetType
.
One of vehicle or charger
Replaced by targetId
.
Replaced by targetType
.
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
Sample
[
{
"id": "string",
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"isEnabled": true,
"defaultShouldCharge": true,
"rules": [
{
"hourMinute": {
"from": "string",
"to": "string"
},
"fromTimestamp": "2020-04-07T17:04:26Z",
"toTimestamp": "2020-04-07T17:04:26Z",
"weekdays": [
0,
1,
2,
3,
4,
5
],
"shouldCharge": true
}
],
"chargeableId": "string",
"chargeableType": "vehicle",
"entityId": "string",
"entityType": "string",
"targetId": "string",
"targetType": "vehicle"
}
]
Create Schedule
POST /schedules
Request
Attributes
ID of the Charging Location to which this schedule applies. The behavior of a null value differs based on the targetType
. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.
Whether this Schedule should be attempting to control the target's charge state.
When no rule is active, the default charge state for the target.
Each rule sets a value for shouldCharge
, either true
or false
. All other properties of the rule are optional filters that limit the times to which this rule applies.
Replaced by targetId
.
Replaced by targetType
.
Sample
{
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"isEnabled": true,
"defaultShouldCharge": true,
"rules": [
{
"hourMinute": {
"from": "string",
"to": "string"
},
"fromTimestamp": "2020-04-07T17:04:26Z",
"toTimestamp": "2020-04-07T17:04:26Z",
"weekdays": [
0,
1,
2,
3,
4,
5
],
"shouldCharge": true
}
],
"entityId": "string",
"entityType": "string"
}
Response
200Attributes
ID of the Charging Location to which this schedule applies. The behavior of a null value differs based on the targetType
. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.
Whether this Schedule should be attempting to control the target's charge state.
When no rule is active, the default charge state for the target.
Each rule sets a value for shouldCharge
, either true
or false
. All other properties of the rule are optional filters that limit the times to which this rule applies.
Replaced by targetId
.
Replaced by targetType
.
One of vehicle or charger
Replaced by targetId
.
Replaced by targetType
.
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
Sample
{
"id": "string",
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"isEnabled": true,
"defaultShouldCharge": true,
"rules": [
{
"hourMinute": {
"from": "string",
"to": "string"
},
"fromTimestamp": "2020-04-07T17:04:26Z",
"toTimestamp": "2020-04-07T17:04:26Z",
"weekdays": [
0,
1,
2,
3,
4,
5
],
"shouldCharge": true
}
],
"chargeableId": "string",
"chargeableType": "vehicle",
"entityId": "string",
"entityType": "string",
"targetId": "string",
"targetType": "vehicle"
}
Get Schedule Status
GET /schedules/{scheduleId}/status
Request
Path parameters
ID of the Schedule.
Response
200Attributes
ID of the schedule.
One of CHARGE
Time at which any value of the status last changed
An enum value that describes the current state of the Schedule
One of ALIGNED, MISALIGNED, PENDING, INACTIVE:OVERRIDDEN, INACTIVE:DISABLED, INACTIVE:AWAY, or INACTIVE:INCAPABLE
Whether the target is currently actually charging
Whether the target is currently expected to be charging
Collection of booleans that - when combined via AND operator - forms the isChargingExpected
value
List of upcoming transitions of the shouldCharge
or targetTemperature
value. A maximum of 2 items are returned.
Replaced by smartOverride.
Sample
{
"scheduleId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"scheduleType": "CHARGE",
"changedAt": "2020-04-07T17:04:26Z",
"state": "ALIGNED",
"isCharging": true,
"isChargingExpected": true,
"isChargingExpectedParts": {
"needsCharge": true,
"isPluggedIn": true,
"shouldCharge": true
},
"upcomingTransitions": [
{
"at": "2020-04-07T17:04:26Z",
"shouldCharge": true
}
],
"externalStart": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
}
Service Health
Endpoints that return information about the health of Enode and our integrations.
Check Available Charger Vendors
GET /health/chargers
Lists the available charger vendors. If you authenticate with a client or link token, we also include the activated vendors that your client has access to. Learn more about vendors requiring activation.
Response
200Attributes
Machine-friendly name of the Vendor
One of ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, or EVBOX
A formatted and properly cased vendor brand name, suitable for reading by humans.
One of Zaptec, Easee, Wallbox, EO, EVBox, or Charge Amps
The name of the first party service or app that the user normally logs into.
Ready-state of the Vendor. Currently always READY
.
One of READY, ELEVATED_ERROR_RATE, or OUTAGE
Sample
[
{
"vendor": "EASEE",
"displayName": "Easee",
"portalName": "Easee",
"status": "READY",
"defaultRegion": "region-global-except-north-america"
},
{
"vendor": "WALLBOX",
"displayName": "Wallbox",
"portalName": "Wallbox",
"status": "READY",
"defaultRegion": "region-global-except-north-america"
},
{
"vendor": "ZAPTEC",
"displayName": "Zaptec",
"portalName": "Zaptec",
"status": "READY",
"defaultRegion": "region-global-except-north-america"
},
{
"vendor": "EO",
"displayName": "EO",
"portalName": "EO",
"status": "READY",
"defaultRegion": "region-global-except-north-america"
}
]
Check Available Vehicle Vendors
GET /health/vehicles
Lists the available vehicle vendors. If you authenticate with a client or link token, we also include the activated vendors that your client has access to. Learn more about vendors requiring activation.
Response
200Attributes
Machine-friendly name of the Vendor
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, or GMC
A formatted and properly cased vendor brand name, suitable for reading by humans.
One of Audi, BMW, Honda, Hyundai, Jaguar, Land Rover, Kia, Mercedes, MINI, Nissan, Peugeot, Porsche, Renault, SEAT, ŠKODA, Tesla, Volkswagen, Volvo, Ford, Opel, DS, Toyota, Citroën, Cupra, Vauxhall, Fiat, Rivian, Nio, Chevrolet, or GMC
The name of the first party service or app that the user normally logs into.
Ready-state of the Vendor. Currently always READY
.
One of READY, ELEVATED_ERROR_RATE, or OUTAGE
Sample
[
{
"vendor": "TESLA",
"displayName": "Tesla",
"portalName": "Tesla",
"status": "READY",
"defaultRegion": "region-global-except-north-america"
},
{
"vendor": "BMW",
"displayName": "BMW",
"portalName": "My BMW",
"status": "READY",
"defaultRegion": "region-global-except-north-america"
},
{
"vendor": "AUDI",
"displayName": "Audi",
"portalName": "myAudi",
"status": "READY",
"defaultRegion": "region-global-except-north-america"
}
]
Check Available Inverter Vendors
GET /health/inverter
Lists the available inverter vendors. If you authenticate with a client or link token, we also include the activated vendors that your client has access to. Learn more about vendors requiring activation.
Response
200Attributes
Machine-friendly name of the Vendor
One of CSISolar, EMA, ENPHASE, FRONIUS, GOODWE, GROWATT, HUAWEI, INVT, SMA, SOFAR, SOLAREDGE, or SOLIS
A formatted and properly cased vendor brand name, suitable for reading by humans.
One of CSISolar, EMA, Enphase, Fronius, GoodWe, Growatt, Huawei, INVT, SMA, Sofar, SolarEdge, or Solis
The name of the first party service or app that the user normally logs into.
Ready-state of the Vendor. Currently always READY
.
One of READY, ELEVATED_ERROR_RATE, or OUTAGE
Sample
[
{
"vendor": "SOLAREDGE",
"displayName": "SolarEdge",
"portalName": "Solar Edge",
"status": "READY",
"defaultRegion": "region-global-except-north-america"
},
{
"vendor": "SMA",
"displayName": "SMA",
"status": "READY",
"defaultRegion": "region-global-except-north-america",
"portalName": "SMA Energy"
},
{
"vendor": "SOLIS",
"displayName": "Solis",
"status": "READY",
"defaultRegion": "region-global-except-north-america",
"portalName": "Solis"
},
{
"vendor": "FRONIUS",
"displayName": "Fronius",
"status": "READY",
"defaultRegion": "region-global-except-north-america",
"portalName": "Fronius"
}
]
Check Available Hvac Vendors
GET /health/hvacs
Lists the available HVAC vendors. If you authenticate with a client or link token, we also include the activated vendors that your client has access to. Learn more about vendors requiring activation.
Response
200Attributes
Machine-friendly name of the Vendor
One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, NEST, or MICROMATIC
A formatted and properly cased vendor brand name, suitable for reading by humans.
One of Tado, Mill, ADAX, Ecobee, Sensibo, Honeywell TCC, Resideo, Mitsubishi, Nest, or Micro Matic
The name of the first party service or app that the user normally logs into.
Ready-state of the Vendor. Currently always READY
.
One of READY, ELEVATED_ERROR_RATE, or OUTAGE
Sample
[
{
"vendor": "MILL",
"displayName": "Mill",
"status": "READY",
"defaultRegion": "region-global-except-north-america",
"portalName": "Mill"
}
]
Check Service Readiness
GET /health/ready
Gets the combined health status of the service and all functionalities and dependencies.
Response
204All functionalities are operating nominally.
Other responses
Response 503
At least one functionality of the system is not operating nominally.
Solar inverters
Solar inverters can be queried for current production state
Get Solar Inverter
GET /inverters/{inverterId}
Request
Path parameters
ID of the solar inverter
Query parameters
If you specify any fields here, we make a request to the Solar inverter's OEM APIs and return the updated data.
This will slow down your integration. In cases of vendor downtime requests with fields may take up to a minute to complete, while requests without fields will always be fast. Enode polls all devices connected to our platform, so any cached data returned will not be older than 10 minutes (unless the vendor APIs are unavailable, in which case you can consult the lastSeen
& isReachable
fields on the solar inverter).
By default, no fields are included, and the latest cached full solar inverter object will be returned.
Response
200Attributes
Solar Inverter ID
One of CSISolar, EMA, ENPHASE, FRONIUS, GOODWE, GROWATT, HUAWEI, INVT, SMA, SOFAR, SOLAREDGE, or SOLIS
ID of the charging location the solar inverter is currently positioned at (if any).
The last time the solar inverter was successfully communicated with
Whether live data from the solar inverter is currently reachable from Enode's perspective. This 'reachability' may refer to reading from a cache operated by the solar inverter's cloud service if that service has determined that its cache is valid.
Descriptive information about the solar inverter
Solar inverter's GPS coordinates
Sample
{
"id": "string",
"vendor": "CSISolar",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"lastSeen": "2020-04-07T17:04:26Z",
"isReachable": true,
"productionState": {
"productionRate": 0,
"isProducing": true,
"totalLifetimeProduction": 100152.56,
"lastUpdated": "2020-04-07T17:04:26Z"
},
"information": {
"id": "string",
"brand": "CSISolar",
"model": "Sunny Boy",
"siteName": "Sunny Plant",
"installationDate": "2020-04-07T17:04:26Z"
},
"location": {
"longitude": 10.7197486,
"latitude": 59.9173985
}
}
List Solar inverter
GET /inverters
Response
200Attributes
Solar inverter IDs
Sample
[
"string"
]
Statistics
Endpoints returning timeseries data collected from any linked devices.
Get User Charging Statistics
GET /statistics/charging
Returns a normalized time series of statistics about power consumption and price for the User.
If Smart Charging has shifted the consumption, the 'non-smart' price fields will show what the consumption would have cost if it had happened at the default time. The difference between the two is provided by the estimatedSavings
field for convenience. <CURRENCY>
is an ISO4217 Alpha-3 currency code that is determined by client-wide configuration or the currency code provided during price data ingestion (such as Tariffs).
Request
Query parameters
The unit of time the data will be cut into before aggregate statistics are applied. Each entry in the response array corresponds to aggregated data of the time range specified.
One of QUARTER_HOUR, HALF_HOUR, HOUR, DAY, WEEK, MONTH, or YEAR
Earliest date to include in the response in ISO format. Cannot be greater than endDate. Example: 2021-03-21T00:25:43.511Z
Latest date to include in the response (defaults to current date/time) in ISO format. Example: 2021-03-21T00:25:43.511Z
Offset (in hours) from UTC of the timezone from which the statistics should be viewed. By default, all returned timestamps are in UTC, and period boundaries (day, week, month, year) used in the aggregation are calculated in UTC. Providing utcOffset
instead aligns these to the viewer's timezone so that the timestamps and period boundaries fall where the viewer expects them to. Positive, negative, and fractional values are valid.
Filter statistics to only include this charging location.
Get statistics for this hardware type. If omitted, statistics for the vehicle hardware type will be returned.
One of charger, vehicle, or hvac
Filter statistics to only include a specific entity. Hardware category of the entity must match the type
parameter.
Response
200Attributes
Aggregate statistics for charge rate in kW
Total power consumption in kWh
Aggregate statistics for power price (<CURRENCY>
per kWh)
Aggregate statistics for power price (<CURRENCY>
per kWh), calculated as if the charging had ocurred uninterrupted without being delayed by Smart Charging
Total cost in <CURRENCY>
Total cost for this consumption in <CURRENCY>
, if it had not been shifted by Smart Charging
Total estimated savings in <CURRENCY>
, achieved by Smart Charging
The start date of this sample
Sample
[
{
"kw": {
"min": 0,
"max": 78,
"mean": 61
},
"kwhSum": 120,
"price": {
"min": 13.8,
"max": 14.4,
"mean": 14.1
},
"nonSmartPrice": {
"min": 12.9,
"max": 16.7,
"mean": 14.8
},
"smartSession": true,
"costSum": 3.14,
"nonSmartCostSum": 4.21,
"estimatedSavings": 1.07,
"date": "2021-01-19T09:37:36.845Z"
}
]
Get User Sessions Charging Statistics
GET /statistics/charging/sessions
Returns a list of statistics about power consumption and price for the User binned by sessions.
Request
Query parameters
Get statistics for this hardware type.
One of charger, vehicle, or hvac
Earliest date to include in the response in ISO format. Example: 2021-03-21T00:25:43.511Z
Latest date to include in the response (defaults to current date/time) in ISO format. Example: 2021-03-21T00:25:43.511Z
Filter statistics to only include a specific entity.
Filter statistics to only include this charging location
Response
200Attributes
ID for this session.
ID of the hardware type for this session.
Charging Location ID for this session.
Start time.
End time.
Aggregate statistics for charge rate in kW
Total power consumption in kWh
Aggregate statistics for power price (<CURRENCY>
per kWh)
Total cost in <CURRENCY>
The values in smartStats
will all be null
if smartSession
is false
Sample
[
{
"id": "string",
"targetId": "string",
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"from": "2020-04-07T17:04:26Z",
"to": "2020-04-07T17:04:26Z",
"kw": {
"min": 0,
"max": 0,
"mean": 0
},
"kwhSum": 120,
"price": {
"min": 0,
"max": 0,
"mean": 0
},
"costSum": 3.14,
"smartSession": true,
"smartStats": {
"nonSmartPrice": {
"min": 0,
"max": 0,
"mean": 0
},
"nonSmartCostSum": 4.21,
"estimatedSavings": 1.07
}
}
]
Get User Production Statistics
GET /statistics/production
Returns a normalized time series of statistics about power production and price for the User.
Request
Query parameters
The unit of time the data will be cut into before aggregate statistics are applied. Each entry in the response array corresponds to aggregated data of the time range specified.
One of QUARTER_HOUR, HALF_HOUR, HOUR, DAY, WEEK, MONTH, or YEAR
Earliest date to include in the response in ISO format. Cannot be greater than endDate. Example: 2021-03-21T00:25:43.511Z
Latest date to include in the response (defaults to current date/time) in ISO format. Example: 2021-03-21T00:25:43.511Z
Offset (in hours) from UTC of the timezone from which the statistics should be viewed. By default, all returned timestamps are in UTC, and period boundaries (day, week, month, year) used in the aggregation are calculated in UTC. Providing utcOffset
instead aligns these to the viewer's timezone so that the timestamps and period boundaries fall where the viewer expects them to. Positive, negative, and fractional values are valid.
Filter statistics to only include this charging location.
Get statistics for this hardware type.
One of inverter
Filter statistics to only include a specific entity. Hardware category of the entity must match the type
parameter.
Response
200Attributes
Aggregate statistics for charge rate in kW
Total power consumption in kWh
Aggregate statistics for power price (<CURRENCY>
per kWh)
Total earnings in <CURRENCY>
The start date of this sample
Sample
[
{
"kw": {
"min": 0,
"max": 78,
"mean": 61
},
"kwhSum": 120,
"price": {
"min": 13.8,
"max": 14.4,
"mean": 14.1
},
"earningsSum": 3.14,
"date": "2021-01-19T09:37:36.845Z"
}
]
Tariffs
Endpoints used to submit pricing information to Enode.
Send Tariff information
PUT /tariffs/{tariffId}
Set a list of rates for a given tariffId
. If previous data exists for a given tariffId
, it will be overwritten. These tariffs are used in our Statistics and Smart Charging features.
Request
Path parameters
Attributes
Per-tariff unique interval name
Rate cost (decimal string)
Sample
[
{
"name": "PEAK",
"cost": "13.37"
},
{
"name": "OFF-PEAK",
"cost": "12.34"
}
]
Response
204Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
User Management
Endpoints used to link and unlink users or vendors.
Link User
POST /users/{userId}/link
Creates an Enode Link session attached to the provided User ID. If this User does not exist, it will be created. The returned linkState
gives the User short-lived (24hs) access to Enode Link. A URL for Enode Link for the user to initiate asset linking is also returned.
Request
Path parameters
ID of the User.
Attributes
Skip the vendor selection screen and present the credential input for a specific vendor immediately.
Sets the type of vendors available for connection in a Link UI session. If absent, this defaults to vehicle
.
One of vehicle, charger, hvac, or inverter
The scope(s) you wish to request access to when linking an asset.
A URI to redirect the user to after successfully linking an asset.
Sample
{
"vendor": "CSISolar",
"vendorType": "vehicle",
"forceLanguage": "en",
"scopes": [
"offline_access",
"all"
],
"redirectUri": "myapp://integrations/enode",
"userName": "string"
}
Response
200Attributes
Sample
{
"linkState": "ZjE2MzMxMGFiYmU4MzcxOTU1ZmRjMTU5NGU2ZmE4YTU3NjViMzIwY2YzNG",
"linkUrl": "https://link.production.enode.io?link_state=YzIwZThhYjYtMjMzMi00ZTAyLTg0OTYtYzdjOTlhZTY3Zjc3QDI2YzI1MDExLTdhYTctNGE2NS1iNjBmLTZmMzc5NmRhODUyMDowNDViYjFiYmE0M2Y5NDU5YTc5OTgxZmEyYTg1NmI4YzhkOGU4YjgyNmNmMzQzZmFmMGNhZTlmNDBjMmZmOTgy&requested_scope=vehicle%3Alocation%20vehicle%3Aodometer&redirect_uri=myapp%3A%2F%2Fintegrations%2Fenode"
}
Other responses
Response 403
Connections limit reached for this clients
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Unlink User
DELETE /users/{userId}
Deletes a User and all of their data permanently and invalidates any associated sessions, authorization codes, and access/refresh tokens.
Request
Path parameters
ID of the User.
Response
204No Content
Deauthorize User
DELETE /users/{userId}/authorization
Deletes the User's stored vendor authorizations and credentials, invalidates any associated sessions, authorization codes, and access/refresh tokens.
All other User data is retained, and if the User is sent through the Link User flow in the future, their account will be just as they left it.
No webhook events will be generated for a deauthorized user.
Request
Path parameters
ID of the User.
Response
204No Content
Vehicles
EVs provide charge, location, and odometer data. Vehicles can be controlled either directly using the Control ChargingAPI endpoint, or through Smart Charging and Schedules.
List Vehicles
GET /vehicles
List all available Vehicles for the User.
If you already know the ID of a vehicle you want to fetch, it is recommended to fetch it using the more performant Get VehicleAPI method.
Request
Query parameters
If you specify any fields here, we make a request to the Vehicle's OEM APIs and return the updated data.
This will slow down your integration. In cases of vendor downtime requests with fields may take up to a minute to complete, while requests without fields will always be fast. Enode polls all devices connected to our platform, so any cached data returned will not be older than 10 minutes (unless the vendor APIs are unavailable, in which case you can consult the lastSeen
& isReachable
fields on the vehicle).
Note that the field values capabilities
& smartChargingPolicy
are deprecated and will always be returned.
If no fields are included, and the latest cached full Vehicle object will be returned.
Response
200Attributes
Vehicle ID
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, or GMC
ISO8601 UTC timestamp at which live data was last available from Enode's perspective.
Whether live data from the vehicle is currently available from Enode's perspective. This 'reachability' may refer to reading from a cache operated by the vehicle's cloud service if that service has determined that its cache is valid.
ID of the charging location the vehicle is currently positioned at (if any).
Descriptive information about the Vehicle.
Information about the electric or hybrid battery.
Smart Charging configuration properties. Configured via the Update Smart Charging PolicyAPI endpoint.
Vehicle's GPS coordinates with timestamp
Vehicle's odometer with timestamp
A collection of descriptors that describe the capabilities of this specific vehicle
Sample
[
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"vendor": "TESLA",
"isReachable": true,
"lastSeen": "2023-03-22T13:54:35.621Z",
"chargingLocationId": null,
"information": {
"vin": "5YJ3F7EA1LF700671",
"brand": "Tesla",
"model": "Model 3",
"year": 2020
},
"chargeState": {
"chargeTimeRemaining": 285,
"chargeRate": 2,
"isFullyCharged": false,
"isPluggedIn": true,
"isCharging": true,
"batteryLevel": 67,
"range": 228,
"batteryCapacity": 44.086,
"chargeLimit": 90,
"lastUpdated": "2023-03-22T13:54:34.000Z",
"powerDeliveryState": "PLUGGED_IN:CHARGING"
},
"smartChargingPolicy": {
"deadline": "07:00",
"isEnabled": false,
"minimumChargeLimit": 20
},
"location": {
"latitude": 59.9173985,
"longitude": 10.7197486,
"lastUpdated": "2023-03-22T13:54:34.000Z"
},
"odometer": {
"distance": 65393,
"lastUpdated": "2023-03-22T13:54:34.000Z"
},
"capabilities": {
"information": {
"interventionIds": [],
"isCapable": true
},
"chargeState": {
"interventionIds": [],
"isCapable": true
},
"location": {
"interventionIds": [],
"isCapable": true
},
"odometer": {
"interventionIds": [],
"isCapable": true
},
"startCharging": {
"interventionIds": [],
"isCapable": true
},
"stopCharging": {
"interventionIds": [],
"isCapable": true
},
"smartCharging": {
"interventionIds": [],
"isCapable": true
}
}
}
]
Other responses
Response 206
Partial Content: The requested vehicle fields could not be fetched, and a cached copy of the data is returned as the response.
Attributes
Vehicle ID
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, or GMC
ISO8601 UTC timestamp at which live data was last available from Enode's perspective.
Whether live data from the vehicle is currently available from Enode's perspective. This 'reachability' may refer to reading from a cache operated by the vehicle's cloud service if that service has determined that its cache is valid.
ID of the charging location the vehicle is currently positioned at (if any).
Descriptive information about the Vehicle.
Information about the electric or hybrid battery.
Smart Charging configuration properties. Configured via the Update Smart Charging PolicyAPI endpoint.
Vehicle's GPS coordinates with timestamp
Vehicle's odometer with timestamp
A collection of descriptors that describe the capabilities of this specific vehicle
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"vendor": "TESLA",
"isReachable": true,
"lastSeen": "2023-03-22T13:54:35.621Z",
"chargingLocationId": null,
"information": {
"vin": "5YJ3F7EA1LF700671",
"brand": "Tesla",
"model": "Model 3",
"year": 2020
},
"chargeState": {
"chargeTimeRemaining": 285,
"chargeRate": 2,
"isFullyCharged": false,
"isPluggedIn": true,
"isCharging": true,
"batteryLevel": 67,
"range": 228,
"batteryCapacity": 44.086,
"chargeLimit": 90,
"lastUpdated": "2023-03-22T13:54:34.000Z",
"powerDeliveryState": "PLUGGED_IN:CHARGING"
},
"smartChargingPolicy": {
"deadline": "07:00",
"isEnabled": false,
"minimumChargeLimit": 20
},
"location": {
"latitude": 59.9173985,
"longitude": 10.7197486,
"lastUpdated": "2023-03-22T13:54:34.000Z"
},
"odometer": {
"distance": 65393,
"lastUpdated": "2023-03-22T13:54:34.000Z"
},
"capabilities": {
"information": {
"interventionIds": [],
"isCapable": true
},
"chargeState": {
"interventionIds": [],
"isCapable": true
},
"location": {
"interventionIds": [],
"isCapable": true
},
"odometer": {
"interventionIds": [],
"isCapable": true
},
"startCharging": {
"interventionIds": [],
"isCapable": true
},
"stopCharging": {
"interventionIds": [],
"isCapable": true
},
"smartCharging": {
"interventionIds": [],
"isCapable": true
}
}
}
Get Charge Action
GET /vehicles/actions/{vendorActionId}
Returns the current state of the requested action.
Request
Path parameters
ID of the Action.
Response
200Attributes
The ID of the action.
ISO8601 UTC timestamp
ISO8601 UTC timestamp
ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the target.
Current state of the charge action.
PENDING
: The initial state. We are actively retrying commands and polling the chargeable device for changes inpowerDeliveryState
.CONFIRMED
: The chargeable has transitioned into the expectedpowerDeliveryState
state.FAILED
: The chargeable failed to respond to our attempts to start or stop charging within 30 minutes. We have given up sending actions to the device.CANCELLED
: A required precondition was not met during the 30 minutes period or a another conflicting action was sent to the same device, cancelling this one.
One of PENDING, CONFIRMED, FAILED, or CANCELLED
ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.
One of vehicle or charger
One of START or STOP
Information about why was this action not executed successfully.
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "PENDING",
"targetId": "string",
"targetType": "vehicle",
"kind": "START",
"failureReason": {
"type": "NO_RESPONSE",
"detail": "The chargeable device remained unreachable."
}
}
Other responses
Response 404
Action not found.
Get Vehicle
GET /vehicles/{vehicleId}
Request
Path parameters
ID of the Vehicle.
Query parameters
If you specify any fields here, we make a request to the Vehicle's OEM APIs and return the updated data.
This will slow down your integration. In cases of vendor downtime requests with fields may take up to a minute to complete, while requests without fields will always be fast. Enode polls all devices connected to our platform, so any cached data returned will not be older than 10 minutes (unless the vendor APIs are unavailable, in which case you can consult the lastSeen
& isReachable
fields on the vehicle).
Note that the field values capabilities
& smartChargingPolicy
are deprecated and will always be returned.
If no fields are included, and the latest cached full Vehicle object will be returned.
Response
200Attributes
Vehicle ID
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, or GMC
ISO8601 UTC timestamp at which live data was last available from Enode's perspective.
Whether live data from the vehicle is currently available from Enode's perspective. This 'reachability' may refer to reading from a cache operated by the vehicle's cloud service if that service has determined that its cache is valid.
ID of the charging location the vehicle is currently positioned at (if any).
Descriptive information about the Vehicle.
Information about the electric or hybrid battery.
Smart Charging configuration properties. Configured via the Update Smart Charging PolicyAPI endpoint.
Vehicle's GPS coordinates with timestamp
Vehicle's odometer with timestamp
A collection of descriptors that describe the capabilities of this specific vehicle
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"vendor": "TESLA",
"isReachable": true,
"lastSeen": "2023-03-22T13:54:35.621Z",
"chargingLocationId": null,
"information": {
"vin": "5YJ3F7EA1LF700671",
"brand": "Tesla",
"model": "Model 3",
"year": 2020
},
"chargeState": {
"chargeTimeRemaining": 285,
"chargeRate": 2,
"isFullyCharged": false,
"isPluggedIn": true,
"isCharging": true,
"batteryLevel": 67,
"range": 228,
"batteryCapacity": 44.086,
"chargeLimit": 90,
"lastUpdated": "2023-03-22T13:54:34.000Z",
"powerDeliveryState": "PLUGGED_IN:CHARGING"
},
"smartChargingPolicy": {
"deadline": "07:00",
"isEnabled": false,
"minimumChargeLimit": 20
},
"location": {
"latitude": 59.9173985,
"longitude": 10.7197486,
"lastUpdated": "2023-03-22T13:54:34.000Z"
},
"odometer": {
"distance": 65393,
"lastUpdated": "2023-03-22T13:54:34.000Z"
},
"capabilities": {
"information": {
"interventionIds": [],
"isCapable": true
},
"chargeState": {
"interventionIds": [],
"isCapable": true
},
"location": {
"interventionIds": [],
"isCapable": true
},
"odometer": {
"interventionIds": [],
"isCapable": true
},
"startCharging": {
"interventionIds": [],
"isCapable": true
},
"stopCharging": {
"interventionIds": [],
"isCapable": true
},
"smartCharging": {
"interventionIds": [],
"isCapable": true
}
}
}
Other responses
Response 206
Partial Content: The requested vehicle fields could not be fetched, and a cached copy of the data is returned as the response.
Attributes
Vehicle ID
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, or GMC
ISO8601 UTC timestamp at which live data was last available from Enode's perspective.
Whether live data from the vehicle is currently available from Enode's perspective. This 'reachability' may refer to reading from a cache operated by the vehicle's cloud service if that service has determined that its cache is valid.
ID of the charging location the vehicle is currently positioned at (if any).
Descriptive information about the Vehicle.
Information about the electric or hybrid battery.
Smart Charging configuration properties. Configured via the Update Smart Charging PolicyAPI endpoint.
Vehicle's GPS coordinates with timestamp
Vehicle's odometer with timestamp
A collection of descriptors that describe the capabilities of this specific vehicle
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"vendor": "TESLA",
"isReachable": true,
"lastSeen": "2023-03-22T13:54:35.621Z",
"chargingLocationId": null,
"information": {
"vin": "5YJ3F7EA1LF700671",
"brand": "Tesla",
"model": "Model 3",
"year": 2020
},
"chargeState": {
"chargeTimeRemaining": 285,
"chargeRate": 2,
"isFullyCharged": false,
"isPluggedIn": true,
"isCharging": true,
"batteryLevel": 67,
"range": 228,
"batteryCapacity": 44.086,
"chargeLimit": 90,
"lastUpdated": "2023-03-22T13:54:34.000Z",
"powerDeliveryState": "PLUGGED_IN:CHARGING"
},
"smartChargingPolicy": {
"deadline": "07:00",
"isEnabled": false,
"minimumChargeLimit": 20
},
"location": {
"latitude": 59.9173985,
"longitude": 10.7197486,
"lastUpdated": "2023-03-22T13:54:34.000Z"
},
"odometer": {
"distance": 65393,
"lastUpdated": "2023-03-22T13:54:34.000Z"
},
"capabilities": {
"information": {
"interventionIds": [],
"isCapable": true
},
"chargeState": {
"interventionIds": [],
"isCapable": true
},
"location": {
"interventionIds": [],
"isCapable": true
},
"odometer": {
"interventionIds": [],
"isCapable": true
},
"startCharging": {
"interventionIds": [],
"isCapable": true
},
"stopCharging": {
"interventionIds": [],
"isCapable": true
},
"smartCharging": {
"interventionIds": [],
"isCapable": true
}
}
}
Control Charging
POST /vehicles/{vehicleId}/charging
Register a request for a vehicle to start or stop charging. We retry sending the command until the vehicle's powerDeliveryState
field transitions to the expected state. Note that this API request will complete before any commands are sent to the vehicle. There can only be one vendor action active for any one target id at a time. If a new action is created, the old action will transition into the CANCELLED
state. You may react to transitions by listening for the user:vendor-action:updated
webhook event or by polling the vehicle action endpointAPI.
This endpoint returns an error with status code 422 if the vehicle is controlled by a schedule or has an active smart charging plan. To restore user control, either disable the schedule, disable smart charging, or use our Smart Override APIAPI to temporarily enable charging.
Request
Path parameters
ID of the Vehicle.
Attributes
Charging action to perform
One of START or STOP
Sample
{
"action": "START"
}
Response
200Attributes
The ID of the action.
ISO8601 UTC timestamp
ISO8601 UTC timestamp
ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the target.
Current state of the charge action.
PENDING
: The initial state. We are actively retrying commands and polling the chargeable device for changes inpowerDeliveryState
.CONFIRMED
: The chargeable has transitioned into the expectedpowerDeliveryState
state.FAILED
: The chargeable failed to respond to our attempts to start or stop charging within 30 minutes. We have given up sending actions to the device.CANCELLED
: A required precondition was not met during the 30 minutes period or a another conflicting action was sent to the same device, cancelling this one.
One of PENDING, CONFIRMED, FAILED, or CANCELLED
ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.
One of vehicle or charger
One of START or STOP
Information about why was this action not executed successfully.
Sample
{
"id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "PENDING",
"targetId": "string",
"targetType": "vehicle",
"kind": "START",
"failureReason": {
"type": "NO_RESPONSE",
"detail": "The chargeable device remained unreachable."
}
}
Other responses
Response 400
A precondition check failed, that is unlikely to change within 30 minutes. This occurs if the vehicle cannot perform the action, is fully charged, or is already in the desired state.
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Response 422
Vehicle controlled by a Schedule or has active Smart Charging Plan
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Get Smart Charging Plan
GET /vehicles/{vehicleId}/smart-charging-plans/{smartChargingPlanId}
Check status of current or historical Smart Charging Plan for a Vehicle. Returns a Smart Charging Plan for this vehicle.
To fetch the most recently created plan, call the endpoint with smartChargingPlanId
set to latest
.
Request
Path parameters
ID of the Vehicle.
ID of the Smart Charging Plan
Response
200Attributes
ID of the Plan
ID of the charging location at which the plan is being executed. Null for plans started before March 2022.
ID of the Vehicle to which the Plan belongs
ID of the User to which the Plan belongs
Vendor of the Vehicle to which the Plan belongs
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, or GMC
Currency in which monetary amounts are denominated (ISO 4217 3-character Alpha code)
Estimated cost of default charging behavior
Estimated cost achieved by this Smart Charge plan
Time at which the vehicle will stop charging
Time at which the vehicle will start charging.
Time at which charging is estimated to be complete
Time at which the vehicle's charging was confirmed as stopped.
Time at which the vehicle's charging was confirmed as started.
The actual time at which the plan ended
The final state of the plan when it ended
One of PLAN:ENDED:FINISHED, PLAN:ENDED:UNPLUGGED, PLAN:ENDED:FAILED, PLAN:ENDED:DISABLED, or PLAN:ENDED:DEADLINE_CHANGED
If the finalState was PLAN:ENDED:FAILED, failureCondition is populated with the condition in which the plan failed.
One of STOP_FAILED, START_FAILED, FINISHED_LATE, UNKNOWN, or CHARGE_INTERRUPTED
Deprecated, replaced by the smartOverride field on the Smart Charge Status object.
Sample
{
"id": "string",
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"vehicleId": "string",
"userId": "string",
"vendor": "AUDI",
"currency": "string",
"nonSmartCost": 0,
"smartCost": 0,
"stopAt": "2020-04-07T17:04:26Z",
"startAt": "2020-04-07T17:04:26Z",
"estimatedFinishAt": "2020-04-07T17:04:26Z",
"stopConfirmedAt": "2020-04-07T17:04:26Z",
"startConfirmedAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"finalState": "PLAN:ENDED:FINISHED",
"failureCondition": "STOP_FAILED",
"externalStart": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
}
Get Vehicle Smart Charging Policy
GET /vehicles/{vehicleId}/smart-charging-policy
Get a vehicle's Smart Charging policy
Request
Path parameters
ID of the Vehicle.
Response
200Attributes
When enabled, this vehicle's charging status may be controlled by Smart Charging
The hour-minute deadline for fully charging the vehicle. Smart charging does not work without setting a deadline. If a timezone is set on the charging location at which the smart charging occurs, the deadline is interpreted in that timezone, otherwise UTC is used.
Immediately charge without regard for energy prices until the vehicle reaches this minimum limit. Defaults to zero. Unit: percentage.
Sample
{
"isEnabled": false,
"deadline": "07:00",
"minimumChargeLimit": 0
}
Update Vehicle Smart Charging Policy
PUT /vehicles/{vehicleId}/smart-charging-policy
Updates the Smart Charging policy for a vehicle
Request
Path parameters
ID of the Vehicle.
Attributes
When enabled, this vehicle's charging status may be controlled by Smart Charging
The hour-minute deadline for fully charging the vehicle. Smart charging does not work without setting a deadline. If a timezone is set on the charging location at which the smart charging occurs, the deadline is interpreted in that timezone, otherwise UTC is used.
Immediately charge without regard for energy prices until the vehicle reaches this minimum limit. Defaults to zero. Unit: percentage.
Sample
{
"isEnabled": false,
"deadline": "07:00",
"minimumChargeLimit": 0
}
Response
200Attributes
When enabled, this vehicle's charging status may be controlled by Smart Charging
The hour-minute deadline for fully charging the vehicle. Smart charging does not work without setting a deadline. If a timezone is set on the charging location at which the smart charging occurs, the deadline is interpreted in that timezone, otherwise UTC is used.
Immediately charge without regard for energy prices until the vehicle reaches this minimum limit. Defaults to zero. Unit: percentage.
Sample
{
"isEnabled": false,
"deadline": "07:00",
"minimumChargeLimit": 0
}
Create Smart Override
POST /vehicles/{vehicleId}/smart-override
Overrides an active smart feature by forcing the vehicle to start charging. This feature is meant to be used in situations where the user wants to charge immediately without disabling other smart features. The override remains active until the vehicle stops charging, or until the Delete Smart OverrideAPI endpoint is called. When the override ends, the overriden smart feature will regain control of the vehicle. This endpoint should not be used for standard charge control, use the Control ChargingAPI endpoint instead.
Request
Path parameters
ID of the Vehicle.
Response
200Attributes
ISO8601 UTC timestamp at which the smart override was created.
ISO8601 UTC timestamp at which the smart override was ended. If null, the smart override is still active.
One of vehicle or charger
ID of the asset (Vehicle or Charger) to which this smart override applies.
The ID of Vendor Action responsible for starting charging on the target. Use the Vehicle Get ActionAPI or the Charger Get ActionAPI endpoints to monitor action results.
ID of the User
Sample
{
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"userId": "string",
"vendor": "AUDI"
}
End Smart Override
DELETE /vehicles/{vehicleId}/smart-override
Ends any active Smart Override for the vehicle specified by vehicleId
. If previously configured, Schedules or Smart Charging will resume control over the target vehicle. Note that this does not mean the vehicle will stop charging, only that it will return to the state expected by the active Schedule or Smart Charging Plan.
Request
Path parameters
ID of the Vehicle.
Response
200Attributes
ISO8601 UTC timestamp at which the smart override was created.
ISO8601 UTC timestamp at which the smart override was ended. If null, the smart override is still active.
One of vehicle or charger
ID of the asset (Vehicle or Charger) to which this smart override applies.
The ID of Vendor Action responsible for starting charging on the target. Use the Vehicle Get ActionAPI or the Charger Get ActionAPI endpoints to monitor action results.
ID of the User
Sample
{
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"userId": "string",
"vendor": "AUDI"
}
Other responses
Response 404
No Smart Override Exists
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Get Vehicle Smart Charging Status
GET /vehicles/{vehicleId}/smart-charging-status
Every vehicle in Enode has a SmartChargingStatus object that describes the vehicle in terms of smart charging.
Request
Path parameters
ID of the Vehicle.
Response
200Attributes
Time at which the SmartChargingStatus object was recalculated, whether or not any values actually changed
Vehicle ID
User ID
Vendor of the Vehicle
An enum value that describes the current SmartCharging state of the vehicle. Every vehicle is in exactly one state, at all times
One of DISABLED, CONSIDERING, UNKNOWN, PLAN:EXECUTING:STOPPING, PLAN:EXECUTING:STOP_FAILED, PLAN:EXECUTING:STOPPED, PLAN:EXECUTING:STOPPED:AWAITING_PRICES, PLAN:EXECUTING:STARTING, PLAN:EXECUTING:START_FAILED, PLAN:EXECUTING:STARTED, PLAN:EXECUTING:CHARGE_INTERRUPTED, PLAN:EXECUTING:OVERRIDDEN, PLAN:ENDED:FINISHED, PLAN:ENDED:UNPLUGGED, PLAN:ENDED:FAILED, PLAN:ENDED:DISABLED, PLAN:ENDED:DEADLINE_CHANGED, or FULLY_CHARGED
Time at which the the 'state' property transitioned to its current value
null
by default, but during all of the PLAN:*
states, the value is populated with a description of the active plan
This field is only populated after calling the vehicleAPI or chargerAPI smart override APIs. While this parameter is populated, the parent charge controller will remain in an overridden state and will not attempt to send actions to the target. The smart override remains in place until the target stops charging for any reason, or until the smart override is ended via the Delete vehicleAPI or chargerAPI smart override APIs.
Sample
{
"updatedAt": "2020-04-07T17:04:26Z",
"vehicleId": "string",
"userId": "string",
"vendor": "string",
"state": "DISABLED",
"stateChangedAt": "2020-04-07T17:04:26Z",
"consideration": {
"isPluggedIn": true,
"isCharging": true,
"atChargingLocation": true,
"hasTimeEstimate": true
},
"plan": {
"id": "string",
"chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
"vehicleId": "string",
"userId": "string",
"vendor": "AUDI",
"currency": "string",
"nonSmartCost": 0,
"smartCost": 0,
"stopAt": "2020-04-07T17:04:26Z",
"startAt": "2020-04-07T17:04:26Z",
"estimatedFinishAt": "2020-04-07T17:04:26Z",
"stopConfirmedAt": "2020-04-07T17:04:26Z",
"startConfirmedAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"finalState": "PLAN:ENDED:FINISHED",
"failureCondition": "STOP_FAILED",
"externalStart": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
},
"smartOverride": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}
}
Webhooks
Webhooks are a mechanism that allows your server to receive notifications of events from the Enode system.
Currently, there is only one webhook available - a preconfigured webhook called Firehose
that reports all supported events occurring within the system. You can configure it using the Update Firehose WebhookAPI endpoint.
See the related guide for more information about timeouts, failures, and retry logic: Using Webhooks
Update Firehose Webhook
PUT /webhooks/firehose
Request
Attributes
A cryptographically secure secret, generated and provided by your client.
The HTTPS url to which Enode should POST the event payload when a watched property changes.
Sample
{
"secret": "0Kvs1tAUQ69FOMBiWlt5XJSrruXMhWDiVbyrWaNm",
"url": "https://brainpower.co/enode-webhooks/firehose"
}
Response
204No Content
Other responses
Response 404
Webhook not found
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Delete Firehose Webhook
DELETE /webhooks/firehose
Request
Attributes
The HTTPS url of the webhook to be deleted
Sample
{
"url": "https://brainpower.co/enode-webhooks/firehose"
}
Response
204No Content
Other responses
Response 404
Webhook not found
Attributes
Sample
{
"type": "https://docs.enode.io/problems/validation-error",
"title": "Invalid Request",
"detail": "\"action\" must be one of [START, STOP]"
}
Test Firehose Webhook
POST /webhooks/firehose/test
Trigger a "enode:firehose:test" payload to be sent to your configured Firehose Webhook URL. This will reset your webhook to a healthy state on success.
Response
200Attributes
Indicates if the test webhook event was delivered successfully to your configured webhook endpoint.
One of SUCCESS or FAILURE
Human readable description of the test outcome.
Null if status is FAILED
.
Sample
{
"status": "SUCCESS",
"description": "string",
"response": {
"code": 200,
"body": "{}",
"headers": [
"content-type: application/json; } charset=utf-8"
]
}
}