Enode Developers

Enode API

This reference provides a comprehensive overview of the Enode API endpoints for accessing and controlling its hardware and features.

The API follows REST principles and uses OAuth2 for authorization.

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.

NameURL
APIhttps://enode-api.production.enode.io
OAuth Authorizationhttps://oauth.production.enode.io/oauth2/auth
OAuth Tokenhttps://oauth.production.enode.io/oauth2/token
Link UIhttps://link.production.enode.io

Copy linkSandbox

Includes the latest stable software and mocked vendors/vehicles/chargers.

NameURL
APIhttps://enode-api.sandbox.enode.io
OAuth Authorizationhttps://oauth.sandbox.enode.io/oauth2/auth
OAuth Tokenhttps://oauth.sandbox.enode.io/oauth2/token
Link UIhttps://link.sandbox.enode.io
Was this section helpful?

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 IDThe identifier for your client, referred to as the client_id.
Client secretThe 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
HeaderAuthorization: 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
HeaderEnode-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}" \
Was this section helpful?

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.

FieldTypical added delay
smartChargingPolicynone
chargeState8 seconds
location8 seconds
information8 seconds
odometer8 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.

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 implementationTypical delay
native3-15 seconds
synthetic A3-30 seconds
synthetic B5-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 contextMaximum delay
default7 minutes
charging1 minute
smartcharge PLAN:*2 minutes
sleeping20 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.

Was this section helpful?

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_requestThe request has a missing or invalid parameter, duplicate parameters, or is malformed.
unauthorized_clientThe client isn't authorized to request an authorization code with this method.
access_deniedThe resource owner or authorization server denied the request.
unsupported_response_typeThe authorization server doesn't support obtaining an authorization code with this method.
invalid_scopeThe requested scope is invalid, unknown, or malformed.
server_errorThe authorization server encountered an unexpected condition that prevented it from fulfilling the request.
temporarily_unavailableThe 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 CodeExplanation
400 Bad RequestThe request payload failed schema validation or parsing
401 UnauthorizedMissing or invalid authentication details
403 ForbiddenAuthentication succeeded, but the user lacks access to the resource
404 Not FoundRequested resource doesn't exist
405 Method Not AllowedVendor unavailability prevented request completion
408 Request TimeoutVendor timeout prevented request completion
409 ConflictVendor rejection prevented request completion
424 Failed DependencyFailed vendor requests prevented request completion
429 Too Many RequestsVendor 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

TitleDescription
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 id field and not information.id. information.id is the ID the vendor uses to refer to the entity and changes over time.

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 lastSeen is null. In this situation, we normally return a 206 status with cached data. However, if lastSeen is null, we don't have any cached data to show.

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.

Was this section helpful?

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.

Was this section helpful?

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

200
Attributes
List of string array of string

Charger IDs

Sample
[
  "string"
]
Was this section helpful?

Get Charge Action

GET /chargers/actions/{vendorActionId}

Returns the current state of the requested action.

Request

Path parameters
vendorActionId string Required

ID of the Action.

Response

200
Attributes
id string<uuid>

The ID of the action.

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time> or null

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.

state string

Current state of the charge action.

  • PENDING: The initial state. We are actively retrying commands and polling the chargeable device for changes in powerDeliveryState.
  • CONFIRMED: The chargeable has transitioned into the expected powerDeliveryState 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

targetId string

ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.

targetType string

One of vehicle or charger

kind string

One of START or STOP

object or null

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.

Was this section helpful?

Get Charger

GET /chargers/{chargerId}

Request

Path parameters
chargerId string Required

ID of the Charger.

Query parameters
string or array

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

200
Attributes
id string

Charger ID

vendor string

One of ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, or EVBOX

lastSeen string<date-time> or null

The last time the charger was successfully communicated with

isReachable boolean

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.

chargingLocationId string<uuid> or null

ID of the charging location the charger is currently positioned at (if any).

object
object

Descriptive information about the Charger

object

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
    }
  }
}
Was this section helpful?

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
chargerId string Required

ID of the Charger.

Attributes
action string Required

Charging action to perform

One of START or STOP

