Enode Developers

Enode API

This reference provides an in-depth description of our endpoints for accessing and controlling the hardware and features available through the Enode API.

The API is organised around REST, and utilises OAuth2 authorization.

Environments

We offer multiple environments, each with their own software versions, data access policies, and live/mocked vendors.

Each environment is completely isolated from the others. When you are issued client credentials, they are tied to a specific environment and cannot be re-used across environments.

Copy linkProduction

Running the latest stable software, with live vendors (vehicles/chargers), and strict data access controls

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

Running the latest stable software, with 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?

Errors and problems

Copy linkOAuth Authorization Request

When the User has completed the process of allowing/denying access in Enode Link, they will be redirected to your configured redirect URI. If something has gone wrong, query parameters error and error_description will be set as documented in Section 4.1.2.1 of the OAuth 2.0 spec:

ErrorError description
invalid_requestThe request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.
unauthorized_clientThe client is not authorized to request an authorization code using this method.
access_deniedThe resource owner or authorization server denied the request.
unsupported_response_typeThe authorization server does not support obtaining an authorization code using 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 currently unable to handle the request due to a temporary overloading or maintenance of the server

Sample

https://website.example/oauth_callback?state=e0a86fe5&error=access_denied&error_description=The+resource+owner+or+authorization+server+denied+the+request.

Copy linkErrors when accessing a User's resources

When using an access_token to access a User's resources, the following HTTP Status Codes in the 4XX range may be encountered:

HTTP Status CodeExplanation
400 Bad RequestThe request payload has failed schema validation / parsing
401 UnauthorizedAuthentication details are missing or invalid
403 ForbiddenAuthentication succeeded, but the authenticated user doesn't have access to the resource
404 Not FoundA non-existent resource is requested
405 Method Not AllowedVendor being unavailable has prevented us from completing the request
408 Request TimeoutTimeout by the vendor has prevented us from completing the request
409 ConflictVendor rejection has prevented us from completing the request
424 Failed DependencyOne or more vendor requests failing have prevented us from completing the request
429 Too Many RequestsRate limiting by the vendor has prevented us from completing the request

In all cases, an RFC7807 Problem Details body is returned to aid in debugging.

Sample

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
{
  "type": "https://docs.enode.io/problems/bad-request",
  "title": "Payload validation failed",
  "detail": "\"authorizationRequest.scope\" is required",
}

Copy linkProblems

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

Entity Not Found

The requested entity was not found on the user's account.

Failed Auth Challenge

The code the User entered in response to a login challenge was not correct.

Forbidden

The current context is not allowed to access the requested resource.

Not Found

The requested entity was not found on the user's account. If requesting vendor entities, ensure you're using the top level 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?

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?

Versioning

Copy linkBreaking Changes

Once issued a client, that client is pinned to the latest major version and will only be exposed to major version changes if you request us to migrate it. In such a situation we are able to offer coordinated migration/maintenance windows and can execute the transition together.

For minor breaking changes, we use per-client feature flags, and your technical contact at Enode will keep you notified of new functionalities that are available to be opted into.

Copy linkSchema additions are to be considered non-breaking

Your implementation should be tolerant of the addition of new fields to JSON schemas and the addition of new webhook event names, as such changes are not guarded by feature flags or major version changes.

If this is a problem for your chosen implementation tools, contact us to discuss possible solutions.

Copy linkConsuming the OpenApi Spec

Every release of the API is accompanied by an OpenAPI Specifiction 3.0 document. This document is available at https://enode-api.production.enode.io/openapi/v1.json

Was this section helpful?

Chargers

EV Chargers provide charging data and can be controlled through the Control Charger endpoint and through Schedules

List Chargers

GET /chargers

List all available Chargers for the User.

Response

200
Attributes
List of string array of string

Charger IDs

Sample
[
  "string"
]
Was this section helpful?

Get Charger

GET /chargers/{chargerId}

Request

Path parameters
chargerId string Required

ID of the Charger

Query parameters
field array of string

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.

One of information or chargeState

Response

200
Attributes
id string

Charger ID

vendor string

Charger Vendor

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

lastSeen string<date-time>

The last time the charger was successfully communicated with

isReachable boolean

Whether live data from the charger is currently fetchable from Enode's perspective. This 'reachability' may refer to reading from a cache operated by the charger's cloud service if that service has determined that its cache is valid.

chargingLocationId string Non-empty

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": "string",
  "vendor": "EASEE",
  "lastSeen": "2019-08-24T14:15:22Z",
  "isReachable": true,
  "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "chargeState": {
    "isPluggedIn": true,
    "isCharging": false,
    "chargeRate": 40.1,
    "lastUpdated": "2020-01-07T16:21:76Z",
    "maxCurrent": 20
  },
  "information": {
    "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
    "brand": "Easee",
    "model": "Home",
    "year": 2020
  },
  "capabilities": {
    "information": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "chargeState": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "startCharging": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "stopCharging": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "setMaxCurrent": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    }
  }
}
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 chargeStateIsCharging field transitions to the expected state. Note that this API request will complete before any commands are sent to the charger. There can only be one vendor action active for any one target id at a time. If a new action is created, the old action transitions to the CANCELLED state. You may react to transitions by listening for the user:vendor-action:updated webhook event or polling the charger action endpoint.

This endpoint returns an error with status code 422 if the charger is controlled by a schedule. To restore user control, either disable the schedule or use our External Start API to temporarily enable charging.

Request

Path parameters
chargerId string Required

ID of the Charger

Attributes
action string Required

Kind of action

One of START or STOP

Sample
{
  "action": "START"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

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

Kind of action

One of START or STOP

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the chargeable.

string

Current state of the charge action.

entityId string Deprecated
entityType string Deprecated
chargeableId string Deprecated
chargeableType string Deprecated
Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "string",
  "targetType": "vehicle",
  "kind": "START",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string",
  "entityId": "string",
  "entityType": "string",
  "chargeableId": "string",
  "chargeableType": "string"
}

Other responses

Response 422

Charger controlled by a Schedule

Attributes
type string
title string
detail string
Sample
{
  "type": "string",
  "title": "string",
  "detail": "string"
}
Was this section helpful?

Get Charge Action

GET /chargers/actions/{actionId}

Returns the current state of the requested action.

Request

Path parameters
actionId string Required

ID of the Action

Response

200
Attributes
id string<uuid>

The ID of the action.

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

Kind of action

One of START or STOP

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the chargeable.

string

Current state of the charge action.

entityId string Deprecated
entityType string Deprecated
chargeableId string Deprecated
chargeableType string Deprecated
Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "8d90101b3f2f",
  "targetType": "vehicle",
  "kind": "START",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string",
  "entityId": "string",
  "entityType": "string",
  "chargeableId": "string",
  "chargeableType": "string"
}

Other responses

Response 404

Action not found.

Was this section helpful?

Create External Start

POST /chargers/{chargerId}/external-start

Forces a charger to start charging. Any active Schedules will transition to an overridden state and will cease dispatching Vendor Actions to the charger. This endpoint allows the user to enable charging immediately, without worrying about disabling active Schedules. The override remains active until the charger stops charging, or until the Delete External Start endpoint is called.

