Enode Developers

Enode API 2024-01-01

This reference provides a comprehensive overview of the Enode API endpoints for accessing and controlling its hardware and features. The API follows REST principles, and uses OAuth 2.0.

This page features detailed documentation for each of our endpoints. You can also explore our API through our updated OpenAPI specifications or Postman collection.

The API is versioned, and all documentation on this page, including the links to the OpenAPI specifications and Postman collection is specific to the selected version.

Environments

We provide multiple environments, each with unique data access policies, and live/mocked vendors.

Environments are isolated from each other. Client credentials are tied to a specific environment and cannot be reused across environments.

Copy linkProduction

Features the latest stable software, live vendors, and strict data access controls.

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

Copy linkSandbox

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

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

Authentication

The Enode API uses OAuth 2.0 client access tokens for authenticating server requests.

Copy linkAPI credentials

Enode API access begins with a client and its corresponding client ID and client secret. Clients organize data, are separate, and relate to a specific environmentAPI.

API credentials are used to obtain an access tokenAPI for accessing the entire APIAPI

Key Description
Client IDThe identifier for your client, referred to as the client_id.
Client secretThe secret for your client, referred to as the client_secret.

Copy linkGetting an access token

The access token authorizes client access to all data and functionality. Obtain it via the OAuth 2.0 client credentials grant using the API credentialsAPI and the relevant OAuth URLsAPI for your client's environment.

Token request example

curl https://oauth.{YOUR_CLIENT_ENVIRONMENT}.enode.io/oauth2/token \
-X POST \
-u {YOUR_CLIENT_ID}:{YOUR_CLIENT_SECRET} \
-d "grant_type=client_credentials"

After requesting the token URL, you'll receive an access token in the response. Cache this token on your server until it expires and needs refreshingAPI. Keep the access token secret.

Token response example

{
	"access_token": "{YOUR_ACCESS_TOKEN}",
	"expires_in": 3599,
	"scope": "",
	"token_type": "bearer"
}

Copy linkRefreshing access tokens

Access tokens expire hourly, indicated by the expires_in key in the response. When expired, obtain a new tokenAPI.

Copy linkAccessing the API with the access token

Authenticate all API requests using a bearer authentication header. This header accesses client-wide endpoints (service healthAPI, tariffsAPI, user managementAPI, and webhooksAPI).

Type Value
HeaderAuthorization: Bearer {YOUR_ACCESS_TOKEN}

Client resource request example

curl https://enode-api.{YOUR_CLIENT_ENVIRONMENT}.enode.io/health/ready \
-H "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
Was this helpful?

Response times

Enode resources like Schedules and Locations have response times of <200ms. However, vehicle interactions involve various delays and timing characteristics.

Understanding the range of possible timings without diving into vendor-specific causes, helps you account for these factors in your UX design.

Copy linkAPI GET requests

Copy linkGet Vehicle

Get Vehicles and List Vehicles are fast operations since all data is prefetched by Enode and shared from a cache.

On API versions prior to 2023-08-01 it is possible to request a synchronous update where data is fetched directly from the vendor. Such requests have longer response times, sometimes 30 seconds or more, depending on the characteristics of the underlying vendor APIs. From 2023-08-01 onwards this has been replaced by the refresh hintAPI mechanism.

The Login step usually takes <2 seconds, but can rarely take up to 30 seconds due to background negotiations, retries, and initial vehicle data fetching.

The final Accept step experiences similar delays as List Vehicles.

Copy linkCharging commands

Charging commands show significant timing variability among vendors. Initiating the action is instant, but the updated charging state typically takes 20 seconds to appear. Occasionally the action may take 5 minutes or more to confirm.

Copy linkWebhooks

Webhooks usually involve polling and dynamically adjust the polling rate based on different situations to provide prompt updates without overloading the vehicle.

The maximum baseline delay between a real-world change (e.g., a vehicle being plugged in) and the resulting webhook notification is 7 minutes.

Vehicle contextMaximum delay
default7 minutes
charging2 minutes
smartcharge PLAN:*2 minutes
sleeping20 minutes

If you'd like to request a faster refresh, you can call the various /refresh-hint endpoints found on devices to queue an accelerated data refresh.

Was this helpful?

Scopes

Access to the data and controls of a device are scoped by an inclusive scopes structure. The scopes are requested in the Link user endpoint via the scopes parameter. Scopes are presented to your user in Link UI, and explained through example data and examples of features enabled by each scope. Your user is not able to de-select or configure scopes themselves in Link UI.

  • Data scopes includes all data and state we fetch from the device, excluding location data, and is always required (e.g vehicle:read:data)
  • Location scopes include the location coordinates of the device (e.g. vehicle:read:location)
  • Control scopes are always explicit to the type of control that is requested (e.g. vehicle:control:charging)

The applied scopes are surfaced through the scopes object in device responses (see example below).

Copy linkOverview of scopes

Asset type Scope Description
Batterybattery:control:operation_modeControls the operation mode of the battery
battery:read:locationReads the GPS coordinates of the battery
battery:read:dataReads the battery data, such as the charge state, configuration and general information
Chargercharger:control:chargingControls the max current configuration and/or charging of the charger
charger:read:dataReads the charger data, such as the charge state and general information
HVAChvac:control:modeControls the mode (permanent hold or follow schedule) of the HVAC unit
hvac:read:dataReads the HVAC data, such as the information, thermostat state and temperature state
Inverterinverter:read:dataReads the inverter data, such as the production state and general information
inverter:read:locationReads the GPS coordinates of the inverter
Metermeter:read:locationReads the GPS coordinates of the meter
meter:read:dataReads the meter data, such as energy state and general information
Vehiclevehicle:control:chargingControls the charging of the vehicle
vehicle:read:dataReads the vehicle data, such as charge state, odometer and general information
vehicle:read:locationReads the GPS coordinates of the vehicle

Copy linkHandling excluded scopes

Copy linkThe relationship between scopes and capabilities

If a device is missing a scope, e.g. a charger that does not have the charger:control:charging scope set, will always have the charging related capabilities will always be set as isCapable: false with no intervention specified.

Example charger response

{
  "id": "2211e263-0362-4235-83f4-887bdf3ee414",
  "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
  "vendor": "ZAPTEC",
  "lastSeen": "2023-03-21T21:08:27.596Z",
  "isReachable": true,
  "locationId": "2211e263-d6d4-d6d4-d6d4-dbdd77ec82b6",
  "scopes": ["charger:read:data"], // Scopes applied to the device
  "chargeState": { ... },
  "information": { ... },
  "capabilities": {
    "information": {
      "isCapable": true, // Capable via the charger:read:data scope
      "interventionIds": []
    },
    "chargeState": {
      "isCapable": true, // Capable via the charger:read:data scope
      "interventionIds": []
    },
    "startCharging": {
      "isCapable": false, // Missing charger:control:charging scope
      "interventionIds": []
    },
    "stopCharging": {
      "isCapable": false, // Missing charger:control:charging scope
      "interventionIds": []
    },
    "setMaxCurrent": {
      "isCapable": false, // Missing charger:control:charging scope
      "interventionIds": []
    }
  }
}

Copy linkResponses when the location scope is excluded

Devices with a missing location scopes will respond with longitude: null and latitude: null as part of their location object.

Copy linkResponses when a control scopes is excluded

Devices with missing control scopes will respond with a 403 error, and the action or command will not go through to the device.

Copy linkApplying new scopes to a device

To set new scopes for a device, it needs to be re-linked via the Link userAPI endpoint by setting new scope values in the scopes parameter.

Was this helpful?

Errors and problems

Copy linkOAuth Authorization Request

Upon completing the Enode Link authorization process, the user will be redirected to your configured redirect URI. If an issue occurs, query parameters error and error_description will be set as described in Section 4.1.2.1 of the OAuth 2.0 specification:

Error Error description
invalid_requestThe request has a missing or invalid parameter, duplicate parameters, or is malformed.
unauthorized_clientThe client isn't authorized to request an authorization code with this method.
access_deniedThe resource owner or authorization server denied the request.
unsupported_response_typeThe authorization server doesn't support obtaining an authorization code with this method.
invalid_scopeThe requested scope is invalid, unknown, or malformed.
server_errorThe authorization server encountered an unexpected condition that prevented it from fulfilling the request.
temporarily_unavailableThe authorization server is temporarily unable to handle the request due to overloading or maintenance.

Sample

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

Copy linkErrors when accessing a User's resources

When using an access_token to access a user's resources, you may encounter the following 4XX range HTTP Status Codes:

HTTP Status CodeExplanation
400 Bad RequestThe request payload failed schema validation or parsing
401 UnauthorizedMissing or invalid authentication details
403 ForbiddenAuthentication succeeded, but the user lacks access to the resource due to a missing control scope.
404 Not FoundRequested resource doesn't exist
405 Method Not AllowedVendor unavailability prevented request completion
408 Request TimeoutVendor timeout prevented request completion
409 ConflictVendor rejection prevented request completion
424 Failed DependencyFailed vendor requests prevented request completion
429 Too Many RequestsVendor rate limiting prevented request completion

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

Sample

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

Copy linkProblems

TitleDescription
Bad request

Some part of the request was malformed. See associated detail message for more information.

Enode Controlled Entity

This entity is currently managed by Smart Charging or Schedules and cannot accept manual commands. Either disable the feature controlling the target, or force charging to start through our External Start APIAPI.

Entity Not Found

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

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.

Server Error

A critical error has ocurred. An employee has been alerted and will work to remedy the situation

Service Unavailable

The service is currently unavailable. Most likely the service was slow to respond, might be overloaded or down for maintenance. Other endpoints might still be available.

You may want to retry the request using a randomized backoff delay.

Check the Enode Status page if this problem persists.

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.

Was this helpful?

Versioning

Versioning

Enode's REST API is versioned. A dated version is released when breaking changes occur, while new features and bug fixes (additive changes) are available in all supported API versions.

You can view all available versions and updates in the changelog.

API clients are pinned to the latest API version upon creation, affecting all API requests and webhook events. API responses include an Enode-Version header, and webhook events have a version field.

You can override the API version on a specific request by sending an Enode-Version in the request header.

Breaking changes

Breaking changes will be released as a new version. When a new version is released, the previous version is supported for six months before deactivation. Enode staff will notify you in advance. Each API version comes with a migration guide explaining changes and upgrade suggestions.

We consider the following breaking changes

  • Changing a request’s authorization or authentication requirements
  • Adding a new required input parameter
  • Changing input validation
  • Removing an HTTP route or method
  • Removing or renaming a response parameter
  • Adding a new case to a response field documented as an enum.

All other additive changes are considered backwards compatible.

Deprecation

Deprecated means that a particular feature, endpoint, or field is marked for removal in a future version of the API. When something is marked as deprecated, it's a signal for you to update your application to use alternative features or methods we provide. While the deprecated item will continue to work in the current version, it will be removed in a future version of the API. When we deprecate an item, we will mark it as deprecated through all the previous versions. Once a version without the item is released, the deprecated feature, endpoint, or field will still be supported in the previous version for six months. After six months, using the deprecated item will return an error. Enode staff will notify you before any item is removed.

Was this helpful?

Pagination

Enode endpoints returning collections of a specific type of resource, such as GET /vehicles, will return a paginated response. Each response will consist of a subset of the resources, called a page. To retrieve the entire collection, subsequent pages need to be fetched.

Each response includes two properties: data and pagination. The data property contains the records of the current page and the pagination property contains cursors that can be used to fetch additional pages. These cursors, before and after, are unique identifiers for specific records in the dataset that help you keep track of your position and navigate through the pages.

Copy linkQuerying a paginated API endpoint

When querying a paginated endpoint, you may provide the following pagination query parameters:

Pagination query parameter example

{
  "pageSize": 50,
  "before": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
  "after": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
}

All of these pagination query parameters are optional. If pageSize is not provided, the default page size of 50 is used. If neither before nor after are provided, the returned page will contain the first set of resources in the collection.

The before and after parameters are mutually exclusive. If both are supplied, the API will return an error.

Responses from most paginated endpoints are sorted in descending order according to when the resource was created. Hence, for a request like GET /vehicles, the most recently linked vehicles appear on the first page.

Copy linkHow to navigate through paginated API responses

The pagination property in a paginated response typically looks like this:

Pagination property example

"pagination": {
  "before": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
  "after": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
}

The pagination property provides the cursors required to fetch the next and previous pages of resources:

  • before contains the cursor to be used to fetch the previous page.
  • after contains the cursor to be used to fetch the next page.

One or both cursors may be null instead of a string. This occurs when:

  • You are on the first page. There are no preceding resources, so before will now be null as otherwise it would point to an empty page.
  • You are on the last page. There are no subsequent resources, so after will now be null as otherwise it would point to an empty page.
  • The entire collection fits on the first page. There are no preceding or subsequent resources, so both before and after are null.