Sample
{
  "action": "START"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time> or null

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.

state string

Current state of the charge action.

  • PENDING: The initial state. We are actively retrying commands and polling the chargeable device for changes in powerDeliveryState.
  • CONFIRMED: The chargeable has transitioned into the expected powerDeliveryState 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

targetId string

ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.

targetType string

One of vehicle or charger

kind string

One of START or STOP

object or null

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
type string
title string
detail string
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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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
chargerId string Required

ID of the Charger.

Attributes
maxCurrent number Required

Desired max current in ampere

Sample
{
  "maxCurrent": 20
}

Response

200
Attributes
id string<uuid>

The ID of the action.

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time> or null

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.

state string

Current state of the charge action.

  • PENDING: The initial state. We are actively retrying commands and polling the chargeable device for changes in powerDeliveryState.
  • CONFIRMED: The chargeable has transitioned into the expected powerDeliveryState 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

targetId string

ID of the charger which this action is controlling.

targetType string

One of charger

object

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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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
chargerId string Required

ID of the Charger.

Response

200
Attributes
createdAt string<date-time>

ISO8601 UTC timestamp at which the smart override was created.

endedAt string<date-time> or null

ISO8601 UTC timestamp at which the smart override was ended. If null, the smart override is still active.

targetType string

One of vehicle or charger

targetId string

ID of the asset (Vehicle or Charger) to which this smart override applies.

vendorActionId string<uuid>

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.

userId string

ID of the User

string
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"
}
Was this section helpful?

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
chargerId string Required

ID of the Charger.

Response

200
Attributes
createdAt string<date-time>

ISO8601 UTC timestamp at which the smart override was created.

endedAt string<date-time> or null

ISO8601 UTC timestamp at which the smart override was ended. If null, the smart override is still active.

targetType string

One of vehicle or charger

targetId string

ID of the asset (Vehicle or Charger) to which this smart override applies.

vendorActionId string<uuid>

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.

userId string

ID of the User

string
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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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

200
Attributes
List of object array of object
object object
id string<uuid>

The ID of the charging location.

name string

User-supplied name for the Charging Location

longitude number

Longitude in degrees

latitude number

Latitude in degrees

timezoneName string

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"
  }
]
Was this section helpful?

Create Charging Location

POST /charging-locations

Request

Attributes
name string Required

User-supplied name for the Charging Location

longitude number Required

Longitude in degrees

latitude number Required

Latitude in degrees

timezoneName string Required

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

200
Attributes
id string<uuid>

The ID of the charging location.

name string

User-supplied name for the Charging Location

longitude number

Longitude in degrees

latitude number

Latitude in degrees

timezoneName string

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"
}
Was this section helpful?

Get Charging Location

GET /charging-locations/{chargingLocationId}

Request

Path parameters
chargingLocationId string Required

ID of the ChargingLocation.

Response

200
Attributes
id string<uuid>

The ID of the charging location.

name string

User-supplied name for the Charging Location

longitude number

Longitude in degrees

latitude number

Latitude in degrees

timezoneName string

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"
}
Was this section helpful?

Delete Charging Location

DELETE /charging-locations/{chargingLocationId}

Delete a Charging Location.

Request

Path parameters
chargingLocationId string Required

ID of the ChargingLocation.

Response

200
Attributes
id string<uuid>

The ID of the charging location.

name string

User-supplied name for the Charging Location

longitude number

Longitude in degrees

latitude number

Latitude in degrees

timezoneName string

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"
}
Was this section helpful?

Update Charging Location

PUT /charging-locations/{chargingLocationId}

Updates a charging location with new configuration.

Request

Path parameters
chargingLocationId string Required

ID of the ChargingLocation.

Attributes
name string

User-supplied name for the Charging Location

longitude number

Longitude in degrees

latitude number

Latitude in degrees

timezoneName string

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

200
Attributes
id string<uuid>

The ID of the charging location.

name string

User-supplied name for the Charging Location

longitude number

Longitude in degrees

latitude number

Latitude in degrees

timezoneName string

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"
}
Was this section helpful?

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
chargingLocationId string Required

ID of the ChargingLocation.

Attributes
tariffId string Required

Energy Provider Tariff ID

array of Object Required

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

204

Successful

Other responses

Response 400