Request

Path parameters
chargerId string Required

ID of the Charger

Response

200
Attributes
createdAt string<date-time>

ISO8601 UTC timestamp at which the external start was created.

endedAt string<date-time> Non-empty

ISO8601 UTC timestamp at which the external start was ended. If null, the External Start override is still active.

targetType string

The Vendor Type of the target entity this External Start is referencing.

One of vehicle or charger

targetId string

ID of the asset (Vehicle or Charger) to which this External Start applies.

vendorActionId string

The ID of Vendor Action responsible for starting charging on the target. Use the Vehicle Get Action or the Charger Get Action endpoints to monitor action results.

Sample
{
  "createdAt": "2020-04-07T17:04:26Z",
  "endedAt": "2020-04-07T17:04:26Z",
  "targetType": "vehicle",
  "targetId": "string",
  "vendorActionId": "string"
}
Was this section helpful?

End External Start

DELETE /chargers/{chargerId}/external-start

Ends any active External Start 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 external start was created.

endedAt string<date-time> Non-empty

ISO8601 UTC timestamp at which the external start was ended. If null, the External Start override is still active.

targetType string

The Vendor Type of the target entity this External Start is referencing.

One of vehicle or charger

targetId string

ID of the asset (Vehicle or Charger) to which this External Start applies.

vendorActionId string

The ID of Vendor Action responsible for starting charging on the target. Use the Vehicle Get Action or the Charger Get Action endpoints to monitor action results.

Sample
{
  "createdAt": "2020-04-07T17:04:26Z",
  "endedAt": "2020-04-07T17:04:26Z",
  "targetType": "vehicle",
  "targetId": "8d90101b3f2f",
  "vendorActionId": "string"
}

Other responses

Response 404

No External Start Exists

Attributes
type string
title string
detail string
Sample
{
  "type": "string",
  "title": "string",
  "detail": "string"
}
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 Action.

Request

Path parameters
chargerId string Required

ID of the Charger

Attributes
maxCurrent number Required Non-empty

Desired max current in ampere

Sample
{
  "maxCurrent": 20
}

Response

200
Attributes
id string<uuid>

The ID of the action.

targetId string

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

object

Target maximum current for charger

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC Timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending temperature commands to the charger.

string

Current state of the charge action.

Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "string",
  "targetState": {
    "maxCurrent": 20
  },
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string"
}
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> Required
name string Required

User-supplied name for the Charging Location

longitude number Required

Longitude in degrees

latitude number Required

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
[
  {
    "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
    "name": "Home",
    "longitude": 10.757933,
    "latitude": 59.911491,
    "timezoneName": "Europe/Copenhagen"
  }
]
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

An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to 'UTC'.

Sample
{
  "name": "Home",
  "longitude": 10.757933,
  "latitude": 59.911491,
  "timezoneName": "Europe/Copenhagen"
}

Response

201
Attributes
id string<uuid> Required
name string Required

User-supplied name for the Charging Location

longitude number Required

Longitude in degrees

latitude number Required

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
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "name": "Home",
  "longitude": 10.757933,
  "latitude": 59.911491,
  "timezoneName": "Europe/Copenhagen"
}
Was this section helpful?

Get Charging Location

GET /charging-locations/{chargingLocationId}

Request

Path parameters
chargingLocationId string Required

ID of the Charging Location.

Response

200
Attributes
id string<uuid> Required
name string Required

User-supplied name for the Charging Location

longitude number Required

Longitude in degrees

latitude number Required

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
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "name": "Home",
  "longitude": 10.757933,
  "latitude": 59.911491,
  "timezoneName": "Europe/Copenhagen"
}
Was this section helpful?

Delete Charging Location

DELETE /charging-locations/{chargingLocationId}

Delete a Charging Location.

Request

Path parameters
chargingLocationId string Required

ID of the Charging Location.

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 Charging Location

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

An IANA TZ database timezone name. This value will be used to convert rules and deadlines for tariffs, smart charging, and schedules into local time. Defaults to 'UTC'.

Sample
{
  "name": "Home",
  "longitude": 10.757933,
  "latitude": 59.911491,
  "timezoneName": "Europe/Copenhagen"
}

Response

200
Attributes
id string<uuid> Required
name string Required

User-supplied name for the Charging Location

longitude number Required

Longitude in degrees

latitude number Required

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
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "name": "Home",
  "longitude": 10.757933,
  "latitude": 59.911491,
  "timezoneName": "Europe/Copenhagen"
}
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 Charging Location

Attributes
tariffId string

Energy Provider Tariff ID

array of Object

List of time intervals at which to apply the specified tariff rates

Sample
{
  "tariffId": "offpeaksaver",
  "tariffIntervals": [
    {
      "name": "OFF-WEEKEND",
      "weekdays": [
        5,
        6
      ],
      "from": "00:00",
      "to": "06:00"
    },
    {
      "name": "PEAK-WEEKEND",
      "weekdays": [
        5,
        6
      ],
      "from": "06:00",
      "to": "18:00"
    },
    {
      "name": "OFF",
      "weekdays": [
        5,
        6
      ],
      "from": "18:00",
      "to": "23:59"
    },
    {
      "name": "PEAK",
      "from": "00:00",
      "to": "18:00"
    }
  ]
}

Other responses

Response 400

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

Response 404

Charging Location not found.

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 Charging Location

Response

200
Attributes
List of object array of object
object object
weekday number
fromHourMinute string
toHourMinute string
tariffId string
tariffName string
Sample
[
  {
    "weekday": 0,
    "fromHourMinute": "00:00",
    "toHourMinute": "06:00",
    "tariffId": "testing-tariff-a",
    "tariffName": "OFF-PEAK"
  },
  {
    "weekday": 0,
    "fromHourMinute": "06:00",
    "toHourMinute": "18:00",
    "tariffId": "testing-tariff-a",
    "tariffName": "PEAK"
  }
]

Other responses

Response 400

Invalid tariffId or rate name, or incomplete interval series

Response 404

Charging Location not found

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 Hold endpoint, Return to Schedule, 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?

Set HVAC Temperature

Deprecated
POST /hvacs/{hvacId}/temperature

This endpoint has been replaced with the Set Permanent Hold and [Follow Schedule] endpoints. A future release will remove this endpoint.

Register a request for a change of the targetTemperature field on an HVAC unit. We retry sending the command until the HVAC unit's targetTemperature field transitions to the expected value. Note that this request will complete before any commands are sent to the HVAC unit. There can only be one vendor action active for any one target id at a time. If a new action is created, the old action transitions to the CANCELLED state. You may react to transitions by listening for the user:vendor-action:updated webhook event or polling the HVAC action endpoint.

This endpoint returns an error with status code 422 if the HVAC unit is controlled by a schedule. To restore user control you must first disable the schedule.

Request

Path parameters
hvacId string Required

ID of the HVAC

Attributes
temperature number Required Non-empty

Desired temperature

deadband number Non-empty