Copy linkFull example response

Example paginated response

{
    "data": [
        {
            "id": "0",
            "vendor": "TESLA",
            ...
            "isReachable": true
        },
        ...
        {
            "id": "49",
            "vendor": "TESLA",
            ...
            "isReachable": true
        }
    ],
    "pagination": {
        "before": null,
        "after": "MjAyMy0wNy0xOFQxMDowNDowMi4zNzNa"
    }
}

In this example, the data array includes the resource records for the current page. The pagination object provides the cursors for navigating to adjacent pages.

Was this helpful?

Batteries

The Battery object represents a residential energy storage unit, like a Tesla Powerwall or Enphase IQ. It offers detailed insights into the battery's operation and allows you to instruct the battery on handling its stored energy.

List Batteries

Beta
GET /batteries

Returns a paginated list of all Batteries.

Request

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of batteries

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "54d827e1-8355-4fed-97b5-55940d1d09ba",
      "userId": "4f6fecd0-bdae-49be-b6e8-ee442e1e3da9",
      "vendor": "TESLA",
      "locationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
      "lastSeen": "2020-04-07T17:04:26Z",
      "isReachable": true,
      "chargeState": {
        "status": "CHARGING",
        "batteryCapacity": 13.5,
        "batteryLevel": 80,
        "chargeRate": 4.6,
        "lastUpdated": "2020-04-07T17:04:26Z"
      },
      "config": {
        "operationMode": "IMPORT_FOCUS",
        "lastUpdated": "2020-04-07T17:04:26Z"
      },
      "information": {
        "id": "7deb27f8-794f-467b-855e-5c61dd9f2cb3",
        "brand": "string",
        "model": "Powerwall",
        "siteName": "Powerwall Home",
        "installationDate": "2020-04-07T17:04:26Z"
      },
      "location": {
        "longitude": 10.7197486,
        "latitude": 59.9173985
      },
      "capabilities": {
        "exportFocus": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        },
        "importFocus": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        },
        "timeOfUse": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        },
        "selfReliance": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        }
      },
      "scopes": [
        "string"
      ]
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

List User Batteries

Beta
GET /users/{userId}/batteries

Returns a paginated list of batteries for the given userId.

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of batteries

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "54d827e1-8355-4fed-97b5-55940d1d09ba",
      "userId": "4f6fecd0-bdae-49be-b6e8-ee442e1e3da9",
      "vendor": "TESLA",
      "locationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
      "lastSeen": "2020-04-07T17:04:26Z",
      "isReachable": true,
      "chargeState": {
        "status": "CHARGING",
        "batteryCapacity": 13.5,
        "batteryLevel": 80,
        "chargeRate": 4.6,
        "lastUpdated": "2020-04-07T17:04:26Z"
      },
      "config": {
        "operationMode": "IMPORT_FOCUS",
        "lastUpdated": "2020-04-07T17:04:26Z"
      },
      "information": {
        "id": "7deb27f8-794f-467b-855e-5c61dd9f2cb3",
        "brand": "string",
        "model": "Powerwall",
        "siteName": "Powerwall Home",
        "installationDate": "2020-04-07T17:04:26Z"
      },
      "location": {
        "longitude": 10.7197486,
        "latitude": 59.9173985
      },
      "capabilities": {
        "exportFocus": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        },
        "importFocus": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        },
        "timeOfUse": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        },
        "selfReliance": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        }
      },
      "scopes": [
        "string"
      ]
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

Get Battery

Beta
GET /batteries/{batteryId}

Request

Path parameters
batteryId string Required

The ID of the battery to look up.

Response

200
Attributes
id string<uuid>

Unique identifier for the battery object

userId string

The ID of the user that linked this battery.

vendor string

Machine-friendly name of the vendor. Use this in API requests.

One of TESLA or ENPHASE

locationId string<uuid> or null

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

lastSeen string<date-time>

The last time Enode successfully communicated with the vendor or when the battery was initially linked.

isReachable boolean

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

object
object
object

Descriptive information about the battery

object

Battery's GPS coordinates

object

A collection of descriptors that describe the capabilities of this specific battery

scopes array of string

Scopes that the user has granted for this battery.

Sample
{
  "id": "54d827e1-8355-4fed-97b5-55940d1d09ba",
  "userId": "4f6fecd0-bdae-49be-b6e8-ee442e1e3da9",
  "vendor": "TESLA",
  "locationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "lastSeen": "2020-04-07T17:04:26Z",
  "isReachable": true,
  "chargeState": {
    "status": "CHARGING",
    "batteryCapacity": 13.5,
    "batteryLevel": 80,
    "chargeRate": 4.6,
    "lastUpdated": "2020-04-07T17:04:26Z"
  },
  "config": {
    "operationMode": "IMPORT_FOCUS",
    "lastUpdated": "2020-04-07T17:04:26Z"
  },
  "information": {
    "id": "7deb27f8-794f-467b-855e-5c61dd9f2cb3",
    "brand": "string",
    "model": "Powerwall",
    "siteName": "Powerwall Home",
    "installationDate": "2020-04-07T17:04:26Z"
  },
  "location": {
    "longitude": 10.7197486,
    "latitude": 59.9173985
  },
  "capabilities": {
    "exportFocus": {
      "isCapable": false,
      "interventionIds": [
        "4eaeb363-296d-4ccc-a973-7805e6f400bd"
      ]
    },
    "importFocus": {
      "isCapable": false,
      "interventionIds": [
        "4eaeb363-296d-4ccc-a973-7805e6f400bd"
      ]
    },
    "timeOfUse": {
      "isCapable": false,
      "interventionIds": [
        "4eaeb363-296d-4ccc-a973-7805e6f400bd"
      ]
    },
    "selfReliance": {
      "isCapable": false,
      "interventionIds": [
        "4eaeb363-296d-4ccc-a973-7805e6f400bd"
      ]
    }
  },
  "scopes": [
    "string"
  ]
}
Was this helpful?

Set Operation Mode for Battery

Beta
POST /batteries/{batteryId}/operation-mode

Request an operationMode change for a battery. This request creates an Action that will retry until the battery's operationMode matches the expected value. The Action must complete before any further commands can be sent to the battery. Only one Action can be active for a specific battery at a time. If a new Action is created, the previous Action will be automatically cancelled and transitioned to the CANCELLED state. Transitions can be tracked via the user:vendor-action:updated webhook event or Get Operation Mode ActionAPI.

Request

Path parameters
batteryId string Required

The ID of the battery being targeted.

Attributes
operationMode string Required

Desired operation mode of the battery.

  • IMPORT_FOCUS: Prioritizes charging the battery. Draws power from the grid and any excess solar for charging.
  • EXPORT_FOCUS: Prioritizes discharging energy stored in the battery back to the grid.
  • TIME_OF_USE: Maximizes energy cost savings in accordance with a user-defined utility rate plan. Energy may be consumed from solar, battery, or grid sources, depending on the current prices and your user's settings in the OEM app. Energy may be exported to the grid from solar or battery sources, depending on current prices and your user's settings in the OEM app.
  • SELF_RELIANCE: Minimizes household reliance on the grid. Prioritize using own energy from solar or battery for household consumption before importing from grid. Energy may be exported to the grid from solar, depending on excess solar and your user's settings in the OEM app.

One of IMPORT_FOCUS, EXPORT_FOCUS, TIME_OF_USE, or SELF_RELIANCE

Sample
{
  "operationMode": "IMPORT_FOCUS"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

ID of the battery which this action is controlling.

targetType string

One of battery

object

Target battery operation mode

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "ac03a513-5494-4e1c-9dd7-2a29dc024312",
  "targetType": "battery",
  "targetState": {
    "operationMode": "IMPORT_FOCUS"
  }
}

Other responses

Response 400

A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the battery cannot perform the action.

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Was this helpful?

Get Operation Mode Action

Beta
GET /batteries/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.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

ID of the battery which this action is controlling.

targetType string

One of battery

object

Target battery operation mode

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "ac03a513-5494-4e1c-9dd7-2a29dc024312",
  "targetType": "battery",
  "targetState": {
    "operationMode": "IMPORT_FOCUS"
  }
}

Other responses

Response 404

Action not found.

Was this helpful?

Cancel Battery Action

Beta
POST /batteries/actions/{actionId}/cancel

Cancels a pending battery Action, halting any further attempts by Enode to execute it.

Note: This only updates the Action's status to CANCELLED within Enode and does not reflect a change in the vendor's cloud. Thus any pending Action in the vendor's cloud might still be executed.

Request

Path parameters
actionId string Required

ID of the Action.

Response

200
Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

ID of the battery which this action is controlling.

targetType string

One of battery

object

Target battery operation mode

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "ac03a513-5494-4e1c-9dd7-2a29dc024312",
  "targetType": "battery",
  "targetState": {
    "operationMode": "IMPORT_FOCUS"
  }
}

Other responses

Response 404

Action not found.

Response 409

Action already in a resolved state and can therefore not be cancelled.

Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

targetId string

ID of the battery which this action is controlling.

targetType string

One of battery

object

Target battery operation mode

state string

The real-time status of an action executed on a target.

  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of CONFIRMED, FAILED, or CANCELLED

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "targetId": "ac03a513-5494-4e1c-9dd7-2a29dc024312",
  "targetType": "battery",
  "targetState": {
    "operationMode": "IMPORT_FOCUS"
  },
  "state": "CONFIRMED"
}
Was this helpful?

Refresh Battery Data

Beta
POST /batteries/{batteryId}/refresh-hint

Use this endpoint to initiate an expedited data refresh for the specified battery.

Note: The Enode platform keeps data automatically up-to-date and detects changes in the OEM APIs within seconds to a few minutes. We change the refresh interval dynamically based on a number of heuristics. This ensures we find the best trade-off between the stability of the connection to the OEM and freshness of the data.
This method overrides most of our heuristics and should therefore be used with caution. You may use it when you have a strong reason to believe the data might be stale.

Request

Path parameters
batteryId string Required

The ID of the battery being targeted.

Response

204

Refresh hint registered successfully.

Other responses

Response 404

The specified battery was not found.

Was this helpful?

Chargers

EV Chargers provide charging data and can be controlled via Control ChargingAPI and Schedules

List Chargers

GET /chargers

Returns a paginated list of all Chargers.

Request

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of chargers

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "2211e263-0362-4235-83f4-887bdf3ee414",
      "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
      "vendor": "ZAPTEC",
      "lastSeen": "2023-03-21T21:08:27.596Z",
      "isReachable": true,
      "locationId": "2211e263-d6d4-d6d4-d6d4-dbdd77ec82b6",
      "chargeState": {
        "isPluggedIn": true,
        "isCharging": true,
        "chargeRate": 6.939,
        "lastUpdated": "2023-03-21T16:39:20.000Z",
        "maxCurrent": 16,
        "powerDeliveryState": "PLUGGED_IN:CHARGING"
      },
      "information": {
        "brand": "Zaptec",
        "model": "ZAPTEC PRO",
        "year": null
      },
      "capabilities": {
        "information": {
          "isCapable": true,
          "interventionIds": []
        },
        "chargeState": {
          "isCapable": true,
          "interventionIds": []
        },
        "startCharging": {
          "isCapable": true,
          "interventionIds": []
        },
        "stopCharging": {
          "isCapable": true,
          "interventionIds": []
        },
        "setMaxCurrent": {
          "isCapable": false,
          "interventionIds": [
            "dbdd77ec82b6-d6d4-d6d4-d6d4-dbdd77ec82b6"
          ]
        }
      },
      "scopes": [
        "charger:control:charging",
        "charger:read:data"
      ]
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

List User Chargers

GET /users/{userId}/chargers

Returns a paginated list of chargers for the given userId.

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of chargers

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "2211e263-0362-4235-83f4-887bdf3ee414",
      "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
      "vendor": "ZAPTEC",
      "lastSeen": "2023-03-21T21:08:27.596Z",
      "isReachable": true,
      "locationId": "2211e263-d6d4-d6d4-d6d4-dbdd77ec82b6",
      "chargeState": {
        "isPluggedIn": true,
        "isCharging": true,
        "chargeRate": 6.939,
        "lastUpdated": "2023-03-21T16:39:20.000Z",
        "maxCurrent": 16,
        "powerDeliveryState": "PLUGGED_IN:CHARGING"
      },
      "information": {
        "brand": "Zaptec",
        "model": "ZAPTEC PRO",
        "year": null
      },
      "capabilities": {
        "information": {
          "isCapable": true,
          "interventionIds": []
        },
        "chargeState": {
          "isCapable": true,
          "interventionIds": []
        },
        "startCharging": {
          "isCapable": true,
          "interventionIds": []
        },
        "stopCharging": {
          "isCapable": true,
          "interventionIds": []
        },
        "setMaxCurrent": {
          "isCapable": false,
          "interventionIds": [
            "dbdd77ec82b6-d6d4-d6d4-d6d4-dbdd77ec82b6"
          ]
        }
      },
      "scopes": [
        "charger:control:charging",
        "charger:read:data"
      ]
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