Invalid tariffId, invalid rate name, or incomplete interval series.

Attributes
type string
title string
detail string
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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

Get Charging Location Tariff

GET /charging-locations/{chargingLocationId}/tariff

Get Tariff intervals for a given charging location.

Request

Path parameters
chargingLocationId string Required

ID of the ChargingLocation.

Response

200
Attributes
List of object array of object
object object
weekday integer

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

fromHourMinute string

Interval from time (inclusive, UTC)

toHourMinute string

Interval to time (exclusive, UTC)

tariffId string

Energy Provider Tariff ID

tariffName string

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
type string
title string
detail string
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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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

200
Attributes
List of string array of string

HVAC IDs

Sample
[
  "string"
]
Was this section helpful?

Get Action

GET /hvacs/actions/{vendorActionId}

Returns the current state of the requested action.

Request

Path parameters
vendorActionId string Required

ID of the Action.

Response

200
Attributes
id string<uuid>

The ID of the action.

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time> or null

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.

state string

Current state of the charge action.

  • PENDING: The initial state. We are actively retrying commands and polling the chargeable device for changes in powerDeliveryState.
  • CONFIRMED: The chargeable has transitioned into the expected powerDeliveryState 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

targetId string

ID of the entity asset (HVAC) which this action is controlling.

targetType string

One of hvac

object
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.

Was this section helpful?

Get HVAC Unit

GET /hvacs/{hvacId}

Request

Path parameters
hvacId string Required

ID of the Hvac.

Response

200
Attributes
id string

HVAC device ID

vendor string

One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, NEST, or MICROMATIC

lastSeen string<date-time> or null

The last time the HVAC unit was successfully communicated with

isReachable boolean

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.

chargingLocationId string<uuid> or null

ID of the charging location the HVAC unit is housed at (if any)

isActive boolean

Whether the HVAC unit is actively heating or cooling.

currentTemperature number or null

Current air temperature reported by device in degrees Celsius.

consumptionRate number or null

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.

mode string or null

The HVAC's mode.

One of HEAT, COOL, AUTO, or OFF

heatSetpoint number or null

If mode allows, heat when currentTemperature falls below this point.

coolSetpoint number or null

If mode allows, cool when currentTemperature rises above this point.

holdType string or null

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

object

Descriptive information about the HVAC unit

object

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
    }
  }
}
Was this section helpful?

Set HVAC Location

PUT /hvacs/{hvacId}

Update the chargingLocationId field on an HVAC device.

Request

Path parameters
hvacId string Required

ID of the Hvac.

Attributes
chargingLocationId string<uuid> or null Required
Sample
{
  "chargingLocationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}

Response

200
Attributes
id string

HVAC device ID

vendor string

One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, NEST, or MICROMATIC

lastSeen string<date-time> or null

The last time the HVAC unit was successfully communicated with

isReachable boolean

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.

chargingLocationId string<uuid> or null

ID of the charging location the HVAC unit is housed at (if any)

isActive boolean

Whether the HVAC unit is actively heating or cooling.

currentTemperature number or null

Current air temperature reported by device in degrees Celsius.

consumptionRate number or null

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.

mode string or null

The HVAC's mode.

One of HEAT, COOL, AUTO, or OFF

heatSetpoint number or null

If mode allows, heat when currentTemperature falls below this point.

coolSetpoint number or null

If mode allows, cool when currentTemperature rises above this point.

holdType string or null

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

object

Descriptive information about the HVAC unit

object

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
    }
  }
}
Was this section helpful?

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
hvacId string Required

ID of the Hvac.

Response

200
Attributes
id string<uuid>

The ID of the action.

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time> or null

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.

state string

Current state of the charge action.

  • PENDING: The initial state. We are actively retrying commands and polling the chargeable device for changes in powerDeliveryState.
  • CONFIRMED: The chargeable has transitioned into the expected powerDeliveryState 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

targetId string

ID of the entity asset (HVAC) which this action is controlling.

targetType string

One of hvac

object
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
type string
title string
detail string
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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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
hvacId string Required

ID of the Hvac.

Attributes
Target mode for an HVAC device
coolSetpoint number Required
mode string Required

One of COOL