Size of the optional deadband centered around temperature.

For example, with a temperature of 22.0 and a deadband of 4.0, an HVAC unit will receive a heating setpoint of 20.0 and a cooling setpoint of 24.0

Sample
{
  "temperature": 22,
  "deadband": 4
}

Response

200
Attributes
id string<uuid>

The ID of the action.

targetId string

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

targetType string

One of hvac

object Deprecated

Replaced with coolSetpoint and heatSetpoint. A future release will remove this field. Target temperature for a HVAC device.

object

Target mode for an HVAC device

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC Timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending temperature commands to the HVAC device.

string

Current state of the HVAC action

Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "string",
  "targetType": "hvac",
  "targetTemperature": {
    "temperature": 22,
    "deadband": 4
  },
  "target": {
    "mode": "string",
    "heatSetpoint": 22,
    "coolSetpoint": 24,
    "holdType": "PERMANENT"
  },
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string"
}

Other responses

Response 422

HVAC unit controlled by a Schedule

Attributes
type string
title string
detail string
Sample
{
  "type": "string",
  "title": "string",
  "detail": "string"
}
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 endpoint.

Request

Path parameters
hvacId string Required

ID of the HVAC

Attributes
Target mode for an HVAC device
mode string Required

Desired mode. HVAC units may specify a list of capableModes under capabilities. No setpoints are accepted in the OFF state.

One of OFF

holdType string

One of PERMANENT

Sample
{
  "mode": "OFF",
  "holdType": "PERMANENT"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

targetId string

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

targetType string

One of hvac

object Deprecated

Replaced with coolSetpoint and heatSetpoint. A future release will remove this field. Target temperature for a HVAC device.

object

Target mode for an HVAC device

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC Timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending temperature commands to the HVAC device.

string

Current state of the HVAC action

Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "8d90101b3f2f",
  "targetType": "hvac",
  "targetTemperature": {
    "temperature": 22,
    "deadband": 4
  },
  "target": {
    "mode": "HEAT",
    "heatSetpoint": 22,
    "coolSetpoint": 24,
    "holdType": "PERMANENT"
  },
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string"
}

Other responses

Response 422

HVAC controlled by an Enode Schedule

Attributes
type string
title string
detail string
Sample
{
  "type": "string",
  "title": "string",
  "detail": "string"
}
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 endpoint.

Request

Path parameters
hvacId string Required

ID of the HVAC

Attributes
holdType string Non-empty

One of SCHEDULED

Sample
{
  "holdType": "SCHEDULED"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

targetId string

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

targetType string

One of hvac

object Deprecated

Replaced with coolSetpoint and heatSetpoint. A future release will remove this field. Target temperature for a HVAC device.

object

Target mode for an HVAC device

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC Timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending temperature commands to the HVAC device.

string

Current state of the HVAC action

Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "8d90101b3f2f",
  "targetType": "hvac",
  "targetTemperature": {
    "temperature": 22,
    "deadband": 4
  },
  "target": {
    "mode": "HEAT",
    "heatSetpoint": 22,
    "coolSetpoint": 24,
    "holdType": "PERMANENT"
  },
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string"
}

Other responses

Response 422

HVAC controlled by an Enode Schedule

Attributes
type string
title string
detail string
Sample
{
  "type": "string",
  "title": "string",
  "detail": "string"
}
Was this section helpful?

Get Action

GET /hvacs/actions/{actionId}

Returns the current state of the requested action.

Request

Path parameters
actionId string Required

ID of the Action

Response

200
Attributes
id string<uuid>

The ID of the action.

targetId string

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

targetType string

One of hvac

object Deprecated

Replaced with coolSetpoint and heatSetpoint. A future release will remove this field. Target temperature for a HVAC device.

object

Target mode for an HVAC device

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC Timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending temperature commands to the HVAC device.

string

Current state of the HVAC action

Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "8d90101b3f2f",
  "targetType": "hvac",
  "targetTemperature": {
    "temperature": 22,
    "deadband": 4
  },
  "target": {
    "mode": "HEAT",
    "heatSetpoint": 22,
    "coolSetpoint": 24,
    "holdType": "PERMANENT"
  },
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string"
}

Other responses

Response 404

Action not found.

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 Required

HVAC device ID

vendor string Required

HVAC Vendor

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

lastSeen string<date-time> Required Non-empty

The last time the HVAC unit was successfully communicated with

isReachable boolean Required

Whether live data from the HVAC unit is currently fetchable from Enode's perspective. It can happen that this 'reachability' refers to reading from a cache operated by the vendor's cloud service, if that service has determined that its cache is valid.

chargingLocationId string Non-empty

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 Non-empty

Current air temperature reported by device in degrees Celsius.

object Deprecated Required

Replaced with coolSetpoint and heatSetpoint. A future release will remove this field. Target temperature for a HVAC device.

consumptionRate number Non-empty

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 Non-empty

The HVAC's mode.

One of HEAT, COOL, AUTO, or OFF

heatSetpoint number Non-empty

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

coolSetpoint number Non-empty

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

holdType string Non-empty

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 Required

Descriptive information about the HVAC unit

object Required

An object describing valid states for this HVAC device.

Sample
{
  "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
  "vendor": "ADAX",
  "lastSeen": "2020-04-07T17:04:26Z",
  "isReachable": true,
  "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "isActive": true,
  "currentTemperature": 20.8,
  "targetTemperature": {
    "temperature": 22,
    "deadband": 4
  },
  "consumptionRate": 1.8,
  "mode": "HEAT",
  "heatSetpoint": 22,
  "coolSetpoint": 24,
  "holdType": "PERMANENT",
  "information": {
    "brand": "ADAX",
    "model": "Neo Wi-Fi Skirting",
    "displayName": "Bedroom Panel Heater",
    "groupName": "Bedroom",
    "category": "HEATING"
  },
  "capabilities": {
    "capableModes": [
      "HEAT",
      "COOL",
      "OFF"
    ],
    "capableHoldTypes": [
      "PERMANENT"
    ],
    "coolSetpointRange": {
      "min": 15,
      "max": 25
    },
    "heatSetpointRange": {
      "min": 15,
      "max": 25
    },
    "setpointDifferenceRange": {
      "min": 15,
      "max": 25
    }
  }
}
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> Required
Sample
{
  "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
}

Response

200
Attributes
id string Required

HVAC device ID

vendor string Required

HVAC Vendor

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

lastSeen string<date-time> Required Non-empty

The last time the HVAC unit was successfully communicated with

isReachable boolean Required

Whether live data from the HVAC unit is currently fetchable from Enode's perspective. It can happen that this 'reachability' refers to reading from a cache operated by the vendor's cloud service, if that service has determined that its cache is valid.

chargingLocationId string Non-empty

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 Non-empty

Current air temperature reported by device in degrees Celsius.

object Deprecated Required

Replaced with coolSetpoint and heatSetpoint. A future release will remove this field. Target temperature for a HVAC device.

consumptionRate number Non-empty

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 Non-empty

The HVAC's mode.

One of HEAT, COOL, AUTO, or OFF