Get Charger

GET /chargers/{chargerId}

Request

Path parameters
chargerId string Required

ID of the Charger.

Response

200
Attributes
id string

Charger ID

userId string

The ID of the user that linked this charger.

vendor string

Machine-friendly name of the vendor. Use this in API requests.

One of ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, EVBOX, GOE, CHARGEPOINT, or ENELX

lastSeen string<date-time>

The last time Enode successfully communicated with the charger.

isReachable boolean

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

locationId string<uuid> or null

ID of the 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

scopes array of string

Scopes that the user has granted for this charger.

Sample
{
  "id": "2211e263-0362-4235-83f4-887bdf3ee414",
  "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
  "vendor": "ZAPTEC",
  "lastSeen": "2023-03-21T21:08:27.596Z",
  "isReachable": true,
  "locationId": "2211e263-d6d4-d6d4-d6d4-dbdd77ec82b6",
  "chargeState": {
    "isPluggedIn": true,
    "isCharging": true,
    "chargeRate": 6.939,
    "lastUpdated": "2023-03-21T16:39:20.000Z",
    "maxCurrent": 16,
    "powerDeliveryState": "PLUGGED_IN:CHARGING"
  },
  "information": {
    "brand": "Zaptec",
    "model": "ZAPTEC PRO",
    "year": null
  },
  "capabilities": {
    "information": {
      "isCapable": true,
      "interventionIds": []
    },
    "chargeState": {
      "isCapable": true,
      "interventionIds": []
    },
    "startCharging": {
      "isCapable": true,
      "interventionIds": []
    },
    "stopCharging": {
      "isCapable": true,
      "interventionIds": []
    },
    "setMaxCurrent": {
      "isCapable": false,
      "interventionIds": [
        "dbdd77ec82b6-d6d4-d6d4-d6d4-dbdd77ec82b6"
      ]
    }
  },
  "scopes": [
    "charger:control:charging",
    "charger:read:data"
  ]
}
Was this helpful?

Update Charger

Beta
PUT /chargers/{chargerId}

Update the locationId field on a Charger.

Request

Path parameters
chargerId string Required

ID of the Charger.

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

Response

200
Attributes
id string

Charger ID

userId string

The ID of the user that linked this charger.

vendor string

Machine-friendly name of the vendor. Use this in API requests.

One of ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, EVBOX, GOE, CHARGEPOINT, or ENELX

lastSeen string<date-time>

The last time Enode successfully communicated with the charger.

isReachable boolean

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

locationId string<uuid> or null

ID of the 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

scopes array of string

Scopes that the user has granted for this charger.

Sample
{
  "id": "2211e263-0362-4235-83f4-887bdf3ee414",
  "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
  "vendor": "ZAPTEC",
  "lastSeen": "2023-03-21T21:08:27.596Z",
  "isReachable": true,
  "locationId": "2211e263-d6d4-d6d4-d6d4-dbdd77ec82b6",
  "chargeState": {
    "isPluggedIn": true,
    "isCharging": true,
    "chargeRate": 6.939,
    "lastUpdated": "2023-03-21T16:39:20.000Z",
    "maxCurrent": 16,
    "powerDeliveryState": "PLUGGED_IN:CHARGING"
  },
  "information": {
    "brand": "Zaptec",
    "model": "ZAPTEC PRO",
    "year": null
  },
  "capabilities": {
    "information": {
      "isCapable": true,
      "interventionIds": []
    },
    "chargeState": {
      "isCapable": true,
      "interventionIds": []
    },
    "startCharging": {
      "isCapable": true,
      "interventionIds": []
    },
    "stopCharging": {
      "isCapable": true,
      "interventionIds": []
    },
    "setMaxCurrent": {
      "isCapable": false,
      "interventionIds": [
        "dbdd77ec82b6-d6d4-d6d4-d6d4-dbdd77ec82b6"
      ]
    }
  },
  "scopes": [
    "charger:control:charging",
    "charger:read:data"
  ]
}
Was this helpful?

Control Charging

POST /chargers/{chargerId}/charging

Request for a charger to start or stop charging. This request creates an Action that will retry until the charger's powerDeliveryState matches the expected value. The Action must complete before any further commands are sent to the charger. Only one Action can be active for a specific charger at a time. If a new Action is created, the previous Action will be automatically cancelled and transitioned to the CANCELLED state. Transitions can be tracked via the user:vendor-action:updated webhook event or Get Charger ActionAPI.

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 Create Smart OverrideAPI to temporarily enable charging.

Request

Path parameters
chargerId string Required

ID of the Charger.

Attributes
action string Required

Charging action to perform

One of START or STOP

Sample
{
  "action": "START"
}

Response

200
Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

ID of the target which this action is controlling.

targetType string

One of vehicle or charger

kind string

The charging action to perform

One of START or STOP

object or null

Information about why was this action not executed successfully.

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "bfbccded-8a1c-45a8-bbda-dcaeef29977a",
  "targetType": "vehicle",
  "kind": "START",
  "failureReason": {
    "type": "NO_RESPONSE",
    "detail": "The chargeable device remained unreachable."
  }
}

Other responses

Response 400

A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the charger cannot perform the action, is fully charged, or is already in the desired state.

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Response 422

Charger controlled by a Schedule

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Was this helpful?

Set Max Current

POST /chargers/{chargerId}/max-current

Register for a change of the maxCurrent field on a charger. This request creates an Action that will retry until the charger's maxCurrent matches the expected value. The Action must complete before any further commands are sent to the charger. Only one Action can be active for a specific charger at a time. If a new Action is created, the previous Action will be automatically cancelled and transitioned to the CANCELLED state. Transitions can be tracked via the user:vendor-action:updated webhook event or Get Charger ActionAPI.

Request

Path parameters
chargerId string Required

ID of the Charger.

Attributes
maxCurrent number Required

Desired max current in ampere

Sample
{
  "maxCurrent": 10
}

Response

200
Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

ID of the entity which this action is controlling.

targetType string

One of vehicle or charger

object

Target maximum current for entity

object or null

Information about why was this action not executed successfully.

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "string",
  "targetType": "vehicle",
  "targetState": {
    "maxCurrent": 10
  },
  "failureReason": {
    "type": "NO_RESPONSE",
    "detail": "The chargeable device remained unreachable."
  }
}

Other responses

Response 400

A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the charger cannot perform the action.

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Was this helpful?

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

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

ID of the target which this action is controlling.

targetType string

One of vehicle or charger

kind string

The charging action to perform

One of START or STOP

object or null

Information about why was this action not executed successfully.

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "bfbccded-8a1c-45a8-bbda-dcaeef29977a",
  "targetType": "vehicle",
  "kind": "START",
  "failureReason": {
    "type": "NO_RESPONSE",
    "detail": "The chargeable device remained unreachable."
  }
}

Other responses

Response 404

Action not found.

Was this helpful?

Cancel Charger Action

POST /chargers/actions/{actionId}/cancel

Cancels a pending Action, halting any further attempts by Enode to execute it.

Note: This only updates the Action's status to CANCELLED within Enode and does not reflect a change in the vendor's cloud. Thus any pending Action in the vendor's cloud might still be executed.

Request

Path parameters
actionId string Required

ID of the Action.

Response

200
Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

ID of the target which this action is controlling.

targetType string

One of vehicle or charger

kind string

The charging action to perform

One of START or STOP

object or null

Information about why was this action not executed successfully.

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "bfbccded-8a1c-45a8-bbda-dcaeef29977a",
  "targetType": "vehicle",
  "kind": "START",
  "failureReason": {
    "type": "NO_RESPONSE",
    "detail": "The chargeable device remained unreachable."
  }
}

Other responses

Response 404

Action not found.

Response 409

Action already in a resolved state.

Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

ID of the target which this action is controlling.

targetType string

One of vehicle or charger

kind string

The charging action to perform

One of START or STOP

object or null

Information about why was this action not executed successfully.

Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "bfbccded-8a1c-45a8-bbda-dcaeef29977a",
  "targetType": "vehicle",
  "kind": "START",
  "failureReason": {
    "type": "NO_RESPONSE",
    "detail": "The chargeable device remained unreachable."
  }
}
Was this helpful?

Refresh Charger Data

POST /chargers/{chargerId}/refresh-hint

Use this endpoint to initiate an expedited data refresh for the specified charger.

Note: The Enode platform keeps data automatically up-to-date and detects changes in the OEM APIs within seconds to a few minutes. We change the refresh interval dynamically based on a number of heuristics. This ensures we find the best trade-off between the stability of the connection to the OEM and freshness of the data.
This method overrides most of our heuristics and should therefore be used with caution. You may use it when you have a strong reason to believe the data might be stale.

Request

Path parameters
chargerId string Required

ID of the Charger.

Response

204

Refresh hint registered successfully.

Other responses

Response 404

The specified charger was not found.

Was this helpful?

Create Smart Override

POST /chargers/{chargerId}/smart-override

Overrides an active smart feature by forcing the charger to start charging. This feature is meant to be used in situations where the user wants to charge immediately without disabling other smart features. The override remains active until the charger stops charging, or until the End Smart OverrideAPI endpoint is called. When the override ends, the overridden smart feature will regain control of the charger. This endpoint should not be used for standard charge control, use the Control ChargingAPI endpoint instead.

Request

Path parameters
chargerId string Required

ID of the Charger.

Response

200
Attributes
createdAt string<date-time>

Time at which the smart override was created.

endedAt string<date-time>

Time at which the smart override was ended. If null, the smart override is still active.

targetId string

ID of the target which this smart override is affecting.

vendorActionId string<uuid> or null

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

userId string

ID of the User

string

One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, LEXUS, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, GMC, CADILLAC, XPENG, ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, EVBOX, GOE, CHARGEPOINT, ENELX, TESLA, or ENPHASE

targetType string

One of charger

Sample
{
  "createdAt": "2020-04-07T17:04:26Z",
  "endedAt": "2020-04-07T17:04:26Z",
  "targetId": "07f8368d-be7e-4dbd-8cf0-94d00dd67ad3",
  "vendorActionId": "213ae0a8-fb65-40be-981a-6a86df3e1c7f",
  "userId": "0bec82e0-0d54-4f2f-83b1-5b248604de0b",
  "vendor": "TESLA",
  "targetType": "charger"
}
Was this helpful?

End Smart Override

DELETE /chargers/{chargerId}/smart-override

Ends any active Smart Override for the charger specified by chargerId. If previously configured, Schedules or Smart Charging will resume control over the target charger. Note that this does not mean the charger will stop charging, only that it will return to the state expected by the active Schedule or Smart Charging Plan.

Request

Path parameters
chargerId string Required

ID of the Charger.

Response

200
Attributes
createdAt string<date-time>

Time at which the smart override was created.

endedAt string<date-time>

Time at which the smart override was ended. If null, the smart override is still active.

targetId string

ID of the target which this smart override is affecting.

vendorActionId string<uuid> or null

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

userId string

ID of the User

string

One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, LEXUS, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, GMC, CADILLAC, XPENG, ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, EVBOX, GOE, CHARGEPOINT, ENELX, TESLA, or ENPHASE

targetType string

One of charger

Sample
{
  "createdAt": "2020-04-07T17:04:26Z",
  "endedAt": "2020-04-07T17:04:26Z",
  "targetId": "07f8368d-be7e-4dbd-8cf0-94d00dd67ad3",
  "vendorActionId": "213ae0a8-fb65-40be-981a-6a86df3e1c7f",
  "userId": "0bec82e0-0d54-4f2f-83b1-5b248604de0b",
  "vendor": "TESLA",
  "targetType": "charger"
}

Other responses

Response 404

No Smart Override Exists

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Was this helpful?

Get Smart Charging Policy

Beta
GET /chargers/{chargerId}/smart-charging-policy

Get the configured smart charging policy for this charger.

Request

Path parameters
chargerId string Required

ID of the Charger.

Response

200
Attributes
isEnabled boolean

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

deadline string

The HH:MM deadline for the cycle. If a timezone is set on the charging location at which the smart charging occurs, the deadline is interpreted in that timezone, otherwise UTC is used.

chargingDuration string

The HH:MM charging duration for each cycle.

Sample
{
  "isEnabled": false,
  "deadline": "07:00",
  "chargingDuration": "07:00"
}
Was this helpful?

Update Smart Charging Policy

Beta
PUT /chargers/{chargerId}/smart-charging-policy

