Environments
We offer multiple environments, each with their own software versions, data access policies, and live/mocked vendors.
Each environment is completely isolated from the others. When you are issued client credentials, they are tied to a specific environment and cannot be re-used across environments.
Copy linkProduction
Running the latest stable software, with live vendors (vehicles/chargers), 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
Running the latest stable software, with 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 environment.
The API credentials used to get an access token, which in turn is used to access client-wide endpoints and user-specific endpoints.
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 credentials and the corresponding OAuth URLs 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 refreshed.
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 token.
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 health, tariffs, user management and webhooks).
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 locations, me, schedules and statistics) and device-specific endpoints (chargers, HVACs, solar inverters and vehicles).
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
When the User has completed the process of allowing/denying access in Enode Link, they will be redirected to your configured redirect URI. If something has gone wrong, query parameters error
and error_description
will be set as documented in Section 4.1.2.1 of the OAuth 2.0 spec:
Error | Error description |
---|---|
invalid_request | The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. |
unauthorized_client | The client is not authorized to request an authorization code using this method. |
access_denied | The resource owner or authorization server denied the request. |
unsupported_response_type | The authorization server does not support obtaining an authorization code using 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 currently unable to handle the request due to a temporary overloading or maintenance of the server |
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, the following HTTP Status Codes in the 4XX range may be encountered:
HTTP Status Code | Explanation |
---|---|
400 Bad Request | The request payload has failed schema validation / parsing |
401 Unauthorized | Authentication details are missing or invalid |
403 Forbidden | Authentication succeeded, but the authenticated user doesn't have access to the resource |
404 Not Found | A non-existent resource is requested |
405 Method Not Allowed | Vendor being unavailable has prevented us from completing the request |
408 Request Timeout | Timeout by the vendor has prevented us from completing the request |
409 Conflict | Vendor rejection has prevented us from completing the request |
424 Failed Dependency | One or more vendor requests failing have prevented us from completing the request |
429 Too Many Requests | Rate limiting by the vendor has prevented us from completing the request |
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 API. |
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
Copy linkBreaking Changes
Once issued a client, that client is pinned to the latest major version and will only be exposed to major version changes if you request us to migrate it. In such a situation we are able to offer coordinated migration/maintenance windows and can execute the transition together.
For minor breaking changes, we use per-client feature flags, and your technical contact at Enode will keep you notified of new functionalities that are available to be opted into.
Copy linkSchema additions are to be considered non-breaking
Your implementation should be tolerant of the addition of new fields to JSON schemas and the addition of new webhook event names, as such changes are not guarded by feature flags or major version changes.
If this is a problem for your chosen implementation tools, contact us to discuss possible solutions.
Copy linkConsuming the OpenApi Spec
Every release of the API is accompanied by an OpenAPI Specifiction 3.0 document. This document is available at https://enode-api.production.enode.io/openapi/v1.json
Chargers
EV Chargers provide charging data and can be controlled through the Control Charger endpoint and through Schedules
List Chargers
GET /chargers
List all available Chargers for the User.
Response
200Attributes
Charger IDs
Sample
[
"string"
]
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
Charger Vendor
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 fetchable 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": "string",
"vendor": "EASEE",
"lastSeen": "2019-08-24T14:15:22Z",
"isReachable": true,
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"chargeState": {
"isPluggedIn": true,
"isCharging": false,
"chargeRate": 40.1,
"lastUpdated": "2020-01-07T16:21:76Z",
"maxCurrent": 20
},
"information": {
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"brand": "Easee",
"model": "Home",
"year": 2020
},
"capabilities": {
"information": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"chargeState": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"startCharging": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"stopCharging": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"setMaxCurrent": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
}
}
}
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 chargeStateIsCharging
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 transitions to the CANCELLED
state. You may react to transitions by listening for the user:vendor-action:updated
webhook event or polling the charger action endpoint.
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 API to temporarily enable charging.
Request
Path parameters
ID of the Charger
Attributes
Kind of action
One of START or STOP
Sample
{
"action": "START"
}
Response
200Attributes
The ID of the action.
ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.
One of vehicle or charger
Kind of action
One of START or STOP
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 chargeable.
Current state of the charge action.
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "string",
"targetType": "vehicle",
"kind": "START",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string",
"entityId": "string",
"entityType": "string",
"chargeableId": "string",
"chargeableType": "string"
}
Other responses
Response 422
Charger controlled by a Schedule
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "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.
ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.
One of vehicle, charger, hvac, or inverter
Kind of action
One of START or STOP
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 chargeable.
Current state of the charge action.
One of vehicle, charger, hvac, or inverter
One of vehicle, charger, hvac, or inverter
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "string",
"targetType": "vehicle",
"kind": "START",
"target": {
"temperature": 22,
"deadband": 4
},
"targetState": {
"maxCurrent": 20
},
"createdAt": "string",
"updatedAt": "string",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string",
"entityId": "string",
"entityType": "vehicle",
"chargeableId": "string",
"chargeableType": "vehicle"
}
Other responses
Response 404
Action not found.
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 Override 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 Charging endpoint instead.
Request
Path parameters
ID of the Charger
Response
200Attributes
ID of the User
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 Action or the Charger Get Action endpoints to monitor action results.
Sample
{
"userId": "string",
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"vendor": "TESLA",
"targetId": "string",
"vendorActionId": "string"
}
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
ID of the User
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 Action or the Charger Get Action endpoints to monitor action results.
Sample
{
"userId": "string",
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"vendor": "TESLA",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
Other responses
Response 404
No Smart Override Exists
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "string"
}
Create External Start
DeprecatedPOST /chargers/{chargerId}/external-start
Deprecated. Replaced by Create Smart Override. The new name better reflects the functionality this endpoint offers.
Request
Path parameters
ID of the Charger
Response
200Attributes
ID of the User
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 Action or the Charger Get Action endpoints to monitor action results.
Sample
{
"userId": "string",
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"vendor": "TESLA",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
End External Start
DeprecatedDELETE /chargers/{chargerId}/external-start
Deprecated. Replaced by Delete Smart Override. The new name better reflects the functionality this endpoint offers.
Request
Path parameters
ID of the Charger
Response
200Attributes
ID of the User
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 Action or the Charger Get Action endpoints to monitor action results.
Sample
{
"userId": "string",
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"vendor": "TESLA",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
Other responses
Response 404
No External Start Exists
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "string"
}
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 Action.
Request
Path parameters
ID of the Charger
Attributes
Desired max current in ampere
Sample
{
"maxCurrent": 20
}
Response
200Attributes
The ID of the action.
ID of the entity asset (Charger) which this action is controlling.
Target maximum current for charger
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 temperature commands to the charger.
Current state of the charge action.
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "string",
"targetState": {
"maxCurrent": 20
},
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string"
}
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
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
[
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"name": "Home",
"longitude": 10.757933,
"latitude": 59.911491,
"timezoneName": "Europe/Copenhagen"
}
]
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": "Home",
"longitude": 10.757933,
"latitude": 59.911491,
"timezoneName": "Europe/Copenhagen"
}
Response
200Attributes
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
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"name": "Home",
"longitude": 10.757933,
"latitude": 59.911491,
"timezoneName": "Europe/Copenhagen"
}
Get Charging Location
GET /charging-locations/{chargingLocationId}
Request
Path parameters
ID of the Charging Location.
Response
200Attributes
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
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"name": "Home",
"longitude": 10.757933,
"latitude": 59.911491,
"timezoneName": "Europe/Copenhagen"
}
Delete Charging Location
DELETE /charging-locations/{chargingLocationId}
Delete a Charging Location.
Request
Path parameters
ID of the Charging Location.
Response
200Attributes
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
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"name": "Home",
"longitude": 10.757933,
"latitude": 59.911491,
"timezoneName": "Europe/Copenhagen"
}
Update Charging Location
PUT /charging-locations/{chargingLocationId}
Updates a charging location with new configuration.
Request
Path parameters
ID of the Charging Location
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": "Home",
"longitude": 10.757933,
"latitude": 59.911491,
"timezoneName": "Europe/Copenhagen"
}
Response
200Attributes
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
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"name": "Home",
"longitude": 10.757933,
"latitude": 59.911491,
"timezoneName": "Europe/Copenhagen"
}
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 Charging Location
Attributes
Energy Provider Tariff ID
List of time intervals at which to apply the specified tariff rates
Sample
{
"tariffId": "offpeaksaver",
"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.
Response 404
Charging Location not found.
Get Charging Location Tariff
GET /charging-locations/{chargingLocationId}/tariff
Get Tariff intervals for a given charging location.
Request
Path parameters
ID of the Charging Location
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
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
Response 404
Charging Location not found
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 Hold endpoint, Return to Schedule, or via Schedules.
List HVAC units
GET /hvacs
Response
200Attributes
HVAC IDs
Sample
[
"string"
]
Set HVAC Temperature
DeprecatedPOST /hvacs/{hvacId}/temperature
This endpoint has been replaced with the Set Permanent Hold and [Follow Schedule] endpoints. A future release will remove this endpoint.
Register a request for a change of the targetTemperature
field on an HVAC unit. We retry sending the command until the HVAC unit's targetTemperature
field transitions to the expected value. Note that this request will complete before any commands are sent to the HVAC unit. 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 the HVAC action endpoint.
This endpoint returns an error with status code 422 if the HVAC unit is controlled by a schedule. To restore user control you must first disable the schedule.
Request
Path parameters
ID of the HVAC
Attributes
Desired temperature
Size of the optional deadband centered around temperature
.
For example, with a temperature
of 22.0 and a deadband
of 4.0, an HVAC unit will receive a heating setpoint of 20.0 and a cooling setpoint of 24.0
Sample
{
"temperature": 22,
"deadband": 4
}
Response
200Attributes
The ID of the action.
ID of the entity asset (HVAC) which this action is controlling.
One of hvac
Replaced with coolSetpoint
and heatSetpoint
. A future release will remove this field. Target temperature for a HVAC device.
Target mode for an HVAC device. See the Schedules Guide for examples of valid target states.
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 temperature commands to the HVAC device.
Current state of the HVAC action
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "string",
"targetType": "hvac",
"targetTemperature": {
"temperature": 22,
"deadband": 4
},
"target": {
"holdType": "PERMANENT",
"mode": "AUTO",
"heatSetpoint": 19,
"coolSetpoint": 24
},
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string"
}
Other responses
Response 422
HVAC unit controlled by a Schedule
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "string"
}
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 endpoint.
Request
Path parameters
ID of the HVAC
Attributes
Desired mode. HVAC units may specify a list of capableModes
under capabilities. No setpoints are accepted in the OFF
state.
One of OFF
Sample
{
"mode": "OFF"
}
Response
200Attributes
The ID of the action.
ID of the entity asset (HVAC) which this action is controlling.
One of hvac
Replaced with coolSetpoint
and heatSetpoint
. A future release will remove this field. Target temperature for a HVAC device.
Target mode for an HVAC device. See the Schedules Guide for examples of valid target states.
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 temperature commands to the HVAC device.
Current state of the HVAC action
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "hvac",
"targetTemperature": {
"temperature": 22,
"deadband": 4
},
"target": {
"holdType": "PERMANENT",
"mode": "AUTO",
"heatSetpoint": 19,
"coolSetpoint": 24
},
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string"
}
Other responses
Response 422
HVAC controlled by an Enode Schedule
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "string"
}
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 endpoint.
Request
Path parameters
ID of the HVAC
Response
200Attributes
The ID of the action.
ID of the entity asset (HVAC) which this action is controlling.
One of hvac
Replaced with coolSetpoint
and heatSetpoint
. A future release will remove this field. Target temperature for a HVAC device.
Target mode for an HVAC device. See the Schedules Guide for examples of valid target states.
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 temperature commands to the HVAC device.
Current state of the HVAC action
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "hvac",
"targetTemperature": {
"temperature": 22,
"deadband": 4
},
"target": {
"holdType": "PERMANENT",
"mode": "AUTO",
"heatSetpoint": 19,
"coolSetpoint": 24
},
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string"
}
Other responses
Response 422
HVAC controlled by an Enode Schedule
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "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.
ID of the entity asset (HVAC) which this action is controlling.
One of hvac
Replaced with coolSetpoint
and heatSetpoint
. A future release will remove this field. Target temperature for a HVAC device.
Target mode for an HVAC device. See the Schedules Guide for examples of valid target states.
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 temperature commands to the HVAC device.
Current state of the HVAC action
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "hvac",
"targetTemperature": {
"temperature": 22,
"deadband": 4
},
"target": {
"holdType": "PERMANENT",
"mode": "AUTO",
"heatSetpoint": 19,
"coolSetpoint": 24
},
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string"
}
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
HVAC Vendor
One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, MITSUBISHI, MICROMATIC, or NEST
The last time the HVAC unit was successfully communicated with
Whether live data from the HVAC unit is currently fetchable 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.
Replaced with coolSetpoint
and heatSetpoint
. A future release will remove this field. Target temperature for a HVAC device.
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:26Z",
"isReachable": true,
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isActive": true,
"currentTemperature": 20.8,
"targetTemperature": {
"temperature": 22,
"deadband": 4
},
"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": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
}
Response
200Attributes
HVAC device ID
HVAC Vendor
One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, MITSUBISHI, MICROMATIC, or NEST
The last time the HVAC unit was successfully communicated with
Whether live data from the HVAC unit is currently fetchable 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.
Replaced with coolSetpoint
and heatSetpoint
. A future release will remove this field. Target temperature for a HVAC device.
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:26Z",
"isReachable": true,
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isActive": true,
"currentTemperature": 20.8,
"targetTemperature": {
"temperature": 22,
"deadband": 4
},
"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
}
}
}
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
Sample
{
"id": "123456789-ABc",
"linkedVendors": [
{
"vendor": "TESLA",
"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
A Schedule is a policy that targets a specific chargeable (vehicle or charger) at a specific Charging Location. It describes whether the target should be charging at any given point in time. This value is called shouldCharge
.
More information and examples are available in the Using Schedules guide.
List Schedules
GET /schedules
Returns a list of Schedules registered to the User.
Response
200Attributes
One of CHARGE
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
ID of the Charging Location to which this schedule applies. The behaviour of a null value differes 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.
Sample
[
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "vehicle",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isEnabled": true,
"defaultShouldCharge": false,
"rules": [
{
"hourMinute": {
"from": "22:00",
"to": "04:00"
},
"fromTimestamp": "2020-01-07T16:21:76Z",
"toTimestamp": "2020-01-07T16:21:76Z",
"weekdays": [
0,
1,
2,
3,
4
],
"shouldCharge": true
}
]
}
]
Create Schedule
POST /schedules
Request
Attributes
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
ID of the Charging Location to which this schedule applies. The behaviour of a null value differes 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.
Sample
{
"targetId": "8d90101b3f2f",
"targetType": "vehicle",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isEnabled": true,
"defaultShouldCharge": false,
"rules": [
{
"hourMinute": {
"from": "22:00",
"to": "04:00"
},
"fromTimestamp": "2020-01-07T16:21:76Z",
"toTimestamp": "2020-01-07T16:21:76Z",
"weekdays": [
0,
1,
2,
3,
4
],
"shouldCharge": true
}
]
}
Response
201Attributes
One of CHARGE
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
ID of the Charging Location to which this schedule applies. The behaviour of a null value differes 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.
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "vehicle",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isEnabled": true,
"defaultShouldCharge": false,
"rules": [
{
"hourMinute": {
"from": "22:00",
"to": "04:00"
},
"fromTimestamp": "2020-01-07T16:21:76Z",
"toTimestamp": "2020-01-07T16:21:76Z",
"weekdays": [
0,
1,
2,
3,
4
],
"shouldCharge": true
}
]
}
Get Schedule
GET /schedules/{scheduleId}
Request
Path parameters
ID of the Schedule.
Response
200Attributes
One of CHARGE
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
ID of the Charging Location to which this schedule applies. The behaviour of a null value differes 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.
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "vehicle",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isEnabled": true,
"defaultShouldCharge": false,
"rules": [
{
"hourMinute": {
"from": "22:00",
"to": "04:00"
},
"fromTimestamp": "2020-01-07T16:21:76Z",
"toTimestamp": "2020-01-07T16:21:76Z",
"weekdays": [
0,
1,
2,
3,
4
],
"shouldCharge": true
}
]
}
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 asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
ID of the Charging Location to which this schedule applies. The behaviour of a null value differes 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.
Sample
{
"targetId": "8d90101b3f2f",
"targetType": "vehicle",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isEnabled": true,
"defaultShouldCharge": false,
"rules": [
{
"hourMinute": {
"from": "22:00",
"to": "04:00"
},
"fromTimestamp": "2020-01-07T16:21:76Z",
"toTimestamp": "2020-01-07T16:21:76Z",
"weekdays": [
0,
1,
2,
3,
4
],
"shouldCharge": true
}
]
}
Response
200Attributes
One of CHARGE
ID of the asset (Vehicle/Charger) to which this schedule applies
One of vehicle or charger
ID of the Charging Location to which this schedule applies. The behaviour of a null value differes 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.
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "vehicle",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"isEnabled": true,
"defaultShouldCharge": false,
"rules": [
{
"hourMinute": {
"from": "22:00",
"to": "04:00"
},
"fromTimestamp": "2020-01-07T16:21:76Z",
"toTimestamp": "2020-01-07T16:21:76Z",
"weekdays": [
0,
1,
2,
3,
4
],
"shouldCharge": true
}
]
}
Get Schedule Status
GET /schedules/{scheduleId}/status
Request
Path parameters
ID of the Schedule.
Response
200Attributes
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.
This field is only populated after calling the vehicle or charger 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 vehicle or charger smart override APIs.
Deprecated, replaced by the smartOverride field.
Sample
{
"scheduleId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"scheduleType": "CHARGE",
"changedAt": "2019-08-24T14:15:22Z",
"state": "ALIGNED",
"isCharging": false,
"isChargingExpected": false,
"isChargingExpectedParts": {
"needsCharge": true,
"isPluggedIn": true,
"shouldCharge": true
},
"upcomingTransitions": [
{
"at": "2020-04-07T17:04:26Z",
"shouldCharge": true,
"targetTemperature": 0
}
],
"smartOverride": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "string"
},
"externalStart": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "string"
}
}
Service Health
Endpoints that return information about the health of Enode and our integrations.
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.
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
Vehicle Vendor
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, or FIAT
A formatted and properly cased vendor brand name, suitable for reading by humans.
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",
"status": "READY"
},
{
"vendor": "BMW",
"displayName": "BMW",
"status": "READY"
},
{
"vendor": "AUDI",
"displayName": "Audi",
"status": "READY"
}
]
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
Charger Vendor
One of ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, or EVBOX
A formatted and properly cased vendor brand name, suitable for reading by humans.
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",
"status": "READY"
},
{
"vendor": "WALLBOX",
"displayName": "Wallbox",
"status": "READY"
},
{
"vendor": "ZAPTEC",
"displayName": "Zaptec",
"status": "READY"
},
{
"vendor": "EO",
"displayName": "EO",
"status": "READY"
}
]
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
HVAC Vendor
One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, MITSUBISHI, MICROMATIC, or NEST
A formatted and properly cased vendor brand name, suitable for reading by humans.
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",
"portalName": "Mill",
"status": "READY"
}
]
Check Available Inverter Vendors
GET /health/inverters
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
Inverter Vendor
One of FRONIUS, GROWATT, SOLAREDGE, SOLIS, ENPHASE, GOODWE, SMA, EMA, or HUAWEI
A formatted and properly cased vendor brand name, suitable for reading by humans.
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": "Solar Edge",
"status": "READY"
},
{
"vendor": "SMA",
"displayName": "SMA",
"status": "READY"
},
{
"vendor": "SOLIS",
"displayName": "Solis",
"status": "READY"
},
{
"vendor": "FRONIUS",
"displayName": "Fronius",
"status": "READY"
}
]
Solar inverters
Solar inverters can be queried for current production state
List Solar inverter
GET /inverters
Response
200Attributes
Solar inverter IDs
Sample
[
"string"
]
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
Inverter Vendor
One of FRONIUS, GROWATT, SOLAREDGE, SOLIS, ENPHASE, GOODWE, SMA, EMA, or HUAWEI
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 fetchable 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 with timestamp
Sample
{
"id": "string",
"vendor": "string",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"lastSeen": "2022-04-07T17:04:26Z",
"isReachable": true,
"productionState": {
"productionRate": 1.8,
"isProducing": true,
"lastUpdated": "2022-04-07T16:21:76Z"
},
"information": {
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"brand": "SMA",
"model": "Sunny Boy",
"siteName": "Sunny plant",
"installationDate": "2020-04-05"
},
"location": {
"longitude": 10.757933,
"latitude": 59.911491
}
}
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
Get statistics for this hardware type.
One of vehicle, charger, or hvac
Filter statistics to only include a specific entity. Hardware category of the entity must match the type
parameter.
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.
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 within the timeseries
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
},
"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 vehicle, charger, 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": "string",
"from": "2019-08-24T14:15:22Z",
"to": "2019-08-24T14:15:22Z",
"kw": {
"min": 0,
"max": 78,
"mean": 61
},
"kwhSum": 120,
"price": {
"min": 0,
"max": 78,
"mean": 61
},
"costSum": 3.14,
"smartSession": true,
"smartStats": {
"nonSmartPrice": {
"min": 0,
"max": 82,
"mean": 65
},
"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
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.
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.
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 within the timeseries
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
ID of the Tariff
Attributes
A list of rates with unique name and price.
Per-tariff unique interval name
Rate cost (decimal string)
Sample
[
{
"name": "PEAK",
"cost": "13.37"
},
{
"name": "OFF-PEAK",
"cost": "12.34"
}
]
Response
204Successfully updated.
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.
One of offline_access, all, vehicle:smart_charging_policy, vehicle:charge_state, vehicle:location, vehicle:odometer, vehicle:information, control:vehicle:charging, charger:charge_state, charger:information, control:charger:charging, charging_location, schedule, hvac:information, control:hvac:temperature, or hvac:temperature_state
A URI to redirect the user to after successfully linking an asset.
Sample
{
"vendor": "string",
"vendorType": "string",
"forceLanguage": "nb",
"scopes": [
"offline_access",
"all"
],
"redirectUri": "myapp://integrations/enode"
}
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": "string",
"title": "string",
"detail": "string"
}
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 Charging 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 Vehicle 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
Vehicle Vendor
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, or FIAT
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 Policy 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": "string",
"vendor": "TESLA",
"lastSeen": "2019-08-24T14:15:22Z",
"isReachable": true,
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"information": {
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"vin": "5YJYGDEF2LFR00942",
"brand": "Tesla",
"model": "Model S P85",
"year": 2020
},
"chargeState": {
"batteryLevel": 38,
"range": 127.5,
"isPluggedIn": true,
"isCharging": false,
"isFullyCharged": false,
"batteryCapacity": 73.21,
"chargeLimit": 80,
"chargeRate": 40.1,
"chargeTimeRemaining": 319,
"lastUpdated": "2020-01-07T16:21:76Z",
"isChargingReasons": [
"DEFAULT"
]
},
"smartChargingPolicy": {
"isEnabled": true,
"deadline": "08:00",
"minimumChargeLimit": 0
},
"location": {
"longitude": 10.757933,
"latitude": 59.911491,
"lastUpdated": "2020-04-07T17:04:26Z"
},
"odometer": {
"distance": 24650,
"lastUpdated": "2020-01-07T16:21:76Z"
},
"capabilities": {
"chargeState": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"location": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"information": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"odometer": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"startCharging": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"stopCharging": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"smartCharging": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
}
}
}
]
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
Vehicle Vendor
One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, VAUXHALL, or FIAT
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 Policy 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": "string",
"vendor": "TESLA",
"lastSeen": "2019-08-24T14:15:22Z",
"isReachable": true,
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"information": {
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"vin": "5YJYGDEF2LFR00942",
"brand": "Tesla",
"model": "Model S P85",
"year": 2020
},
"chargeState": {
"batteryLevel": 38,
"range": 127.5,
"isPluggedIn": true,
"isCharging": false,
"isFullyCharged": false,
"batteryCapacity": 73.21,
"chargeLimit": 80,
"chargeRate": 40.1,
"chargeTimeRemaining": 319,
"lastUpdated": "2020-01-07T16:21:76Z",
"isChargingReasons": [
"DEFAULT"
]
},
"smartChargingPolicy": {
"isEnabled": true,
"deadline": "08:00",
"minimumChargeLimit": 0
},
"location": {
"longitude": 10.757933,
"latitude": 59.911491,
"lastUpdated": "2020-04-07T17:04:26Z"
},
"odometer": {
"distance": 24650,
"lastUpdated": "2020-01-07T16:21:76Z"
},
"capabilities": {
"chargeState": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"location": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"information": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"odometer": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"startCharging": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"stopCharging": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
},
"smartCharging": {
"isCapable": true,
"interventionIds": [
"0defa374-8a1a-4eb1-a85f-b7cb09501097"
]
}
}
}
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 chargeStateIsCharging
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 transitions to the CANCELLED
state. You may react to transitions by listening for the user:vendor-action:updated
webhook event or polling the vehicle action endpoint.
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 API to temporarily enable charging.
Request
Path parameters
ID of the Vehicle.
Attributes
Kind of action
One of START or STOP
Sample
{
"action": "START"
}
Response
200Attributes
The ID of the action.
ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.
One of vehicle or charger
Kind of action
One of START or STOP
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 chargeable.
Current state of the charge action.
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "vehicle",
"kind": "START",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string",
"entityId": "string",
"entityType": "string",
"chargeableId": "string",
"chargeableType": "string"
}
Other responses
Response 422
Vehicle controlled by a Schedule or has active Smart Charging Plan
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "string"
}
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.
ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.
One of vehicle or charger
Kind of action
One of START or STOP
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 chargeable.
Current state of the charge action.
Sample
{
"id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"targetId": "8d90101b3f2f",
"targetType": "vehicle",
"kind": "START",
"createdAt": "2020-04-07T17:04:26Z",
"updatedAt": "2020-04-07T17:04:26Z",
"completedAt": "2020-04-07T17:04:26Z",
"state": "string",
"entityId": "string",
"entityType": "string",
"chargeableId": "string",
"chargeableType": "string"
}
Other responses
Response 404
Action not found.
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 ocurrs, 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. The hasChargeAboveThreshold
Smart Charge consideration uses this value. Defaults to zero.
Sample
{
"isEnabled": true,
"deadline": "08: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 ocurrs, 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. The hasChargeAboveThreshold
Smart Charge consideration uses this value. Defaults to zero.
Sample
{
"isEnabled": true,
"deadline": "08: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 ocurrs, 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. The hasChargeAboveThreshold
Smart Charge consideration uses this value. Defaults to zero.
Sample
{
"isEnabled": true,
"deadline": "08:00",
"minimumChargeLimit": 0
}
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, or PLAN:ENDED:DEADLINE_CHANGED
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 vehicle or charger 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 vehicle or charger smart override APIs.
Sample
{
"updatedAt": "2019-08-24T14:15:22Z",
"vehicleId": "string",
"userId": "string",
"vendor": "string",
"state": "DISABLED",
"stateChangedAt": "2019-08-24T14:15:22Z",
"consideration": {
"isSmartChargeCapable": true,
"isPluggedIn": true,
"isCharging": true,
"recentlyAtChargingLocation": true,
"hasTimeEstimate": true,
"needsSignificantCharge": true,
"hasChargeAboveThreshold": true,
"singleUser": true,
"wontStopExistingChargingSession": true,
"likelyToGenerateSavings": true
},
"plan": {
"id": "string",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"vehicleId": "string",
"userId": "string",
"vendor": "string",
"currency": "NOK",
"nonSmartCost": 0,
"smartCost": 0,
"stopAt": "2019-08-24T14:15:22Z",
"startAt": "2019-08-24T14:15:22Z",
"estimatedFinishAt": "2019-08-24T14:15:22Z",
"stopConfirmedAt": "2019-08-24T14:15:22Z",
"startConfirmedAt": "2019-08-24T14:15:22Z",
"endedAt": "2019-08-24T14:15:22Z",
"finalState": "PLAN:ENDED:FINISHED",
"failureCondition": "STOP_FAILED",
"externalStart": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
},
"smartOverride": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "string",
"vendorActionId": "string"
}
}
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
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, or UNKNOWN
Deprecated, replaced by the smartOverride field.
Sample
{
"id": "string",
"chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
"vehicleId": "string",
"userId": "string",
"vendor": "string",
"currency": "NOK",
"nonSmartCost": 0,
"smartCost": 0,
"stopAt": "2019-08-24T14:15:22Z",
"startAt": "2019-08-24T14:15:22Z",
"estimatedFinishAt": "2019-08-24T14:15:22Z",
"stopConfirmedAt": "2019-08-24T14:15:22Z",
"startConfirmedAt": "2019-08-24T14:15:22Z",
"endedAt": "2019-08-24T14:15:22Z",
"finalState": "PLAN:ENDED:FINISHED",
"failureCondition": "STOP_FAILED",
"externalStart": {
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
}
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 Override 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 Charging endpoint instead.
Request
Path parameters
ID of the Vehicle.
Response
200Attributes
ID of the User
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 Action or the Charger Get Action endpoints to monitor action results.
Sample
{
"userId": "string",
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"vendor": "TESLA",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
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
ID of the User
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 Action or the Charger Get Action endpoints to monitor action results.
Sample
{
"userId": "string",
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"vendor": "TESLA",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
Other responses
Response 404
No Active Smart Override Exists
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "string"
}
Create External Start
DeprecatedPOST /vehicles/{vehicleId}/external-start
Deprecated. Replaced by Create Smart Override. The new name better reflects the functionality this endpoint offers.
Request
Path parameters
ID of the Vehicle.
Response
200Attributes
ID of the User
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 Action or the Charger Get Action endpoints to monitor action results.
Sample
{
"userId": "string",
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"vendor": "TESLA",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
End External Start
DeprecatedDELETE /vehicles/{vehicleId}/external-start
Deprecated. Replaced by Delete Smart Override. The new name better reflects the functionality this endpoint offers.
Request
Path parameters
ID of the Vehicle.
Response
200Attributes
ID of the User
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 Action or the Charger Get Action endpoints to monitor action results.
Sample
{
"userId": "string",
"createdAt": "2020-04-07T17:04:26Z",
"endedAt": "2020-04-07T17:04:26Z",
"targetType": "vehicle",
"vendor": "TESLA",
"targetId": "8d90101b3f2f",
"vendorActionId": "string"
}
Other responses
Response 404
No External Start Exists
Attributes
Sample
{
"type": "string",
"title": "string",
"detail": "string"
}
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 Webhook endpoint.
See the related guide for more information about timeouts, failures, and retry logic: Using Webhooks
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.
Human readable description of the test outcome.
Sample
{
"status": "SUCCESS",
"description": "Successful",
"response": {
"code": 200,
"body": "{}",
"headers": [
"content-type: application/json; charset=utf-8"
]
}
}
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
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