heatSetpoint number Non-empty

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

coolSetpoint number Non-empty

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

holdType string Non-empty

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 Required

Descriptive information about the HVAC unit

object Required

An object describing valid states for this HVAC device.

Sample
{
  "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
  "vendor": "ADAX",
  "lastSeen": "2020-04-07T17:04:26Z",
  "isReachable": true,
  "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "isActive": true,
  "currentTemperature": 20.8,
  "targetTemperature": {
    "temperature": 22,
    "deadband": 4
  },
  "consumptionRate": 1.8,
  "mode": "HEAT",
  "heatSetpoint": 22,
  "coolSetpoint": 24,
  "holdType": "PERMANENT",
  "information": {
    "brand": "ADAX",
    "model": "Neo Wi-Fi Skirting",
    "displayName": "Bedroom Panel Heater",
    "groupName": "Bedroom",
    "category": "HEATING"
  },
  "capabilities": {
    "capableModes": [
      "HEAT",
      "COOL",
      "OFF"
    ],
    "capableHoldTypes": [
      "PERMANENT"
    ],
    "coolSetpointRange": {
      "min": 15,
      "max": 25
    },
    "heatSetpointRange": {
      "min": 15,
      "max": 25
    },
    "setpointDifferenceRange": {
      "min": 15,
      "max": 25
    }
  }
}
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
array of Object
Sample
{
  "id": "123456789-ABc",
  "linkedVendors": [
    {
      "vendor": "TESLA",
      "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

Was this section helpful?

Schedules

A Schedule is a policy that targets a specific chargeable (vehicle or charger) at a specific Charging Location. It describes whether the target should be charging at any given point in time. This value is called shouldCharge.

More information and examples are available in the Using Schedules guide.

List Schedules

GET /schedules

Returns a list of Schedules registered to the User.

Response

200
Attributes
List of Object array of Object

A Schedule that applies to the combination of a certain Charging Location and chargeable asset (Vehicle/Charger/HVAC). Read the guide to Using Schedules.

targetId string Required

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

chargingLocationId string<uuid> Required Non-empty

ID of the Charging Location to which this schedule applies. If null, schedule is applied at all of the User's Charging Locations.

isEnabled boolean

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

defaultShouldCharge boolean Required

Default value of shouldCharge when no rule applies.

array of Charge Schedule 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.

targetType string Required

One of vehicle or charger

id string<uuid> Required
Sample
[
  {
    "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
    "targetId": "string",
    "chargingLocationId": "string",
    "isEnabled": true,
    "defaultShouldCharge": false,
    "rules": [
      {
        "hourMinute": {
          "from": "22:00",
          "to": "04:00"
        },
        "fromTimestamp": "2020-01-07T16:21:76Z",
        "toTimestamp": "2020-01-07T16:21:76Z",
        "weekdays": [
          0,
          1,
          2,
          3,
          4
        ],
        "shouldCharge": true
      }
    ],
    "targetType": "vehicle"
  }
]
Was this section helpful?

Create Schedule

POST /schedules

Request

Attributes

A Schedule that applies to the combination of a certain Charging Location and chargeable asset (Vehicle/Charger/HVAC). Read the guide to Using Schedules.

targetId string Required

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

chargingLocationId string<uuid> Required Non-empty

ID of the Charging Location to which this schedule applies. If null, schedule is applied at all of the User's Charging Locations.

isEnabled boolean

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

defaultShouldCharge boolean Required

Default value of shouldCharge when no rule applies.

array of Charge Schedule 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.

targetType string Required

One of vehicle or charger

Sample
{
  "targetId": "string",
  "chargingLocationId": "string",
  "isEnabled": true,
  "defaultShouldCharge": false,
  "rules": [
    {
      "hourMinute": {
        "from": "22:00",
        "to": "04:00"
      },
      "fromTimestamp": "2020-01-07T16:21:76Z",
      "toTimestamp": "2020-01-07T16:21:76Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4
      ],
      "shouldCharge": true
    }
  ],
  "targetType": "vehicle"
}

Response

201
Attributes

A Schedule that applies to the combination of a certain Charging Location and chargeable asset (Vehicle/Charger/HVAC). Read the guide to Using Schedules.

targetId string Required

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

chargingLocationId string<uuid> Required Non-empty

ID of the Charging Location to which this schedule applies. If null, schedule is applied at all of the User's Charging Locations.

isEnabled boolean

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

defaultShouldCharge boolean Required

Default value of shouldCharge when no rule applies.

array of Charge Schedule 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.

targetType string Required

One of vehicle or charger

id string<uuid> Required
Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "string",
  "chargingLocationId": "string",
  "isEnabled": true,
  "defaultShouldCharge": false,
  "rules": [
    {
      "hourMinute": {
        "from": "22:00",
        "to": "04:00"
      },
      "fromTimestamp": "2020-01-07T16:21:76Z",
      "toTimestamp": "2020-01-07T16:21:76Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4
      ],
      "shouldCharge": true
    }
  ],
  "targetType": "vehicle"
}
Was this section helpful?

Get Schedule

GET /schedules/{scheduleId}

Request

Path parameters
scheduleId string Required

ID of the Schedule.

Response

200
Attributes

A Schedule that applies to the combination of a certain Charging Location and chargeable asset (Vehicle/Charger/HVAC). Read the guide to Using Schedules.

targetId string Required

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

chargingLocationId string<uuid> Required Non-empty

ID of the Charging Location to which this schedule applies. If null, schedule is applied at all of the User's Charging Locations.

isEnabled boolean

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

defaultShouldCharge boolean Required

Default value of shouldCharge when no rule applies.

array of Charge Schedule 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.

targetType string Required

One of vehicle or charger

id string<uuid> Required
Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "string",
  "chargingLocationId": "string",
  "isEnabled": true,
  "defaultShouldCharge": false,
  "rules": [
    {
      "hourMinute": {
        "from": "22:00",
        "to": "04:00"
      },
      "fromTimestamp": "2020-01-07T16:21:76Z",
      "toTimestamp": "2020-01-07T16:21:76Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4
      ],
      "shouldCharge": true
    }
  ],
  "targetType": "vehicle"
}
Was this section helpful?

Delete Schedule

DELETE /schedules/{scheduleId}

Delete a Schedule

Request

Path parameters
scheduleId string Required

ID of the Schedule.

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

A Schedule that applies to the combination of a certain Charging Location and chargeable asset (Vehicle/Charger/HVAC). Read the guide to Using Schedules.

targetId string Required

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

chargingLocationId string<uuid> Required Non-empty

ID of the Charging Location to which this schedule applies. If null, schedule is applied at all of the User's Charging Locations.

isEnabled boolean

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

defaultShouldCharge boolean Required

Default value of shouldCharge when no rule applies.

array of Charge Schedule 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.

targetType string Required

One of vehicle or charger

Sample
{
  "targetId": "string",
  "chargingLocationId": "string",
  "isEnabled": true,
  "defaultShouldCharge": false,
  "rules": [
    {
      "hourMinute": {
        "from": "22:00",
        "to": "04:00"
      },
      "fromTimestamp": "2020-01-07T16:21:76Z",
      "toTimestamp": "2020-01-07T16:21:76Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4
      ],
      "shouldCharge": true
    }
  ],
  "targetType": "vehicle"
}