Update the configured smart charging policy for this charger.

Request

Path parameters
chargerId string Required

ID of the Charger.

Attributes
isEnabled boolean Optional

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

deadline string Optional

The HH:MM deadline for the cycle. If a timezone is set on the charging location at which the smart charging occurs, the deadline is interpreted in that timezone, otherwise UTC is used.

chargingDuration string Optional

The HH:MM charging duration for each cycle.

Sample
{
  "isEnabled": false,
  "deadline": "07:00",
  "chargingDuration": "07:00"
}

Response

200
Attributes
isEnabled boolean

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

deadline string

The HH:MM deadline for the cycle. If a timezone is set on the charging location at which the smart charging occurs, the deadline is interpreted in that timezone, otherwise UTC is used.

chargingDuration string

The HH:MM charging duration for each cycle.

Sample
{
  "isEnabled": false,
  "deadline": "07:00",
  "chargingDuration": "07:00"
}
Was this helpful?

Get Smart Charging Status

Beta
GET /chargers/{chargerId}/smart-charging-status

Get the current smart charging status for this charger

Request

Path parameters
chargerId string Required

ID of the Charger.

Response

200
Attributes
chargerId string

Charger ID

userId string

User ID

state string

An enum value that describes the current smart charging state of the charger. Every charger is in exactly one state, at all times

One of DISABLED, CHARGER_NOT_REACHABLE, VEHICLE_NOT_PLUGGED_IN, CHARGING_PAUSED, CHARGING, or AWAITING_PRICES

array of Object

Charging intervals for this cycle

Sample
{
  "chargerId": "string",
  "userId": "string",
  "state": "DISABLED",
  "chargingIntervals": [
    {
      "status": "IN_PROGRESS",
      "startTime": "2023-03-21T21:08:27.596Z",
      "endTime": "2023-03-21T21:08:27.596Z"
    }
  ]
}
Was this helpful?

HVAC

HVAC units (heaters, heat pumps, air conditioning, thermostats, etc.) are controlled by altering the mode & target setpoints. This can be done directly using the Set Permanent HoldAPI endpoint, Return to ScheduleAPI, or via Schedules.

List HVAC units

GET /hvacs

Paginated list of HVAC units

Request

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

List of paginated HVAC units

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
      "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
      "vendor": "ADAX",
      "lastSeen": "2020-04-07T17:04:26.000Z",
      "isReachable": true,
      "isActive": true,
      "currentTemperature": 20.8,
      "consumptionRate": 1.8,
      "mode": "HEAT",
      "heatSetpoint": 22,
      "coolSetpoint": 24,
      "holdType": "PERMANENT",
      "information": {
        "brand": "ADAX",
        "model": "Neo Wi-Fi Skirting",
        "displayName": "Bedroom Panel Heater",
        "groupName": "Bedroom",
        "category": "HEATING"
      },
      "capabilities": {
        "capableModes": [
          "HEAT",
          "COOL",
          "OFF"
        ],
        "capableHoldTypes": [
          "PERMANENT"
        ],
        "coolSetpointRange": {
          "min": 15,
          "max": 25
        },
        "heatSetpointRange": {
          "min": 15,
          "max": 25
        },
        "setpointDifferenceRange": {
          "min": 15,
          "max": 25
        },
        "setFollowSchedule": {
          "isCapable": true,
          "interventionIds": []
        },
        "setPermanentHold": {
          "isCapable": true,
          "interventionIds": []
        }
      },
      "thermostatState": {
        "mode": "HEAT",
        "heatSetpoint": 22,
        "coolSetpoint": 24,
        "holdType": "PERMANENT",
        "lastUpdated": "2020-04-07T17:04:26.000Z"
      },
      "temperatureState": {
        "currentTemperature": 20.8,
        "isActive": true,
        "lastUpdated": "2020-04-07T17:03:26.000Z"
      },
      "scopes": [
        "hvac:control:mode",
        "hvac:read:data"
      ],
      "locationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

List User HVAC units

GET /users/{userId}/hvacs

Paginated list of HVAC units for the given User

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

List of paginated HVAC units

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
      "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
      "vendor": "ADAX",
      "lastSeen": "2020-04-07T17:04:26.000Z",
      "isReachable": true,
      "isActive": true,
      "currentTemperature": 20.8,
      "consumptionRate": 1.8,
      "mode": "HEAT",
      "heatSetpoint": 22,
      "coolSetpoint": 24,
      "holdType": "PERMANENT",
      "information": {
        "brand": "ADAX",
        "model": "Neo Wi-Fi Skirting",
        "displayName": "Bedroom Panel Heater",
        "groupName": "Bedroom",
        "category": "HEATING"
      },
      "capabilities": {
        "capableModes": [
          "HEAT",
          "COOL",
          "OFF"
        ],
        "capableHoldTypes": [
          "PERMANENT"
        ],
        "coolSetpointRange": {
          "min": 15,
          "max": 25
        },
        "heatSetpointRange": {
          "min": 15,
          "max": 25
        },
        "setpointDifferenceRange": {
          "min": 15,
          "max": 25
        },
        "setFollowSchedule": {
          "isCapable": true,
          "interventionIds": []
        },
        "setPermanentHold": {
          "isCapable": true,
          "interventionIds": []
        }
      },
      "thermostatState": {
        "mode": "HEAT",
        "heatSetpoint": 22,
        "coolSetpoint": 24,
        "holdType": "PERMANENT",
        "lastUpdated": "2020-04-07T17:04:26.000Z"
      },
      "temperatureState": {
        "currentTemperature": 20.8,
        "isActive": true,
        "lastUpdated": "2020-04-07T17:03:26.000Z"
      },
      "scopes": [
        "hvac:control:mode",
        "hvac:read:data"
      ],
      "locationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

Get HVAC unit Smart Policy

Beta
GET /hvacs/{hvacId}/smart-policy

Get HVAC unit smart policy

Request

Path parameters
hvacId string Required

ID of the HVAC unit.

Response

200
Attributes
isEnabled boolean

When enabled, this HVAC unit is under smart control.

Sample
{
  "isEnabled": false
}
Was this helpful?

Update HVAC unit Smart Policy

Beta
PUT /hvacs/{hvacId}/smart-policy

Updates the smart policy for an HVAC unit

Request

Path parameters
hvacId string Required

ID of the HVAC unit.

Attributes
isEnabled boolean Optional

When enabled, this HVAC unit is under smart control.

Sample
{
  "isEnabled": false
}

Response

200
Attributes
isEnabled boolean

When enabled, this HVAC unit is under smart control.

Sample
{
  "isEnabled": false
}
Was this helpful?

Get Smart HVAC unit Status

Beta
GET /hvacs/{hvacId}/smart-status

Get the status of a smart HVAC unit

Request

Path parameters
hvacId string Required

ID of the HVAC unit.

Response

200
Attributes
hvacId string

ID of the HVAC unit.

userId string

ID of the user who owns the HVAC unit.

array of Object
Sample
{
  "hvacId": "8f39fa8d-8f10-4984-a319-741dc23848c0",
  "userId": "8f39fa8d-8f10-4984-a319-741dc23848c0",
  "intervals": [
    {
      "from": "10:00",
      "to": "11:00",
      "heatSetpoint": 20
    }
  ]
}
Was this helpful?

Set Location for an HVAC unit

PUT /hvacs/{hvacId}

Update the locationId field on an HVAC unit.

Request

Path parameters
hvacId string Required

ID of the HVAC unit.

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

Response

200
Attributes
id string

HVAC unit ID

userId string

The ID of the user that linked this hvac.

vendor string

Machine-friendly name of the vendor. Use this in API requests.

One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, MICROMATIC, NIBE, PANASONIC, TOSHIBA, DAIKIN, NEST, FUJITSU, or BOSCH

lastSeen string<date-time>

The last time Enode successfully communicated with the vendor or when the HVAC unit was initially linked.

isReachable boolean

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

consumptionRate number or null

The current rate of energy consumption in kW. An inactive HVAC will have a consumption rate of 0. HVACs not supporting consumption rate will report null. This value is currently only supported by a small number of devices.

object

Descriptive information about the HVAC unit

object

An object describing valid states for this HVAC unit.

object

An object grouping the latest temperature information. These values replace the deprecated top-level fields and include a freshness indicator.

object

An object grouping the latest thermostat state. These values replace the deprecated top-level fields and include a freshness indicator.

mode string Deprecated

Replaced by thermostatState.mode. The HVAC's mode.

One of OFF, AUTO, COOL, or HEAT

heatSetpoint number or null Deprecated

Replaced by thermostatState.heatSetpoint. If mode allows, heat when currentTemperature falls below this point.

coolSetpoint number or null Deprecated

Replaced by thermostatState.coolSetpoint. If mode allows, cool when currentTemperature rises above this point.

holdType string Deprecated

Replaced by thermostatState.holdType. 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

isActive boolean Deprecated

Replaced by temperatureState.isActive. Whether the HVAC unit is actively heating or cooling.

currentTemperature number or null Deprecated

Replaced by temperatureState.currentTemperature. Current air temperature reported by device in degrees Celsius.

scopes array of string

Scopes that the user has granted for this HVAC unit.

locationId string<uuid> or null

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

Sample
{
  "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
  "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
  "vendor": "ADAX",
  "lastSeen": "2020-04-07T17:04:26.000Z",
  "isReachable": true,
  "isActive": true,
  "currentTemperature": 20.8,
  "consumptionRate": 1.8,
  "mode": "HEAT",
  "heatSetpoint": 22,
  "coolSetpoint": 24,
  "holdType": "PERMANENT",
  "information": {
    "brand": "ADAX",
    "model": "Neo Wi-Fi Skirting",
    "displayName": "Bedroom Panel Heater",
    "groupName": "Bedroom",
    "category": "HEATING"
  },
  "capabilities": {
    "capableModes": [
      "HEAT",
      "COOL",
      "OFF"
    ],
    "capableHoldTypes": [
      "PERMANENT"
    ],
    "coolSetpointRange": {
      "min": 15,
      "max": 25
    },
    "heatSetpointRange": {
      "min": 15,
      "max": 25
    },
    "setpointDifferenceRange": {
      "min": 15,
      "max": 25
    },
    "setFollowSchedule": {
      "isCapable": true,
      "interventionIds": []
    },
    "setPermanentHold": {
      "isCapable": true,
      "interventionIds": []
    }
  },
  "thermostatState": {
    "mode": "HEAT",
    "heatSetpoint": 22,
    "coolSetpoint": 24,
    "holdType": "PERMANENT",
    "lastUpdated": "2020-04-07T17:04:26.000Z"
  },
  "temperatureState": {
    "currentTemperature": 20.8,
    "isActive": true,
    "lastUpdated": "2020-04-07T17:03:26.000Z"
  },
  "scopes": [
    "hvac:control:mode",
    "hvac:read:data"
  ],
  "locationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
}
Was this helpful?

Get HVAC Unit

GET /hvacs/{hvacId}

Request

Path parameters
hvacId string Required

ID of the HVAC unit.

Response

200
Attributes
id string

HVAC unit ID

userId string

The ID of the user that linked this hvac.

vendor string

Machine-friendly name of the vendor. Use this in API requests.

One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, MICROMATIC, NIBE, PANASONIC, TOSHIBA, DAIKIN, NEST, FUJITSU, or BOSCH

lastSeen string<date-time>

The last time Enode successfully communicated with the vendor or when the HVAC unit was initially linked.

isReachable boolean

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

consumptionRate number or null

The current rate of energy consumption in kW. An inactive HVAC will have a consumption rate of 0. HVACs not supporting consumption rate will report null. This value is currently only supported by a small number of devices.

object

Descriptive information about the HVAC unit

object

An object describing valid states for this HVAC unit.

object

An object grouping the latest temperature information. These values replace the deprecated top-level fields and include a freshness indicator.

object

An object grouping the latest thermostat state. These values replace the deprecated top-level fields and include a freshness indicator.

mode string Deprecated

Replaced by thermostatState.mode. The HVAC's mode.

One of OFF, AUTO, COOL, or HEAT

heatSetpoint number or null Deprecated

Replaced by thermostatState.heatSetpoint. If mode allows, heat when currentTemperature falls below this point.

coolSetpoint number or null Deprecated

Replaced by thermostatState.coolSetpoint. If mode allows, cool when currentTemperature rises above this point.

holdType string Deprecated

Replaced by thermostatState.holdType. 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

isActive boolean Deprecated

Replaced by temperatureState.isActive. Whether the HVAC unit is actively heating or cooling.

currentTemperature number or null Deprecated

Replaced by temperatureState.currentTemperature. Current air temperature reported by device in degrees Celsius.

scopes array of string

Scopes that the user has granted for this HVAC unit.

locationId string<uuid> or null

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