Sample
{
  "coolSetpoint": 0,
  "mode": "COOL"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time> or null

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.

state string

Current state of the charge action.

  • PENDING: The initial state. We are actively retrying commands and polling the chargeable device for changes in powerDeliveryState.
  • CONFIRMED: The chargeable has transitioned into the expected powerDeliveryState 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

targetId string

ID of the entity asset (HVAC) which this action is controlling.

targetType string

One of hvac

object
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
type string
title string
detail string
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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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

200
Attributes
id string

The user's userID.

array of Object
Sample
{
  "id": "123456789-ABc",
  "linkedVendors": [
    {
      "vendor": "CSISolar",
      "vendorType": "vehicle",
      "isValid": true
    }
  ]
}
Was this section helpful?

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 string Required

Vendor to be unlinked.

Response

204

No Content

Was this section helpful?

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
scheduleId string Required

ID of the Schedule.

Response

200
Attributes
id string
chargingLocationId string<uuid> or null

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.

isEnabled boolean

Whether this Schedule should be attempting to control the target's charge state.

defaultShouldCharge boolean

When no rule is active, the default charge state for the target.

array of Object

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.

chargeableId string Deprecated

Replaced by targetId.

chargeableType string Deprecated

Replaced by targetType.

One of vehicle or charger

entityId string Deprecated

Replaced by targetId.

entityType string Deprecated

Replaced by targetType.

targetId string

ID of the asset (Vehicle/Charger) to which this schedule applies

targetType string

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"
}
Was this section helpful?

Delete Schedule

DELETE /schedules/{scheduleId}

Delete a Schedule

Request

Path parameters
scheduleId string Required

ID of the Schedule.

Response

204

No Content

Was this section helpful?

Update Schedule

PUT /schedules/{scheduleId}

Does a partial update of a schedule.

Request

Path parameters
scheduleId string Required

ID of the Schedule.

Attributes
chargingLocationId string<uuid> or null

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.

isEnabled boolean

Whether this Schedule should be attempting to control the target's charge state.

defaultShouldCharge boolean

When no rule is active, the default charge state for the target.

array of Object

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.

entityId string Deprecated

Replaced by targetId.

entityType string Deprecated

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

200
Attributes
id string
chargingLocationId string<uuid> or null

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.

isEnabled boolean

Whether this Schedule should be attempting to control the target's charge state.

defaultShouldCharge boolean

When no rule is active, the default charge state for the target.

array of Object

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.

chargeableId string Deprecated

Replaced by targetId.

chargeableType string Deprecated

Replaced by targetType.

One of vehicle or charger

entityId string Deprecated

Replaced by targetId.

entityType string Deprecated

Replaced by targetType.

targetId string

ID of the asset (Vehicle/Charger) to which this schedule applies

targetType string

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"
}
Was this section helpful?

List Schedules

GET /schedules

Returns a list of Schedules registered to the User.

Response

200
Attributes
List of Object array of Object
id string
chargingLocationId string<uuid> or null

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.

isEnabled boolean

Whether this Schedule should be attempting to control the target's charge state.

defaultShouldCharge boolean

When no rule is active, the default charge state for the target.

array of Object

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.

chargeableId string Deprecated

Replaced by targetId.

chargeableType string Deprecated

Replaced by targetType.

One of vehicle or charger

entityId string Deprecated

Replaced by targetId.

entityType string Deprecated

Replaced by targetType.

targetId string

ID of the asset (Vehicle/Charger) to which this schedule applies

targetType string

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"
  }
]
Was this section helpful?

Create Schedule

POST /schedules

Request

Attributes
chargingLocationId string<uuid> or null Required

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.

isEnabled boolean Required

Whether this Schedule should be attempting to control the target's charge state.

defaultShouldCharge boolean Required

When no rule is active, the default charge state for the target.

array of Object Required

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.

entityId string Deprecated Required

Replaced by targetId.

entityType string Deprecated Required

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

200
Attributes
id string
chargingLocationId string<uuid> or null

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.

isEnabled boolean

Whether this Schedule should be attempting to control the target's charge state.

defaultShouldCharge boolean

When no rule is active, the default charge state for the target.

array of Object

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.

chargeableId string Deprecated