Response

200
Attributes

A Schedule that applies to the combination of a certain Charging Location and chargeable asset (Vehicle/Charger/HVAC). Read the guide to Using Schedules.

targetId string Required

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

chargingLocationId string<uuid> Required Non-empty

ID of the Charging Location to which this schedule applies. If null, schedule is applied at all of the User's Charging Locations.

isEnabled boolean

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

defaultShouldCharge boolean Required

Default value of shouldCharge when no rule applies.

array of Charge Schedule 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.

targetType string Required

One of vehicle or charger

id string<uuid> Required
Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "string",
  "chargingLocationId": "string",
  "isEnabled": true,
  "defaultShouldCharge": false,
  "rules": [
    {
      "hourMinute": {
        "from": "22:00",
        "to": "04:00"
      },
      "fromTimestamp": "2020-01-07T16:21:76Z",
      "toTimestamp": "2020-01-07T16:21:76Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4
      ],
      "shouldCharge": true
    }
  ],
  "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
scheduleId string<uuid> Required
scheduleType string Required

One of CHARGE or TEMPERATURE

changedAt string<date-time> Required

Time at which any value of the status last changed

state string Required

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 Required

Whether the target is currently actually charging

isChargingExpected boolean Required

Whether the target is currently expected to be charging

object Required

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

array of Object Required

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

object Non-empty

This field is only populated after calling the vehicle or charger External Start 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 External Start override remains in place until the target stops charging for any reason, or until the External Start is ended via the Delete vehicle or charger External Start APIs.

Sample
{
  "scheduleId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "scheduleType": "CHARGE",
  "changedAt": "2019-08-24T14:15:22Z",
  "state": "ALIGNED",
  "isCharging": false,
  "isChargingExpected": false,
  "isChargingExpectedParts": {
    "needsCharge": true,
    "isPluggedIn": true,
    "shouldCharge": true
  },
  "upcomingTransitions": [
    {
      "at": "2020-04-07T17:04:26Z",
      "shouldCharge": true,
      "targetTemperature": 0
    }
  ],
  "externalStart": {
    "createdAt": "2020-04-07T17:04:26Z",
    "endedAt": "2020-04-07T17:04:26Z",
    "targetType": "vehicle",
    "targetId": "8d90101b3f2f",
    "vendorActionId": "string"
  }
}
Was this section helpful?

Service Health

Endpoints that return information about the health of Enode and our integrations.

Check Service Readiness

GET /health/ready

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

Other responses

Response 503

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

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

Vehicle Vendor

One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, or VAUXHALL

displayName string

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

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

Sample
[
  {
    "vendor": "TESLA",
    "displayName": "Tesla",
    "status": "READY"
  },
  {
    "vendor": "BMW",
    "displayName": "BMW",
    "status": "READY"
  },
  {
    "vendor": "AUDI",
    "displayName": "Audi",
    "status": "READY"
  }
]
Was this section helpful?

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

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

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

Sample
[
  {
    "vendor": "EASEE",
    "displayName": "Easee",
    "status": "READY"
  },
  {
    "vendor": "WALLBOX",
    "displayName": "Wallbox",
    "status": "READY"
  },
  {
    "vendor": "ZAPTEC",
    "displayName": "Zaptec",
    "status": "READY"
  },
  {
    "vendor": "EO",
    "displayName": "EO",
    "status": "READY"
  }
]
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

HVAC Vendor

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

displayName string

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

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

Sample
[
  {
    "vendor": "MILL",
    "displayName": "Mill",
    "portalName": "Mill",
    "status": "READY"
  }
]
Was this section helpful?

Check Available Inverter Vendors

GET /health/inverters

Lists the available inverter vendors. If you authenticate with a client or link token, we also include the activated vendors that your client has access to. Learn more about vendors requiring activation.

Response

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

Inverter Vendor

One of FRONIUS, GROWATT, SOLAREDGE, SOLIS, ENPHASE, GOODWE, SMA, or EMA

displayName string

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

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

Sample
[
  {
    "vendor": "SOLAREDGE",
    "displayName": "Solar Edge",
    "status": "READY"
  },
  {
    "vendor": "SMA",
    "displayName": "SMA",
    "status": "READY"
  },
  {
    "vendor": "SOLIS",
    "displayName": "Solis",
    "status": "READY"
  },
  {
    "vendor": "FRONIUS",
    "displayName": "Fronius",
    "status": "READY"
  }
]
Was this section helpful?

Solar inverters

Solar inverters can be queried for current production state

List Solar inverter

GET /inverters

Response

200
Attributes
List of string array of string

Solar inverter IDs

Sample
[
  "string"
]
Was this section helpful?

Get Solar inverter

GET /inverters/{inverterId}

Request

Path parameters
inverterId string Required

ID of the solar inverter

Query parameters
field no type

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 Required

Solar inverter ID

vendor string Required

Inverter Vendor

One of FRONIUS, GROWATT, SOLAREDGE, SOLIS, ENPHASE, GOODWE, SMA, or EMA

chargingLocationId string Non-empty

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

lastSeen string<date-time> Required

The last time the solar inverter was successfully communicated with

isReachable boolean Required

Whether live data from the solar inverter is currently fetchable from Enode's perspective. This 'reachability' may refer to reading from a cache operated by the solar inverter's cloud service if that service has determined that its cache is valid.

object Required
object Required

Descriptive information about the solar inverter

object Required

Solar inverter's GPS coordinates with timestamp

Sample
{
  "id": "string",
  "vendor": "string",
  "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "lastSeen": "2022-04-07T17:04:26Z",
  "isReachable": true,
  "productionState": {
    "productionRate": 1.8,
    "isProducing": true,
    "lastUpdated": "2022-04-07T16:21:76Z"
  },
  "information": {
    "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
    "brand": "SMA",
    "model": "Sunny Boy",
    "siteName": "Sunny plant",
    "installationDate": "2020-04-05"
  },
  "location": {
    "longitude": 10.757933,
    "latitude": 59.911491
  }
}
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 HALF_HOUR, HOUR, DAY, WEEK, MONTH, or YEAR

startDate string Required

Earliest date to include in the response. Cannot be greater than endDate.

endDate string

Latest date to include in the response (defaults to current date/time).

type string

Get statistics for this hardware type.

One of vehicle, charger, or hvac

id string

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

utcOffset number

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.

Response

200
Attributes
List of object array of object
object object
object Required

Aggregate statistics for charge rate in kW

kwhSum number Required

Total power consumption in kWh

object Required

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

object Required

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

costSum number Required

Total cost in <CURRENCY>

nonSmartCostSum number Required

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

estimatedSavings number Required

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

date string<date-time> Required

The start date of this sample within the timeseries