Sample
{
  "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
  "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
  "vendor": "ADAX",
  "lastSeen": "2020-04-07T17:04:26.000Z",
  "isReachable": true,
  "isActive": true,
  "currentTemperature": 20.8,
  "consumptionRate": 1.8,
  "mode": "HEAT",
  "heatSetpoint": 22,
  "coolSetpoint": 24,
  "holdType": "PERMANENT",
  "information": {
    "brand": "ADAX",
    "model": "Neo Wi-Fi Skirting",
    "displayName": "Bedroom Panel Heater",
    "groupName": "Bedroom",
    "category": "HEATING"
  },
  "capabilities": {
    "capableModes": [
      "HEAT",
      "COOL",
      "OFF"
    ],
    "capableHoldTypes": [
      "PERMANENT"
    ],
    "coolSetpointRange": {
      "min": 15,
      "max": 25
    },
    "heatSetpointRange": {
      "min": 15,
      "max": 25
    },
    "setpointDifferenceRange": {
      "min": 15,
      "max": 25
    },
    "setFollowSchedule": {
      "isCapable": true,
      "interventionIds": []
    },
    "setPermanentHold": {
      "isCapable": true,
      "interventionIds": []
    }
  },
  "thermostatState": {
    "mode": "HEAT",
    "heatSetpoint": 22,
    "coolSetpoint": 24,
    "holdType": "PERMANENT",
    "lastUpdated": "2020-04-07T17:04:26.000Z"
  },
  "temperatureState": {
    "currentTemperature": 20.8,
    "isActive": true,
    "lastUpdated": "2020-04-07T17:03:26.000Z"
  },
  "scopes": [
    "hvac:control:mode",
    "hvac:read:data"
  ],
  "locationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
}
Was this 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.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

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

targetType string

One of hvac

object
Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "string",
  "targetType": "hvac",
  "target": {
    "coolSetpoint": 0,
    "mode": "COOL",
    "holdType": "PERMANENT"
  }
}

Other responses

Response 404

Action not found.

Was this helpful?

Cancel HVAC Action

POST /hvacs/actions/{actionId}/cancel

Cancels a pending HVAC action, halting any further attempts by Enode to execute it.

Note: This only updates the action's status to CANCELLED within Enode and does not reflect a change in the vendor's cloud. Thus any pending action in the vendor's cloud might still be executed.

Request

Path parameters
actionId string Required

ID of the Action.

Response

200
Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

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

targetType string

One of hvac

object
Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "string",
  "targetType": "hvac",
  "target": {
    "coolSetpoint": 0,
    "mode": "COOL",
    "holdType": "PERMANENT"
  }
}

Other responses

Response 404

Action not found.

Response 409

Action already in a resolved state.

Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

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

targetType string

One of hvac

object
Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "string",
  "targetType": "hvac",
  "target": {
    "coolSetpoint": 0,
    "mode": "COOL",
    "holdType": "PERMANENT"
  }
}
Was this helpful?

Set HVAC unit to follow device schedule

POST /hvacs/{hvacId}/follow-schedule

Tell an HVAC unit to follow the schedule set on the device. Only available if SCHEDULED is present in the target's capabilities.capableHoldType. This endpoint can be used to cancel permanent holds. We retry sending the command until the HVAC unit's fields transition to the expected values. Note that this request will complete before any commands are sent to the HVAC unit. You may react to transitions by listening for the user:vendor-action:updated webhook event or polling the HVAC action endpointAPI.

Request

Path parameters
hvacId string Required

ID of the HVAC unit.

Response

200
Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

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

targetType string

One of hvac

object
Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "string",
  "targetType": "hvac",
  "target": {
    "holdType": "SCHEDULED"
  }
}

Other responses

Response 400

A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the HVAC unit cannot perform the action.

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Response 422

HVAC unit controlled by an Enode Schedule

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Was this helpful?

Refresh HVAC unit data

POST /hvacs/{hvacId}/refresh-hint

Use this endpoint to initiate an expedited data refresh for the specified HVAC unit.

Note: The Enode platform keeps data automatically up-to-date and detects changes in the OEM APIs within seconds to a few minutes. We change the refresh interval dynamically based on a number of heuristics. This ensures we find the best trade-off between the stability of the connection to the OEM and freshness of the data.
This method overrides most of our heuristics and should therefore be used with caution. You may use it when you have a strong reason to believe the data might be stale.

Request

Path parameters
hvacId string Required

ID of the HVAC unit.

Response

204

Refresh hint registered successfully.

Other responses

Response 404

The specified hvac was not found.

Was this helpful?

Set HVAC unit Mode as Permanent Hold

POST /hvacs/{hvacId}/permanent-hold

Tell an HVAC unit to enter a permanent hold. Only available if PERMANENT is present in the target's capabilities.capableHoldType. We retry sending the command until the HVAC unit's target field transition to the expected value. Note that this request will complete before any commands are sent to the HVAC unit. You may react to transitions by listening for the user:vendor-action:updated webhook event or polling the HVAC action endpointAPI.

Request

Path parameters
hvacId string Required

ID of the HVAC unit.

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

One of COOL

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

Response

200
Attributes
id string<uuid>

The ID of the action.

userId string

The ID of the user that owns the target of this action.

createdAt string<date-time>

Time when this action was created

updatedAt string<date-time>

Time when this action was last updated

completedAt string<date-time>

Time when the action transitioned to a non-pending state.

state string

The real-time status of an action executed on a target.

  • PENDING: The initial state. Enode is actively sending commands and monitoring the target for changes.
  • CONFIRMED: Successful transition of the target to the desired state.
  • FAILED: The target did not respond to the action before timing out. Enode has ceased sending additional commands.
  • CANCELLED: A required precondition was not met during the action's timeout window or another action has been sent to the target, overriding this one.

One of PENDING, CONFIRMED, FAILED, or CANCELLED

targetId string

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

targetType string

One of hvac

object
Sample
{
  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772",
  "createdAt": "2020-04-07T17:04:26Z",
  "updatedAt": "2020-04-07T17:04:26Z",
  "completedAt": "2020-04-07T17:04:26Z",
  "state": "PENDING",
  "targetId": "string",
  "targetType": "hvac",
  "target": {
    "coolSetpoint": 0,
    "mode": "COOL",
    "holdType": "PERMANENT"
  }
}

Other responses

Response 400

A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the HVAC unit cannot perform the action or the setpoints are invalid.

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Response 422

HVAC unit controlled by an Enode Schedule

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Was this helpful?

Interventions

Endpoints that return information about interventions. More information and examples are available in the Interventions guide.

List Interventions

GET /interventions

Returns a list of all known interventions.

The language parameter can be used to specify the language of the resolution title and description.

Request

Query parameters
language string Optional

Preferred BCP47 language code - Request translation for the specified language. Falls back to en-US if not provided or provided language code is unsupported.

One of en-US, en-GB, de-DE, fr-FR, es-ES, pt-PT, nl-NL, nb-NO, sv-SE, da-DK, fi-FI, or ro-RO

Response

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

Machine-friendly representation of the OEM's name.

One of APSYSTEMS, CSISolar, Deye, ENPHASE, FOXESS, FRONIUS, GOODWE, GROWATT, Hoymiles, HUAWEI, INVT, SMA, SOFAR, SOLAREDGE, SOLAX, SOLIS, SOLPLANET, SUNGROW, SUNSYNK, TESLA, TSUN, AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, LEXUS, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, GMC, CADILLAC, XPENG, TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, MICROMATIC, NIBE, PANASONIC, TOSHIBA, DAIKIN, NEST, FUJITSU, BOSCH, ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, EVBOX, GOE, CHARGEPOINT, ENELX, TESLA, ENPHASE, ENPHASE, or TESLA

vendorType string

Type of device this intervention relates to.

One of vehicle, charger, hvac, inverter, battery, or meter

string

A formatted and properly cased OEM brand name, suitable for reading by humans. May contain special characters.

One of APsystems, CSISolar, Deye, Enphase, FOXESS, Fronius, GoodWe, Growatt, Hoymiles, Huawei, INVT, SMA, Sofar, SolarEdge, Solax, Solis, Solplanet, Sungrow, SUNSYNK, Tesla, TSUN, Audi, BMW, Honda, Hyundai, Jaguar, Land Rover, Kia, Mercedes, MINI, Nissan, Peugeot, Porsche, Renault, SEAT, ŠKODA, Tesla, Volkswagen, Volvo, Ford, Opel, DS, Toyota, Lexus, Citroën, Cupra, Vauxhall, Fiat, Rivian, Nio, Chevrolet, GMC, Cadillac, XPENG, Tado, Mill, ADAX, Ecobee, Sensibo, Honeywell TCC, Resideo, Mitsubishi, Micro Matic, NIBE, Panasonic, Toshiba, DAIKIN, Nest, Fujitsu, Bosch, Zaptec, Easee, Wallbox, EO, EVBox, Charge Amps, go-e, ChargePoint, Enel X, Tesla, Enphase, Enphase, or Tesla

introducedAt string<date-time>

ISO 8601 timestamp of when the intervention was introduced.

domain string

The domain the intervention is related to. i.e. Is the intervention related to the vendor service account or a setting on the device.

One of Account or Device

object
Sample
[
  {
    "id": "9d90a9ad-9b24-4ce0-94e9-e888b1b877f4",
    "vendor": "AUDI",
    "vendorType": "vehicle",
    "brand": "Audi",
    "introducedAt": "2023-03-16T00:00:00",
    "domain": "Account",
    "resolution": {
      "title": "Accept the Audi terms and conditions",
      "description": "To gain access to your vehicle's telemetry data, it's necessary to accept Audi's terms and conditions. Follow these steps to proceed:<br><br>1. Open the **myAudi app** on your phone<br>2. Follow the prompts to accept Audi's terms and conditions",
      "access": "Remote",
      "agent": "User"
    }
  }
]
Was this helpful?

Get Intervention

GET /interventions/{interventionId}

Returns a single intervention.

The language parameter can be used to specify the language of the resolution title and description.

Request

Path parameters
interventionId string Required

ID of the intervention.

Query parameters
language string Optional

Preferred BCP47 language code - Request translation for the specified language. Falls back to en-US if not provided or provided language code is unsupported.

One of en-US, en-GB, de-DE, fr-FR, es-ES, pt-PT, nl-NL, nb-NO, sv-SE, da-DK, fi-FI, or ro-RO

Response

200
Attributes
id string<uuid>
string

Machine-friendly representation of the OEM's name.

One of APSYSTEMS, CSISolar, Deye, ENPHASE, FOXESS, FRONIUS, GOODWE, GROWATT, Hoymiles, HUAWEI, INVT, SMA, SOFAR, SOLAREDGE, SOLAX, SOLIS, SOLPLANET, SUNGROW, SUNSYNK, TESLA, TSUN, AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, LEXUS, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, GMC, CADILLAC, XPENG, TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, MICROMATIC, NIBE, PANASONIC, TOSHIBA, DAIKIN, NEST, FUJITSU, BOSCH, ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, EVBOX, GOE, CHARGEPOINT, ENELX, TESLA, ENPHASE, ENPHASE, or TESLA

vendorType string

Type of device this intervention relates to.

One of vehicle, charger, hvac, inverter, battery, or meter

string

A formatted and properly cased OEM brand name, suitable for reading by humans. May contain special characters.

One of APsystems, CSISolar, Deye, Enphase, FOXESS, Fronius, GoodWe, Growatt, Hoymiles, Huawei, INVT, SMA, Sofar, SolarEdge, Solax, Solis, Solplanet, Sungrow, SUNSYNK, Tesla, TSUN, Audi, BMW, Honda, Hyundai, Jaguar, Land Rover, Kia, Mercedes, MINI, Nissan, Peugeot, Porsche, Renault, SEAT, ŠKODA, Tesla, Volkswagen, Volvo, Ford, Opel, DS, Toyota, Lexus, Citroën, Cupra, Vauxhall, Fiat, Rivian, Nio, Chevrolet, GMC, Cadillac, XPENG, Tado, Mill, ADAX, Ecobee, Sensibo, Honeywell TCC, Resideo, Mitsubishi, Micro Matic, NIBE, Panasonic, Toshiba, DAIKIN, Nest, Fujitsu, Bosch, Zaptec, Easee, Wallbox, EO, EVBox, Charge Amps, go-e, ChargePoint, Enel X, Tesla, Enphase, Enphase, or Tesla

introducedAt string<date-time>

ISO 8601 timestamp of when the intervention was introduced.

domain string

The domain the intervention is related to. i.e. Is the intervention related to the vendor service account or a setting on the device.

One of Account or Device