Replaced by targetId.

chargeableType string Deprecated

Replaced by targetType.

One of vehicle or charger

entityId string Deprecated

Replaced by targetId.

entityType string Deprecated

Replaced by targetType.

targetId string

ID of the asset (Vehicle/Charger) to which this schedule applies

targetType string

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"
}
Was this section helpful?

Get Schedule Status

GET /schedules/{scheduleId}/status

Request

Path parameters
scheduleId string Required

ID of the Schedule.

Response

200
Attributes
The state of a Charge Schedule at a particular point in time.
scheduleId string<uuid>

ID of the schedule.

scheduleType string

One of CHARGE

changedAt string<date-time>

Time at which any value of the status last changed

state string

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

isCharging boolean

Whether the target is currently actually charging

isChargingExpected boolean

Whether the target is currently expected to be charging

object

Collection of booleans that - when combined via AND operator - forms the isChargingExpected value

array of Object

List of upcoming transitions of the shouldCharge or targetTemperature value. A maximum of 2 items are returned.

object or null Deprecated

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"
  }
}
Was this section helpful?

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

200
Attributes
List of object array of object
object object
vendor string

Machine-friendly name of the Vendor

One of ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, or EVBOX

displayName string

A formatted and properly cased vendor brand name, suitable for reading by humans.

One of Zaptec, Easee, Wallbox, EO, EVBox, or Charge Amps

portalName string

The name of the first party service or app that the user normally logs into.

status string

Ready-state of the Vendor. Currently always READY.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

array of Object
defaultRegion string
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"
  }
]
Was this section helpful?

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

200
Attributes
List of object array of object
object object
vendor string

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

displayName string

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

portalName string

The name of the first party service or app that the user normally logs into.

status string

Ready-state of the Vendor. Currently always READY.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

array of Object
defaultRegion string
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"
  }
]
Was this section helpful?

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

200
Attributes
List of object array of object
object object
vendor string

Machine-friendly name of the Vendor

One of CSISolar, EMA, ENPHASE, FRONIUS, GOODWE, GROWATT, HUAWEI, INVT, SMA, SOFAR, SOLAREDGE, or SOLIS

displayName string

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

portalName string

The name of the first party service or app that the user normally logs into.

status string

Ready-state of the Vendor. Currently always READY.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

array of Object
defaultRegion string
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"
  }
]
Was this section helpful?

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

200
Attributes
List of object array of object
object object
vendor string

Machine-friendly name of the Vendor

One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, NEST, or MICROMATIC

displayName string

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

portalName string

The name of the first party service or app that the user normally logs into.

status string

Ready-state of the Vendor. Currently always READY.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

array of Object
defaultRegion string
Sample
[
  {
    "vendor": "MILL",
    "displayName": "Mill",
    "status": "READY",
    "defaultRegion": "region-global-except-north-america",
    "portalName": "Mill"
  }
]
Was this section helpful?

Check Service Readiness

GET /health/ready

Gets the combined health status of the service and all functionalities and dependencies.

Response

204

All functionalities are operating nominally.

Other responses

Response 503

At least one functionality of the system is not operating nominally.

Was this section helpful?

Solar inverters

Solar inverters can be queried for current production state

Get Solar Inverter

GET /inverters/{inverterId}

Request

Path parameters
inverterId string Required

ID of the solar inverter

Query parameters
string or array

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

200
Attributes
id string

Solar Inverter ID

vendor string

One of CSISolar, EMA, ENPHASE, FRONIUS, GOODWE, GROWATT, HUAWEI, INVT, SMA, SOFAR, SOLAREDGE, or SOLIS

chargingLocationId string<uuid> or null

ID of the charging location the solar inverter is currently positioned at (if any).

lastSeen string<date-time>

The last time the solar inverter was successfully communicated with

isReachable boolean

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.

object
object

Descriptive information about the solar inverter

object

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
  }
}
Was this section helpful?

List Solar inverter

GET /inverters

Response

200
Attributes
List of string array of string

Solar inverter IDs

Sample
[
  "string"
]
Was this section helpful?

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
resolution string

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

startDate string Required

Earliest date to include in the response in ISO format. Cannot be greater than endDate. Example: 2021-03-21T00:25:43.511Z