Sample
[
  {
    "kw": {
      "min": 0,
      "max": 78,
      "mean": 61
    },
    "kwhSum": 120,
    "price": {
      "min": 13.8,
      "max": 14.4,
      "mean": 14.1
    },
    "nonSmartPrice": {
      "min": 12.9,
      "max": 16.7,
      "mean": 14.8
    },
    "costSum": 3.14,
    "nonSmartCostSum": 4.21,
    "estimatedSavings": 1.07,
    "date": "2021-01-19T09:37:36.845Z"
  }
]
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 Required

Get statistics for this hardware type.

One of vehicle, charger, or hvac

startDate string Required

Earliest date to include in the response.

endDate string

Latest date to include in the response (defaults to current date/time).

targetId string

Filter statistics to only include a specific entity.

chargingLocationId string

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 Non-empty

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": "string",
    "from": "2019-08-24T14:15:22Z",
    "to": "2019-08-24T14:15:22Z",
    "kw": {
      "min": 0,
      "max": 78,
      "mean": 61
    },
    "kwhSum": 120,
    "price": {
      "min": 0,
      "max": 78,
      "mean": 61
    },
    "costSum": 3.14,
    "smartSession": true,
    "smartStats": {
      "nonSmartPrice": {
        "min": 0,
        "max": 82,
        "mean": 65
      },
      "nonSmartCostSum": 4.21,
      "estimatedSavings": 1.07
    }
  }
]
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. Cannot be greater than endDate.

endDate string

Latest date to include in the response (defaults to current date/time).

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.

utcOffset number

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.

Response

200
Attributes
List of object array of object
object object
object Required

Aggregate statistics for charge rate in kW

kwhSum number Required

Total power consumption in kWh

object Required

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

earningsSum number Required

Total earnings in <CURRENCY>

date string<date-time> Required

The start date of this sample within the timeseries

Sample
[
  {
    "kw": {
      "min": 0,
      "max": 78,
      "mean": 61
    },
    "kwhSum": 120,
    "price": {
      "min": 13.8,
      "max": 14.4,
      "mean": 14.1
    },
    "earningsSum": 3.14,
    "date": "2021-01-19T09:37:36.845Z"
  }
]
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 string Required

ID of the Tariff

Attributes
List of object array of object

A list of rates with name and price.

object object
name string

Rate name

cost string<float>

Rate cost (decimal string, 9 decimals precision max)

Sample
[
  {
    "name": "PEAK",
    "cost": "13.37"
  },
  {
    "name": "OFF-PEAK",
    "cost": "12.34"
  }
]
Was this section helpful?

User Management

Endpoints used to link and unlink users or vendors.

POST /users/{userId}/link

Creates an Enode Link session attached to the provided User ID. If this User does not exist, it will be created. The returned linkState gives the User short-lived (24hs) access to Enode Link. A URL for Enode Link for the user to initiate asset linking is also returned.

Request

Path parameters
userId string Required

ID of the User

Attributes
string

Skip the vendor selection screen and present the credential input for a specific vendor immediately.

vendorType string

Sets the type of vendors available for connection in a Link UI session. If absent, this defaults to vehicle.

One of vehicle, charger, hvac, or inverter

forceLanguage string

BCP47 language code - Force the Link UI to prefer the specified language. If omitted, the UI will default to the User's browser default language.

One of en, de, nb, sv, ja, es, or fr

scopes array of string

The scope(s) you wish to request access to when linking an asset.

One of offline_access, all, vehicle:smart_charging_policy, vehicle:charge_state, vehicle:location, vehicle:odometer, vehicle:information, control:vehicle:charging, charger:charge_state, charger:information, control:charger:charging, charging_location, schedule, hvac:information, control:hvac:temperature, or hvac:temperature_state

redirectUri string

A URI to redirect the user to after successfully linking an asset.

Sample
{
  "vendor": "string",
  "vendorType": "string",
  "forceLanguage": "nb",
  "scopes": [
    "offline_access",
    "all"
  ],
  "redirectUri": "myapp://integrations/enode"
}

Response

200
Attributes
linkState string
linkUrl string
Sample
{
  "linkState": "ZjE2MzMxMGFiYmU4MzcxOTU1ZmRjMTU5NGU2ZmE4YTU3NjViMzIwY2YzNG",
  "linkUrl": "https://link.production.enode.io?link_state=YzIwZThhYjYtMjMzMi00ZTAyLTg0OTYtYzdjOTlhZTY3Zjc3QDI2YzI1MDExLTdhYTctNGE2NS1iNjBmLTZmMzc5NmRhODUyMDowNDViYjFiYmE0M2Y5NDU5YTc5OTgxZmEyYTg1NmI4YzhkOGU4YjgyNmNmMzQzZmFmMGNhZTlmNDBjMmZmOTgy&requested_scope=vehicle%3Alocation%20vehicle%3Aodometer&redirect_uri=myapp%3A%2F%2Fintegrations%2Fenode"
}
Was this section helpful?

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

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

Was this section helpful?

Vehicles

EVs provide charge, location, and odometer data. Vehicles can be controlled either directly using the Control Charging endpoint, or through Smart Charging and Schedules.

List Vehicles

GET /vehicles

List all available Vehicles for the User.

If you already know the ID of a vehicle you want to fetch, it is recommended to fetch it using the more performant Get Vehicle method.

Request

Query parameters
field array of string

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

By default, no fields are included, and the latest cached full Vehicle object will be returned.

One of chargeState, location, information, or odometer

Response

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

Vehicle ID

vendor string

Vehicle Vendor

One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, or VAUXHALL

lastSeen string<date-time>

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

isReachable boolean

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 Non-empty

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 Policy 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": "string",
    "vendor": "TESLA",
    "lastSeen": "2019-08-24T14:15:22Z",
    "isReachable": true,
    "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
    "information": {
      "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
      "vin": "5YJYGDEF2LFR00942",
      "brand": "Tesla",
      "model": "Model S P85",
      "year": 2020
    },
    "chargeState": {
      "batteryLevel": 38,
      "range": 127.5,
      "isPluggedIn": true,
      "isCharging": false,
      "isFullyCharged": false,
      "batteryCapacity": 73.21,
      "chargeLimit": 80,
      "chargeRate": 40.1,
      "chargeTimeRemaining": 319,
      "lastUpdated": "2020-01-07T16:21:76Z",
      "isChargingReasons": [
        "DEFAULT"
      ]
    },
    "smartChargingPolicy": {
      "isEnabled": true,
      "deadline": "08:00",
      "minimumChargeLimit": 0
    },
    "location": {
      "longitude": 10.757933,
      "latitude": 59.911491,
      "lastUpdated": "2020-04-07T17:04:26Z"
    },
    "odometer": {
      "distance": 24650,
      "lastUpdated": "2020-01-07T16:21:76Z"
    },
    "capabilities": {
      "chargeState": {
        "isCapable": true,
        "interventionIds": [
          "0defa374-8a1a-4eb1-a85f-b7cb09501097"
        ]
      },
      "location": {
        "isCapable": true,
        "interventionIds": [
          "0defa374-8a1a-4eb1-a85f-b7cb09501097"
        ]
      },
      "information": {
        "isCapable": true,
        "interventionIds": [
          "0defa374-8a1a-4eb1-a85f-b7cb09501097"
        ]
      },
      "odometer": {
        "isCapable": true,
        "interventionIds": [
          "0defa374-8a1a-4eb1-a85f-b7cb09501097"
        ]
      },
      "startCharging": {
        "isCapable": true,
        "interventionIds": [
          "0defa374-8a1a-4eb1-a85f-b7cb09501097"
        ]
      },
      "stopCharging": {
        "isCapable": true,
        "interventionIds": [
          "0defa374-8a1a-4eb1-a85f-b7cb09501097"
        ]
      },
      "smartCharging": {
        "isCapable": true,
        "interventionIds": [
          "0defa374-8a1a-4eb1-a85f-b7cb09501097"
        ]
      }
    }
  }
]
Was this section helpful?