object
Sample
{
  "id": "9d90a9ad-9b24-4ce0-94e9-e888b1b877f4",
  "vendor": "AUDI",
  "vendorType": "vehicle",
  "brand": "Audi",
  "introducedAt": "2023-03-16T00:00:00",
  "domain": "Account",
  "resolution": {
    "title": "Accept the Audi terms and conditions",
    "description": "To gain access to your vehicle's telemetry data, it's necessary to accept Audi's terms and conditions. Follow these steps to proceed:<br><br>1. Open the **myAudi app** on your phone<br>2. Follow the prompts to accept Audi's terms and conditions",
    "access": "Remote",
    "agent": "User"
  }
}

Other responses

Response 404

Intervention not found.

Was this helpful?

Locations

Locations are used to assign devices to a geographical group. This is useful when running schedules, smart charging, or smart heating, as target behavior usually depends on a common locality of demand (charging, heating, cooling, etc.) and supply (tariff, battery, inverter, etc.) of energy.

List Locations

GET /locations

Returns a paginated list of all Locations.

Request

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of locations

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
      "userId": "0fc4b1e7-9bdf-4958-b343-86eff3d9f92f",
      "name": "Enode",
      "latitude": 59.9165915,
      "longitude": 10.7582268,
      "timezoneName": "Europe/Oslo"
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

List User Locations

GET /users/{userId}/locations

Returns a paginated list of Locations for the given user.

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of locations

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
      "userId": "0fc4b1e7-9bdf-4958-b343-86eff3d9f92f",
      "name": "Enode",
      "latitude": 59.9165915,
      "longitude": 10.7582268,
      "timezoneName": "Europe/Oslo"
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

Create Location

POST /users/{userId}/locations

Create a Location for a User.

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Attributes
name string Required

User-supplied name for the Location

latitude number Required

Latitude in degrees

longitude number Required

Longitude in degrees

timezoneName string Required

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

Sample
{
  "name": "Enode",
  "latitude": 59.9165915,
  "longitude": 10.7582268,
  "timezoneName": "Europe/Oslo"
}

Response

200
Attributes
id string<uuid>

The ID of the Location.

userId string

User ID the location belongs to

name string

User-supplied name for the Location

latitude number

Latitude in degrees

longitude number

Longitude 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": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "0fc4b1e7-9bdf-4958-b343-86eff3d9f92f",
  "name": "Enode",
  "latitude": 59.9165915,
  "longitude": 10.7582268,
  "timezoneName": "Europe/Oslo"
}
Was this helpful?

Get Location

GET /locations/{locationId}

Fetch a Location.

Request

Path parameters
locationId string Required

ID of the Location.

Response

200
Attributes
id string<uuid>

The ID of the Location.

userId string

User ID the location belongs to

name string

User-supplied name for the Location

latitude number

Latitude in degrees

longitude number

Longitude 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": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "0fc4b1e7-9bdf-4958-b343-86eff3d9f92f",
  "name": "Enode",
  "latitude": 59.9165915,
  "longitude": 10.7582268,
  "timezoneName": "Europe/Oslo"
}
Was this helpful?

Delete Location

DELETE /locations/{locationId}

Delete a Location.

Request

Path parameters
locationId string Required

ID of the Location.

Response

200
Attributes
id string<uuid>

The ID of the Location.

userId string

User ID the location belongs to

name string

User-supplied name for the Location

latitude number

Latitude in degrees

longitude number

Longitude 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": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "0fc4b1e7-9bdf-4958-b343-86eff3d9f92f",
  "name": "Enode",
  "latitude": 59.9165915,
  "longitude": 10.7582268,
  "timezoneName": "Europe/Oslo"
}
Was this helpful?

Update Location

PUT /locations/{locationId}

Updates a location.

Request

Path parameters
locationId string Required

ID of the Location.

Attributes
name string Required

User-supplied name for the Location

latitude number Required

Latitude in degrees

longitude number Required

Longitude in degrees

timezoneName string Required

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

Sample
{
  "name": "Enode",
  "latitude": 59.9165915,
  "longitude": 10.7582268,
  "timezoneName": "Europe/Oslo"
}

Response

200
Attributes
id string<uuid>

The ID of the Location.

userId string

User ID the location belongs to

name string

User-supplied name for the Location

latitude number

Latitude in degrees

longitude number

Longitude 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": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "userId": "0fc4b1e7-9bdf-4958-b343-86eff3d9f92f",
  "name": "Enode",
  "latitude": 59.9165915,
  "longitude": 10.7582268,
  "timezoneName": "Europe/Oslo"
}
Was this helpful?

Meters

The Meter object represents a unit responsible for measuring energy usage. It provides detailed information about the meter itself and the energy consumption data it records.

Get Meter

Beta
GET /meters/{meterId}

Request

Path parameters
meterId string Required

The ID of the meter you are looking up

Response

200
Attributes
id string<uuid>

Unique identifier for the meter object

userId string

The ID of the user that linked this meter.

vendor string

Machine-friendly name of the vendor. Use this in API requests.

One of ENPHASE or TESLA

lastSeen string<date-time>

The last time Enode successfully communicated with the vendor or when the meter was initially linked.

isReachable boolean

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

object

Descriptive information about the meter

object
object

Meter's GPS coordinates

object

The specific meter's capabilities for recording energy consumption and production data.

scopes array of string

Scopes that the user has granted for this meter.

Sample
{
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "userId": "string",
  "vendor": "TESLA",
  "lastSeen": "2020-04-07T17:04:26Z",
  "isReachable": true,
  "information": {
    "brand": "Tesla",
    "model": "Tesla Powerwall built-in meter",
    "siteName": "Powerwall Home",
    "installationDate": "2020-04-07T17:04:26Z"
  },
  "energyState": {
    "power": 2.2,
    "lastUpdated": "2022-03-01T12:34:56Z"
  },
  "location": {
    "longitude": 10.7197486,
    "latitude": 59.9173985
  },
  "capabilities": {
    "measuresConsumption": {
      "isCapable": false,
      "interventionIds": [
        "4eaeb363-296d-4ccc-a973-7805e6f400bd"
      ]
    },
    "measuresProduction": {
      "isCapable": false,
      "interventionIds": [
        "4eaeb363-296d-4ccc-a973-7805e6f400bd"
      ]
    }
  },
  "scopes": [
    "meter:read:data",
    "meter:read:location"
  ]
}
Was this helpful?

Refresh meter data

Beta
POST /meters/{meterId}/refresh-hint

Use this endpoint to initiate an expedited data refresh for the specified meter.

Note: The Enode platform keeps data automatically up-to-date and detects changes in the OEM APIs within seconds to a few minutes. We change the refresh interval dynamically based on a number of heuristics. This ensures we find the best trade-off between the stability of the connection to the OEM and freshness of the data.
This method overrides most of our heuristics and should therefore be used with caution. You may use it when you have a strong reason to believe the data might be stale.

Request

Path parameters
meterId string Required

The ID of the meter you are looking up

Response

204

Refresh hint registered successfully.

Other responses

Response 404

The specified meter was not found.

Was this helpful?

List User Meters

Beta
GET /users/{userId}/meters

Returns a paginated list of meters for the given userId.

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of meters

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "userId": "string",
      "vendor": "TESLA",
      "lastSeen": "2020-04-07T17:04:26Z",
      "isReachable": true,
      "information": {
        "brand": "Tesla",
        "model": "Tesla Powerwall built-in meter",
        "siteName": "Powerwall Home",
        "installationDate": "2020-04-07T17:04:26Z"
      },
      "energyState": {
        "power": 2.2,
        "lastUpdated": "2022-03-01T12:34:56Z"
      },
      "location": {
        "longitude": 10.7197486,
        "latitude": 59.9173985
      },
      "capabilities": {
        "measuresConsumption": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        },
        "measuresProduction": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        }
      },
      "scopes": [
        "meter:read:data",
        "meter:read:location"
      ]
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

List Meters

Beta
GET /meters

Returns a paginated list of all Meters.

Request

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of meters

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "userId": "string",
      "vendor": "TESLA",
      "lastSeen": "2020-04-07T17:04:26Z",
      "isReachable": true,
      "information": {
        "brand": "Tesla",
        "model": "Tesla Powerwall built-in meter",
        "siteName": "Powerwall Home",
        "installationDate": "2020-04-07T17:04:26Z"
      },
      "energyState": {
        "power": 2.2,
        "lastUpdated": "2022-03-01T12:34:56Z"
      },
      "location": {
        "longitude": 10.7197486,
        "latitude": 59.9173985
      },
      "capabilities": {
        "measuresConsumption": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        },
        "measuresProduction": {
          "isCapable": false,
          "interventionIds": [
            "4eaeb363-296d-4ccc-a973-7805e6f400bd"
          ]
        }
      },
      "scopes": [
        "meter:read:data",
        "meter:read:location"
      ]
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

Schedules

Endpoints to manage schedules for Vehicles, Chargers and HVACs.

More information and examples are available in the Scheduling guide.

List Schedules

GET /users/{userId}/schedules

Returns a list of Schedules registered to the User.

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Response

200
Attributes
data array of array

Paginated list of schedules

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "isEnabled": true,
      "defaultShouldCharge": true,
      "rules": [
        {
          "hourMinute": {
            "from": "string",
            "to": "string"
          },
          "fromTimestamp": "2020-04-07T17:04:26Z",
          "toTimestamp": "2020-04-07T17:04:26Z",
          "weekdays": [
            0,
            1,
            2,
            3,
            4,
            5
          ],
          "shouldCharge": true
        }
      ],
      "targetId": "string",
      "targetType": "vehicle",
      "locationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
      "id": "string"
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

Create Schedule

POST /users/{userId}/schedules

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Attributes
isEnabled boolean Required

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

defaultShouldCharge boolean Required

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

array of Object Required

Each rule sets a value for shouldCharge, either true or false. All other properties of the rule are optional filters that limit the times to which this rule applies.

targetId string Required

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

targetType string Required

One of vehicle or charger

locationId string<uuid> or null Required

ID of the Location to which this schedule applies. The behavior of a null value differs based on the targetType. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.

Sample
{
  "isEnabled": true,
  "defaultShouldCharge": true,
  "rules": [
    {
      "hourMinute": {
        "from": "string",
        "to": "string"
      },
      "fromTimestamp": "2020-04-07T17:04:26Z",
      "toTimestamp": "2020-04-07T17:04:26Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4,
        5
      ],
      "shouldCharge": true
    }
  ],
  "targetId": "string",
  "targetType": "vehicle",
  "locationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}

Response

200
Attributes
isEnabled boolean

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

defaultShouldCharge boolean

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

array of Object

Each rule sets a value for shouldCharge, either true or false. All other properties of the rule are optional filters that limit the times to which this rule applies.

targetId string

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

targetType string

One of vehicle or charger

locationId string<uuid> or null

ID of the Location to which this schedule applies. The behavior of a null value differs based on the targetType. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.

id string
Sample
{
  "isEnabled": true,
  "defaultShouldCharge": true,
  "rules": [
    {
      "hourMinute": {
        "from": "string",
        "to": "string"
      },
      "fromTimestamp": "2020-04-07T17:04:26Z",
      "toTimestamp": "2020-04-07T17:04:26Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4,
        5
      ],
      "shouldCharge": true
    }
  ],
  "targetId": "string",
  "targetType": "vehicle",
  "locationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "id": "string"
}
Was this helpful?

Get Schedule

GET /schedules/{scheduleId}

Request

Path parameters
scheduleId string Required

ID of the Schedule.

Response

200
Attributes
isEnabled boolean

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

defaultShouldCharge boolean

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

array of Object

Each rule sets a value for shouldCharge, either true or false. All other properties of the rule are optional filters that limit the times to which this rule applies.

targetId string

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

targetType string

One of vehicle or charger

locationId string<uuid> or null

ID of the Location to which this schedule applies. The behavior of a null value differs based on the targetType. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.

id string
Sample
{
  "isEnabled": true,
  "defaultShouldCharge": true,
  "rules": [
    {
      "hourMinute": {
        "from": "string",
        "to": "string"
      },
      "fromTimestamp": "2020-04-07T17:04:26Z",
      "toTimestamp": "2020-04-07T17:04:26Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4,
        5
      ],
      "shouldCharge": true
    }
  ],
  "targetId": "string",
  "targetType": "vehicle",
  "locationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "id": "string"
}
Was this helpful?

Update Schedule

PUT /schedules/{scheduleId}

Does a partial update of a schedule.

Request

Path parameters
scheduleId string Required

ID of the Schedule.

Attributes
isEnabled boolean Optional

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

defaultShouldCharge boolean Optional

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

array of Object Optional

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.

targetId string Optional

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

targetType string Optional

One of vehicle or charger

locationId string<uuid> or null Optional

ID of the Location to which this schedule applies. The behavior of a null value differs based on the targetType. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.