endDate string

Latest date to include in the response (defaults to current date/time) in ISO format. Example: 2021-03-21T00:25:43.511Z

utcOffset string<float>

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.

chargingLocationId string

Filter statistics to only include this charging location.

type string

Get statistics for this hardware type. If omitted, statistics for the vehicle hardware type will be returned.

One of charger, vehicle, or hvac

id string

Filter statistics to only include a specific entity. Hardware category of the entity must match the type parameter.

Response

200
Attributes
List of object array of object
object object
object

Aggregate statistics for charge rate in kW

kwhSum number

Total power consumption in kWh

object

Aggregate statistics for power price (<CURRENCY> per kWh)

object

Aggregate statistics for power price (<CURRENCY> per kWh), calculated as if the charging had ocurred uninterrupted without being delayed by Smart Charging

costSum number

Total cost in <CURRENCY>

nonSmartCostSum number or null

Total cost for this consumption in <CURRENCY>, if it had not been shifted by Smart Charging

estimatedSavings number or null

Total estimated savings in <CURRENCY>, achieved by Smart Charging

date string<date-time>

The start date of this sample

smartSession boolean Deprecated
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"
  }
]
Was this section helpful?

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
targetType string

Get statistics for this hardware type.

One of charger, vehicle, or hvac

startDate string Required

Earliest date to include in the response in ISO format. Example: 2021-03-21T00:25:43.511Z

endDate string

Latest date to include in the response (defaults to current date/time) in ISO format. Example: 2021-03-21T00:25:43.511Z

targetId string

Filter statistics to only include a specific entity.

chargingLocationId string<uuid>

Filter statistics to only include this charging location

Response

200
Attributes
List of object array of object
object object
id string

ID for this session.

targetId string

ID of the hardware type for this session.

chargingLocationId string<uuid> or null

Charging Location ID for this session.

from string<date-time>

Start time.

to string<date-time>

End time.

object

Aggregate statistics for charge rate in kW

kwhSum number

Total power consumption in kWh

object

Aggregate statistics for power price (<CURRENCY> per kWh)

costSum number

Total cost in <CURRENCY>

smartSession boolean

The values in smartStats will all be null if smartSession is false

object
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
    }
  }
]
Was this section helpful?

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
resolution string

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

startDate string Required

Earliest date to include in the response in ISO format. Cannot be greater than endDate. Example: 2021-03-21T00:25:43.511Z

endDate string

Latest date to include in the response (defaults to current date/time) in ISO format. Example: 2021-03-21T00:25:43.511Z

utcOffset string<float>

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.

chargingLocationId string

Filter statistics to only include this charging location.

type string

Get statistics for this hardware type.

One of inverter

id string

Filter statistics to only include a specific entity. Hardware category of the entity must match the type parameter.

Response

200
Attributes
List of object array of object
object object
object

Aggregate statistics for charge rate in kW

kwhSum number

Total power consumption in kWh

object

Aggregate statistics for power price (<CURRENCY> per kWh)

earningsSum number

Total earnings in <CURRENCY>

date string<date-time>

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"
  }
]
Was this section helpful?

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
tariffId no type Required
Attributes
List of object array of object
object object
name string Required

Per-tariff unique interval name

cost string Required

Rate cost (decimal string)

Sample
[
  {
    "name": "PEAK",
    "cost": "13.37"
  },
  {
    "name": "OFF-PEAK",
    "cost": "12.34"
  }
]

Response

204
Attributes
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

User Management

Endpoints used to link and unlink users or vendors.

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
userId string Required

ID of the User.

Response

204

No Content

Was this section helpful?

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
userId string Required

ID of the User.

Response

204

No Content

Was this section helpful?

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
string or array

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

200
Attributes
List of object array of object
object object
id string

Vehicle ID

vendor string

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

lastSeen string<date-time> or null

ISO8601 UTC timestamp at which live data was last available from Enode's perspective.

isReachable boolean or null

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.

chargingLocationId string<uuid> or null

ID of the charging location the vehicle is currently positioned at (if any).

object

Descriptive information about the Vehicle.

object

Information about the electric or hybrid battery.

object