Get Vehicle

GET /vehicles/{vehicleId}

Request

Path parameters
vehicleId string Required

ID of the Vehicle.

Query parameters
field array of string

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

By default, no fields are included, and the latest cached full Vehicle object will be returned.

One of chargeState, location, information, or odometer

Response

200
Attributes
id string

Vehicle ID

vendor string

Vehicle Vendor

One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, CITROEN, CUPRA, or VAUXHALL

lastSeen string<date-time>

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

isReachable boolean

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 Non-empty

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 Policy 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": "string",
  "vendor": "TESLA",
  "lastSeen": "2019-08-24T14:15:22Z",
  "isReachable": true,
  "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "information": {
    "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
    "vin": "5YJYGDEF2LFR00942",
    "brand": "Tesla",
    "model": "Model S P85",
    "year": 2020
  },
  "chargeState": {
    "batteryLevel": 38,
    "range": 127.5,
    "isPluggedIn": true,
    "isCharging": false,
    "isFullyCharged": false,
    "batteryCapacity": 73.21,
    "chargeLimit": 80,
    "chargeRate": 40.1,
    "chargeTimeRemaining": 319,
    "lastUpdated": "2020-01-07T16:21:76Z",
    "isChargingReasons": [
      "DEFAULT"
    ]
  },
  "smartChargingPolicy": {
    "isEnabled": true,
    "deadline": "08:00",
    "minimumChargeLimit": 0
  },
  "location": {
    "longitude": 10.757933,
    "latitude": 59.911491,
    "lastUpdated": "2020-04-07T17:04:26Z"
  },
  "odometer": {
    "distance": 24650,
    "lastUpdated": "2020-01-07T16:21:76Z"
  },
  "capabilities": {
    "chargeState": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "location": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "information": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "odometer": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "startCharging": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "stopCharging": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    },
    "smartCharging": {
      "isCapable": true,
      "interventionIds": [
        "0defa374-8a1a-4eb1-a85f-b7cb09501097"
      ]
    }
  }
}
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 chargeStateIsCharging field transitions to the expected state. Note that this API request will complete before any commands are sent to the vehicle. There can only be one vendor action active for any one target id at a time. If a new action is created, the old action transitions to the CANCELLED state. You may react to transitions by listening for the user:vendor-action:updated webhook event or polling the vehicle action endpoint.

This endpoint returns an error with status code 422 if the vehicle is controlled by a schedule or has an active smart charging plan. To restore user control, either disable the schedule, disable smart charging, or use our External Start API to temporarily enable charging.

Request

Path parameters
vehicleId string Required

ID of the Vehicle.

Attributes
action string

Kind of action

One of START or STOP

Sample
{
  "action": "START"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

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

Kind of action

One of START or STOP

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the chargeable.

string

Current state of the charge action.

entityId string Deprecated
entityType string Deprecated
chargeableId string Deprecated
chargeableType string Deprecated
Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "8d90101b3f2f",
  "targetType": "vehicle",
  "kind": "START",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string",
  "entityId": "string",
  "entityType": "string",
  "chargeableId": "string",
  "chargeableType": "string"
}

Other responses

Response 422

Vehicle controlled by a Schedule or has active Smart Charging Plan

Attributes
type string
title string
detail string
Sample
{
  "type": "string",
  "title": "string",
  "detail": "string"
}
Was this section helpful?

Get Charge Action

GET /vehicles/actions/{actionId}

Returns the current state of the requested action.

Request

Path parameters
actionId string Required

ID of the Action

Response

200
Attributes
id string<uuid>

The ID of the action.

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

Kind of action

One of START or STOP

createdAt string<date-time>

ISO8601 UTC timestamp

updatedAt string<date-time>

ISO8601 UTC timestamp

completedAt string<date-time>

ISO8601 UTC timestamp at which the action transitioned to a non-pending state. If this value is set, then we are no longer sending commands to the chargeable.

string

Current state of the charge action.

entityId string Deprecated
entityType string Deprecated
chargeableId string Deprecated
chargeableType string Deprecated
Sample
{
  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "targetId": "8d90101b3f2f",
  "targetType": "vehicle",
  "kind": "START",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "string",
  "entityId": "string",
  "entityType": "string",
  "chargeableId": "string",
  "chargeableType": "string"
}

Other responses

Response 404

Action not found.

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

The hour-minute deadline for fully charging the vehicle. Smart charging does not work without setting a deadline. If a timezone is set on the charging location at which the smart charging ocurrs, the deadline is interpreted in that timezone, otherwise UTC is used.

minimumChargeLimit number

Immediately charge without regard for energy prices until the vehicle reaches this minimum limit. The hasChargeAboveThreshold Smart Charge consideration uses this value. Defaults to zero.

Sample
{
  "isEnabled": true,
  "deadline": "08:00",
  "minimumChargeLimit": 0
}
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

The hour-minute deadline for fully charging the vehicle. Smart charging does not work without setting a deadline. If a timezone is set on the charging location at which the smart charging ocurrs, the deadline is interpreted in that timezone, otherwise UTC is used.

minimumChargeLimit number

Immediately charge without regard for energy prices until the vehicle reaches this minimum limit. The hasChargeAboveThreshold Smart Charge consideration uses this value. Defaults to zero.

Sample
{
  "isEnabled": true,
  "deadline": "08:00",
  "minimumChargeLimit": 0
}

Response

200
Attributes
isEnabled boolean

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

deadline string

The hour-minute deadline for fully charging the vehicle. Smart charging does not work without setting a deadline. If a timezone is set on the charging location at which the smart charging ocurrs, the deadline is interpreted in that timezone, otherwise UTC is used.

minimumChargeLimit number

Immediately charge without regard for energy prices until the vehicle reaches this minimum limit. The hasChargeAboveThreshold Smart Charge consideration uses this value. Defaults to zero.

Sample
{
  "isEnabled": true,
  "deadline": "08:00",
  "minimumChargeLimit": 0
}
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, PLAN:EXECUTING:STOPPING, PLAN:EXECUTING:STOP_FAILED, PLAN:EXECUTING:STOPPED, PLAN:EXECUTING:STARTING, PLAN:EXECUTING:START_FAILED, PLAN:EXECUTING:STARTED, PLAN:EXECUTING:CHARGE_INTERRUPTED, PLAN:EXECUTING:OVERRIDDEN, PLAN:ENDED:FINISHED, PLAN:ENDED:UNPLUGGED, PLAN:ENDED:FAILED, PLAN:ENDED:DISABLED, or PLAN:ENDED:DEADLINE_CHANGED