Sample
{
  "isEnabled": true,
  "defaultShouldCharge": true,
  "rules": [
    {
      "hourMinute": {
        "from": "string",
        "to": "string"
      },
      "fromTimestamp": "2020-04-07T17:04:26Z",
      "toTimestamp": "2020-04-07T17:04:26Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4,
        5
      ],
      "shouldCharge": true
    }
  ],
  "targetId": "string",
  "targetType": "vehicle",
  "locationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd"
}

Response

200
Attributes
isEnabled boolean

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

defaultShouldCharge boolean

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

array of Object

Each rule sets a value for shouldCharge, either true or false. All other properties of the rule are optional filters that limit the times to which this rule applies.

targetId string

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

targetType string

One of vehicle or charger

locationId string<uuid> or null

ID of the Location to which this schedule applies. The behavior of a null value differs based on the targetType. For chargers, a null value is essentially ignored and the schedule is applied even if the charger isn't at a charging location. This is designed to prevent schedules from controlling vehicles at public chargers where the user doesn't pay for electricity.

id string
Sample
{
  "isEnabled": true,
  "defaultShouldCharge": true,
  "rules": [
    {
      "hourMinute": {
        "from": "string",
        "to": "string"
      },
      "fromTimestamp": "2020-04-07T17:04:26Z",
      "toTimestamp": "2020-04-07T17:04:26Z",
      "weekdays": [
        0,
        1,
        2,
        3,
        4,
        5
      ],
      "shouldCharge": true
    }
  ],
  "targetId": "string",
  "targetType": "vehicle",
  "locationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "id": "string"
}
Was this helpful?

Delete Schedule

DELETE /schedules/{scheduleId}

Delete a Schedule

Request

Path parameters
scheduleId string Required

ID of the Schedule.

Response

204

No Content

Was this helpful?

Get Schedule Status

GET /schedules/{scheduleId}/status

Request

Path parameters
scheduleId string Required

ID of the Schedule.

Response

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

ID of the schedule.

scheduleType string

One of CHARGE

changedAt string<date-time>

Time at which any value of the status last changed

state string

An enum value that describes the current state of the Schedule

One of ALIGNED, MISALIGNED, PENDING, INACTIVE:OVERRIDDEN, INACTIVE:DISABLED, INACTIVE:AWAY, or INACTIVE:INCAPABLE

isCharging boolean

Whether the target is currently actually charging

isChargingExpected boolean

Whether the target is currently expected to be charging

object

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

array of Object

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

object or null

This field populates after using Vehicle Create Smart OverrideAPI or Charger Create Smart OverrideAPI. Once populated, the target enters an overridden state, stopping Enode from sending Smart Charging actions. The Smart Override persists until the target ceases charging for any reason or is manually ended via Vehicle End Smart OverrideAPI or Charger End Smart OverrideAPI.

Sample
{
  "scheduleId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
  "scheduleType": "CHARGE",
  "changedAt": "2020-04-07T17:04:26Z",
  "state": "ALIGNED",
  "isCharging": true,
  "isChargingExpected": true,
  "isChargingExpectedParts": {
    "needsCharge": true,
    "isPluggedIn": true,
    "shouldCharge": true
  },
  "upcomingTransitions": [
    {
      "at": "2020-04-07T17:04:26Z",
      "shouldCharge": true
    }
  ],
  "smartOverride": {
    "createdAt": "2020-04-07T17:04:26Z",
    "endedAt": "2020-04-07T17:04:26Z",
    "targetType": "vehicle",
    "targetId": "07f8368d-be7e-4dbd-8cf0-94d00dd67ad3",
    "vendorActionId": "213ae0a8-fb65-40be-981a-6a86df3e1c7f"
  }
}
Was this helpful?

Service Health

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

Check Available Charger Vendors

GET /health/chargers

Lists the available charger vendors, including the activated vendors that your client has access to. Learn more about vendors requiring activation.

Response

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

Machine-friendly name of the vendor. Use this in API requests.

One of ZAPTEC, EASEE, WALLBOX, EO, CHARGEAMPS, EVBOX, GOE, CHARGEPOINT, or ENELX

displayName string

A formatted and properly cased OEM brand name, suitable for reading by humans. May contain special characters.

One of Zaptec, Easee, Wallbox, EO, EVBox, Charge Amps, go-e, ChargePoint, or Enel X

status string

Ready-state of the Vendor. Currently always READY.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

portalName string

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

linkingStatus string

Ready-state for linking with the Vendor.

  • READY: The Vendor is ready to be linked with.
  • ELEVATED_ERROR_RATE: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.
  • OUTAGE: The Vendor is currently not available for linking. We will show an error in Link UI and not let the user attempt to link with the Vendor.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

Sample
[
  {
    "vendor": "EASEE",
    "displayName": "Easee",
    "portalName": "Easee",
    "status": "READY",
    "linkingStatus": "READY"
  },
  {
    "vendor": "WALLBOX",
    "displayName": "Wallbox",
    "portalName": "Wallbox",
    "status": "READY",
    "linkingStatus": "READY"
  },
  {
    "vendor": "ZAPTEC",
    "displayName": "Zaptec",
    "portalName": "Zaptec",
    "status": "READY",
    "linkingStatus": "READY"
  },
  {
    "vendor": "EO",
    "displayName": "EO",
    "portalName": "EO",
    "status": "READY",
    "linkingStatus": "READY"
  }
]
Was this helpful?

Check Available Vehicle Vendors

GET /health/vehicles

Lists the available vehicle vendors, including the activated vendors that your client has access to. Learn more about vendors requiring activation.

Response

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

Machine-friendly name of the vendor. Use this in API requests.

One of AUDI, BMW, HONDA, HYUNDAI, JAGUAR, LANDROVER, KIA, MERCEDES, MINI, NISSAN, PEUGEOT, PORSCHE, RENAULT, SEAT, SKODA, TESLA, VOLKSWAGEN, VOLVO, FORD, OPEL, DS, TOYOTA, LEXUS, CITROEN, CUPRA, VAUXHALL, FIAT, RIVIAN, NIO, CHEVROLET, GMC, CADILLAC, or XPENG

displayName string

A formatted and properly cased OEM brand name, suitable for reading by humans. May contain special characters.

One of Audi, BMW, Honda, Hyundai, Jaguar, Land Rover, Kia, Mercedes, MINI, Nissan, Peugeot, Porsche, Renault, SEAT, ŠKODA, Tesla, Volkswagen, Volvo, Ford, Opel, DS, Toyota, Lexus, Citroën, Cupra, Vauxhall, Fiat, Rivian, Nio, Chevrolet, GMC, Cadillac, or XPENG

status string

Ready-state of the Vendor. Currently always READY.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

portalName string

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

linkingStatus string

Ready-state for linking with the Vendor.

  • READY: The Vendor is ready to be linked with.
  • ELEVATED_ERROR_RATE: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.
  • OUTAGE: The Vendor is currently not available for linking. We will show an error in Link UI and not let the user attempt to link with the Vendor.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

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

Check Available Inverter Vendors

GET /health/inverter

Lists the available inverter vendors, including the activated vendors that your client has access to. Learn more about vendors requiring activation.

Response

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

Machine-friendly name of the vendor. Use this in API requests.

One of APSYSTEMS, CSISolar, Deye, ENPHASE, FOXESS, FRONIUS, GOODWE, GROWATT, Hoymiles, HUAWEI, INVT, SMA, SOFAR, SOLAREDGE, SOLAX, SOLIS, SOLPLANET, SUNGROW, SUNSYNK, TESLA, or TSUN

displayName string

A formatted and properly cased OEM brand name, suitable for reading by humans. May contain special characters.

One of APsystems, CSISolar, Deye, Enphase, FOXESS, Fronius, GoodWe, Growatt, Hoymiles, Huawei, INVT, SMA, Sofar, SolarEdge, Solax, Solis, Solplanet, Sungrow, SUNSYNK, Tesla, or TSUN

status string

Ready-state of the Vendor. Currently always READY.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

portalName string

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

linkingStatus string

Ready-state for linking with the Vendor.

  • READY: The Vendor is ready to be linked with.
  • ELEVATED_ERROR_RATE: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.
  • OUTAGE: The Vendor is currently not available for linking. We will show an error in Link UI and not let the user attempt to link with the Vendor.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

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

Check Available Hvac Vendors

GET /health/hvacs

Lists the available HVAC vendors, including the activated vendors that your client has access to. Learn more about vendors requiring activation.

Response

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

Machine-friendly name of the vendor. Use this in API requests.

One of TADO, MILL, ADAX, ECOBEE, SENSIBO, HONEYWELL, RESIDEO, MITSUBISHI, MICROMATIC, NIBE, PANASONIC, TOSHIBA, DAIKIN, NEST, FUJITSU, or BOSCH

displayName string

A formatted and properly cased OEM brand name, suitable for reading by humans. May contain special characters.

One of Tado, Mill, ADAX, Ecobee, Sensibo, Honeywell TCC, Resideo, Mitsubishi, Micro Matic, NIBE, Panasonic, Toshiba, DAIKIN, Nest, Fujitsu, or Bosch

status string

Ready-state of the Vendor. Currently always READY.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

portalName string

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

linkingStatus string

Ready-state for linking with the Vendor.

  • READY: The Vendor is ready to be linked with.
  • ELEVATED_ERROR_RATE: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.
  • OUTAGE: The Vendor is currently not available for linking. We will show an error in Link UI and not let the user attempt to link with the Vendor.

One of READY, ELEVATED_ERROR_RATE, or OUTAGE

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

Check Service Readiness

GET /health/ready

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

Response

204

All functionalities are operating nominally.

Other responses

Response 503

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

Was this helpful?

Solar inverters

Solar inverters can be queried for current production state

List Solar Inverters

GET /inverters

Response

200
Attributes
array of Object

Paginated list of solar inverters

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "195d8649-ad12-4755-a9cc-44e2d40ce4d9",
      "userId": "f9d9b134-05f3-452a-80aa-be0deb22f492",
      "vendor": "ENPHASE",
      "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
      "lastSeen": "2020-04-07T17:04:26Z",
      "isReachable": true,
      "productionState": {
        "productionRate": 0,
        "isProducing": true,
        "totalLifetimeProduction": 100152.56,
        "lastUpdated": "2020-04-07T17:04:26Z"
      },
      "information": {
        "id": "7a18eb4e-ee65-4d5b-bb7c-d8e530006b18",
        "brand": "string",
        "model": "Sunny Boy",
        "siteName": "Sunny Plant",
        "installationDate": "2020-04-07T17:04:26Z"
      },
      "location": {
        "longitude": 10.7197486,
        "latitude": 59.9173985
      },
      "timezone": "Europe/Oslo",
      "scopes": [
        "inverter:read:location",
        "inverter:read:data"
      ]
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

List User Solar Inverters

GET /users/{userId}/inverters

Request

Path parameters
userId string Required

A unique identifier of your choice representing your user, e.g. a stable UUID you keep in your datastore. If a user entity matching the provided userId does not exist in your client, it will be created before the link session is created.

Query parameters
pageSize number Optional

Number of records to return per page

before string Optional

Encoded cursor used to fetch previous page. Cannot be used together with after. Refer to PaginationAPI for more information.

after string Optional

Encoded cursor used to fetch next page. Cannot be set together with before. Refer to PaginationAPI for more information.

Response

200
Attributes
array of Object

Paginated list of solar inverters

object

Cursors to the pages before and after current page. See the PaginationAPI section for reference.

Sample
{
  "data": [
    {
      "id": "195d8649-ad12-4755-a9cc-44e2d40ce4d9",
      "userId": "f9d9b134-05f3-452a-80aa-be0deb22f492",
      "vendor": "ENPHASE",
      "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
      "lastSeen": "2020-04-07T17:04:26Z",
      "isReachable": true,
      "productionState": {
        "productionRate": 0,
        "isProducing": true,
        "totalLifetimeProduction": 100152.56,
        "lastUpdated": "2020-04-07T17:04:26Z"
      },
      "information": {
        "id": "7a18eb4e-ee65-4d5b-bb7c-d8e530006b18",
        "brand": "string",
        "model": "Sunny Boy",
        "siteName": "Sunny Plant",
        "installationDate": "2020-04-07T17:04:26Z"
      },
      "location": {
        "longitude": 10.7197486,
        "latitude": 59.9173985
      },
      "timezone": "Europe/Oslo",
      "scopes": [
        "inverter:read:location",
        "inverter:read:data"
      ]
    }
  ],
  "pagination": {
    "after": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa",
    "before": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
  }
}
Was this helpful?

Get Solar Inverter

GET /inverters/{inverterId}

Request

Path parameters
inverterId string Required

ID of the solar inverter

Response

200
Attributes
id string<uuid>

Solar Inverter ID

userId string

The ID of the user that linked this inverter.

vendor string