Smart Charging configuration properties. Configured via the Update Smart Charging PolicyAPI endpoint.

object

Vehicle's GPS coordinates with timestamp

object

Vehicle's odometer with timestamp

object

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
id string

Vehicle ID

vendor string

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

lastSeen string<date-time> or null

ISO8601 UTC timestamp at which live data was last available from Enode's perspective.

isReachable boolean or null

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.

chargingLocationId string<uuid> or null

ID of the charging location the vehicle is currently positioned at (if any).

object

Descriptive information about the Vehicle.

object

Information about the electric or hybrid battery.

object

Smart Charging configuration properties. Configured via the Update Smart Charging PolicyAPI endpoint.

object

Vehicle's GPS coordinates with timestamp

object

Vehicle's odometer with timestamp

object

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
    }
  }
}
Was this section helpful?

Get Charge Action

GET /vehicles/actions/{vendorActionId}

Returns the current state of the requested action.

Request

Path parameters
vendorActionId string Required

ID of the Action.

Response

200
Attributes
id string<uuid>

The ID of the action.

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time> or null

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.

state string

Current state of the charge action.

  • PENDING: The initial state. We are actively retrying commands and polling the chargeable device for changes in powerDeliveryState.
  • CONFIRMED: The chargeable has transitioned into the expected powerDeliveryState 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

targetId string

ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.

targetType string

One of vehicle or charger

kind string

One of START or STOP

object or null

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.

Was this section helpful?

Get Vehicle

GET /vehicles/{vehicleId}

Request

Path parameters
vehicleId string Required

ID of the Vehicle.

Query parameters
string or array

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

200
Attributes
id string

Vehicle ID

vendor string

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

lastSeen string<date-time> or null

ISO8601 UTC timestamp at which live data was last available from Enode's perspective.

isReachable boolean or null

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.

chargingLocationId string<uuid> or null

ID of the charging location the vehicle is currently positioned at (if any).

object

Descriptive information about the Vehicle.

object

Information about the electric or hybrid battery.

object

Smart Charging configuration properties. Configured via the Update Smart Charging PolicyAPI endpoint.

object

Vehicle's GPS coordinates with timestamp

object

Vehicle's odometer with timestamp

object

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
id string

Vehicle ID

vendor string

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

lastSeen string<date-time> or null

ISO8601 UTC timestamp at which live data was last available from Enode's perspective.

isReachable boolean or null

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.

chargingLocationId string<uuid> or null

ID of the charging location the vehicle is currently positioned at (if any).

object

Descriptive information about the Vehicle.

object

Information about the electric or hybrid battery.

object

Smart Charging configuration properties. Configured via the Update Smart Charging PolicyAPI endpoint.

object

Vehicle's GPS coordinates with timestamp

object

Vehicle's odometer with timestamp

object

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
    }
  }
}
Was this section helpful?

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
vehicleId string Required

ID of the Vehicle.

Attributes
action string Required

Charging action to perform

One of START or STOP

Sample
{
  "action": "START"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time> or null

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.

state string

Current state of the charge action.

  • PENDING: The initial state. We are actively retrying commands and polling the chargeable device for changes in powerDeliveryState.
  • CONFIRMED: The chargeable has transitioned into the expected powerDeliveryState 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

targetId string

ID of the chargeable entity asset (Vehicle or Charger) which this action is controlling.

targetType string

One of vehicle or charger

kind string

One of START or STOP

object or null

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
type string
title string
detail string
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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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
vehicleId string Required

ID of the Vehicle.

smartChargingPlanId string Required

ID of the Smart Charging Plan

Response

200
Attributes
id string

ID of the Plan

chargingLocationId string<uuid> or null

ID of the charging location at which the plan is being executed. Null for plans started before March 2022.

vehicleId string

ID of the Vehicle to which the Plan belongs

userId string

ID of the User to which the Plan belongs

vendor string

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 string

Currency in which monetary amounts are denominated (ISO 4217 3-character Alpha code)

nonSmartCost number

Estimated cost of default charging behavior

smartCost number or null

Estimated cost achieved by this Smart Charge plan

stopAt string<date-time>

Time at which the vehicle will stop charging

startAt string<date-time> or null

Time at which the vehicle will start charging.

estimatedFinishAt string<date-time>

Time at which charging is estimated to be complete

stopConfirmedAt string<date-time> or null

Time at which the vehicle's charging was confirmed as stopped.

startConfirmedAt string<date-time> or null

Time at which the vehicle's charging was confirmed as started.

endedAt string<date-time> or null

The actual time at which the plan ended

finalState string or null

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

failureCondition string or null

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

object or null Deprecated

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"
  }
}
Was this section helpful?