stateChangedAt string<date-time>

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

object

null by default, but during the CONSIDERING state, the value is populated with a list of all the requirements that must be true before a plan will be created

object

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

object Non-empty

This field is only populated after calling the vehicle or charger External Start 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 External Start override remains in place until the target stops charging for any reason, or until the External Start is ended via the Delete vehicle or charger External Start APIs.

Sample
{
  "updatedAt": "2019-08-24T14:15:22Z",
  "vehicleId": "string",
  "userId": "string",
  "vendor": "string",
  "state": "DISABLED",
  "stateChangedAt": "2019-08-24T14:15:22Z",
  "consideration": {
    "isSmartChargeCapable": true,
    "isPluggedIn": true,
    "isCharging": true,
    "recentlyAtChargingLocation": true,
    "hasTimeEstimate": true,
    "needsSignificantCharge": true,
    "hasChargeAboveThreshold": true,
    "singleUser": true,
    "wontStopExistingChargingSession": true,
    "likelyToGenerateSavings": true,
    "confidentBatteryCapacity": true,
    "atChargingLocation": true,
    "locationIsFresh": true,
    "confidentTimeEstimate": true,
    "needsCharge": true,
    "priceDataAvailable": true,
    "minimumSavings": true,
    "minimumDelay": true,
    "isNormalSchedule": true,
    "noCommittedDelay": true
  },
  "plan": {
    "id": "string",
    "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
    "vehicleId": "string",
    "userId": "string",
    "vendor": "string",
    "currency": "NOK",
    "nonSmartCost": 0,
    "smartCost": 0,
    "stopAt": "2019-08-24T14:15:22Z",
    "startAt": "2019-08-24T14:15:22Z",
    "estimatedFinishAt": "2019-08-24T14:15:22Z",
    "stopConfirmedAt": "2019-08-24T14:15:22Z",
    "startConfirmedAt": "2019-08-24T14:15:22Z",
    "endedAt": "2019-08-24T14:15:22Z",
    "finalState": "PLAN:ENDED:FINISHED",
    "failureCondition": "STOP_FAILED"
  },
  "externalStart": {
    "createdAt": "2020-04-07T17:04:26Z",
    "endedAt": "2020-04-07T17:04:26Z",
    "targetType": "vehicle",
    "targetId": "8d90101b3f2f",
    "vendorActionId": "string"
  }
}
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 Non-empty

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

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

Estimated cost achieved by this Smart Charge plan

stopAt string<date-time>

Time at which the vehicle will stop charging

startAt string<date-time>

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>

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

startConfirmedAt string<date-time>

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

endedAt string<date-time>

The actual time at which the plan ended

finalState string

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

If the finalState was PLAN:ENDED:FAILED, failureCondition is populated with the condition in which the plan failed.

One of STOP_FAILED, START_FAILED, or FINISHED_LATE

Sample
{
  "id": "string",
  "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "vehicleId": "string",
  "userId": "string",
  "vendor": "string",
  "currency": "NOK",
  "nonSmartCost": 0,
  "smartCost": 0,
  "stopAt": "2019-08-24T14:15:22Z",
  "startAt": "2019-08-24T14:15:22Z",
  "estimatedFinishAt": "2019-08-24T14:15:22Z",
  "stopConfirmedAt": "2019-08-24T14:15:22Z",
  "startConfirmedAt": "2019-08-24T14:15:22Z",
  "endedAt": "2019-08-24T14:15:22Z",
  "finalState": "PLAN:ENDED:FINISHED",
  "failureCondition": "STOP_FAILED"
}
Was this section helpful?

Create External Start

POST /vehicles/{vehicleId}/external-start

Forces a vehicle to start charging. Any active Schedules or Smart Charging plans will transition to an overridden state and will cease dispatching Vendor Actions to the vehicle. An External Start does not cancel a Smart Charging Plan - it only enables charging. This endpoint allows the user to enable charging immediately, without worrying about disabling Schedules or Smart Charging. The override remains active until the vehicle stops charging, or until the Delete External Start endpoint is called.

Request

Path parameters
vehicleId string Required

ID of the Vehicle.

Response

200
Attributes
createdAt string<date-time>

ISO8601 UTC timestamp at which the external start was created.

endedAt string<date-time> Non-empty

ISO8601 UTC timestamp at which the external start was ended. If null, the External Start override is still active.

targetType string

The Vendor Type of the target entity this External Start is referencing.

One of vehicle or charger

targetId string

ID of the asset (Vehicle or Charger) to which this External Start applies.

vendorActionId string

The ID of Vendor Action responsible for starting charging on the target. Use the Vehicle Get Action or the Charger Get Action endpoints to monitor action results.

Sample
{
  "createdAt": "2020-04-07T17:04:26Z",
  "endedAt": "2020-04-07T17:04:26Z",
  "targetType": "vehicle",
  "targetId": "8d90101b3f2f",
  "vendorActionId": "string"
}
Was this section helpful?

End External Start

DELETE /vehicles/{vehicleId}/external-start

Ends any active External Start 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 external start was created.

endedAt string<date-time> Non-empty

ISO8601 UTC timestamp at which the external start was ended. If null, the External Start override is still active.

targetType string

The Vendor Type of the target entity this External Start is referencing.

One of vehicle or charger

targetId string

ID of the asset (Vehicle or Charger) to which this External Start applies.

vendorActionId string

The ID of Vendor Action responsible for starting charging on the target. Use the Vehicle Get Action or the Charger Get Action endpoints to monitor action results.

Sample
{
  "createdAt": "2020-04-07T17:04:26Z",
  "endedAt": "2020-04-07T17:04:26Z",
  "targetType": "vehicle",
  "targetId": "8d90101b3f2f",
  "vendorActionId": "string"
}

Other responses

Response 404

No Active External Start Exists

Attributes
type string
title string
detail string
Sample
{
  "type": "string",
  "title": "string",
  "detail": "string"
}
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 Webhook endpoint.

See the related guide for more information about timeouts, failures, and retry logic: Using Webhooks

Test Firehose Webhook

POST /webhooks/firehose/test

Trigger a "enode:firehose:test" payload to be sent to your configured Firehose Webhook URL. This will reset your webhook to a healthy state on success.

Response

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
Sample
{
  "status": "SUCCESS",
  "description": "string",
  "response": {
    "code": 0,
    "body": "string",
    "headers": "string"
  }
}
Was this section helpful?

Update Firehose Webhook

PUT /webhooks/firehose

Request

Attributes
secret string

A cryptographically secure secret, generated and provided by your client

url string

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

Delete Firehose Webhook

DELETE /webhooks/firehose

Request

Attributes
url string

The HTTPS url of the webhook to be deleted

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

Other responses

Response 404

Webhook not found

Was this section helpful?