Machine-friendly name of the vendor. Use this in API requests.

One of APSYSTEMS, CSISolar, Deye, ENPHASE, FOXESS, FRONIUS, GOODWE, GROWATT, Hoymiles, HUAWEI, INVT, SMA, SOFAR, SOLAREDGE, SOLAX, SOLIS, SOLPLANET, SUNGROW, SUNSYNK, TESLA, or TSUN

chargingLocationId string<uuid> or null

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

lastSeen string<date-time>

The last time Enode received live data or when the solar inverter was initially linked.

isReachable boolean

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

object
object

Descriptive information about the solar inverter

object

Solar inverter's GPS coordinates

timezone string or null

IANA TZ database timezone name representing the location of this inverter.

scopes array of string

Scopes that the user has granted for this inverter.

Sample
{
  "id": "195d8649-ad12-4755-a9cc-44e2d40ce4d9",
  "userId": "f9d9b134-05f3-452a-80aa-be0deb22f492",
  "vendor": "ENPHASE",
  "chargingLocationId": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
  "lastSeen": "2020-04-07T17:04:26Z",
  "isReachable": true,
  "productionState": {
    "productionRate": 0,
    "isProducing": true,
    "totalLifetimeProduction": 100152.56,
    "lastUpdated": "2020-04-07T17:04:26Z"
  },
  "information": {
    "id": "7a18eb4e-ee65-4d5b-bb7c-d8e530006b18",
    "brand": "string",
    "model": "Sunny Boy",
    "siteName": "Sunny Plant",
    "installationDate": "2020-04-07T17:04:26Z"
  },
  "location": {
    "longitude": 10.7197486,
    "latitude": 59.9173985
  },
  "timezone": "Europe/Oslo",
  "scopes": [
    "inverter:read:location",
    "inverter:read:data"
  ]
}
Was this helpful?

Refresh Inverter data

POST /inverters/{inverterId}/refresh-hint

Use this endpoint to initiate an expedited data refresh for the specified inverter.

Note: The Enode platform keeps data automatically up-to-date and detects changes in the OEM APIs within seconds to a few minutes. We change the refresh interval dynamically based on a number of heuristics. This ensures we find the best trade-off between the stability of the connection to the OEM and freshness of the data.
This method overrides most of our heuristics and should therefore be used with caution. You may use it when you have a strong reason to believe the data might be stale.

Request

Path parameters
inverterId string Required

ID of the solar inverter

Response

204

Refresh hint registered successfully.

Other responses

Response 404

The specified inverter was not found.

Was this helpful?

Statistics

Endpoints returning timeseries data collected from any linked devices.

Get User Charging Statistics

GET /users/{userId}/statistics/charging

Returns statistics about power consumption and price in the form of a time series.

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. If smart charging has resulted in savings, the value is reported in the estimatedSavings field. <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

Path parameters
userId string Required

User ID

Query parameters
startDate string<date-time> Required

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

endDate string<date-time> Optional

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

locationId string<uuid> Optional

Filter statistics to only include this location

id string Optional

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

type string Required

Get statistics for this hardware type.

One of charger, vehicle, or hvac

utcOffset string<float> Deprecated Optional

Offset (in hours) from UTC to adjust the timezone for viewing statistics. By default, all timestamps are in UTC, and period boundaries (day, week, month, year) are calculated in UTC. Providing utcOffset aligns these to the viewer's timezone. Accepts positive, negative, and fractional values. Note: utcOffset has no effect with resolutions QUARTER_HOUR, HALF_HOUR, or HOUR.

Deprecated: The use of utcOffset is discouraged as it doesn't handle time zones adequately. All data will be bucketed in UTC if utcOffset is not provided.

resolution string Optional

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

Response

200
Attributes
List of object array of object
object object
object

Aggregate statistics for charge rate in kW

kwhSum number

Total power consumption in kWh

object

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

costSum number

Total cost in <CURRENCY>

object

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

estimatedSavings number or null

Total estimated savings in <CURRENCY>, achieved by Smart Charging. If null, no part of the time range was impacted by Smart Charging.

date string<date-time>

The start date of this sample

Sample
[
  {
    "kw": {
      "min": 0,
      "max": 78,
      "mean": 61
    },
    "kwhSum": 120,
    "price": {
      "min": 13.8,
      "max": 14.4,
      "mean": 14.1
    },
    "nonSmartPrice": {
      "min": 12.9,
      "max": 16.7,
      "mean": 14.8
    },
    "costSum": 3.14,
    "estimatedSavings": 1.07,
    "date": "2021-01-19T09:37:36.845Z"
  }
]
Was this helpful?

Get User Statistics on Charging Sessions

GET /users/{userId}/statistics/charging/sessions

Returns statistics about power consumption and price binned by sessions.

Request

Path parameters
userId string Required

User ID

Query parameters
startDate string<date-time> Required

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

endDate string<date-time> Optional

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

locationId string<uuid> Optional

Filter statistics to only include this location

id string Optional

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

type string Required

Get statistics for this hardware type.

One of charger, vehicle, or hvac

Response

200
Attributes
List of object array of object
object object
object

Aggregate statistics for charge rate in kW

kwhSum number

Total power consumption in kWh

object

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

costSum number

Total cost in <CURRENCY>

id string

ID of the asset (charger/hvac/vehicle) for this session.

locationId string<uuid> or null

Charging Location ID for this session.

from string<date-time>

Start time.

to string<date-time>

End time.

object

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

estimatedSavings number or null

Total estimated savings in <CURRENCY>, achieved by Smart Charging. If null, the entire session was not a Smart Charging session.

Sample
[
  {
    "kw": {
      "min": 0,
      "max": 0,
      "mean": 0
    },
    "kwhSum": 120,
    "price": {
      "min": 0,
      "max": 0,
      "mean": 0
    },
    "costSum": 3.14,
    "id": "string",
    "locationId": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
    "from": "2020-04-07T17:04:26Z",
    "to": "2020-04-07T17:04:26Z",
    "nonSmartPrice": {
      "min": 0,
      "max": 0,
      "mean": 0
    },
    "estimatedSavings": 1.07
  }
]
Was this helpful?

Get User Production Statistics

GET /users/{userId}/statistics/production

Returns statistics about power production and price in the form of a time series.

Request

Path parameters
userId string Required

User ID

Query parameters
startDate string<date-time> Required

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

endDate string<date-time> Optional

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

locationId string<uuid> Optional

Filter statistics to only include this location

id string Optional

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

type string Required

Get statistics for this hardware type.

One of inverter

resolution string Optional

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

utcOffset string<float> Deprecated Optional

Offset (in hours) from UTC to adjust the timezone for viewing statistics. By default, all timestamps are in UTC, and period boundaries (day, week, month, year) are calculated in UTC. Providing utcOffset aligns these to the viewer's timezone. Accepts positive, negative, and fractional values. Note: utcOffset has no effect with resolutions QUARTER_HOUR, HALF_HOUR, or HOUR.

Deprecated: The use of utcOffset is discouraged as it doesn't handle time zones adequately. All data will be bucketed in UTC if utcOffset is not provided.

Response

200
Attributes
List of object array of object
object object
object

Aggregate statistics for production rate in kW

kwhSum number

Total power production in kWh

object

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

earningsSum number

Total earnings in <CURRENCY>

date string<date-time>

The start date of this sample

Sample
[
  {
    "kw": {
      "min": 0,
      "max": 78,
      "mean": 61
    },
    "kwhSum": 120,
    "price": {
      "min": 13.8,
      "max": 14.4,
      "mean": 14.1
    },
    "earningsSum": 3.14,
    "date": "2021-01-19T09:37:36.845Z"
  }
]
Was this helpful?

Get Vendor Statistics For Inverters

Beta
GET /users/{userId}/vendor-statistics

Returns statistics about power production for the given inverter in the form of a time series, collected from vendor APIs.

This endpoint is currently in beta. Please be aware that errors, inaccuracies, and breaking changes may occur without prior notice.

Currently, we only support querying for a maximum of 1 month of data at once.

It is not possible to select a timezone for the aggregated daily stats; the timezone reported by the inverter is used. To aggregate data in other timezones, we recommend fetching hourly data. Inverters in non-integer timezone offsets have not been tested, and may not return correct data.

Please note that currently, requests may take a long time to complete. Fetching shorter intervals, such as a week or a few days at a time, is the recommended workaround if you experience timeouts.

Data for the current day/hour (not available for all vendors) is cached for up to 15 minutes. Older data is cached indefinitely, so retroactive updates to existing data by the vendor are not reflected in the API. This could happen, for instance, if the inverter is actually an array of inverters, and an inverter is added or removed.

Request

Path parameters
userId string Required

User ID

Query parameters
resolution string Required

The duration of each time bucket the returned time series is divided into. Each entry in the response array corresponds to aggregated data of the specified time range.

One of HOUR or DAY

startDate string<date-time> Required

The earliest date (UTC) to include in the response. Cannot be greater than endDate. Example: 2021-03-21T02:00:00Z

endDate string<date-time> Optional

The latest date (UTC) to include in the response. Defaults to the current date/time. Example: 2021-03-21T05:00:00Z

inverterId string<uuid> Required

ID of the Inverter.

Response

200
Attributes
object

Contains information about power production statistics.

Sample
{
  "production": {
    "unit": "kWh",
    "data": [
      {
        "date": "2024-01-19T09:00:00.000Z",
        "value": 11.1
      },
      {
        "date": "2024-01-19T10:00:00.000Z",
        "value": 15.4
      }
    ]
  }
}
Was this helpful?

Tariffs

Use the Tariffs API to submit pricing information to Enode. These prices will be preferred over market prices in Enode's smart products, like Smart HVACAPI, and will be used to calculate costs in StatisticsAPI.

Get Tariff

GET /tariffs/{tariffId}

Get a tariff using its ID.

Request

Path parameters
tariffId string Required

Response

200
Attributes
List of object array of object
object object
name string

Per-tariff unique interval name

cost string

Rate cost (decimal string)

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

Create a Tariff

PUT /tariffs/{tariffId}

Create a tariff using a list of names and prices. Before the tariff can be used in Enode products, it must be linked to a locationAPI.

Request

Path parameters
tariffId string Required
Attributes
List of object array of object Optional
object object Optional
name string Required

Per-tariff unique interval name

cost string Required

Rate cost (decimal string)

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

Response

204

Successfully updated.

Was this helpful?

Link Tariff to Location

PUT /locations/{locationId}/tariff

Link a tariff to a LocationAPI using a daily schedule. Each new schedule overwrites any previous requests. Devices positioned at this location will use the schedule to calculate electricity costs.The schedule must ensure that there are no overlapping intervals, although gaps are permissible. In case of gaps, the system will default to market prices.

Request

Path parameters
locationId string Required

ID of the Location.

Attributes
tariffId string Required

The Tariff ID

array of Object Required

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

Sample
{
  "tariffId": "string",
  "tariffIntervals": [
    {
      "name": "OFF-PEAK-WEEKDAY",
      "from": "00:00",
      "to": "12:00",
      "weekdays": [
        0,
        1,
        2,
        3,
        4
      ]
    },
    {
      "name": "PEAK-WEEKDAY",
      "from": "12:00",
      "to": "24:00",
      "weekdays": [
        0,
        1,
        2,
        3,
        4
      ]
    },
    {
      "name": "OFF-PEAK-WEEKEND",
      "weekdays": [
        5,
        6
      ],
      "from": "00:00",
      "to": "06:00"
    },
    {
      "name": "PEAK-WEEKEND",
      "weekdays": [
        5,
        6
      ],
      "from": "06:00",
      "to": "24:00"
    }
  ]
}

Response

204

Successful

Other responses

Response 400

Overlapping tariff schedule. Ensure that the schedule has no overlaps.

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Response 404

Location or tariff not found.

Attributes
type string

A URI reference that identifies the problem type.

title string

A short, human-readable summary of the problem type.

detail string

A human-readable explanation specific to this occurrence of the problem.

Sample
{
  "type": "https://docs.enode.io/problems/im-a-teapot",
  "title": "I'm a teapot",
  "detail": "The requested entity body is short and stout."
}
Was this helpful?

Get Tariff Schedule

GET /locations/{locationId}/tariff

Get the tariff schedule linked to a location.

Request

Path parameters
locationId string Required

ID of the Location.

Response

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

Weekday to apply the named tariff. A weekday starts with 0 for Monday, and ends with 6 for Sunday. If not specified, named tariff is applied for entire week

One of 0, 1, 2, 3, 4, 5, or 6

fromHourMinute string

Interval from time (inclusive, UTC)

toHourMinute string

Interval to time (exclusive, UTC)

tariffId string

Energy Provider Tariff ID

tariffName string

Rate name

Sample
[
  {
    "weekd