Get Vehicle Smart Charging Policy

GET /vehicles/{vehicleId}/smart-charging-policy

Get a vehicle's Smart Charging policy

Request

Path parameters
vehicleId string Required

ID of the Vehicle.

Response

200
Attributes
isEnabled boolean

When enabled, this vehicle's charging status may be controlled by Smart Charging

deadline string or null

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.

minimumChargeLimit number

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
}
Was this section helpful?

Update Vehicle Smart Charging Policy

PUT /vehicles/{vehicleId}/smart-charging-policy

Updates the Smart Charging policy for a vehicle

Request

Path parameters
vehicleId string Required

ID of the Vehicle.

Attributes
isEnabled boolean

When enabled, this vehicle's charging status may be controlled by Smart Charging

deadline string or null

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.

minimumChargeLimit number

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

200
Attributes
isEnabled boolean

When enabled, this vehicle's charging status may be controlled by Smart Charging

deadline string or null

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.

minimumChargeLimit number

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
}
Was this section helpful?

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
vehicleId string Required

ID of the Vehicle.

Response

200
Attributes
createdAt string<date-time>

ISO8601 UTC timestamp at which the smart override was created.

endedAt string<date-time> or null

ISO8601 UTC timestamp at which the smart override was ended. If null, the smart override is still active.

targetType string

One of vehicle or charger

targetId string

ID of the asset (Vehicle or Charger) to which this smart override applies.

vendorActionId string<uuid>

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.

userId string

ID of the User

string
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"
}
Was this section helpful?

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
vehicleId string Required

ID of the Vehicle.

Response

200
Attributes
createdAt string<date-time>

ISO8601 UTC timestamp at which the smart override was created.

endedAt string<date-time> or null

ISO8601 UTC timestamp at which the smart override was ended. If null, the smart override is still active.

targetType string

One of vehicle or charger

targetId string

ID of the asset (Vehicle or Charger) to which this smart override applies.

vendorActionId string<uuid>

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.

userId string

ID of the User

string
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
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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
vehicleId string Required

ID of the Vehicle.

Response

200
Attributes
updatedAt string<date-time>

Time at which the SmartChargingStatus object was recalculated, whether or not any values actually changed

vehicleId string

Vehicle ID

userId string

User ID

vendor string

Vendor of the Vehicle

state string

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

stateChangedAt string<date-time>

Time at which the the 'state' property transitioned to its current value

object or null
object or null

null by default, but during all of the PLAN:* states, the value is populated with a description of the active plan

object or null

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"
  }
}
Was this section helpful?

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
secret string Required

A cryptographically secure secret, generated and provided by your client.

url string Required

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

204

No Content

Other responses

Response 404

Webhook not found

Attributes
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

Delete Firehose Webhook

DELETE /webhooks/firehose

Request

Attributes
url string Required

The HTTPS url of the webhook to be deleted

Sample
{
  "url": "https://brainpower.co/enode-webhooks/firehose"
}

Response

204

No Content

Other responses

Response 404

Webhook not found

Attributes
type string
title string
detail string
Sample
{
  "type": "https://docs.enode.io/problems/validation-error",
  "title": "Invalid Request",
  "detail": "\"action\" must be one of [START, STOP]"
}
Was this section helpful?

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

200
Attributes
status string

Indicates if the test webhook event was delivered successfully to your configured webhook endpoint.

One of SUCCESS or FAILURE

description string

Human readable description of the test outcome.

object or null

Null if status is FAILED.

Sample
{
  "status": "SUCCESS",
  "description": "string",
  "response": {
    "code": 200,
    "body": "{}",
    "headers": [
      "content-type: application/json; } charset=utf-8"
    ]
  }
}
Was this section helpful?