{
  "openapi": "3.1.0",
  "info": {
    "title": "Enode API",
    "version": "2024-10-01",
    "description": "One integration, 1000+ energy devices.",
    "license": {
      "name": "Enode Commercial License",
      "url": "https://enode.com"
    }
  },
  "tags": [
    {
      "name": "User Management",
      "description": "Endpoints used to link and unlink users or vendors."
    },
    {
      "name": "Vehicles",
      "description": "EVs provide charge, location, and odometer data."
    },
    {
      "name": "Chargers",
      "description": "EV Chargers provide charging data."
    },
    {
      "name": "Batteries",
      "description": "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."
    },
    {
      "name": "HVAC",
      "description": "HVAC units (heaters, heat pumps, air conditioning, thermostats, etc.) are controlled by altering the mode & target setpoints. This can be done directly using the [Set Permanent Hold](/api/reference#postSetHvacPermanentHold) endpoint or [Return to Schedule](/api/reference#postSetHvacFollowSchedule)."
    },
    {
      "name": "Solar inverters",
      "description": "Solar inverters can be queried for current production state."
    },
    {
      "name": "Meters",
      "description": "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."
    },
    {
      "name": "HEM Systems",
      "description": "HEM Systems (Home Energy Management Systems) track flows between various assets such as solar inverters, batteries, and meters. They provide information and status details for the system and also support historical metrics through statistics for solar generation, household consumption, grid import/export, battery levels, and charge/discharge. Refer to the [Guide](/docs/hem-system) for details on how to enable this functionality on your account."
    },
    {
      "name": "Locations",
      "description": "Locations are used to assign devices to a geographical group. This is useful for optimization, as target behavior usually depends on a common locality of demand (charging, heating, cooling, etc.) and supply (tariff, battery, inverter, etc.) of energy."
    },
    {
      "name": "Interventions",
      "description": "Endpoints that return information about interventions. More information and examples are available in the [Interventions](/docs/interventions) guide."
    },
    {
      "name": "Webhooks",
      "description": "Webhooks are a mechanism that allows your server to receive notifications of events from the Enode system.\n\nSee the related guide for more information about timeouts, failures, and retry logic: [Using Webhooks](/docs/webhooks)"
    },
    {
      "name": "Service Health",
      "description": "Endpoints that return information about the health of Enode and our integrations."
    },
    {
      "name": "Statistics",
      "description": "Endpoints returning timeseries data collected from linked devices."
    },
    {
      "name": "Early Adopter",
      "description": "This feature or endpoint is available to early adopters for initial feedback. The implementation is still evolving and may change or be removed. See [Versioning Labels](https://developers.enode.com/api/reference#labels)."
    },
    {
      "name": "Beta",
      "description": "This product or endpoint is now feature complete and the implementation will not change. There may be bugs or stability issues but they are actively being worked on. We are still open to receiving feedback before delivering a stable release. See [Versioning Labels](https://developers.enode.com/api/reference#labels)."
    },
    {
      "name": "Flexible EV Charging",
      "description": "Flexible EV Charging allows you to setup constraints for local optimization for your EVs, while providing flexibility to the Flex Shape API."
    },
    {
      "name": "Price Signals",
      "description": "Configure zones and locations, then push price signals to drive optimization. Zones represent market bidding zones (e.g., NO1, BE, SE3) with a configured currency. Locations must be assigned to a zone before optimization can run. Price signals are scoped to a zone — each push may trigger re-optimization of affected assets."
    },
    {
      "name": "Shape",
      "description": "The Flex Shape API exposes an aggregated controllable energy load per zone. Trading algorithms use the shape to construct bid curves."
    },
    {
      "name": "Tariffs",
      "description": "Tariffs combine a schedule with a set of rates to define the cost of energy usage based on the time of day and day of the week."
    },
    {
      "name": "Flexible EV Charging Sessions",
      "description": "Flexible EV Charging Sessions provide visibility into a vehicle's charging session lifecycle, including real-time targets, outcomes, charge blocks, and energy delivery statistics."
    },
    {
      "name": "Solar Configurations",
      "description": "Solar Configurations describe the physical characteristics of a solar installation. These characteristics are used to forecast solar generation and to enable solar charging of vehicles."
    }
  ],
  "servers": [
    {
      "url": "https://enode-api.production.enode.io"
    }
  ],
  "x-tagGroups": [
    {
      "name": "Connect",
      "tags": [
        "User Management",
        "Vehicles",
        "Chargers",
        "Batteries",
        "HVAC",
        "Solar inverters",
        "Meters",
        "HEM Systems",
        "Locations",
        "Interventions",
        "Webhooks",
        "Service Health",
        "Statistics"
      ]
    },
    {
      "name": "Optimize",
      "tags": [
        "Tariffs",
        "Solar Configurations",
        "Flexible EV Charging",
        "Flexible EV Charging Sessions"
      ]
    },
    {
      "name": "Flex",
      "tags": [
        "Price Signals",
        "Shape"
      ]
    }
  ],
  "components": {
    "securitySchemes": {
      "ClientAccessToken": {
        "type": "oauth2",
        "description": "A `ClientAccessToken` is obtained via the [OAuth 2.0 Client Credentials grant](https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/) and carries authorization to access all functionalities and data in your Enode account.\nFull details at [The ClientAccessToken](/api/reference#getting-an-access-token)\n",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://oauth.production.enode.io/oauth2/token",
            "scopes": {}
          }
        }
      }
    },
    "schemas": {
      "UsersListEntry": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "ID of the user.",
            "example": "ad84e742-0f46-4cf4-b0db-7d890f8f23f5"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Scopes for the user.",
            "deprecated": true,
            "example": [
              "all"
            ]
          }
        },
        "required": [
          "id",
          "createdAt",
          "scopes"
        ],
        "additionalProperties": false
      },
      "PaginationCursors": {
        "type": "object",
        "properties": {
          "after": {
            "type": [
              "string",
              "null"
            ],
            "example": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa"
          },
          "before": {
            "type": [
              "string",
              "null"
            ],
            "example": "MjAyMy0wNi0xNlQwOTowMzowMS4yNjJa"
          }
        },
        "required": [
          "after",
          "before"
        ],
        "additionalProperties": false,
        "description": "Cursors to the pages before and after current page. See the [Pagination](/api/reference#pagination) section for reference."
      },
      "PaginatedUsersListResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UsersListEntry"
            },
            "description": "Paginated list of users."
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of users."
      },
      "InverterVendor": {
        "type": "string",
        "enum": [
          "AFORE",
          "APSYSTEMS",
          "CSISolar",
          "Deye",
          "ENPHASE",
          "FOXESS",
          "FRONIUS",
          "GIVENERGY",
          "GOODWE",
          "GROWATT",
          "Hoymiles",
          "HUAWEI",
          "INVT",
          "SMA",
          "SOFAR",
          "SOLAREDGE",
          "SOLARK",
          "SOLAX",
          "SOLIS",
          "SOLPLANET",
          "SUNGROW",
          "SUNSYNK",
          "TESLA",
          "TSUN"
        ],
        "description": "Machine-friendly name of the vendor. Use this in API requests.",
        "example": "ENPHASE"
      },
      "VehicleVendor": {
        "type": "string",
        "enum": [
          "ACURA",
          "AUDI",
          "BMW",
          "JAGUAR",
          "LANDROVER",
          "MINI",
          "PORSCHE",
          "RENAULT",
          "SEAT",
          "SKODA",
          "TESLA",
          "VOLKSWAGEN",
          "VOLVO",
          "XPENG",
          "KIA",
          "HYUNDAI",
          "PEUGEOT",
          "OPEL",
          "DS",
          "MERCEDES",
          "FORD",
          "TOYOTA",
          "LEXUS",
          "NISSAN",
          "CITROEN",
          "CUPRA",
          "VAUXHALL",
          "FIAT",
          "RIVIAN",
          "NIO",
          "CHEVROLET",
          "CADILLAC",
          "GMC",
          "HONDA",
          "POLESTAR",
          "SUBARU",
          "JEEP",
          "MAZDA",
          "MG",
          "CHRYSLER",
          "DODGE",
          "RAM",
          "ALFAROMEO",
          "LANCIA",
          "LUCID",
          "BYD",
          "DACIA",
          "ALPINE"
        ],
        "description": "Machine-friendly name of the vendor. Use this in API requests.",
        "example": "TESLA"
      },
      "HvacVendor": {
        "type": "string",
        "enum": [
          "TADO",
          "MILL",
          "ADAX",
          "ECOBEE",
          "SENSIBO",
          "HONEYWELL",
          "RESIDEO",
          "MITSUBISHI",
          "MICROMATIC",
          "NIBE",
          "PANASONIC",
          "TOSHIBA",
          "DAIKIN",
          "NEST",
          "FUJITSU",
          "BOSCH",
          "NETATMO"
        ],
        "description": "Machine-friendly name of the vendor. Use this in API requests.",
        "example": "ADAX"
      },
      "ChargerVendor": {
        "type": "string",
        "enum": [
          "ZAPTEC",
          "EASEE",
          "WALLBOX",
          "CHARGEAMPS",
          "GOE",
          "CHARGEPOINT",
          "ENELX",
          "TESLA",
          "OHME",
          "GARO",
          "SCHNEIDER",
          "PODPOINT",
          "KEBA",
          "MYENERGI",
          "HEIDELBERG",
          "ELLI",
          "INDRA",
          "PEBLAR"
        ],
        "description": "Machine-friendly name of the vendor. Use this in API requests.",
        "example": "ZAPTEC"
      },
      "BatteryVendor": {
        "type": "string",
        "enum": [
          "ENPHASE",
          "GIVENERGY",
          "FOXESS",
          "HUAWEI",
          "SMA",
          "SOLAREDGE",
          "SOLAX",
          "SOLIS",
          "TESLA",
          "SUNGROW"
        ],
        "description": "Machine-friendly name of the vendor. Use this in API requests.",
        "example": "TESLA"
      },
      "MeterVendor": {
        "type": "string",
        "enum": [
          "ENPHASE",
          "GIVENERGY",
          "FOXESS",
          "HUAWEI",
          "SMA",
          "SOLAREDGE",
          "SOLIS",
          "SOLAX",
          "SUNGROW",
          "TESLA"
        ],
        "description": "Machine-friendly name of the vendor. Use this in API requests.",
        "example": "TESLA"
      },
      "Vendor": {
        "type": "string",
        "enum": [
          "ACURA",
          "ADAX",
          "AFORE",
          "ALFAROMEO",
          "ALPINE",
          "APSYSTEMS",
          "AUDI",
          "BMW",
          "BOSCH",
          "BYD",
          "CADILLAC",
          "CHARGEAMPS",
          "CHARGEPOINT",
          "CHEVROLET",
          "CHRYSLER",
          "CITROEN",
          "CSISolar",
          "CUPRA",
          "DACIA",
          "DAIKIN",
          "DODGE",
          "DS",
          "Deye",
          "EASEE",
          "ECOBEE",
          "ELLI",
          "ENELX",
          "ENPHASE",
          "FIAT",
          "FORD",
          "FOXESS",
          "FRONIUS",
          "FUJITSU",
          "GARO",
          "GIVENERGY",
          "GMC",
          "GOE",
          "GOODWE",
          "GROWATT",
          "HEIDELBERG",
          "HONDA",
          "HONEYWELL",
          "HUAWEI",
          "HYUNDAI",
          "Hoymiles",
          "INDRA",
          "INVT",
          "JAGUAR",
          "JEEP",
          "KEBA",
          "KIA",
          "LANCIA",
          "LANDROVER",
          "LEXUS",
          "LUCID",
          "MAZDA",
          "MERCEDES",
          "MG",
          "MICROMATIC",
          "MILL",
          "MINI",
          "MITSUBISHI",
          "MYENERGI",
          "NEST",
          "NETATMO",
          "NIBE",
          "NIO",
          "NISSAN",
          "OHME",
          "OPEL",
          "PANASONIC",
          "PEBLAR",
          "PEUGEOT",
          "PODPOINT",
          "POLESTAR",
          "PORSCHE",
          "RAM",
          "RENAULT",
          "RESIDEO",
          "RIVIAN",
          "SCHNEIDER",
          "SEAT",
          "SENSIBO",
          "SKODA",
          "SMA",
          "SOFAR",
          "SOLAREDGE",
          "SOLARK",
          "SOLAX",
          "SOLIS",
          "SOLPLANET",
          "SUBARU",
          "SUNGROW",
          "SUNSYNK",
          "TADO",
          "TESLA",
          "TOSHIBA",
          "TOYOTA",
          "TSUN",
          "VAUXHALL",
          "VOLKSWAGEN",
          "VOLVO",
          "WALLBOX",
          "XPENG",
          "ZAPTEC"
        ],
        "description": "Machine-friendly name of the vendor. Use this in API requests.",
        "example": "TESLA"
      },
      "VendorType": {
        "type": "string",
        "enum": [
          "vehicle",
          "charger",
          "hvac",
          "inverter",
          "battery",
          "meter"
        ],
        "example": "vehicle"
      },
      "UserResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "123456789-ABc",
            "description": "The user's ID."
          },
          "linkedVendors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "vendor": {
                  "$ref": "#/components/schemas/Vendor"
                },
                "vendorType": {
                  "$ref": "#/components/schemas/VendorType"
                },
                "isValid": {
                  "type": "boolean",
                  "description": "Whether the provided credentials are currently valid. A `false` value here indicates that a credential has become invalidated, and [Link User](/api/reference#postUsersUseridLink) should be used to get new credentials from this user."
                }
              },
              "required": [
                "vendor",
                "vendorType",
                "isValid"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "id",
          "linkedVendors"
        ],
        "additionalProperties": false
      },
      "Scopes": {
        "type": "string",
        "enum": [
          "battery:control:operation_mode",
          "battery:read:data",
          "battery:read:location",
          "charger:control:charging",
          "charger:read:data",
          "hvac:control:mode",
          "hvac:read:data",
          "inverter:control:power_limit",
          "inverter:read:data",
          "inverter:read:location",
          "meter:read:data",
          "meter:read:location",
          "vehicle:control:charging",
          "vehicle:read:data",
          "vehicle:read:location"
        ]
      },
      "LinkUserPayload": {
        "type": "object",
        "properties": {
          "vendor": {
            "$ref": "#/components/schemas/Vendor",
            "description": "By specifying a vendor, the [brand selection step](/docs/link-ui#step-2-brand-and-service-selection) in Link UI will be skipped. Instead, your user will go directly to the [service selection view](/docs/link-ui#step-2-brand-and-service-selection) (if applicable for the specified vendor), or to the [review data access](/docs/link-ui#step-3-review-data-access) step."
          },
          "vendorType": {
            "$ref": "#/components/schemas/VendorType",
            "description": "Sets the asset type your user can link through Link UI within the linking session. The [brand selection step](/docs/link-ui#step-2-brand-and-service-selection) selection step will show vendors available for the specified asset type. If absent, the type(s) of assets that will be linked are inferred from the `scope(s)` requested."
          },
          "scopes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Scopes"
            },
            "minItems": 1,
            "description": "The [scope(s)](#scopes) you wish to request access to when linking an asset ([learn more](#scopes)). The scopes will be presented for user consent in Link UI in the [review data access](/docs/link-ui#step-3-review-data-access) step. The `<assetType>:read:data` scope is required for any asset type (e.g. if you wish to link a `battery`, you must request `battery:read:data`).",
            "example": [
              "vehicle:read:data",
              "vehicle:control:charging"
            ]
          },
          "language": {
            "type": "string",
            "enum": [
              "browser",
              "da-DK",
              "de-DE",
              "en-US",
              "en-GB",
              "es-ES",
              "fi-FI",
              "fr-FR",
              "it-IT",
              "ja-JP",
              "lv-LV",
              "lt-LT",
              "nb-NO",
              "nl-NL",
              "nl-BE",
              "pl-PL",
              "pt-PT",
              "ro-RO",
              "sv-SE"
            ],
            "description": "Sets the language for Link UI. We recommend matching this to the language of your application. If your language is not yet supported, you can specify `browser` which will assess your user's browser language via the `Accept-Language` header ([learn more](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language)). Passing in `browser` will fall back to `en-US` if no match is found."
          },
          "redirectUri": {
            "type": "string",
            "maxLength": 500,
            "format": "uri",
            "description": "The URI your user will be redirected to after clicking \"Complete\" at the linking flow (from the [last step in the Link UI flow](/docs/link-ui#step-6-success)). Only used in Link UI sessions that were not opened via the Link SDKs.",
            "example": "https://myapp.com/callback/enode"
          },
          "colorScheme": {
            "type": "string",
            "enum": [
              "system",
              "light",
              "dark"
            ],
            "default": "system",
            "description": "Sets the color scheme (light or dark) of Link UI. If your UI is only available in one of the color schemes, and does not follow the operating system color scheme, we recommend setting either `light` or `dark`. Defaults to  `system`, which follows the users operating system settings.",
            "example": "light"
          }
        },
        "required": [
          "scopes",
          "language",
          "redirectUri"
        ],
        "additionalProperties": false,
        "example": {
          "vendor": "VOLKSWAGEN",
          "vendorType": "vehicle",
          "language": "en-GB",
          "scopes": [
            "vehicle:read:data",
            "vehicle:control:charging"
          ],
          "redirectUri": "https://myapp.com/callback/enode",
          "colorScheme": "light"
        }
      },
      "LinkUserResponse": {
        "type": "object",
        "properties": {
          "linkUrl": {
            "type": "string",
            "description": "Use this URL to present Link UI to your user via [mobile in-app browsers](/docs/link-ui#mobile-in-app-browsers) or [web redirects](/docs/link-ui#web-redirects).",
            "example": "https://link.enode.com/YzIwZThhYjYtMjMzMi00ZTAyLTg0OTYtYzdjOTlhZTY3Zjc3QDI2YzI1MDExLTdhYTctNGE2NS1iNjBmLTZmMzc5NmRhODUyMDowNDViYjFiYmE0M2Y5NDU5YTc5OTgxZmEyYTg1NmI4YzhkOGU4YjgyNmNmMzQzZmFmMGNhZTlmNDBjMmZmOTgy"
          },
          "linkToken": {
            "type": "string",
            "description": "Use this token to initialize the [Link SDKs](/docs/link-sdks) if you wish to present Link UI to your users via our [mobile SDKs](/docs/link-ui#mobile-sd-ks).",
            "example": "U2FtcGxlIFNESyB0b2tlbgpTYW1wbGUgU0RLIHRva2VuClNhbXBsZSBTREsgdG9rZW4KU2FtcGxlIFNESyB0b2tlbg=="
          }
        },
        "required": [
          "linkUrl",
          "linkToken"
        ],
        "additionalProperties": false
      },
      "ConnectionsLimitReachedProblem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "A URI reference that identifies the problem type."
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem type."
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation specific to this occurrence of the problem."
          },
          "issues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {}
            },
            "description": "A list of validation issues which occurred while validating some component of the network payload."
          }
        },
        "required": [
          "type",
          "title",
          "detail"
        ],
        "description": "Connections limit reached",
        "example": {
          "type": "https://developers.enode.com/api/problems/forbidden",
          "title": "Connections limit reached.",
          "detail": "Unable to create more connections for ClientID: a7bedf14-c3eb-4c2b-a08f-b34a1f70808d"
        }
      },
      "RelinkUserPayload": {
        "type": "object",
        "properties": {
          "language": {
            "type": "string",
            "enum": [
              "browser",
              "da-DK",
              "de-DE",
              "en-US",
              "en-GB",
              "es-ES",
              "fi-FI",
              "fr-FR",
              "it-IT",
              "ja-JP",
              "lv-LV",
              "lt-LT",
              "nb-NO",
              "nl-NL",
              "nl-BE",
              "pl-PL",
              "pt-PT",
              "ro-RO",
              "sv-SE"
            ],
            "description": "Sets the language for Link UI. We recommend matching this to the language of your application. If your language is not yet supported, you can specify `browser` which will assess your user's browser language via the `Accept-Language` header ([learn more](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language)). Passing in `browser` will fall back to `en-US` if no match is found."
          },
          "redirectUri": {
            "type": "string",
            "maxLength": 500,
            "format": "uri",
            "description": "The URI your user will be redirected to after clicking \"Complete\" at the linking flow (from the [last step in the Link UI flow](/docs/link-ui#step-6-success)). Only used in Link UI sessions that were not opened via the Link SDKs.",
            "example": "https://myapp.com/callback/enode"
          },
          "colorScheme": {
            "type": "string",
            "enum": [
              "system",
              "light",
              "dark"
            ],
            "default": "system",
            "description": "Sets the color scheme (light or dark) of Link UI. If your UI is only available in one of the color schemes, and does not follow the operating system color scheme, we recommend setting either `light` or `dark`. Defaults to  `system`, which follows the users operating system settings.",
            "example": "light"
          }
        },
        "required": [
          "language",
          "redirectUri"
        ],
        "additionalProperties": false
      },
      "Problem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "A URI reference that identifies the problem type."
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem type."
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation specific to this occurrence of the problem."
          },
          "issues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {}
            },
            "description": "A list of validation issues which occurred while validating some component of the network payload."
          }
        },
        "required": [
          "type",
          "title",
          "detail"
        ],
        "description": "Standard Problem Error",
        "example": {
          "type": "https://developers.enode.com/api/problems/not-found",
          "title": "Not Found",
          "detail": "The requested asset wasn't found."
        }
      },
      "Brand": {
        "type": "string",
        "description": "A formatted and properly cased OEM brand name, suitable for reading by humans. May contain special characters.",
        "example": "Tesla"
      },
      "VehicleInformation": {
        "type": "object",
        "properties": {
          "vin": {
            "type": [
              "string",
              "null"
            ],
            "description": "Vehicle VIN",
            "example": "2HGFB2F5XEH542858"
          },
          "brand": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Brand"
              },
              {
                "type": [
                  "string",
                  "null"
                ]
              }
            ]
          },
          "model": {
            "type": [
              "string",
              "null"
            ],
            "description": "Vehicle model",
            "example": "Model S P85"
          },
          "year": {
            "type": [
              "number",
              "null"
            ],
            "description": "Vehicle production year",
            "example": 2020
          },
          "displayName": {
            "type": [
              "string",
              "null"
            ],
            "description": "User-defined vehicle nickname.",
            "example": "Batmobile"
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL to an image of the vehicle model. `null` when not available.",
            "example": "https://cdn.images.enode.com/assets/019c8221-f8be-7fb3-a2eb-3c9c223f4d73.webp"
          }
        },
        "required": [
          "vin",
          "brand",
          "model",
          "year",
          "displayName",
          "imageUrl"
        ],
        "additionalProperties": false,
        "description": "Descriptive information about the Vehicle."
      },
      "VehiclePowerDeliveryState": {
        "type": "string",
        "enum": [
          "UNKNOWN",
          "UNPLUGGED",
          "PLUGGED_IN:INITIALIZING",
          "PLUGGED_IN:CHARGING",
          "PLUGGED_IN:STOPPED",
          "PLUGGED_IN:COMPLETE",
          "PLUGGED_IN:NO_POWER",
          "PLUGGED_IN:FAULT",
          "PLUGGED_IN:DISCHARGING"
        ],
        "example": "PLUGGED_IN:CHARGING",
        "description": "The current state of power delivery between the vehicle and charger.\n\n * `UNKNOWN`: The state of power delivery is currently unknown or `chargeState.lastUpdated` is more than 7 days ago. \n * `UNPLUGGED`: The vehicle is not connected to the charger. \n * `PLUGGED_IN:INITIALIZING`: The charging station is preparing to deliver power to the vehicle. It is expected for this state to shortly transition into PLUGGED_IN:CHARGING. \n * `PLUGGED_IN:CHARGING`: The vehicle is actively receiving power from the charger, causing the battery level to increase. \n * `PLUGGED_IN:COMPLETE`: The charging process has finished and the vehicle's battery has reached the target charge limit. \n * `PLUGGED_IN:STOPPED`: The charging process has been intentionally stopped by either the vehicle or the charger. The vehicle is still plugged in and waiting for the charging process to resume. \n * `PLUGGED_IN:NO_POWER`: The vehicle attempted to initialize charging, however no external power was available. It is not possible to transition into a charging state with a remote command until there is some user intervention to resolve the issue. \n * `PLUGGED_IN:FAULT`: A malfunction in the charging process is preventing power from being delivered. Possible causes include a charging cable not being properly locked, extreme temperatures, or malfunctions in either the charging station or the vehicle's internal system. It is not possible to transition into a charging state with a remote command until there is some user intervention to resolve the issue.\n * `PLUGGED_IN:DISCHARGING`: The vehicle is actively discharging by giving power to the home/grid, causing the battery level to decrease."
      },
      "VehicleChargeState": {
        "type": "object",
        "properties": {
          "batteryLevel": {
            "type": [
              "number",
              "null"
            ],
            "description": "Remaining battery in percent",
            "example": 66
          },
          "range": {
            "type": [
              "number",
              "null"
            ],
            "description": "Estimated remaining kilometers",
            "example": 228
          },
          "isPluggedIn": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indicates whether the vehicle is connected to a charging box (regardless of whether it is actually charging)",
            "example": true
          },
          "isCharging": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indicates whether the vehicle is currently receiving power from the charger and actively charging its battery.",
            "example": true
          },
          "isFullyCharged": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indicates whether the vehicle is fully charged. 'Fully charged' may be a `batteryLevel` of less than 100 if a `chargeLimit` has been configured in the vehicle. This will be `null` when `powerDeliveryState` is `UNKNOWN`.",
            "example": false
          },
          "batteryCapacity": {
            "type": [
              "number",
              "null"
            ],
            "description": "Vehicle's usable battery capacity in kWh.",
            "example": 48.1
          },
          "chargeLimit": {
            "type": [
              "number",
              "null"
            ],
            "description": "Charge limit, as a percent of `batteryCapacity`.\n\nWhen `null`, the vendor did not report a charge limit when we last received data from them. We recommend assuming the limit is 100%.",
            "example": 90
          },
          "chargeRate": {
            "type": [
              "number",
              "null"
            ],
            "description": "The current charge rate in kW.\n\nThis property is only available when the vehicle is charging, and is `null` any other time.",
            "example": 2
          },
          "chargeTimeRemaining": {
            "type": [
              "number",
              "null"
            ],
            "description": "Estimated time until the current charging intent is completed, in minutes.\n\nThis property is only available when the vehicle is charging, and is `null` any other time.",
            "example": 285
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received charge state update",
            "example": "2020-04-07T17:04:26Z"
          },
          "maxCurrent": {
            "type": [
              "number",
              "null"
            ],
            "deprecated": true,
            "description": "Deprecated: Use `chargeRateLimit` instead.\n\nThe maximum current that the vehicle can draw from the charger, in amps.",
            "example": 16
          },
          "powerDeliveryState": {
            "$ref": "#/components/schemas/VehiclePowerDeliveryState"
          },
          "pluggedInChargerId": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID of the charger currently plugged into the vehicle. By default, this attribute will be `null` and will only be populated if:\n * The charger and the vehicle are linked to the same Enode `userId`.\n * AND Enode has determined that the vehicle and charger are **currently** plugged into each other.",
            "example": "e7d4db80-4fca-4781-ac70-14108f560706"
          },
          "chargeRateLimit": {
            "type": [
              "number",
              "null"
            ],
            "description": "The current charge rate limit in kW. Returns `null` when the vehicle is not plugged into a charger or when the value is unavailable from the vendor.\n\nEarly Adopter: This property is only available for early adopters of [Set Charge Rate Limit](/api/reference#postSetChargerChargeRateLimit)."
          }
        },
        "required": [
          "batteryLevel",
          "range",
          "isPluggedIn",
          "isCharging",
          "isFullyCharged",
          "batteryCapacity",
          "chargeLimit",
          "chargeRate",
          "chargeTimeRemaining",
          "lastUpdated",
          "maxCurrent",
          "powerDeliveryState"
        ],
        "additionalProperties": false,
        "description": "Latest information about the electric or hybrid battery. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
      },
      "VehicleSmartChargingPolicy": {
        "type": "object",
        "properties": {
          "isEnabled": {
            "type": "boolean",
            "description": "When enabled, this vehicle's charging status may be controlled by [Smart Charging](/docs/smart-charging/introduction)"
          },
          "deadline": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
            "description": "The hour-minute deadline for fully charging the vehicle. Smart charging does not work without setting a deadline. If a timezone is set on the location at which the smart charging occurs, the deadline is interpreted in that timezone, otherwise UTC is used.",
            "example": "07:00"
          },
          "minimumChargeLimit": {
            "type": "number",
            "description": "Proceed to charge promptly, disregarding energy prices, until the vehicle achieves this preset minimum limit. Please note that this limit cannot exceed the vehicle's maximum charge limit. The default setting is zero. The unit of measure is percentage."
          }
        },
        "required": [
          "isEnabled",
          "deadline",
          "minimumChargeLimit"
        ],
        "title": "Smart Charging Policy",
        "description": "[Smart Charging](/docs/smart-charging/introduction) configuration properties. Configured via [Update Vehicle Smart Charging Policy](/api/reference#updateVehicleSmartChargingPolicy)."
      },
      "VehicleOdometer": {
        "type": "object",
        "properties": {
          "distance": {
            "type": [
              "number",
              "null"
            ],
            "description": "Odometer in kilometers",
            "example": 65393
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of the last odometer update (ISO 8601 UTC timestamp)",
            "example": "2024-01-07T17:04:26.000Z"
          }
        },
        "required": [
          "distance",
          "lastUpdated"
        ],
        "additionalProperties": false,
        "description": "Vehicle's odometer reading in kilometers with timestamp"
      },
      "Capability": {
        "type": "object",
        "properties": {
          "isCapable": {
            "type": "boolean",
            "description": "The entity is fully capable of providing this data or functionality. If false, support is partial or missing. A capable entity (`true`) may still list recommended interventions in `interventionIds`.",
            "example": false
          },
          "interventionIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              }
            },
            "description": "IDs of interventions the user can make to alter the availability of this capability.\nInterventions may be present even when `isCapable` is `true` (recommended, non-blocking actions). See [the interventions guide](/docs/interventions#accessing-interventions-via-our-api)."
          }
        },
        "required": [
          "isCapable",
          "interventionIds"
        ],
        "additionalProperties": false
      },
      "ChargeRateLimitRange": {
        "type": "object",
        "properties": {
          "kW": {
            "type": "object",
            "properties": {
              "min": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "The minimum charge rate limit in kW. Returns null when unavailable from the vendor."
              },
              "max": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "The maximum charge rate limit in kW. Returns null when unavailable from the vendor."
              }
            },
            "required": [
              "min",
              "max"
            ],
            "additionalProperties": false,
            "description": "Allowed charge rate limit range in kW."
          }
        },
        "required": [
          "kW"
        ],
        "additionalProperties": false
      },
      "ChargeRateLimitCapability": {
        "type": "object",
        "properties": {
          "isCapable": {
            "type": "boolean",
            "description": "The entity is fully capable of providing this data or functionality. If false, support is partial or missing. A capable entity (`true`) may still list recommended interventions in `interventionIds`.",
            "example": false
          },
          "interventionIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              }
            },
            "description": "IDs of interventions the user can make to alter the availability of this capability.\nInterventions may be present even when `isCapable` is `true` (recommended, non-blocking actions). See [the interventions guide](/docs/interventions#accessing-interventions-via-our-api)."
          },
          "allowedRange": {
            "$ref": "#/components/schemas/ChargeRateLimitRange",
            "description": "Allowed charge rate limits for the charger."
          }
        },
        "required": [
          "isCapable",
          "interventionIds",
          "allowedRange"
        ],
        "additionalProperties": false
      },
      "VehicleCapabilities": {
        "type": "object",
        "properties": {
          "information": {
            "$ref": "#/components/schemas/Capability",
            "description": "Full availability of information data."
          },
          "chargeState": {
            "$ref": "#/components/schemas/Capability",
            "description": "Full availability of chargeState data."
          },
          "location": {
            "$ref": "#/components/schemas/Capability",
            "description": "Full availability of location data."
          },
          "odometer": {
            "$ref": "#/components/schemas/Capability",
            "description": "Full availability of odometer data."
          },
          "setMaxCurrent": {
            "$ref": "#/components/schemas/Capability",
            "deprecated": true,
            "description": "Deprecated: Use `setChargeRateLimit` instead.\n\nSupports setting the maximum charge current."
          },
          "startCharging": {
            "$ref": "#/components/schemas/Capability",
            "description": "Supports START charging command."
          },
          "stopCharging": {
            "$ref": "#/components/schemas/Capability",
            "description": "Supports STOP charging command."
          },
          "smartCharging": {
            "$ref": "#/components/schemas/Capability",
            "description": "Support for smartCharging. This value is dynamic and may change over time."
          },
          "refreshState": {
            "$ref": "#/components/schemas/Capability",
            "description": "Supports refreshing the vehicle state on demand. This value is dynamic and may change over time."
          },
          "setChargeRateLimit": {
            "$ref": "#/components/schemas/ChargeRateLimitCapability",
            "description": "Ability to set the charge rate limit in kW. Only available when the vehicle is paired with a capable charger.\n\nEarly Adopter: This property is only available for early adopters of [Set Charge Rate Limit](/api/reference#postSetChargerChargeRateLimit)"
          }
        },
        "required": [
          "information",
          "chargeState",
          "location",
          "odometer",
          "setMaxCurrent",
          "startCharging",
          "stopCharging",
          "smartCharging"
        ],
        "additionalProperties": false,
        "description": "A collection of descriptors that describe the capabilities of this specific vehicle.\n\nWhen the vehicle is paired with a linked charger, each capability's `interventionIds` merge interventions from both assets. See [Step 4: Handle unified interventions](/docs/ev-charger-pairing/integration-steps#step-4-handle-unified-interventions) for how charger interventions are surfaced, when vehicle interventions are suppressed, and how the recommended `LinkAdditionalAsset` (\"link a charger\") intervention behaves."
      },
      "Vehicle": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Vehicle ID",
            "example": "05ee9df5-d072-4ee8-b773-399dec8f5693"
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that linked this vehicle.",
            "example": "bb28471e-cde6-4eff-ace4-9a7f4f50882a"
          },
          "vendor": {
            "$ref": "#/components/schemas/VehicleVendor"
          },
          "lastSeen": {
            "type": "string",
            "format": "date-time",
            "description": "The last time Enode received live data or when the vehicle was initially linked.",
            "example": "2024-01-07T17:04:26.000Z"
          },
          "isReachable": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indicates whether Enode can currently access live data from the vehicle. If the vehicle is not reachable, data updates will be delayed.",
            "example": true
          },
          "information": {
            "$ref": "#/components/schemas/VehicleInformation"
          },
          "chargeState": {
            "$ref": "#/components/schemas/VehicleChargeState"
          },
          "smartChargingPolicy": {
            "$ref": "#/components/schemas/VehicleSmartChargingPolicy"
          },
          "odometer": {
            "$ref": "#/components/schemas/VehicleOdometer"
          },
          "capabilities": {
            "$ref": "#/components/schemas/VehicleCapabilities"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Scopes that the user has granted for this vehicle.",
            "example": [
              "vehicle:control:charging",
              "vehicle:read:data",
              "vehicle:read:location"
            ]
          }
        },
        "required": [
          "id",
          "userId",
          "vendor",
          "lastSeen",
          "isReachable",
          "information",
          "chargeState",
          "smartChargingPolicy",
          "odometer",
          "capabilities",
          "scopes"
        ],
        "additionalProperties": false
      },
      "VehicleLocation": {
        "type": "object",
        "properties": {
          "longitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Longitude in degrees",
            "example": 10.7197486
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Latitude in degrees",
            "example": 59.9173985
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received location",
            "example": "2024-01-07T17:04:26.000Z"
          }
        },
        "required": [
          "longitude",
          "latitude",
          "lastUpdated"
        ],
        "additionalProperties": false,
        "description": "Vehicle's GPS coordinates with timestamp"
      },
      "PaginatedVehicleList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Vehicle"
                },
                {
                  "type": "object",
                  "properties": {
                    "location": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/VehicleLocation"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "format": "uuid",
                              "example": "07f8368d-be7e-4dbd-8cf0-94d00dd67ad3",
                              "x-format": {
                                "guid": true
                              },
                              "description": "ID of the location the vehicle is currently positioned at (if any)."
                            }
                          },
                          "required": [
                            "id"
                          ],
                          "additionalProperties": false
                        }
                      ],
                      "description": "Vehicle's GPS coordinates with timestamp"
                    }
                  },
                  "required": [
                    "location"
                  ],
                  "additionalProperties": false
                }
              ]
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "TargetMaxCurrent": {
        "type": "object",
        "properties": {
          "maxCurrent": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "Desired max current in ampere",
            "example": 10
          }
        },
        "required": [
          "maxCurrent"
        ],
        "additionalProperties": false,
        "description": "Target maximum current for entity"
      },
      "ActionState": {
        "type": "string",
        "enum": [
          "PENDING",
          "CONFIRMED",
          "FAILED",
          "CANCELLED"
        ],
        "description": "The real-time status of an action executed on a target. \n\n * `PENDING`: The initial state. Enode is actively sending commands and monitoring the target for changes. \n * `CONFIRMED`: Successful transition of the target to the desired state. \n * `FAILED`: The target did not respond to the action before timing out. Enode has ceased sending additional commands. \n * `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."
      },
      "ChargeableVendorType": {
        "type": "string",
        "enum": [
          "vehicle",
          "charger"
        ]
      },
      "ActionFailureReason": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "NO_RESPONSE",
              "FAILED_PRECONDITION",
              "CONFLICT",
              "NOT_FOUND",
              "UNNECESSARY",
              "REQUESTED_CANCELLATION"
            ],
            "description": "A machine-readable high level error category.\n\n * `NO_RESPONSE`: The device did not react to our commands within the action's timeout window.  \n * `FAILED_PRECONDITION`: The device did not meet all required preconditions for this action to be executed during the action's timeout window. \n * `UNNECESSARY`: The action was not carried out given that the device was already in the desired state. \n * `CONFLICT`: A newer action for this device has been created. This action is now abandoned.  \n * `REQUESTED_CANCELLATION`: This action was cancelled by request of the controlling owner. The controlling owner may refer to another Enode entity which initiated the command, such as a schedule or smart override. \n * `NOT_FOUND`: The device was deleted while the action was `PENDING`.\n"
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation of why the action was unsuccessful.",
            "example": "The device remained unreachable."
          }
        },
        "required": [
          "type",
          "detail"
        ],
        "description": "Information about why was this action not executed successfully."
      },
      "MaxCurrentAction": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the action."
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that owns the target of this action.",
            "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was created",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was last updated",
            "example": "2020-04-07T17:04:26Z"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time when the action transitioned to a non-pending state.",
            "example": "2020-04-07T17:04:26Z"
          },
          "state": {
            "$ref": "#/components/schemas/ActionState"
          },
          "targetId": {
            "type": "string",
            "description": "ID of the entity which this action is controlling."
          },
          "targetType": {
            "$ref": "#/components/schemas/ChargeableVendorType"
          },
          "targetState": {
            "$ref": "#/components/schemas/TargetMaxCurrent"
          },
          "failureReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ActionFailureReason"
              },
              {
                "type": [
                  "object",
                  "null"
                ]
              }
            ]
          }
        },
        "required": [
          "id",
          "userId",
          "createdAt",
          "updatedAt",
          "completedAt",
          "state",
          "targetId",
          "targetType",
          "targetState",
          "failureReason"
        ],
        "additionalProperties": false,
        "deprecated": true,
        "title": "Max Current Action",
        "description": "Deprecated: Use ChargeRateLimitAction instead."
      },
      "ChargeRateLimitPayload": {
        "type": "object",
        "properties": {
          "chargeRateLimit": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "Desired charge rate limit in kilowatts (kW)",
            "example": 5.2
          }
        },
        "required": [
          "chargeRateLimit"
        ],
        "additionalProperties": false,
        "description": "Target charge rate limit for charger"
      },
      "ChargeRateLimitAction": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the action."
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that owns the target of this action.",
            "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was created",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was last updated",
            "example": "2020-04-07T17:04:26Z"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time when the action transitioned to a non-pending state.",
            "example": "2020-04-07T17:04:26Z"
          },
          "state": {
            "$ref": "#/components/schemas/ActionState"
          },
          "targetId": {
            "type": "string",
            "description": "ID of the entity which this action is controlling."
          },
          "targetType": {
            "$ref": "#/components/schemas/ChargeableVendorType"
          },
          "targetState": {
            "$ref": "#/components/schemas/ChargeRateLimitPayload"
          },
          "failureReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ActionFailureReason"
              },
              {
                "type": [
                  "object",
                  "null"
                ]
              }
            ]
          }
        },
        "required": [
          "id",
          "userId",
          "createdAt",
          "updatedAt",
          "completedAt",
          "state",
          "targetId",
          "targetType",
          "targetState",
          "failureReason"
        ],
        "additionalProperties": false,
        "title": "Charge Rate Limit Action"
      },
      "VehicleChargeRateLimitAction": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the action."
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that owns the target of this action.",
            "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was created",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was last updated",
            "example": "2020-04-07T17:04:26Z"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time when the action transitioned to a non-pending state.",
            "example": "2020-04-07T17:04:26Z"
          },
          "state": {
            "$ref": "#/components/schemas/ActionState"
          },
          "targetId": {
            "type": "string",
            "description": "ID of the entity which this action is controlling."
          },
          "targetState": {
            "$ref": "#/components/schemas/ChargeRateLimitPayload"
          },
          "failureReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ActionFailureReason"
              },
              {
                "type": [
                  "object",
                  "null"
                ]
              }
            ]
          },
          "targetType": {
            "type": "string",
            "enum": [
              "vehicle"
            ]
          }
        },
        "required": [
          "id",
          "userId",
          "createdAt",
          "updatedAt",
          "completedAt",
          "state",
          "targetId",
          "targetState",
          "failureReason",
          "targetType"
        ],
        "additionalProperties": false,
        "title": "Vehicle Charge Rate Limit Action"
      },
      "ChargingAction": {
        "type": "string",
        "enum": [
          "START",
          "STOP"
        ]
      },
      "ChargeAction": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the action."
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that owns the target of this action.",
            "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was created",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was last updated",
            "example": "2020-04-07T17:04:26Z"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time when the action transitioned to a non-pending state.",
            "example": "2020-04-07T17:04:26Z"
          },
          "state": {
            "$ref": "#/components/schemas/ActionState"
          },
          "targetId": {
            "type": "string",
            "description": "ID of the target which this action is controlling.",
            "example": "bfbccded-8a1c-45a8-bbda-dcaeef29977a"
          },
          "targetType": {
            "$ref": "#/components/schemas/ChargeableVendorType"
          },
          "kind": {
            "$ref": "#/components/schemas/ChargingAction",
            "description": "The charging action to perform"
          },
          "failureReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ActionFailureReason"
              },
              {
                "type": [
                  "object",
                  "null"
                ]
              }
            ]
          }
        },
        "required": [
          "id",
          "userId",
          "createdAt",
          "updatedAt",
          "completedAt",
          "state",
          "targetId",
          "targetType",
          "kind",
          "failureReason"
        ],
        "additionalProperties": false,
        "title": "Charge Action"
      },
      "VehicleAction": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                "x-format": {
                  "guid": true
                },
                "description": "The ID of the action."
              },
              "userId": {
                "type": "string",
                "description": "The ID of the user that owns the target of this action.",
                "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
              },
              "createdAt": {
                "type": "string",
                "format": "date-time",
                "description": "Time when this action was created",
                "example": "2020-04-07T17:04:26Z"
              },
              "updatedAt": {
                "type": "string",
                "format": "date-time",
                "description": "Time when this action was last updated",
                "example": "2020-04-07T17:04:26Z"
              },
              "completedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Time when the action transitioned to a non-pending state.",
                "example": "2020-04-07T17:04:26Z"
              },
              "state": {
                "$ref": "#/components/schemas/ActionState"
              },
              "targetId": {
                "type": "string",
                "description": "ID of the target which this action is controlling.",
                "example": "bfbccded-8a1c-45a8-bbda-dcaeef29977a"
              },
              "kind": {
                "$ref": "#/components/schemas/ChargingAction",
                "description": "The charging action to perform"
              },
              "failureReason": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/ActionFailureReason"
                  },
                  {
                    "type": [
                      "object",
                      "null"
                    ]
                  }
                ]
              },
              "targetType": {
                "type": "string",
                "enum": [
                  "vehicle"
                ]
              }
            },
            "required": [
              "id",
              "userId",
              "createdAt",
              "updatedAt",
              "completedAt",
              "state",
              "targetId",
              "kind",
              "failureReason",
              "targetType"
            ],
            "additionalProperties": false,
            "title": "Charge Action"
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                "x-format": {
                  "guid": true
                },
                "description": "The ID of the action."
              },
              "userId": {
                "type": "string",
                "description": "The ID of the user that owns the target of this action.",
                "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
              },
              "createdAt": {
                "type": "string",
                "format": "date-time",
                "description": "Time when this action was created",
                "example": "2020-04-07T17:04:26Z"
              },
              "updatedAt": {
                "type": "string",
                "format": "date-time",
                "description": "Time when this action was last updated",
                "example": "2020-04-07T17:04:26Z"
              },
              "completedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Time when the action transitioned to a non-pending state.",
                "example": "2020-04-07T17:04:26Z"
              },
              "state": {
                "$ref": "#/components/schemas/ActionState"
              },
              "targetId": {
                "type": "string",
                "description": "ID of the entity which this action is controlling."
              },
              "targetState": {
                "$ref": "#/components/schemas/TargetMaxCurrent"
              },
              "failureReason": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/ActionFailureReason"
                  },
                  {
                    "type": [
                      "object",
                      "null"
                    ]
                  }
                ]
              },
              "targetType": {
                "type": "string",
                "enum": [
                  "vehicle"
                ]
              }
            },
            "required": [
              "id",
              "userId",
              "createdAt",
              "updatedAt",
              "completedAt",
              "state",
              "targetId",
              "targetState",
              "failureReason",
              "targetType"
            ],
            "additionalProperties": false,
            "deprecated": true,
            "title": "Max Current Action"
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                "x-format": {
                  "guid": true
                },
                "description": "The ID of the action."
              },
              "userId": {
                "type": "string",
                "description": "The ID of the user that owns the target of this action.",
                "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
              },
              "createdAt": {
                "type": "string",
                "format": "date-time",
                "description": "Time when this action was created",
                "example": "2020-04-07T17:04:26Z"
              },
              "updatedAt": {
                "type": "string",
                "format": "date-time",
                "description": "Time when this action was last updated",
                "example": "2020-04-07T17:04:26Z"
              },
              "completedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Time when the action transitioned to a non-pending state.",
                "example": "2020-04-07T17:04:26Z"
              },
              "state": {
                "$ref": "#/components/schemas/ActionState"
              },
              "targetId": {
                "type": "string",
                "description": "ID of the entity which this action is controlling."
              },
              "targetState": {
                "$ref": "#/components/schemas/ChargeRateLimitPayload"
              },
              "failureReason": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/ActionFailureReason"
                  },
                  {
                    "type": [
                      "object",
                      "null"
                    ]
                  }
                ]
              },
              "targetType": {
                "type": "string",
                "enum": [
                  "vehicle"
                ]
              }
            },
            "required": [
              "id",
              "userId",
              "createdAt",
              "updatedAt",
              "completedAt",
              "state",
              "targetId",
              "targetState",
              "failureReason",
              "targetType"
            ],
            "additionalProperties": false,
            "title": "Charge Rate Limit Action"
          }
        ]
      },
      "ChargerPowerDeliveryState": {
        "type": "string",
        "enum": [
          "UNKNOWN",
          "UNPLUGGED",
          "PLUGGED_IN:INITIALIZING",
          "PLUGGED_IN:CHARGING",
          "PLUGGED_IN:STOPPED",
          "PLUGGED_IN:NO_POWER",
          "PLUGGED_IN:FAULT",
          "PLUGGED_IN:DISCHARGING"
        ],
        "example": "UNPLUGGED",
        "description": "The current state of power delivery between the vehicle and charger.\n\n * `UNKNOWN`: The state of power delivery is currently unknown or `chargeState.lastUpdated` is more than 7 days ago. \n * `UNPLUGGED`: The vehicle is not connected to the charger. \n * `PLUGGED_IN:INITIALIZING`: The charging station is preparing to deliver power to the vehicle. It is expected for this state to shortly transition into PLUGGED_IN:CHARGING. \n * `PLUGGED_IN:CHARGING`: The charger is actively delivering power to the vehicle, causing the battery level to increase. \n * `PLUGGED_IN:STOPPED`: The vehicle is plugged in, but the charger has been stopped. It is possible to transition into a charging state by sending a start command.\n * `PLUGGED_IN:NO_POWER`: The charger attempted to initialize charging, however no external power was accepted by the vehicle. It is not possible to transition into a charging state with a remote command until there is some user intervention to resolve the issue. \n * `PLUGGED_IN:FAULT`: A malfunction in the charging process is preventing power from being delivered. Possible causes include a charging cable not being properly locked, extreme temperatures, or malfunctions in either the charging station or the vehicle's internal system. It is not possible to transition into a charging state with a remote command until there is some user intervention to resolve the issue.\n * `PLUGGED_IN:DISCHARGING`: The charger is actively discharging by giving power to the home/grid, causing the battery level to decrease."
      },
      "ChargerChargeState": {
        "type": "object",
        "properties": {
          "isPluggedIn": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indicates whether the charger has a vehicle plugged into it (regardless of whether that vehicle is actually charging)"
          },
          "isCharging": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indicates whether the charger is currently delivering power to the vehicle and actively charging its battery."
          },
          "chargeRate": {
            "type": [
              "number",
              "null"
            ],
            "description": "The current charge rate in kW.\n\nThis property is only available when the charger is actively charging a vehicle, and is `null` any other time."
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of latest charge state update",
            "example": "2020-04-07T17:04:26Z"
          },
          "maxCurrent": {
            "type": [
              "number",
              "null"
            ],
            "deprecated": true,
            "description": "Deprecated: Use `chargeRateLimit` instead.\n\nDesired max current in amperes, if set"
          },
          "powerDeliveryState": {
            "$ref": "#/components/schemas/ChargerPowerDeliveryState"
          },
          "pluggedInVehicleId": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID of the vehicle currently plugged into the charger. By default, this attribute will be `null` and will only be populated if:\n * The charger and the vehicle are linked to the same Enode `userId`.\n * AND Enode has determined that the vehicle and charger are **currently** plugged into each other.",
            "example": "bf077f15-a7aa-4bc4-b917-8f1c89676198"
          },
          "chargeRateLimit": {
            "type": [
              "number",
              "null"
            ],
            "description": "The current charge rate limit in kW. Returns null when unavailable from the vendor. \n\nBeta: This property is available in beta as part of [Set Charge Rate Limit](/api/reference#postSetChargerChargeRateLimit)."
          }
        },
        "required": [
          "isPluggedIn",
          "isCharging",
          "chargeRate",
          "lastUpdated",
          "maxCurrent",
          "powerDeliveryState"
        ],
        "description": "Latest information about the charger. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
      },
      "ChargerInformation": {
        "type": "object",
        "properties": {
          "brand": {
            "$ref": "#/components/schemas/Brand"
          },
          "model": {
            "type": "string",
            "description": "Charger model",
            "example": "Home"
          },
          "displayName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Charger nickname set by the user in the vendor app. `null` when the vendor does not provide one.",
            "example": "Garage left"
          },
          "year": {
            "type": [
              "number",
              "null"
            ],
            "description": "Charger production year"
          },
          "serialNumber": {
            "type": "string",
            "description": "Charger serial number. Most chargers have this, but some do not expose it. When missing we default to a vendor provided ID, which may be visible to the end user in their app."
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL to an image of the charger model. `null` when not available.",
            "example": "https://cdn.images.enode.com/assets/019c90f6-1450-72f5-9074-65d7834914e5.webp"
          }
        },
        "required": [
          "brand",
          "model",
          "displayName",
          "year",
          "serialNumber",
          "imageUrl"
        ],
        "description": "Descriptive information about the Charger"
      },
      "Charger": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Charger ID"
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that linked this charger."
          },
          "vendor": {
            "$ref": "#/components/schemas/ChargerVendor"
          },
          "lastSeen": {
            "type": "string",
            "format": "date-time",
            "description": "The last time Enode communicated with the charger.",
            "example": "2020-04-07T17:04:26Z"
          },
          "isReachable": {
            "type": "boolean",
            "description": "Indicates whether Enode can currently access live data from the charger. If the charger is not reachable, data updates will be delayed."
          },
          "chargeState": {
            "$ref": "#/components/schemas/ChargerChargeState"
          },
          "capabilities": {
            "type": "object",
            "properties": {
              "information": {
                "$ref": "#/components/schemas/Capability",
                "description": "Full availability of information data."
              },
              "chargeState": {
                "$ref": "#/components/schemas/Capability",
                "description": "Full availability of chargeState data."
              },
              "startCharging": {
                "$ref": "#/components/schemas/Capability",
                "description": "Supports START charging command."
              },
              "stopCharging": {
                "$ref": "#/components/schemas/Capability",
                "description": "Supports STOP charging command."
              },
              "setMaxCurrent": {
                "$ref": "#/components/schemas/Capability",
                "deprecated": true,
                "description": "Deprecated: Use `setChargeRateLimit` instead.\n\nAbility to set the max charge rate."
              },
              "setChargeRateLimit": {
                "$ref": "#/components/schemas/ChargeRateLimitCapability",
                "description": "Ability to set the charge rate limit in kW.\n\nBeta: This property is available in beta as part of [Set Charge Rate Limit](/api/reference#postSetChargerChargeRateLimit)"
              }
            },
            "required": [
              "information",
              "chargeState",
              "startCharging",
              "stopCharging",
              "setMaxCurrent"
            ],
            "additionalProperties": false,
            "description": "A collection of descriptors that describe the capabilities of this specific charger"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Scopes that the user has granted for this charger.",
            "example": [
              "charger:control:charging",
              "charger:read:data"
            ]
          },
          "information": {
            "$ref": "#/components/schemas/ChargerInformation"
          },
          "location": {
            "type": "object",
            "properties": {
              "id": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uuid",
                "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                "x-format": {
                  "guid": true
                },
                "description": "ID of the location the charger is currently positioned at (if any)."
              },
              "lastUpdated": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Time of last received location state update",
                "example": "2020-04-07T17:04:26Z"
              }
            },
            "required": [
              "id",
              "lastUpdated"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "userId",
          "vendor",
          "lastSeen",
          "isReachable",
          "chargeState",
          "capabilities",
          "scopes",
          "information",
          "location"
        ],
        "additionalProperties": false,
        "example": {
          "information": {
            "brand": "Zaptec",
            "displayName": "Garage left",
            "model": "Pro",
            "serialNumber": "1234567890",
            "year": null
          },
          "location": {
            "id": "2211e263-d6d4-d6d4-d6d4-dbdd77ec82b6",
            "lastUpdated": "2023-03-21T16:39:20.000Z"
          },
          "id": "2211e263-0362-4235-83f4-887bdf3ee414",
          "userId": "d381faac-5283-44a1-9eb1-36cab2ace670",
          "vendor": "ZAPTEC",
          "lastSeen": "2023-03-21T21:08:27.596Z",
          "isReachable": true,
          "chargeState": {
            "isPluggedIn": true,
            "isCharging": true,
            "chargeRate": 6.939,
            "lastUpdated": "2023-03-21T16:39:20.000Z",
            "maxCurrent": 16,
            "powerDeliveryState": "PLUGGED_IN:CHARGING",
            "pluggedInVehicleId": "bf077f15-a7aa-4bc4-b917-8f1c89676198",
            "chargeRateLimit": 7.1
          },
          "capabilities": {
            "information": {
              "isCapable": true,
              "interventionIds": []
            },
            "chargeState": {
              "isCapable": true,
              "interventionIds": []
            },
            "startCharging": {
              "isCapable": true,
              "interventionIds": []
            },
            "stopCharging": {
              "isCapable": true,
              "interventionIds": []
            },
            "setMaxCurrent": {
              "isCapable": false,
              "interventionIds": [
                "4eaeb363-296d-4ccc-a973-7805e6f400bd"
              ]
            },
            "setChargeRateLimit": {
              "isCapable": true,
              "interventionIds": [],
              "allowedRange": {
                "kW": {
                  "min": 1.5,
                  "max": 7.4
                }
              }
            }
          },
          "scopes": [
            "charger:control:charging",
            "charger:read:data"
          ]
        }
      },
      "PaginatedChargerList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Charger"
            },
            "description": "Paginated list of chargers"
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of chargers"
      },
      "ChargerUpdatePayload": {
        "type": "object",
        "properties": {
          "locationId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            }
          }
        },
        "required": [
          "locationId"
        ],
        "additionalProperties": false
      },
      "ChargerAction": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/ChargeAction"
          },
          {
            "$ref": "#/components/schemas/MaxCurrentAction"
          },
          {
            "$ref": "#/components/schemas/ChargeRateLimitAction"
          }
        ]
      },
      "BatteryStatus": {
        "type": "string",
        "enum": [
          "CHARGING",
          "DISCHARGING",
          "IDLE",
          "FAULT",
          "UNKNOWN"
        ],
        "description": "The power delivery state of the battery.",
        "example": "CHARGING"
      },
      "BatteryChargeState": {
        "type": "object",
        "properties": {
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BatteryStatus"
              },
              {
                "type": [
                  "string",
                  "null"
                ]
              }
            ]
          },
          "batteryCapacity": {
            "type": [
              "number",
              "null"
            ],
            "description": "Battery capacity in kWh.",
            "example": 13.5
          },
          "batteryLevel": {
            "type": [
              "number",
              "null"
            ],
            "description": "Remaining battery charge level in percent.",
            "example": 80
          },
          "chargeRate": {
            "type": [
              "number",
              "null"
            ],
            "description": "The current charge rate in kW. A positive value indicates that the battery is charging.",
            "example": 4.6
          },
          "dischargeLimit": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum charge level for a battery, expressed as a percentage. Batteries will not discharge below this user-set reserve level except in emergency power situations.",
            "example": 20
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received charge state update",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "status",
          "batteryCapacity",
          "batteryLevel",
          "chargeRate",
          "dischargeLimit",
          "lastUpdated"
        ],
        "additionalProperties": false,
        "description": "Latest information about the battery. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
      },
      "BatteryOperationMode": {
        "type": "string",
        "enum": [
          "IMPORT_FOCUS",
          "EXPORT_FOCUS",
          "TIME_OF_USE",
          "SELF_RELIANCE",
          "IDLE",
          "UNKNOWN"
        ],
        "description": "The current operation mode of the battery.\n\n * `SELF_RELIANCE`: Minimizes household reliance on the grid. Prioritizes 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.\n * `TIME_OF_USE`: Maximizes energy cost savings in accordance with a user-defined schedule matching a 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.\n * `IMPORT_FOCUS`: Prioritizes charging the battery. Uses excess solar energy for charging and will charge from grid if possible. Leveraged energy sources depend on the configuration of the battery. Note: Focus modes target a certain battery behavior but are ultimately internal to the battery. Actual behavior might differ from the focus mode. \n * `EXPORT_FOCUS`: Prioritizes discharging energy stored in the battery back to the household and any excess to the grid. Grid exports often depend on local regulation and might require agreements with grid providers to be supported.  Note: Focus modes target a certain battery behavior but are ultimately internal to the battery. Actual behavior might differ from the focus mode.\n * `IDLE`: Prevents the battery from charging or discharging. The battery remains inactive and maintains its current state of charge, even if there is available solar generation or energy demand from household consumption.\n * `UNKNOWN`: The mode of the battery is currently unknown. It might be possible to switch out of this mode and into one of the known modes. Actively returning to this mode is not possible."
      },
      "BatteryConfig": {
        "type": "object",
        "properties": {
          "operationMode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BatteryOperationMode"
              },
              {
                "type": [
                  "string",
                  "null"
                ]
              }
            ]
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received configuration update",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "operationMode",
          "lastUpdated"
        ],
        "additionalProperties": false
      },
      "BatteryInformation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Battery vendor ID",
            "example": "7deb27f8-794f-467b-855e-5c61dd9f2cb3"
          },
          "brand": {
            "$ref": "#/components/schemas/Brand"
          },
          "model": {
            "type": "string",
            "description": "Battery model",
            "example": "Powerwall"
          },
          "siteName": {
            "type": "string",
            "description": "Name of the site, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names.",
            "example": "Powerwall Home"
          },
          "installationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Battery installation date",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "id",
          "brand",
          "model",
          "siteName",
          "installationDate"
        ],
        "additionalProperties": false,
        "description": "Descriptive information about the battery"
      },
      "BatteryCapabilities": {
        "type": "object",
        "properties": {
          "exportFocus": {
            "$ref": "#/components/schemas/Capability",
            "description": "Supports EXPORT_FOCUS operation mode."
          },
          "importFocus": {
            "$ref": "#/components/schemas/Capability",
            "description": "Supports IMPORT_FOCUS operation mode."
          },
          "timeOfUse": {
            "$ref": "#/components/schemas/Capability",
            "description": "Supports TIME_OF_USE operation mode."
          },
          "selfReliance": {
            "$ref": "#/components/schemas/Capability",
            "description": "Supports SELF_RELIANCE operation mode."
          },
          "idle": {
            "$ref": "#/components/schemas/Capability",
            "description": "Supports IDLE operation mode."
          }
        },
        "required": [
          "exportFocus",
          "importFocus",
          "timeOfUse",
          "selfReliance",
          "idle"
        ],
        "additionalProperties": false,
        "description": "A collection of descriptors that describe the capabilities of this specific battery"
      },
      "BatteryLocation": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
            "x-format": {
              "guid": true
            },
            "description": "ID of the location the battery is currently positioned at (if any)."
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Longitude in degrees",
            "example": 10.7197486
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Latitude in degrees",
            "example": 59.9173985
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received location state update",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "id",
          "longitude",
          "latitude",
          "lastUpdated"
        ],
        "additionalProperties": false,
        "description": "Battery's GPS coordinates"
      },
      "Battery": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the battery object",
            "example": "54d827e1-8355-4fed-97b5-55940d1d09ba"
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that linked this battery.",
            "example": "4f6fecd0-bdae-49be-b6e8-ee442e1e3da9"
          },
          "vendor": {
            "$ref": "#/components/schemas/BatteryVendor"
          },
          "lastSeen": {
            "type": "string",
            "format": "date-time",
            "description": "The last time Enode successfully communicated with the vendor or when the battery was initially linked.",
            "example": "2020-04-07T17:04:26Z"
          },
          "isReachable": {
            "type": "boolean",
            "description": "Indicates whether Enode can currently access live data from the battery. If the battery is not reachable, data updates will be delayed."
          },
          "chargeState": {
            "$ref": "#/components/schemas/BatteryChargeState"
          },
          "config": {
            "$ref": "#/components/schemas/BatteryConfig"
          },
          "information": {
            "$ref": "#/components/schemas/BatteryInformation"
          },
          "capabilities": {
            "$ref": "#/components/schemas/BatteryCapabilities"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Scopes that the user has granted for this battery.",
            "example": [
              "battery:control:operation_mode",
              "battery:read:data",
              "battery:read:location"
            ]
          },
          "location": {
            "$ref": "#/components/schemas/BatteryLocation"
          },
          "hemSystemId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "ID of the HEM system the asset is associated with. This field is present when the HEM System feature is enabled and the asset is linked to a HEM system.",
            "example": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
          }
        },
        "required": [
          "id",
          "userId",
          "vendor",
          "lastSeen",
          "isReachable",
          "chargeState",
          "config",
          "information",
          "capabilities",
          "scopes",
          "location",
          "hemSystemId"
        ],
        "additionalProperties": false,
        "description": "Battery object"
      },
      "PaginatedBatteryList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Battery"
            },
            "description": "Paginated list of batteries"
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of batteries"
      },
      "setBatteryOperationModePayload": {
        "type": "object",
        "properties": {
          "operationMode": {
            "type": "string",
            "enum": [
              "IMPORT_FOCUS",
              "EXPORT_FOCUS",
              "TIME_OF_USE",
              "SELF_RELIANCE",
              "IDLE"
            ],
            "description": "Desired operation mode of the battery.\n\n * `SELF_RELIANCE`: Minimizes household reliance on the grid. Prioritizes 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.\n * `TIME_OF_USE`: Maximizes energy cost savings in accordance with a user-defined schedule matching a 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.\n * `IMPORT_FOCUS`: Prioritizes charging the battery. Uses excess solar energy for charging and will charge from grid if possible. Leveraged energy sources depend on the configuration of the battery. Note: Focus modes target a certain battery behavior but are ultimately internal to the battery. Actual behavior might differ from the focus mode. \n * `EXPORT_FOCUS`: Prioritizes discharging energy stored in the battery back to the household and any excess to the grid. Grid exports often depend on local regulation and might require agreements with grid providers to be supported.  Note: Focus modes target a certain battery behavior but are ultimately internal to the battery. Actual behavior might differ from the focus mode.\n * `IDLE`: Prevents the battery from charging or discharging. The battery remains inactive and maintains its current state of charge, even if there is available solar generation or energy demand from household consumption.",
            "example": "IMPORT_FOCUS"
          }
        },
        "required": [
          "operationMode"
        ],
        "additionalProperties": false,
        "description": "Target battery operation mode"
      },
      "OperationModeAction": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the action."
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that owns the target of this action.",
            "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was created",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was last updated",
            "example": "2020-04-07T17:04:26Z"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time when the action transitioned to a non-pending state.",
            "example": "2020-04-07T17:04:26Z"
          },
          "state": {
            "$ref": "#/components/schemas/ActionState"
          },
          "targetId": {
            "type": "string",
            "description": "ID of the battery which this action is controlling.",
            "example": "ac03a513-5494-4e1c-9dd7-2a29dc024312"
          },
          "targetType": {
            "type": "string",
            "enum": [
              "battery"
            ]
          },
          "targetState": {
            "$ref": "#/components/schemas/setBatteryOperationModePayload"
          },
          "failureReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ActionFailureReason"
              },
              {
                "type": [
                  "object",
                  "null"
                ]
              }
            ]
          }
        },
        "required": [
          "id",
          "userId",
          "createdAt",
          "updatedAt",
          "completedAt",
          "state",
          "targetId",
          "targetType",
          "targetState",
          "failureReason"
        ],
        "additionalProperties": false,
        "title": "Battery Operation Mode Action"
      },
      "HvacMode": {
        "type": "string",
        "enum": [
          "UNKNOWN",
          "OFF",
          "AUTO",
          "COOL",
          "HEAT"
        ],
        "example": "AUTO",
        "description": "The current state of the HVAC unit.\n\n * `UNKNOWN`: The mode of the HVAC unit is currently not available from the vendor or not supported by enode.\n * `OFF`: The HVAC unit is turned off.\n * `AUTO`: The HVAC unit will try to maintain the given setpoint by alternating between cooling and heating based on the ambient temperature\n * `COOL`: The HVAC unit will only cool to the given setpoint.\n * `HEAT`: The HVAC unit will only heat to the given setpoint"
      },
      "HvacHoldType": {
        "type": "string",
        "enum": [
          "PERMANENT",
          "SCHEDULED"
        ]
      },
      "NullableTemperatureRange": {
        "type": [
          "object",
          "null"
        ],
        "properties": {
          "min": {
            "type": [
              "number",
              "null"
            ],
            "description": "The minimum allowable temperature, inclusive."
          },
          "max": {
            "type": [
              "number",
              "null"
            ],
            "description": "The maximum allowable temperature, inclusive."
          }
        },
        "required": [
          "min",
          "max"
        ],
        "additionalProperties": false
      },
      "NullableTemperatureDifferenceRange": {
        "type": [
          "object",
          "null"
        ],
        "properties": {
          "min": {
            "type": [
              "number",
              "null"
            ],
            "description": "The minimum allowable difference, inclusive."
          },
          "max": {
            "type": [
              "number",
              "null"
            ],
            "description": "The maximum allowable difference, inclusive."
          }
        },
        "required": [
          "min",
          "max"
        ],
        "additionalProperties": false
      },
      "PaginatedHVACList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "HVAC unit ID"
                },
                "userId": {
                  "type": "string",
                  "description": "The ID of the user that linked this hvac."
                },
                "vendor": {
                  "$ref": "#/components/schemas/HvacVendor"
                },
                "lastSeen": {
                  "type": "string",
                  "format": "date-time",
                  "description": "The last time Enode successfully communicated with the vendor or when the HVAC unit was initially linked.",
                  "example": "2020-04-07T17:04:26Z"
                },
                "isReachable": {
                  "type": "boolean",
                  "description": "Indicates whether Enode can currently access live data from the HVAC. If the HVAC is not reachable, data updates will be delayed."
                },
                "consumptionRate": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "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."
                },
                "information": {
                  "type": "object",
                  "properties": {
                    "brand": {
                      "$ref": "#/components/schemas/Brand"
                    },
                    "model": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Device model name"
                    },
                    "displayName": {
                      "type": "string",
                      "description": "Name of the device, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names."
                    },
                    "groupName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Name of the group the device belongs to, as set by the user on the device/vendor. Groups are typically presented as \"rooms\" or \"zones\"."
                    },
                    "category": {
                      "type": "string",
                      "enum": [
                        "HEATING",
                        "COOLING",
                        "HEAT_PUMP",
                        "AGGREGATOR"
                      ],
                      "description": "Classification of the connected HVAC device.\n\n * `HEATING`: A direct heating device, such as an electric panel heater\n\n * `COOLING`: A direct cooling device, such as an air conditioner \n\n * `HEAT_PUMP`: An air-to-air heat pump capable of both heating and cooling\n\n * `AGGREGATOR`: A device that is capable of controlling various HVAC systems behind it, such as a smart thermostat"
                    }
                  },
                  "required": [
                    "brand",
                    "model",
                    "displayName",
                    "groupName",
                    "category"
                  ],
                  "additionalProperties": false,
                  "description": "Descriptive information about the HVAC unit"
                },
                "temperatureState": {
                  "type": "object",
                  "properties": {
                    "currentTemperature": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "Current air temperature reported by device in degrees Celsius."
                    },
                    "isActive": {
                      "type": "boolean",
                      "description": "Whether the HVAC unit is actively heating or cooling."
                    },
                    "lastUpdated": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "Time of last temperature state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer",
                      "example": "2020-04-07T17:04:26Z"
                    }
                  },
                  "required": [
                    "currentTemperature",
                    "isActive",
                    "lastUpdated"
                  ],
                  "additionalProperties": false,
                  "description": "Latest information about temperature. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
                },
                "thermostatState": {
                  "type": "object",
                  "properties": {
                    "mode": {
                      "$ref": "#/components/schemas/HvacMode"
                    },
                    "heatSetpoint": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "If mode allows, heat when `currentTemperature` falls below this point."
                    },
                    "coolSetpoint": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "If mode allows, cool when `currentTemperature` rises above this point."
                    },
                    "holdType": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/HvacHoldType"
                        },
                        {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "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."
                        }
                      ]
                    },
                    "lastUpdated": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "Time of last thermostat state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer.",
                      "example": "2020-04-07T17:04:26Z"
                    }
                  },
                  "required": [
                    "mode",
                    "heatSetpoint",
                    "coolSetpoint",
                    "holdType",
                    "lastUpdated"
                  ],
                  "additionalProperties": false,
                  "description": "Latest information about the thermostat state. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
                },
                "scopes": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Scopes that the user has granted for this HVAC unit.",
                  "example": [
                    "hvac:control:mode",
                    "hvac:read:data"
                  ]
                },
                "capabilities": {
                  "type": "object",
                  "properties": {
                    "capableModes": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "$ref": "#/components/schemas/HvacMode"
                      },
                      "description": "A list of valid modes for this HVAC unit."
                    },
                    "coolSetpointRange": {
                      "$ref": "#/components/schemas/NullableTemperatureRange",
                      "description": "The range of allowable values for `coolSetpoint`."
                    },
                    "heatSetpointRange": {
                      "$ref": "#/components/schemas/NullableTemperatureRange",
                      "description": "The range of allowable values for `heatSetpoint`."
                    },
                    "setpointDifferenceRange": {
                      "$ref": "#/components/schemas/NullableTemperatureDifferenceRange",
                      "description": "A constraint specifying the minimum and maximum allowable difference between `heatSetpoint` and `coolSetpoint`. Only applicable in `AUTO` mode."
                    },
                    "setFollowSchedule": {
                      "$ref": "#/components/schemas/Capability",
                      "description": "Supports following a schedule set on the device."
                    },
                    "setPermanentHold": {
                      "$ref": "#/components/schemas/Capability",
                      "description": "Supports setting a permanent hold."
                    }
                  },
                  "required": [
                    "capableModes",
                    "coolSetpointRange",
                    "heatSetpointRange",
                    "setpointDifferenceRange",
                    "setFollowSchedule",
                    "setPermanentHold"
                  ],
                  "additionalProperties": false,
                  "description": "An object describing valid states for this HVAC unit."
                },
                "location": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "uuid",
                      "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                      "x-format": {
                        "guid": true
                      },
                      "description": "ID of the charging location the HVAC unit is housed at (if any)"
                    }
                  },
                  "required": [
                    "id"
                  ],
                  "additionalProperties": false
                }
              },
              "required": [
                "id",
                "userId",
                "vendor",
                "lastSeen",
                "isReachable",
                "consumptionRate",
                "information",
                "temperatureState",
                "thermostatState",
                "scopes",
                "capabilities",
                "location"
              ],
              "additionalProperties": false,
              "example": {
                "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
                "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
                "vendor": "ADAX",
                "lastSeen": "2020-04-07T17:04:26.000Z",
                "isReachable": true,
                "consumptionRate": 1.8,
                "information": {
                  "brand": "ADAX",
                  "model": "Neo Wi-Fi Skirting",
                  "displayName": "Bedroom Panel Heater",
                  "groupName": "Bedroom",
                  "category": "HEATING"
                },
                "location": {
                  "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
                },
                "capabilities": {
                  "capableModes": [
                    "HEAT",
                    "COOL",
                    "OFF"
                  ],
                  "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"
                ]
              }
            },
            "description": "List of paginated HVAC units"
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of HVAC units"
      },
      "hvacUpdatePayload": {
        "type": "object",
        "properties": {
          "locationId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            }
          }
        },
        "required": [
          "locationId"
        ],
        "additionalProperties": false
      },
      "CoolTargetState": {
        "type": "object",
        "properties": {
          "coolSetpoint": {
            "type": "number"
          },
          "mode": {
            "type": "string",
            "enum": [
              "COOL"
            ]
          },
          "holdType": {
            "type": "string",
            "enum": [
              "PERMANENT"
            ]
          }
        },
        "required": [
          "coolSetpoint",
          "mode",
          "holdType"
        ],
        "additionalProperties": false,
        "title": "COOL",
        "description": "Target mode for an HVAC unit"
      },
      "HeatTargetState": {
        "type": "object",
        "properties": {
          "heatSetpoint": {
            "type": "number"
          },
          "mode": {
            "type": "string",
            "enum": [
              "HEAT"
            ]
          },
          "holdType": {
            "type": "string",
            "enum": [
              "PERMANENT"
            ]
          }
        },
        "required": [
          "heatSetpoint",
          "mode",
          "holdType"
        ],
        "additionalProperties": false,
        "title": "HEAT",
        "description": "Target mode for an HVAC unit"
      },
      "AutoTargetState": {
        "type": "object",
        "properties": {
          "coolSetpoint": {
            "type": "number"
          },
          "heatSetpoint": {
            "type": "number"
          },
          "mode": {
            "type": "string",
            "enum": [
              "AUTO"
            ]
          },
          "holdType": {
            "type": "string",
            "enum": [
              "PERMANENT"
            ]
          }
        },
        "required": [
          "coolSetpoint",
          "heatSetpoint",
          "mode",
          "holdType"
        ],
        "additionalProperties": false,
        "title": "AUTO",
        "description": "Target mode for an HVAC unit"
      },
      "OffTargetState": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "OFF"
            ]
          },
          "holdType": {
            "type": "string",
            "enum": [
              "PERMANENT"
            ]
          }
        },
        "required": [
          "mode",
          "holdType"
        ],
        "additionalProperties": false,
        "title": "OFF",
        "description": "Target mode for an HVAC unit"
      },
      "PermanentHoldTargetState": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/CoolTargetState"
          },
          {
            "$ref": "#/components/schemas/HeatTargetState"
          },
          {
            "$ref": "#/components/schemas/AutoTargetState"
          },
          {
            "$ref": "#/components/schemas/OffTargetState"
          }
        ],
        "title": "Permanent Hold"
      },
      "HvacActionPermanentHold": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the action."
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that owns the target of this action.",
            "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was created",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was last updated",
            "example": "2020-04-07T17:04:26Z"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time when the action transitioned to a non-pending state.",
            "example": "2020-04-07T17:04:26Z"
          },
          "state": {
            "$ref": "#/components/schemas/ActionState"
          },
          "targetId": {
            "type": "string",
            "description": "ID of the entity asset (HVAC) which this action is controlling."
          },
          "targetType": {
            "type": "string",
            "enum": [
              "hvac"
            ]
          },
          "target": {
            "$ref": "#/components/schemas/PermanentHoldTargetState"
          },
          "failureReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ActionFailureReason"
              },
              {
                "type": [
                  "object",
                  "null"
                ]
              }
            ]
          }
        },
        "required": [
          "id",
          "userId",
          "createdAt",
          "updatedAt",
          "completedAt",
          "state",
          "targetId",
          "targetType",
          "target",
          "failureReason"
        ],
        "additionalProperties": false,
        "title": "Permanent Hold Action"
      },
      "ScheduledTargetState": {
        "type": "object",
        "properties": {
          "holdType": {
            "type": "string",
            "enum": [
              "SCHEDULED"
            ]
          }
        },
        "required": [
          "holdType"
        ],
        "additionalProperties": false,
        "title": "Follow Device Schedule"
      },
      "HvacActionFollowSchedule": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the action."
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that owns the target of this action.",
            "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was created",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this action was last updated",
            "example": "2020-04-07T17:04:26Z"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time when the action transitioned to a non-pending state.",
            "example": "2020-04-07T17:04:26Z"
          },
          "state": {
            "$ref": "#/components/schemas/ActionState"
          },
          "targetId": {
            "type": "string",
            "description": "ID of the entity asset (HVAC) which this action is controlling."
          },
          "targetType": {
            "type": "string",
            "enum": [
              "hvac"
            ]
          },
          "target": {
            "$ref": "#/components/schemas/ScheduledTargetState"
          },
          "failureReason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ActionFailureReason"
              },
              {
                "type": [
                  "object",
                  "null"
                ]
              }
            ]
          }
        },
        "required": [
          "id",
          "userId",
          "createdAt",
          "updatedAt",
          "completedAt",
          "state",
          "targetId",
          "targetType",
          "target",
          "failureReason"
        ],
        "additionalProperties": false,
        "title": "Follow Schedule Action"
      },
      "HvacAction": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/HvacActionPermanentHold"
          },
          {
            "$ref": "#/components/schemas/HvacActionFollowSchedule"
          }
        ]
      },
      "CoolPermanentHold": {
        "type": "object",
        "properties": {
          "coolSetpoint": {
            "type": "number"
          },
          "mode": {
            "type": "string",
            "enum": [
              "COOL"
            ]
          }
        },
        "required": [
          "coolSetpoint",
          "mode"
        ],
        "additionalProperties": false,
        "title": "COOL",
        "description": "Target mode for an HVAC unit"
      },
      "HeatPermanentHold": {
        "type": "object",
        "properties": {
          "heatSetpoint": {
            "type": "number"
          },
          "mode": {
            "type": "string",
            "enum": [
              "HEAT"
            ]
          }
        },
        "required": [
          "heatSetpoint",
          "mode"
        ],
        "additionalProperties": false,
        "title": "HEAT",
        "description": "Target mode for an HVAC unit"
      },
      "AutoPermanentHold": {
        "type": "object",
        "properties": {
          "coolSetpoint": {
            "type": "number"
          },
          "heatSetpoint": {
            "type": "number"
          },
          "mode": {
            "type": "string",
            "enum": [
              "AUTO"
            ]
          }
        },
        "required": [
          "coolSetpoint",
          "heatSetpoint",
          "mode"
        ],
        "additionalProperties": false,
        "title": "AUTO",
        "description": "Target mode for an HVAC unit"
      },
      "OffPermanentHold": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "OFF"
            ]
          }
        },
        "required": [
          "mode"
        ],
        "additionalProperties": false,
        "title": "OFF",
        "description": "Target mode for an HVAC unit"
      },
      "HVACSetPermanentHoldPayload": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/CoolPermanentHold"
          },
          {
            "$ref": "#/components/schemas/HeatPermanentHold"
          },
          {
            "$ref": "#/components/schemas/AutoPermanentHold"
          },
          {
            "$ref": "#/components/schemas/OffPermanentHold"
          }
        ],
        "title": "Permanent Hold"
      },
      "InverterProductionState": {
        "type": "object",
        "properties": {
          "productionRate": {
            "type": [
              "number",
              "null"
            ],
            "description": "The current production rate in kW."
          },
          "isProducing": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether the solar inverter is actively producing energy or not."
          },
          "totalLifetimeProduction": {
            "type": [
              "number",
              "null"
            ],
            "description": "The total lifetime production in kWh.",
            "example": 100152.56
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received production state update",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "productionRate",
          "isProducing",
          "totalLifetimeProduction",
          "lastUpdated"
        ],
        "additionalProperties": false,
        "description": "Latest information about solar production. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
      },
      "InverterCapabilities": {
        "type": "object",
        "properties": {
          "productionState": {
            "$ref": "#/components/schemas/Capability",
            "description": "Full availability of productionState data."
          },
          "productionStatistics": {
            "$ref": "#/components/schemas/Capability",
            "description": "Availability of production statistics directly from the vendor."
          }
        },
        "required": [
          "productionState",
          "productionStatistics"
        ],
        "additionalProperties": false,
        "description": "A collection of descriptors that describe the capabilities of this specific inverter.\n\nNote: [Sample-based statistics](/api/reference#getProductionStatistics) collected by Enode rely on the `productionState` capability and are not affected by this capability."
      },
      "InverterInformation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Solar inverter vendor ID",
            "example": "7a18eb4e-ee65-4d5b-bb7c-d8e530006b18"
          },
          "sn": {
            "type": [
              "string",
              "null"
            ],
            "description": "Solar inverter serial number",
            "example": "A123456789"
          },
          "brand": {
            "$ref": "#/components/schemas/Brand"
          },
          "model": {
            "type": "string",
            "description": "Solar inverter model",
            "example": "Sunny Boy"
          },
          "siteName": {
            "type": "string",
            "description": "Name of the site, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names.",
            "example": "Sunny Plant"
          },
          "installationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Solar inverter installation date",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "id",
          "sn",
          "brand",
          "model",
          "siteName",
          "installationDate"
        ],
        "additionalProperties": false,
        "description": "Descriptive information about the solar inverter"
      },
      "InverterLocation": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
            "x-format": {
              "guid": true
            },
            "description": "ID of the location the solar inverter is currently positioned at (if any)."
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Longitude in degrees",
            "example": 10.7197486
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Latitude in degrees",
            "example": 59.9173985
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received location state update",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "id",
          "longitude",
          "latitude",
          "lastUpdated"
        ],
        "additionalProperties": false,
        "description": "Solar inverter's GPS coordinates"
      },
      "Inverter": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Solar Inverter ID",
            "example": "195d8649-ad12-4755-a9cc-44e2d40ce4d9"
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that linked this inverter.",
            "example": "f9d9b134-05f3-452a-80aa-be0deb22f492"
          },
          "vendor": {
            "$ref": "#/components/schemas/InverterVendor"
          },
          "lastSeen": {
            "type": "string",
            "format": "date-time",
            "description": "The last time Enode received live data or when the solar inverter was initially linked.",
            "example": "2020-04-07T17:04:26Z"
          },
          "isReachable": {
            "type": "boolean",
            "description": "Indicates whether Enode can currently access live data from the inverter. If the inverter is not reachable, data updates will be delayed."
          },
          "productionState": {
            "$ref": "#/components/schemas/InverterProductionState"
          },
          "timezone": {
            "type": [
              "string",
              "null"
            ],
            "example": "Europe/Oslo",
            "description": "IANA TZ database timezone name representing the location of this inverter."
          },
          "capabilities": {
            "$ref": "#/components/schemas/InverterCapabilities"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Scopes that the user has granted for this inverter.",
            "example": [
              "inverter:read:data",
              "inverter:read:location"
            ]
          },
          "information": {
            "$ref": "#/components/schemas/InverterInformation"
          },
          "location": {
            "$ref": "#/components/schemas/InverterLocation"
          },
          "hemSystemId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "ID of the HEM system the asset is associated with. This field is present when the HEM System feature is enabled and the asset is linked to a HEM system.",
            "example": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
          }
        },
        "required": [
          "id",
          "userId",
          "vendor",
          "lastSeen",
          "isReachable",
          "productionState",
          "timezone",
          "capabilities",
          "scopes",
          "information",
          "location",
          "hemSystemId"
        ],
        "additionalProperties": false,
        "description": "Solar inverter object"
      },
      "PaginatedInverterList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Inverter"
            },
            "description": "Paginated list of solar inverters"
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of solar inverters"
      },
      "MeterInformation": {
        "type": "object",
        "properties": {
          "brand": {
            "$ref": "#/components/schemas/Brand"
          },
          "model": {
            "type": "string",
            "description": "Meter model",
            "example": "Tesla Powerwall built-in meter"
          },
          "siteName": {
            "type": "string",
            "description": "Name of the site, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names.",
            "example": "Powerwall Home"
          },
          "installationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Meter installation date",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "brand",
          "model",
          "siteName",
          "installationDate"
        ],
        "additionalProperties": false,
        "description": "Descriptive information about the meter"
      },
      "MeterEnergyState": {
        "type": "object",
        "properties": {
          "power": {
            "type": [
              "number",
              "null"
            ],
            "description": "The current power measured by the meter in kW. \n\n * Positive value: Power is imported from the grid to the site, indicating consumption. \n * Negative value: Power is exported to the grid, typically when the site generates excess electricity (e.g. from solar panels, or battery discharge). ",
            "example": 2.2
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received energy state update.",
            "example": "2022-03-01T12:34:56Z"
          }
        },
        "required": [
          "power",
          "lastUpdated"
        ],
        "additionalProperties": false,
        "description": "Latest information about meter load. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
      },
      "MeterLocation": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
            "x-format": {
              "guid": true
            },
            "description": "ID of the location the meter is currently positioned at (if any)."
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Longitude in degrees",
            "example": 10.7197486
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Latitude in degrees",
            "example": 59.9173985
          },
          "lastUpdated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Time of last received location state update",
            "example": "2024-01-07T17:04:26.000Z"
          }
        },
        "required": [
          "id",
          "longitude",
          "latitude",
          "lastUpdated"
        ],
        "additionalProperties": false,
        "description": "Meter's GPS coordinates"
      },
      "MeterCapabilities": {
        "type": "object",
        "properties": {
          "measuresConsumption": {
            "$ref": "#/components/schemas/Capability",
            "description": "Indicates if the meter can measure consumed energy."
          },
          "measuresProduction": {
            "$ref": "#/components/schemas/Capability",
            "description": "Indicates if the meter can measure energy produced or generated."
          }
        },
        "required": [
          "measuresConsumption",
          "measuresProduction"
        ],
        "additionalProperties": false,
        "description": "The specific meter's capabilities for recording energy consumption and production data."
      },
      "Meter": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique identifier for the meter object"
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that linked this meter."
          },
          "vendor": {
            "$ref": "#/components/schemas/MeterVendor"
          },
          "lastSeen": {
            "type": "string",
            "format": "date-time",
            "description": "The last time Enode successfully communicated with the vendor or when the meter was initially linked.",
            "example": "2020-04-07T17:04:26Z"
          },
          "isReachable": {
            "type": "boolean",
            "description": "Indicates whether Enode can currently access live data from the meter. If the meter is not reachable, data updates will be delayed."
          },
          "information": {
            "$ref": "#/components/schemas/MeterInformation"
          },
          "energyState": {
            "$ref": "#/components/schemas/MeterEnergyState"
          },
          "location": {
            "$ref": "#/components/schemas/MeterLocation"
          },
          "capabilities": {
            "$ref": "#/components/schemas/MeterCapabilities"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Scopes that the user has granted for this meter.",
            "example": [
              "meter:read:data",
              "meter:read:location"
            ]
          },
          "hemSystemId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "ID of the HEM system the asset is associated with. This field is present when the HEM System feature is enabled and the asset is linked to a HEM system.",
            "example": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
          }
        },
        "required": [
          "id",
          "userId",
          "vendor",
          "lastSeen",
          "isReachable",
          "information",
          "energyState",
          "location",
          "capabilities",
          "scopes",
          "hemSystemId"
        ],
        "additionalProperties": false
      },
      "PaginatedMeterList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Meter"
            },
            "description": "Paginated list of meters"
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of meters"
      },
      "HEMSystem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "54d827e1-8355-4fed-97b5-55940d1d09ba",
            "x-format": {
              "guid": true
            },
            "description": "Unique identifier for the HEM System"
          },
          "userId": {
            "type": "string",
            "description": "The ID of the user that linked devices of the solar installation",
            "example": "4f6fecd0-bdae-49be-b6e8-ee442e1e3da9"
          },
          "locationId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe",
            "x-format": {
              "guid": true
            },
            "description": "ID of the location the HEM System is associated with"
          },
          "information": {
            "type": "object",
            "properties": {
              "vendor": {
                "type": "string",
                "enum": [
                  "SOLAREDGE",
                  "FOXESS",
                  "SMA",
                  "TESLA",
                  "GIVENERGY",
                  "SOLAX",
                  "SOLIS",
                  "HUAWEI",
                  "ENPHASE",
                  "SUNGROW"
                ],
                "description": "Machine-friendly name of the vendor. Use this in API requests.",
                "example": "ENPHASE"
              },
              "name": {
                "type": "string",
                "description": "Name of the HEM System, as set by the user on the device/vendor. ",
                "example": "My Solar Terrace"
              },
              "installationDate": {
                "type": "string",
                "format": "date-time",
                "description": "HEM System installation date",
                "example": "2020-04-07T17:04:26Z"
              },
              "latitude": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Latitude in degrees",
                "example": 59.9173985
              },
              "longitude": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Longitude in degrees",
                "example": 10.7197486
              },
              "address": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Address of the HEM System",
                "example": "123 Main St, Springfield, IL 62701"
              },
              "timezone": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "lastUpdated": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Time of last received location state update",
                "example": "2020-04-07T17:04:26Z"
              }
            },
            "required": [
              "vendor",
              "name",
              "installationDate",
              "latitude",
              "longitude",
              "address",
              "timezone",
              "lastUpdated"
            ]
          },
          "status": {
            "type": "object",
            "properties": {
              "lastSeen": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "The last time Enode successfully communicated with the HEM system.",
                "example": "2025-06-15T10:02:34Z"
              },
              "energy": {
                "type": "object",
                "properties": {
                  "today": {
                    "type": "object",
                    "properties": {
                      "generation": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Solar generation in kWh",
                        "example": 12.5
                      },
                      "consumption": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Household consumption in kWh",
                        "example": 8.2
                      },
                      "charge": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Battery charge in kWh",
                        "example": 3
                      },
                      "discharge": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Battery discharge in kWh",
                        "example": 1.5
                      },
                      "import": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Grid import in kWh",
                        "example": 0.7
                      },
                      "export": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Grid export in kWh",
                        "example": 3.5
                      },
                      "unit": {
                        "type": "string",
                        "description": "Unit of the metrics",
                        "example": "kWh"
                      },
                      "lastUpdated": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time",
                        "description": "Time of last received metrics update",
                        "example": "2020-04-07T17:04:26Z"
                      }
                    },
                    "required": [
                      "generation",
                      "consumption",
                      "charge",
                      "discharge",
                      "import",
                      "export",
                      "unit",
                      "lastUpdated"
                    ],
                    "description": "Energy metrics for the current day (from midnight to last update seen by Enode)"
                  }
                },
                "required": [
                  "today"
                ],
                "description": "Energy metrics for the HEM System"
              }
            },
            "required": [
              "lastSeen",
              "energy"
            ],
            "description": "Status of the HEM System"
          }
        },
        "required": [
          "id",
          "userId",
          "locationId",
          "information",
          "status"
        ],
        "description": "Home Energy Management System (HEMS) that describes the solar installation or site or plant"
      },
      "PaginatedHEMSystemList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HEMSystem"
            },
            "description": "Paginated list of HEM systems"
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of HEM systems"
      },
      "HemssTimeseries": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "isAvailable": {
                "type": "boolean",
                "enum": [
                  true
                ],
                "description": "Indicates that the timeseries data is available"
              },
              "unit": {
                "type": "string",
                "enum": [
                  "kW",
                  "kWh",
                  "%"
                ],
                "description": "Unit of measurement for HEM System statistics",
                "example": "kW"
              },
              "unitType": {
                "type": "string",
                "enum": [
                  "Energy",
                  "Power",
                  "SoC"
                ],
                "description": "Type of unit for HEM System statistics",
                "example": "Power"
              },
              "sampling": {
                "type": "object",
                "properties": {
                  "mode": {
                    "type": "string",
                    "enum": [
                      "bucketed"
                    ],
                    "description": "Sampling mode for the data"
                  },
                  "resolution": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "PT5M"
                        ]
                      },
                      {
                        "type": "string",
                        "enum": [
                          "PT10M"
                        ]
                      },
                      {
                        "type": "string",
                        "enum": [
                          "PT15M"
                        ]
                      },
                      {
                        "type": "string",
                        "enum": [
                          "PT30M"
                        ]
                      },
                      {
                        "type": "string",
                        "enum": [
                          "PT1H"
                        ]
                      },
                      {
                        "type": "string",
                        "enum": [
                          "P1D"
                        ]
                      },
                      {
                        "type": "string",
                        "enum": [
                          "P1M"
                        ]
                      }
                    ],
                    "description": "Time resolution of the bucketed data in the ISO 8601 format",
                    "example": "PT5M"
                  }
                },
                "required": [
                  "mode",
                  "resolution"
                ],
                "description": "Sampling configuration for HEM System statistics data"
              },
              "timezone": {
                "type": "string",
                "description": "Timezone of the data",
                "example": "Europe/Oslo"
              },
              "data": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "t": {
                      "type": "string",
                      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:[0-5][05]:00(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$",
                      "description": "Timestamp in RFC 3339 format (minutes ending in 0 or 5, seconds: 00).",
                      "example": "2025-06-15T12:00:00+02:00"
                    },
                    "v": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "Value of the data point, null if no data available",
                      "example": 1.8
                    }
                  },
                  "required": [
                    "t",
                    "v"
                  ],
                  "description": "A single data point in HEM System statistics timeseries."
                },
                "description": "Timeseries of HEM System statistics per timezone of the system. The first bucket of a day starts at midnight, localtime and the final bucket of a day ends at midnight, local time.\n Example: For data with a PT5M resolution and a timezone offset of +02:00, the first and last bucket would be `2025-05-05T00:00:00+02:00` and `2025-05-05T23:55:00+02:00`."
              }
            },
            "required": [
              "isAvailable",
              "unit",
              "unitType",
              "sampling",
              "timezone",
              "data"
            ],
            "title": "Data Available"
          },
          {
            "type": "object",
            "properties": {
              "isAvailable": {
                "type": "boolean",
                "enum": [
                  false
                ],
                "description": "Indicates that the timeseries is not available"
              },
              "reason": {
                "type": "string",
                "description": "Reason why HEM System statistics are unavailable",
                "example": "Data not available for the requested interval"
              }
            },
            "required": [
              "isAvailable",
              "reason"
            ],
            "title": "Data Unavailable",
            "description": "Unavailable HEM System statistics timeseries with reason"
          }
        ],
        "description": "HEM System statistics timeseries data"
      },
      "HemsStats": {
        "type": "object",
        "properties": {
          "timeseries": {
            "type": "object",
            "properties": {
              "generation": {
                "$ref": "#/components/schemas/HemssTimeseries",
                "description": "Solar generation statistics",
                "example": {
                  "isAvailable": true,
                  "unit": "kW",
                  "unitType": "Power",
                  "sampling": {
                    "mode": "bucketed",
                    "resolution": "PT5M"
                  },
                  "timezone": "Europe/Oslo",
                  "data": [
                    {
                      "t": "2025-06-15T12:00:00+02:00",
                      "v": 3.2
                    },
                    {
                      "t": "2025-06-15T12:05:00+02:00",
                      "v": 3.4
                    },
                    {
                      "t": "2025-06-15T12:10:00+02:00",
                      "v": 3.1
                    }
                  ]
                }
              },
              "consumption": {
                "$ref": "#/components/schemas/HemssTimeseries",
                "description": "Household consumption statistics",
                "example": {
                  "isAvailable": true,
                  "unit": "kW",
                  "unitType": "Power",
                  "sampling": {
                    "mode": "bucketed",
                    "resolution": "PT5M"
                  },
                  "timezone": "Europe/Oslo",
                  "data": [
                    {
                      "t": "2025-06-15T12:00:00+02:00",
                      "v": 1.8
                    },
                    {
                      "t": "2025-06-15T12:05:00+02:00",
                      "v": 1.7
                    },
                    {
                      "t": "2025-06-15T12:10:00+02:00",
                      "v": 1.9
                    }
                  ]
                }
              },
              "import": {
                "$ref": "#/components/schemas/HemssTimeseries",
                "description": "Grid import statistics",
                "example": {
                  "isAvailable": true,
                  "unit": "kW",
                  "unitType": "Power",
                  "sampling": {
                    "mode": "bucketed",
                    "resolution": "PT5M"
                  },
                  "timezone": "Europe/Oslo",
                  "data": [
                    {
                      "t": "2025-06-15T12:00:00+02:00",
                      "v": 0
                    },
                    {
                      "t": "2025-06-15T12:05:00+02:00",
                      "v": 0
                    },
                    {
                      "t": "2025-06-15T12:10:00+02:00",
                      "v": 0
                    }
                  ]
                }
              },
              "export": {
                "$ref": "#/components/schemas/HemssTimeseries",
                "description": "Grid export statistics",
                "example": {
                  "isAvailable": true,
                  "unit": "kW",
                  "unitType": "Power",
                  "sampling": {
                    "mode": "bucketed",
                    "resolution": "PT5M"
                  },
                  "timezone": "Europe/Oslo",
                  "data": [
                    {
                      "t": "2025-06-15T12:00:00+02:00",
                      "v": 0.9
                    },
                    {
                      "t": "2025-06-15T12:05:00+02:00",
                      "v": 1.1
                    },
                    {
                      "t": "2025-06-15T12:10:00+02:00",
                      "v": 0.8
                    }
                  ]
                }
              },
              "charge": {
                "$ref": "#/components/schemas/HemssTimeseries",
                "description": "Battery charge statistics",
                "example": {
                  "isAvailable": true,
                  "unit": "kW",
                  "unitType": "Power",
                  "sampling": {
                    "mode": "bucketed",
                    "resolution": "PT5M"
                  },
                  "timezone": "Europe/Oslo",
                  "data": [
                    {
                      "t": "2025-06-15T12:00:00+02:00",
                      "v": 0.5
                    },
                    {
                      "t": "2025-06-15T12:05:00+02:00",
                      "v": 0.6
                    },
                    {
                      "t": "2025-06-15T12:10:00+02:00",
                      "v": 0.4
                    }
                  ]
                }
              },
              "discharge": {
                "$ref": "#/components/schemas/HemssTimeseries",
                "description": "Battery discharge statistics",
                "example": {
                  "isAvailable": true,
                  "unit": "kW",
                  "unitType": "Power",
                  "sampling": {
                    "mode": "bucketed",
                    "resolution": "PT5M"
                  },
                  "timezone": "Europe/Oslo",
                  "data": [
                    {
                      "t": "2025-06-15T12:00:00+02:00",
                      "v": 0
                    },
                    {
                      "t": "2025-06-15T12:05:00+02:00",
                      "v": 0
                    },
                    {
                      "t": "2025-06-15T12:10:00+02:00",
                      "v": 0
                    }
                  ]
                }
              },
              "batteryLevel": {
                "$ref": "#/components/schemas/HemssTimeseries",
                "description": "Battery level statistics",
                "example": {
                  "isAvailable": true,
                  "unit": "%",
                  "unitType": "SoC",
                  "sampling": {
                    "mode": "bucketed",
                    "resolution": "PT5M"
                  },
                  "timezone": "Europe/Oslo",
                  "data": [
                    {
                      "t": "2025-06-15T12:00:00+02:00",
                      "v": 64
                    },
                    {
                      "t": "2025-06-15T12:05:00+02:00",
                      "v": 65
                    },
                    {
                      "t": "2025-06-15T12:10:00+02:00",
                      "v": 66
                    }
                  ]
                }
              }
            },
            "required": [
              "generation",
              "consumption",
              "import",
              "export",
              "charge",
              "discharge",
              "batteryLevel"
            ],
            "description": "Collection of all HEM System statistics timeseries"
          }
        },
        "required": [
          "timeseries"
        ],
        "description": "HEM System statistics containing various energy and power timeseries"
      },
      "LocationResponse": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "User-supplied name for the Location",
            "example": "Enode"
          },
          "latitude": {
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "description": "Latitude in degrees",
            "example": 59.9165915
          },
          "longitude": {
            "type": "number",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in degrees",
            "example": 10.7582268
          },
          "timezoneName": {
            "type": "string",
            "description": "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.",
            "example": "Europe/Oslo"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the Location."
          },
          "userId": {
            "type": "string",
            "description": "User ID the location belongs to",
            "example": "0fc4b1e7-9bdf-4958-b343-86eff3d9f92f"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when the Location was created",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "name",
          "latitude",
          "longitude",
          "timezoneName",
          "id",
          "userId",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "PaginatedLocationList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LocationResponse"
            },
            "description": "Paginated list of locations"
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of locations"
      },
      "PartialLocation": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "User-supplied name for the Location",
            "example": "Enode"
          },
          "latitude": {
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "description": "Latitude in degrees",
            "example": 59.9165915
          },
          "longitude": {
            "type": "number",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in degrees",
            "example": 10.7582268
          },
          "timezoneName": {
            "type": "string",
            "description": "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.",
            "example": "Europe/Oslo"
          }
        },
        "additionalProperties": false
      },
      "LocationPayload": {
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/PartialLocation"
          },
          {
            "type": "object",
            "properties": {
              "timezoneName": {
                "type": "string",
                "description": "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`.",
                "example": "Europe/Oslo",
                "default": "UTC"
              }
            },
            "required": [
              "name",
              "latitude",
              "longitude"
            ]
          }
        ]
      },
      "InterventionAction": {
        "type": "string",
        "enum": [
          "Link",
          "LinkAdditionalAsset"
        ],
        "description": "The action to be taken by the user to resolve the intervention, such as relinking their account (`Link`) or linking an additional asset like a charger (`LinkAdditionalAsset`). See [resolving interventions](https://developers.enode.com/docs/link-ui/relinking).",
        "example": "Link"
      },
      "Intervention": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "example": "9d90a9ad-9b24-4ce0-94e9-e888b1b877f4",
                "x-format": {
                  "guid": true
                }
              },
              "vendor": {
                "$ref": "#/components/schemas/Vendor",
                "description": "Machine-friendly representation of the OEM's name.",
                "example": "AUDI"
              },
              "vendorType": {
                "$ref": "#/components/schemas/VendorType",
                "description": "Type of device this intervention relates to."
              },
              "brand": {
                "$ref": "#/components/schemas/Brand"
              },
              "introducedAt": {
                "type": "string",
                "format": "date-time",
                "description": "ISO8601 UTC timestamp of when the intervention was introduced.",
                "example": "2023-03-16T00:00:00Z"
              },
              "domain": {
                "type": "string",
                "enum": [
                  "Account",
                  "Device"
                ],
                "description": "The domain the intervention is related to. i.e. Is the intervention related to the vendor service account or a setting on the device.",
                "example": "Account"
              },
              "resolution": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "A localized title for the intervention.",
                    "example": "Accept the Audi terms and conditions"
                  },
                  "description": {
                    "type": "string",
                    "description": "A localized description of how to resolve the intervention. Formatted as Markdown.",
                    "example": "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": {
                    "type": "string",
                    "enum": [
                      "Remote",
                      "Physical"
                    ],
                    "description": "Where the intervention needs to be resolved. i.e. remotely using the vendor's app or directly on the device.",
                    "example": "Remote"
                  },
                  "agent": {
                    "type": "string",
                    "enum": [
                      "User",
                      "ThirdParty"
                    ],
                    "description": "Who can resolve the intervention. i.e. a user can resolve the intervention themselves, or a licensed service retailer is needed.",
                    "example": "User"
                  },
                  "action": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/InterventionAction"
                      },
                      {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    ]
                  }
                },
                "required": [
                  "title",
                  "description",
                  "access",
                  "agent",
                  "action"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "vendor",
              "vendorType",
              "brand",
              "introducedAt",
              "domain",
              "resolution"
            ],
            "additionalProperties": false,
            "title": "Integration intervention"
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "example": "9d90a9ad-9b24-4ce0-94e9-e888b1b877f4",
                "x-format": {
                  "guid": true
                }
              },
              "vendor": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Vendor"
                  },
                  {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "A null value indicates that this intervention is not specific to a single brand or device type.",
                    "example": null
                  }
                ]
              },
              "vendorType": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/VendorType"
                  },
                  {
                    "type": [
                      "string",
                      "null"
                    ],
                    "example": null,
                    "description": "A null value indicates that this intervention is not specific to a single brand or device type."
                  }
                ]
              },
              "brand": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Brand"
                  },
                  {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "A null value indicates that this intervention is not specific to a single brand or device type.",
                    "example": null
                  }
                ]
              },
              "introducedAt": {
                "type": "string",
                "format": "date-time",
                "description": "ISO8601 UTC timestamp of when the intervention was introduced.",
                "example": "2023-03-16T00:00:00Z"
              },
              "domain": {
                "type": "string",
                "enum": [
                  "Account",
                  "Device"
                ],
                "description": "The domain the intervention is related to. i.e. Is the intervention related to the vendor service account or a setting on the device.",
                "example": "Account"
              },
              "resolution": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "A localized title for the intervention.",
                    "example": "Accept the Audi terms and conditions"
                  },
                  "description": {
                    "type": "string",
                    "description": "A localized description of how to resolve the intervention. Formatted as Markdown.",
                    "example": "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": {
                    "type": "string",
                    "enum": [
                      "Remote",
                      "Physical"
                    ],
                    "description": "Where the intervention needs to be resolved. i.e. remotely using the vendor's app or directly on the device.",
                    "example": "Remote"
                  },
                  "agent": {
                    "type": "string",
                    "enum": [
                      "User",
                      "ThirdParty"
                    ],
                    "description": "Who can resolve the intervention. i.e. a user can resolve the intervention themselves, or a licensed service retailer is needed.",
                    "example": "User"
                  },
                  "action": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/InterventionAction"
                      },
                      {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    ]
                  }
                },
                "required": [
                  "title",
                  "description",
                  "access",
                  "agent",
                  "action"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "vendor",
              "vendorType",
              "brand",
              "introducedAt",
              "domain",
              "resolution"
            ],
            "additionalProperties": false,
            "title": "Integration-agnostic intervention"
          }
        ]
      },
      "InterventionsList": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/Intervention"
        }
      },
      "WebhookCreatePayload": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "minLength": 8,
            "maxLength": 200,
            "description": "The HTTPS URL that webhook payloads should be sent to. Must resolve to a public IP address and return a 2xx response directly without redirecting.",
            "example": "https://example.com/enode-webhooks",
            "x-format": {
              "uri": true
            }
          },
          "secret": {
            "type": "string",
            "minLength": 6,
            "maxLength": 256,
            "description": "A cryptographically secure secret, generated and provided by your client. Refer to [Generating a secret](/docs/webhooks#generating-a-secret) for details on how to do this.",
            "example": "0Kvs1tAUQ69FOMBiWlt5XJSrruXMhWDiVbyrWaNm"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "*",
                "user:vehicle:discovered",
                "user:vehicle:updated",
                "user:vehicle:deleted",
                "user:vehicle:smart-charging-status-updated",
                "user:charge-action:updated",
                "user:vendor-action:updated",
                "user:schedule:execution-updated",
                "user:charger:discovered",
                "user:charger:updated",
                "user:charger:deleted",
                "user:hvac:discovered",
                "user:hvac:updated",
                "user:hvac:deleted",
                "user:inverter:discovered",
                "user:inverter:updated",
                "user:inverter:deleted",
                "user:inverter:statistics-updated",
                "user:credentials:invalidated",
                "user:battery:discovered",
                "user:battery:updated",
                "user:battery:deleted",
                "enode:webhook:test",
                "user:meter:discovered",
                "user:meter:updated",
                "user:meter:deleted",
                "user:hem-system:discovered",
                "user:hem-system:updated",
                "user:hem-system:deleted",
                "flex:vehicle-policy:created",
                "flex:vehicle-policy:updated",
                "flex:vehicle-policy:deleted",
                "flex:vehicle-policy:status",
                "flex:session:updated"
              ]
            },
            "default": [
              "*"
            ],
            "description": "The events which will trigger the webhook. Available events: `*`, `user:vehicle:discovered`, `user:vehicle:updated`, `user:vehicle:deleted`, `user:vehicle:smart-charging-status-updated`, `user:charge-action:updated`, `user:vendor-action:updated`, `user:schedule:execution-updated`, `user:charger:discovered`, `user:charger:updated`, `user:charger:deleted`, `user:hvac:discovered`, `user:hvac:updated`, `user:hvac:deleted`, `user:inverter:discovered`, `user:inverter:updated`, `user:inverter:deleted`, `user:inverter:statistics-updated`, `user:credentials:invalidated`, `user:battery:discovered`, `user:battery:updated`, `user:battery:deleted`, `enode:webhook:test`, `user:meter:discovered`, `user:meter:updated`, `user:meter:deleted`, `user:hem-system:discovered`, `user:hem-system:updated`, `user:hem-system:deleted`, `flex:vehicle-policy:created`, `flex:vehicle-policy:updated`, `flex:vehicle-policy:deleted`, `flex:vehicle-policy:status`, `flex:session:updated`",
            "example": [
              "user:vehicle:discovered",
              "user:vehicle:updated",
              "user:vehicle:deleted"
            ]
          },
          "apiVersion": {
            "type": [
              "string",
              "null"
            ],
            "description": "If provided, webhook payloads will be generated for this version. If not provided or `null`, the default API version of the client will be used when generating webhook payloads. Valid versions: `2024-10-01`",
            "example": "2024-10-01"
          },
          "authentication": {
            "type": "object",
            "properties": {
              "headerName": {
                "type": "string",
                "minLength": 1,
                "maxLength": 128,
                "pattern": "^[a-z0-9-_]+$",
                "description": "Authentication header name.",
                "example": "x-api-key"
              },
              "headerValue": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256,
                "pattern": "^[a-zA-Z0-9_:;.,/\\\\\"'?!(){}[\\]@<>=\\-+*#$&`|~^% ]+$",
                "description": "Authentication header value.",
                "example": "AOIxcVLKxR2VpzlN5HIk14oPu80"
              }
            },
            "required": [
              "headerName",
              "headerValue"
            ],
            "additionalProperties": false,
            "description": "If provided, the authentication header will be sent with each webhook request."
          }
        },
        "required": [
          "url",
          "secret"
        ],
        "additionalProperties": false,
        "description": "Fields to update the webhook with."
      },
      "WebhookResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the webhook.",
            "example": "1de1as-dsa12wed-15sa"
          },
          "url": {
            "type": "string",
            "minLength": 8,
            "maxLength": 200,
            "description": "The HTTPS URL that webhook payloads should be sent to. Must resolve to a public IP address and return a 2xx response directly without redirecting.",
            "example": "https://example.com/enode-webhooks",
            "x-format": {
              "uri": true
            }
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "default": [
              "*"
            ],
            "description": "The events which will trigger the webhook.",
            "example": [
              "user:vehicle:discovered",
              "user:vehicle:updated",
              "user:vehicle:deleted"
            ]
          },
          "lastSuccess": {
            "type": "string",
            "format": "date-time",
            "description": "Time when a delivery to this webhook was last successful.",
            "example": "2023-08-14T13:01:00.000"
          },
          "isActive": {
            "type": "boolean",
            "description": "Indicates whether the webhook is active or not.",
            "example": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when the webhook was created.",
            "example": "2023-08-14T13:01:00.000"
          },
          "apiVersion": {
            "type": [
              "string",
              "null"
            ],
            "description": "API version of the payload. If null, the default API version of the client will be used when generating webhook payloads.",
            "example": "2024-10-01"
          },
          "authentication": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "headerName": {
                "type": "string"
              }
            },
            "required": [
              "headerName"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "url",
          "lastSuccess",
          "isActive",
          "createdAt",
          "apiVersion",
          "authentication"
        ],
        "additionalProperties": false,
        "description": "Webhook entity."
      },
      "WebhookNotValidProblem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "A URI reference that identifies the problem type."
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem type."
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation specific to this occurrence of the problem."
          },
          "issues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {}
            },
            "description": "A list of validation issues which occurred while validating some component of the network payload."
          }
        },
        "required": [
          "type",
          "title",
          "detail"
        ],
        "description": "Webhook input is not valid.",
        "example": {
          "type": "https://developers.enode.com/api/problems/bad-request",
          "title": "Webhook input is not valid.",
          "detail": "The webhook input is not valid."
        }
      },
      "WebhookUpdatePayload": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "minLength": 8,
            "maxLength": 200,
            "description": "The HTTPS URL that webhook payloads should be sent to. Must resolve to a public IP address and return a 2xx response directly without redirecting.",
            "example": "https://example.com/enode-webhooks",
            "x-format": {
              "uri": true
            }
          },
          "secret": {
            "type": "string",
            "minLength": 6,
            "maxLength": 256,
            "description": "A cryptographically secure secret, generated and provided by your client. Refer to [Generating a secret](/docs/webhooks#generating-a-secret) for details on how to do this.",
            "example": "0Kvs1tAUQ69FOMBiWlt5XJSrruXMhWDiVbyrWaNm"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "*",
                "user:vehicle:discovered",
                "user:vehicle:updated",
                "user:vehicle:deleted",
                "user:vehicle:smart-charging-status-updated",
                "user:charge-action:updated",
                "user:vendor-action:updated",
                "user:schedule:execution-updated",
                "user:charger:discovered",
                "user:charger:updated",
                "user:charger:deleted",
                "user:hvac:discovered",
                "user:hvac:updated",
                "user:hvac:deleted",
                "user:inverter:discovered",
                "user:inverter:updated",
                "user:inverter:deleted",
                "user:inverter:statistics-updated",
                "user:credentials:invalidated",
                "user:battery:discovered",
                "user:battery:updated",
                "user:battery:deleted",
                "enode:webhook:test",
                "user:meter:discovered",
                "user:meter:updated",
                "user:meter:deleted",
                "user:hem-system:discovered",
                "user:hem-system:updated",
                "user:hem-system:deleted",
                "flex:vehicle-policy:created",
                "flex:vehicle-policy:updated",
                "flex:vehicle-policy:deleted",
                "flex:vehicle-policy:status",
                "flex:session:updated"
              ]
            },
            "description": "The events which will trigger the webhook. Available events: `*`, `user:vehicle:discovered`, `user:vehicle:updated`, `user:vehicle:deleted`, `user:vehicle:smart-charging-status-updated`, `user:charge-action:updated`, `user:vendor-action:updated`, `user:schedule:execution-updated`, `user:charger:discovered`, `user:charger:updated`, `user:charger:deleted`, `user:hvac:discovered`, `user:hvac:updated`, `user:hvac:deleted`, `user:inverter:discovered`, `user:inverter:updated`, `user:inverter:deleted`, `user:inverter:statistics-updated`, `user:credentials:invalidated`, `user:battery:discovered`, `user:battery:updated`, `user:battery:deleted`, `enode:webhook:test`, `user:meter:discovered`, `user:meter:updated`, `user:meter:deleted`, `user:hem-system:discovered`, `user:hem-system:updated`, `user:hem-system:deleted`, `flex:vehicle-policy:created`, `flex:vehicle-policy:updated`, `flex:vehicle-policy:deleted`, `flex:vehicle-policy:status`, `flex:session:updated`",
            "example": [
              "user:vehicle:discovered",
              "user:vehicle:updated",
              "user:vehicle:deleted"
            ]
          },
          "apiVersion": {
            "type": [
              "string",
              "null"
            ],
            "description": "If provided, webhook payloads will be generated for this version. If not provided or `null`, the default API version of the client will be used when generating webhook payloads. Valid versions: `2024-10-01`",
            "example": "2024-10-01"
          },
          "authentication": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "headerName": {
                "type": "string",
                "minLength": 1,
                "maxLength": 128,
                "pattern": "^[a-z0-9-_]+$",
                "description": "Authentication header name.",
                "example": "x-api-key"
              },
              "headerValue": {
                "type": "string",
                "minLength": 1,
                "maxLength": 256,
                "pattern": "^[a-zA-Z0-9_:;.,/\\\\\"'?!(){}[\\]@<>=\\-+*#$&`|~^% ]+$",
                "description": "Authentication header value.",
                "example": "AOIxcVLKxR2VpzlN5HIk14oPu80"
              }
            },
            "required": [
              "headerName",
              "headerValue"
            ],
            "additionalProperties": false,
            "description": "If provided, the authentication header will be sent with each webhook request."
          }
        },
        "additionalProperties": false,
        "description": "Fields to update the webhook with."
      },
      "WebhookNotFoundProblem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "A URI reference that identifies the problem type."
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem type."
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation specific to this occurrence of the problem."
          },
          "issues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {}
            },
            "description": "A list of validation issues which occurred while validating some component of the network payload."
          }
        },
        "required": [
          "type",
          "title",
          "detail"
        ],
        "description": "Webhook not found problem error",
        "example": {
          "type": "https://developers.enode.com/api/problems/not-found",
          "title": "Webhook not found",
          "detail": "Could not find webhook 0ec3d927-0100-44ff-bb53-edfe3ce64a57"
        }
      },
      "PaginatedWebhookList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookResponse"
            },
            "description": "Paginated list of webhooks."
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated response of webhooks."
      },
      "TestWebhook": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "SUCCESS",
              "FAILURE"
            ],
            "description": "Indicates if the test webhook event was delivered successfully to your configured webhook endpoint."
          },
          "description": {
            "type": "string",
            "description": "Human readable description of the test outcome."
          },
          "response": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "code": {
                "type": "number",
                "example": 200,
                "description": "Status code returned by your configured webhook endpoint"
              },
              "body": {
                "type": "string",
                "example": "{}",
                "description": "Body returned by your configured webhook endpoint"
              },
              "headers": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Headers returned by your configured webhook endpoint",
                "example": [
                  "content-type: application/json; } charset=utf-8"
                ]
              }
            },
            "required": [
              "code",
              "body",
              "headers"
            ],
            "additionalProperties": false,
            "description": "Null if status is `FAILURE` and no HTTP response was received (e.g. DNS resolution failure or connection error)."
          }
        },
        "required": [
          "status",
          "description",
          "response"
        ],
        "additionalProperties": false
      },
      "Integration": {
        "type": "object",
        "properties": {
          "vendor": {
            "$ref": "#/components/schemas/Vendor"
          },
          "displayName": {
            "$ref": "#/components/schemas/Brand"
          },
          "assetTypes": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "vehicle",
                "charger",
                "hvac",
                "inverter",
                "battery",
                "meter"
              ]
            }
          },
          "scopes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Scopes"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state of the Vendor. Currently always `READY`.",
            "example": "READY"
          },
          "portalName": {
            "type": "string",
            "description": "The name of the first party service or app that the user normally logs into."
          },
          "linkingStatus": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state for linking with the Vendor.\n\n  * `READY`: The Vendor is ready to be linked with.\n  * `ELEVATED_ERROR_RATE`: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.\n  * `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.",
            "example": "READY"
          }
        },
        "required": [
          "vendor",
          "displayName",
          "assetTypes",
          "scopes",
          "status",
          "portalName",
          "linkingStatus"
        ],
        "additionalProperties": false
      },
      "ChargerHealth": {
        "type": "object",
        "properties": {
          "vendor": {
            "$ref": "#/components/schemas/ChargerVendor"
          },
          "displayName": {
            "$ref": "#/components/schemas/Brand"
          },
          "status": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state of the Vendor. Currently always `READY`.",
            "example": "READY"
          },
          "portalName": {
            "type": "string",
            "description": "The name of the first party service or app that the user normally logs into."
          },
          "linkingStatus": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state for linking with the Vendor.\n\n  * `READY`: The Vendor is ready to be linked with.\n  * `ELEVATED_ERROR_RATE`: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.\n  * `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.",
            "example": "READY"
          }
        },
        "required": [
          "vendor",
          "displayName",
          "status",
          "portalName",
          "linkingStatus"
        ],
        "additionalProperties": false
      },
      "VehicleHealth": {
        "type": "object",
        "properties": {
          "vendor": {
            "$ref": "#/components/schemas/VehicleVendor"
          },
          "displayName": {
            "$ref": "#/components/schemas/Brand"
          },
          "status": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state of the Vendor. Currently always `READY`.",
            "example": "READY"
          },
          "portalName": {
            "type": "string",
            "description": "The name of the first party service or app that the user normally logs into."
          },
          "linkingStatus": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state for linking with the Vendor.\n\n  * `READY`: The Vendor is ready to be linked with.\n  * `ELEVATED_ERROR_RATE`: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.\n  * `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.",
            "example": "READY"
          }
        },
        "required": [
          "vendor",
          "displayName",
          "status",
          "portalName",
          "linkingStatus"
        ],
        "additionalProperties": false
      },
      "BatteryHealth": {
        "type": "object",
        "properties": {
          "vendor": {
            "$ref": "#/components/schemas/BatteryVendor"
          },
          "displayName": {
            "$ref": "#/components/schemas/Brand"
          },
          "status": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state of the Vendor. Currently always `READY`.",
            "example": "READY"
          },
          "portalName": {
            "type": "string",
            "description": "The name of the first party service or app that the user normally logs into."
          },
          "linkingStatus": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state for linking with the Vendor.\n\n  * `READY`: The Vendor is ready to be linked with.\n  * `ELEVATED_ERROR_RATE`: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.\n  * `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.",
            "example": "READY"
          }
        },
        "required": [
          "vendor",
          "displayName",
          "status",
          "portalName",
          "linkingStatus"
        ],
        "additionalProperties": false
      },
      "InverterHealth": {
        "type": "object",
        "properties": {
          "vendor": {
            "$ref": "#/components/schemas/InverterVendor"
          },
          "displayName": {
            "$ref": "#/components/schemas/Brand"
          },
          "status": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state of the Vendor. Currently always `READY`.",
            "example": "READY"
          },
          "portalName": {
            "type": "string",
            "description": "The name of the first party service or app that the user normally logs into."
          },
          "linkingStatus": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state for linking with the Vendor.\n\n  * `READY`: The Vendor is ready to be linked with.\n  * `ELEVATED_ERROR_RATE`: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.\n  * `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.",
            "example": "READY"
          }
        },
        "required": [
          "vendor",
          "displayName",
          "status",
          "portalName",
          "linkingStatus"
        ],
        "additionalProperties": false
      },
      "HvacHealth": {
        "type": "object",
        "properties": {
          "vendor": {
            "$ref": "#/components/schemas/HvacVendor"
          },
          "displayName": {
            "$ref": "#/components/schemas/Brand"
          },
          "status": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state of the Vendor. Currently always `READY`.",
            "example": "READY"
          },
          "portalName": {
            "type": "string",
            "description": "The name of the first party service or app that the user normally logs into."
          },
          "linkingStatus": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state for linking with the Vendor.\n\n  * `READY`: The Vendor is ready to be linked with.\n  * `ELEVATED_ERROR_RATE`: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.\n  * `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.",
            "example": "READY"
          }
        },
        "required": [
          "vendor",
          "displayName",
          "status",
          "portalName",
          "linkingStatus"
        ],
        "additionalProperties": false
      },
      "MeterHealth": {
        "type": "object",
        "properties": {
          "vendor": {
            "$ref": "#/components/schemas/MeterVendor"
          },
          "displayName": {
            "$ref": "#/components/schemas/Brand"
          },
          "status": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state of the Vendor. Currently always `READY`.",
            "example": "READY"
          },
          "portalName": {
            "type": "string",
            "description": "The name of the first party service or app that the user normally logs into."
          },
          "linkingStatus": {
            "type": "string",
            "enum": [
              "READY",
              "ELEVATED_ERROR_RATE",
              "OUTAGE"
            ],
            "description": "Ready-state for linking with the Vendor.\n\n  * `READY`: The Vendor is ready to be linked with.\n  * `ELEVATED_ERROR_RATE`: Multiple attempts may be needed to link successfully. We are showing a warning in Link UI.\n  * `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.",
            "example": "READY"
          }
        },
        "required": [
          "vendor",
          "displayName",
          "status",
          "portalName",
          "linkingStatus"
        ],
        "additionalProperties": false
      },
      "FlexSchedule": {
        "type": "object",
        "properties": {
          "monday": {
            "type": "object",
            "properties": {
              "deadline": {
                "type": "string",
                "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                "example": "07:00",
                "title": "Deadline"
              },
              "minimumChargeTarget": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "title": "Minimum Charge Target",
                "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                "example": 80
              }
            },
            "required": [
              "deadline",
              "minimumChargeTarget"
            ],
            "additionalProperties": false,
            "title": "Schedule Settings",
            "description": "The schedule settings for a particular day of the week."
          },
          "tuesday": {
            "type": "object",
            "properties": {
              "deadline": {
                "type": "string",
                "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                "example": "07:00",
                "title": "Deadline"
              },
              "minimumChargeTarget": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "title": "Minimum Charge Target",
                "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                "example": 80
              }
            },
            "required": [
              "deadline",
              "minimumChargeTarget"
            ],
            "additionalProperties": false,
            "title": "Schedule Settings",
            "description": "The schedule settings for a particular day of the week."
          },
          "wednesday": {
            "type": "object",
            "properties": {
              "deadline": {
                "type": "string",
                "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                "example": "07:00",
                "title": "Deadline"
              },
              "minimumChargeTarget": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "title": "Minimum Charge Target",
                "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                "example": 80
              }
            },
            "required": [
              "deadline",
              "minimumChargeTarget"
            ],
            "additionalProperties": false,
            "title": "Schedule Settings",
            "description": "The schedule settings for a particular day of the week."
          },
          "thursday": {
            "type": "object",
            "properties": {
              "deadline": {
                "type": "string",
                "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                "example": "07:00",
                "title": "Deadline"
              },
              "minimumChargeTarget": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "title": "Minimum Charge Target",
                "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                "example": 80
              }
            },
            "required": [
              "deadline",
              "minimumChargeTarget"
            ],
            "additionalProperties": false,
            "title": "Schedule Settings",
            "description": "The schedule settings for a particular day of the week."
          },
          "friday": {
            "type": "object",
            "properties": {
              "deadline": {
                "type": "string",
                "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                "example": "07:00",
                "title": "Deadline"
              },
              "minimumChargeTarget": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "title": "Minimum Charge Target",
                "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                "example": 80
              }
            },
            "required": [
              "deadline",
              "minimumChargeTarget"
            ],
            "additionalProperties": false,
            "title": "Schedule Settings",
            "description": "The schedule settings for a particular day of the week."
          },
          "saturday": {
            "type": "object",
            "properties": {
              "deadline": {
                "type": "string",
                "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                "example": "07:00",
                "title": "Deadline"
              },
              "minimumChargeTarget": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "title": "Minimum Charge Target",
                "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                "example": 80
              }
            },
            "required": [
              "deadline",
              "minimumChargeTarget"
            ],
            "additionalProperties": false,
            "title": "Schedule Settings",
            "description": "The schedule settings for a particular day of the week."
          },
          "sunday": {
            "type": "object",
            "properties": {
              "deadline": {
                "type": "string",
                "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                "example": "07:00",
                "title": "Deadline"
              },
              "minimumChargeTarget": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "title": "Minimum Charge Target",
                "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                "example": 80
              }
            },
            "required": [
              "deadline",
              "minimumChargeTarget"
            ],
            "additionalProperties": false,
            "title": "Schedule Settings",
            "description": "The schedule settings for a particular day of the week."
          }
        },
        "required": [
          "monday",
          "tuesday",
          "wednesday",
          "thursday",
          "friday",
          "saturday",
          "sunday"
        ],
        "additionalProperties": false,
        "title": "Schedule",
        "description": "The weekly schedule of Policy settings. The upcoming schedule settings should be read from the Policy Status object, under `settings.regularSchedule`."
      },
      "RestrictionScheduleEntry": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Extensible enum. The type of restriction. Currently only `FULL` is supported.",
            "examples": [
              "FULL"
            ]
          },
          "weekdays": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 6
            },
            "minItems": 1,
            "description": "Days of the week on which the restriction is active, encoded as 0=Monday through 6=Sunday (ISO 8601 ordering, zero-indexed). Must contain at least one day, with no duplicates. The restriction applies only on these days and only between `startTime` and `endTime` on each of them.",
            "example": [
              0,
              1,
              2,
              3,
              4
            ]
          },
          "startTime": {
            "type": "string",
            "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
            "description": "Start time of the restriction window in `HH:MM` format, interpreted in the location's local time. The restriction is active from this time until `endTime` on each day listed in `weekdays`.",
            "example": "16:00"
          },
          "endTime": {
            "type": "string",
            "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
            "description": "End time of the restriction window in `HH:MM` format, interpreted in the location's local time. The restriction is active from `startTime` until this time on each day listed in `weekdays`. Use `24:00` to indicate end of day (midnight).",
            "example": "20:00"
          }
        },
        "required": [
          "type",
          "weekdays",
          "startTime",
          "endTime"
        ],
        "title": "RestrictionScheduleEntry",
        "description": "A recurring restriction window where the system plans and requests charging to pause during the specified time range on the specified weekdays. `weekdays` must be non-empty and contain unique values in the range 0..6. `endTime` must be greater than `startTime`; use `24:00` as the `endTime` to indicate end of day (midnight)."
      },
      "RestrictionSchedule": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/RestrictionScheduleEntry"
        },
        "maxItems": 20,
        "title": "RestrictionSchedule",
        "description": "A list of recurring restriction windows where the system plans and requests charging to pause. At most 20 entries; entries must not overlap on the same weekday. Use `24:00` as the `endTime` of an entry to indicate end of day (midnight)."
      },
      "FlexPolicyPayload": {
        "type": "object",
        "properties": {
          "locationId": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of the location at which this policy is applied."
          },
          "vehicleId": {
            "type": "string",
            "description": "The ID of the vehicle for which this policy applies."
          },
          "batteryReserve": {
            "type": "number",
            "maximum": 50,
            "minimum": 0,
            "description": "Upon arrival at the location, the vehicle will immediately charge to this battery level without regard to prices or flexibility demands. This charging is reflected in the Policy Status State as `SCHEDULE:BATTERY_RESERVE`. Must be between 0% and 20%. Note: For Mercedes-Benz vehicles, `batteryReserve` must be set to `50`, as these vehicles always charge to 50% SOC upon plug-in."
          },
          "schedule": {
            "$ref": "#/components/schemas/FlexSchedule"
          },
          "restrictionSchedule": {
            "$ref": "#/components/schemas/RestrictionSchedule",
            "description": "Recurring restriction windows that pause charging during the specified time ranges. Omit to create a policy with no restrictions."
          }
        },
        "required": [
          "locationId",
          "vehicleId",
          "batteryReserve",
          "schedule"
        ],
        "additionalProperties": false,
        "title": "Flex Policy",
        "description": "The payload to create a new flex policy."
      },
      "FlexPolicy": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The ID of the flex policy."
          },
          "vehicleId": {
            "type": "string",
            "description": "The ID of the vehicle for which this policy applies."
          },
          "locationId": {
            "type": "string",
            "description": "The ID of the location at which this policy is applied. When the vehicle is not at this location, the Policy Status State will be `UNAVAILABLE`."
          },
          "batteryReserve": {
            "type": "number",
            "maximum": 50,
            "minimum": 0,
            "description": "Upon arrival at the location, the vehicle will immediately charge to this battery level without regard to prices or flexibility demands. This charging is reflected in the Policy Status State as `SCHEDULE:BATTERY_RESERVE`. Must be between 0% and 20%. Note: For Mercedes-Benz vehicles, `batteryReserve` must be set to `50`, as these vehicles always charge to 50% SOC upon plug-in."
          },
          "lastObservedLocationChargeLimit": {
            "type": "number",
            "title": "Last Observed Location Charge Limit",
            "description": "The vehicle's charge limit as last observed at this policy's location. Defaults to 100 until first observed. Used for validating that targets do not exceed the vehicle's charge limit at this location.",
            "example": 80
          },
          "schedule": {
            "$ref": "#/components/schemas/FlexSchedule"
          },
          "restrictionSchedule": {
            "$ref": "#/components/schemas/RestrictionSchedule",
            "description": "Recurring restriction windows where the system plans and requests charging to pause during the specified time ranges. An empty array indicates no restrictions."
          }
        },
        "required": [
          "id",
          "vehicleId",
          "locationId",
          "batteryReserve",
          "lastObservedLocationChargeLimit",
          "schedule",
          "restrictionSchedule"
        ],
        "title": "Flex Policy",
        "description": "Flex Policy"
      },
      "ValidationError": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "https://developers.enode.com/api/problems/validation-error"
            ]
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem type."
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation specific to this occurrence of the problem."
          },
          "issues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {}
            },
            "description": "A list of validation issues which occurred while validating some component of the network payload."
          }
        },
        "required": [
          "type",
          "title",
          "detail"
        ],
        "title": "Validation Error"
      },
      "PaginatedFlexPolicyList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlexPolicy"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated list of flex policies"
      },
      "PublicFlexPolicyUpdate": {
        "type": "object",
        "properties": {
          "batteryReserve": {
            "type": "number",
            "maximum": 50,
            "minimum": 0,
            "description": "Upon arrival at the location, the vehicle will immediately charge to this battery level without regard to prices or flexibility demands. This charging is reflected in the Policy Status State as `SCHEDULE:BATTERY_RESERVE`. Must be between 0% and 20%. Note: For Mercedes-Benz vehicles, `batteryReserve` must be set to `50`, as these vehicles always charge to 50% SOC upon plug-in."
          },
          "schedule": {
            "type": "object",
            "properties": {
              "monday": {
                "type": "object",
                "properties": {
                  "deadline": {
                    "type": "string",
                    "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                    "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                    "example": "07:00",
                    "title": "Deadline"
                  },
                  "minimumChargeTarget": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "title": "Minimum Charge Target",
                    "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                    "example": 80
                  }
                },
                "required": [
                  "deadline",
                  "minimumChargeTarget"
                ],
                "additionalProperties": false,
                "title": "Schedule Settings",
                "description": "The schedule settings for a particular day of the week."
              },
              "tuesday": {
                "type": "object",
                "properties": {
                  "deadline": {
                    "type": "string",
                    "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                    "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                    "example": "07:00",
                    "title": "Deadline"
                  },
                  "minimumChargeTarget": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "title": "Minimum Charge Target",
                    "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                    "example": 80
                  }
                },
                "required": [
                  "deadline",
                  "minimumChargeTarget"
                ],
                "additionalProperties": false,
                "title": "Schedule Settings",
                "description": "The schedule settings for a particular day of the week."
              },
              "wednesday": {
                "type": "object",
                "properties": {
                  "deadline": {
                    "type": "string",
                    "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                    "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                    "example": "07:00",
                    "title": "Deadline"
                  },
                  "minimumChargeTarget": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "title": "Minimum Charge Target",
                    "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                    "example": 80
                  }
                },
                "required": [
                  "deadline",
                  "minimumChargeTarget"
                ],
                "additionalProperties": false,
                "title": "Schedule Settings",
                "description": "The schedule settings for a particular day of the week."
              },
              "thursday": {
                "type": "object",
                "properties": {
                  "deadline": {
                    "type": "string",
                    "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                    "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                    "example": "07:00",
                    "title": "Deadline"
                  },
                  "minimumChargeTarget": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "title": "Minimum Charge Target",
                    "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                    "example": 80
                  }
                },
                "required": [
                  "deadline",
                  "minimumChargeTarget"
                ],
                "additionalProperties": false,
                "title": "Schedule Settings",
                "description": "The schedule settings for a particular day of the week."
              },
              "friday": {
                "type": "object",
                "properties": {
                  "deadline": {
                    "type": "string",
                    "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                    "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                    "example": "07:00",
                    "title": "Deadline"
                  },
                  "minimumChargeTarget": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "title": "Minimum Charge Target",
                    "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                    "example": 80
                  }
                },
                "required": [
                  "deadline",
                  "minimumChargeTarget"
                ],
                "additionalProperties": false,
                "title": "Schedule Settings",
                "description": "The schedule settings for a particular day of the week."
              },
              "saturday": {
                "type": "object",
                "properties": {
                  "deadline": {
                    "type": "string",
                    "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                    "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                    "example": "07:00",
                    "title": "Deadline"
                  },
                  "minimumChargeTarget": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "title": "Minimum Charge Target",
                    "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                    "example": 80
                  }
                },
                "required": [
                  "deadline",
                  "minimumChargeTarget"
                ],
                "additionalProperties": false,
                "title": "Schedule Settings",
                "description": "The schedule settings for a particular day of the week."
              },
              "sunday": {
                "type": "object",
                "properties": {
                  "deadline": {
                    "type": "string",
                    "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                    "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                    "example": "07:00",
                    "title": "Deadline"
                  },
                  "minimumChargeTarget": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "title": "Minimum Charge Target",
                    "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                    "example": 80
                  }
                },
                "required": [
                  "deadline",
                  "minimumChargeTarget"
                ],
                "additionalProperties": false,
                "title": "Schedule Settings",
                "description": "The schedule settings for a particular day of the week."
              }
            },
            "additionalProperties": false
          },
          "restrictionSchedule": {
            "$ref": "#/components/schemas/RestrictionSchedule",
            "description": "Recurring restriction windows. If provided, replaces the entire array. Use an empty array to clear. Omit to leave unchanged."
          }
        },
        "additionalProperties": false,
        "title": "Flex Policy Update",
        "description": "Partial update payload for a Flex Policy. Only `batteryReserve`, `schedule`, and `restrictionSchedule` can be updated. Individual days in the schedule can be omitted to keep their current values."
      },
      "FlexLocationZonePayload": {
        "type": "object",
        "properties": {
          "zoneId": {
            "type": "string",
            "enum": [
              "NO1",
              "NO2",
              "NO3",
              "NO4",
              "NO5",
              "SE1",
              "SE2",
              "SE3",
              "SE4",
              "DK1",
              "DK2",
              "FI",
              "EE",
              "LV",
              "LT",
              "AT",
              "BE",
              "GER",
              "FR",
              "NL",
              "PL",
              "ES",
              "PT",
              "CH"
            ],
            "description": "The zone to assign this location to. Corresponds to a market bidding zone (e.g., NO1, BE, SE3).",
            "example": "NO1"
          }
        },
        "required": [
          "zoneId"
        ],
        "additionalProperties": false,
        "description": "Payload for assigning a location to a zone. The zone determines which price signal and optimization context applies to this location."
      },
      "FlexLocationGroupAssignmentPayload": {
        "type": "object",
        "properties": {
          "groupId": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[\\w:-]+$",
            "description": "The group to assign this location to. Must belong to the dimension in the path.",
            "example": "seg_abc123"
          }
        },
        "required": [
          "groupId"
        ],
        "additionalProperties": false,
        "description": "Payload for assigning a location to a group in a Flex Shape segmentation dimension."
      },
      "FlexLocationGroupBatchAssignment": {
        "type": "object",
        "properties": {
          "locationId": {
            "type": "string",
            "format": "uuid",
            "example": "a39578d6-96f8-4f42-a6aa-6fdb1be06d03",
            "x-format": {
              "guid": true
            },
            "description": "ID of the Location to assign."
          },
          "groupId": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[\\w:-]+$",
            "description": "The group to assign this location to. Must belong to the dimension in the path.",
            "example": "seg_abc123"
          }
        },
        "required": [
          "locationId",
          "groupId"
        ],
        "additionalProperties": false,
        "description": "A location-to-group assignment within the Flex Shape dimension in the path."
      },
      "FlexLocationGroupBatchAssignmentPayload": {
        "type": "object",
        "properties": {
          "assignments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlexLocationGroupBatchAssignment"
            },
            "minItems": 1,
            "maxItems": 10000,
            "description": "Location assignments to apply atomically. Each location may appear at most once."
          }
        },
        "required": [
          "assignments"
        ],
        "additionalProperties": false,
        "description": "Payload for assigning many locations to groups in one Flex Shape segmentation dimension."
      },
      "FlexLocationGroupAssignment": {
        "type": "object",
        "properties": {
          "dimensionId": {
            "type": "string",
            "description": "ID of the Flex Shape dimension.",
            "example": "region"
          },
          "groupId": {
            "type": "string",
            "description": "ID of the group assigned for this dimension.",
            "example": "seg_abc123"
          }
        },
        "required": [
          "dimensionId",
          "groupId"
        ],
        "additionalProperties": false,
        "description": "A location's assignment to a group in a Flex Shape segmentation dimension."
      },
      "FlexLocationGroupAssignmentsResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlexLocationGroupAssignment"
            },
            "description": "Current group assignments for the location, ordered by dimension ID."
          }
        },
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "description": "Current Flex Shape group assignments for a location."
      },
      "FlexZone": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The zone identifier. Corresponds to a market bidding zone.",
            "example": "NO1"
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false,
        "description": "A zone where the client has assets. Zones are automatically derived from the market bidding zones of the client's connected vehicles."
      },
      "PriceSignalValue": {
        "type": "object",
        "properties": {
          "at": {
            "type": "string",
            "format": "date-time",
            "description": "UTC timestamp when this price becomes effective. The price applies from this point until the next value (or until the window end).",
            "example": "2024-06-15T00:00:00Z"
          },
          "price": {
            "type": "number",
            "description": "The price value in the price-signal stream's currency per kWh.",
            "example": 0.045
          }
        },
        "required": [
          "at",
          "price"
        ],
        "additionalProperties": false,
        "description": "A price signal data point. The price applies from this point until the next point (step function)."
      },
      "PriceSignalPushPayload": {
        "type": "object",
        "properties": {
          "currency": {
            "type": "string",
            "minLength": 3,
            "maxLength": 3,
            "pattern": "^[A-Z]{3}$",
            "description": "ISO 4217 currency code. The first accepted revision establishes the price-signal stream currency; later revisions must match it. Enode does not perform currency conversion.",
            "example": "EUR"
          },
          "issuedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the customer or upstream price provider issued this revision. This is source provenance only; Enode uses its own receipt order to determine what was known at a point in time.",
            "example": "2024-06-14T12:30:00Z"
          },
          "externalRevisionId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Optional revision identifier assigned by the customer or upstream price provider.",
            "example": "day-ahead-2024-06-15-r2"
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "description": "End of the replacement window (exclusive). All existing data in [firstValue.at, to) is replaced with the provided values.",
            "example": "2024-06-16T00:00:00Z"
          },
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PriceSignalValue"
            },
            "minItems": 1,
            "maxItems": 10000,
            "description": "The price signal values. Between 1 and 10,000 values are accepted. Values must be ordered chronologically. Each value defines the price from its timestamp until the next value (step function). The first value's 'at' defines the start of the replacement window."
          }
        },
        "required": [
          "currency",
          "to",
          "values"
        ],
        "additionalProperties": false,
        "description": "Payload for pushing a price signal to a zone. Replaces all existing data in the window [firstValue.at, to) with the provided values."
      },
      "PriceSignalIdempotencyPayloadMismatchProblem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "https://developers.enode.com/api/problems/idempotency-key-payload-mismatch"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Idempotency key payload mismatch"
            ]
          },
          "detail": {
            "type": "string",
            "description": "Detailed problem description for an Idempotency-Key reused with a different price signal payload."
          }
        },
        "required": [
          "type",
          "title",
          "detail"
        ]
      },
      "PriceSignalResponse": {
        "type": "object",
        "properties": {
          "zoneId": {
            "type": "string",
            "description": "The zone this price signal belongs to.",
            "example": "NO1"
          },
          "currency": {
            "type": "string",
            "minLength": 3,
            "maxLength": 3,
            "pattern": "^[A-Z]{3}$",
            "description": "The currency of the price values. Legacy data received before currency provenance was persisted retains the historical EUR response fallback until the first accepted revision establishes the stream currency.",
            "example": "EUR"
          },
          "from": {
            "type": "string",
            "format": "date-time",
            "description": "Start of the queried time range.",
            "example": "2024-06-15T00:00:00Z"
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "description": "End of the queried time range.",
            "example": "2024-06-16T00:00:00Z"
          },
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PriceSignalValue"
            },
            "description": "The price signal values whose validity overlaps the queried range. Includes the last value before `from` when it is still in effect at `from` (step-function carry-forward), so its `at` can precede the queried range."
          }
        },
        "required": [
          "zoneId",
          "currency",
          "from",
          "to",
          "values"
        ],
        "additionalProperties": false,
        "description": "A price signal for a zone."
      },
      "FlexShapeChunk": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "The start timestamp of the chunk.",
            "example": "2026-03-17T10:00:00Z"
          },
          "forecast": {
            "type": "object",
            "properties": {
              "expectedKw": {
                "type": "number",
                "description": "The expected mean load in kW.",
                "example": 75000
              },
              "minimumKw": {
                "type": "number",
                "description": "The achievable minimum mean load in kW.",
                "example": 55000
              },
              "maximumKw": {
                "type": "number",
                "description": "The achievable maximum mean load in kW.",
                "example": 101000
              },
              "confidence": {
                "type": "number",
                "description": "Probability that the expectedKw forecast is within a small (configurable) margin of the realized load (0.0-1.0).",
                "example": 0.95
              }
            },
            "required": [
              "expectedKw",
              "minimumKw",
              "maximumKw",
              "confidence"
            ],
            "additionalProperties": false,
            "description": "Forecast attributes for this chunk, with a confidence score."
          },
          "relativeSetpoint": {
            "type": "number",
            "description": "The relative setpoint constraint applied to this chunk, in kW. 0 means no constraint.",
            "example": 0
          }
        },
        "required": [
          "timestamp",
          "forecast",
          "relativeSetpoint"
        ],
        "additionalProperties": false
      },
      "FlexShapeDeliverableAccountingChunk": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "The start timestamp of the chunk.",
            "example": "2026-03-17T10:00:00Z"
          },
          "requestedKw": {
            "type": "number",
            "description": "The requested relative setpoint for this chunk, in kW.",
            "example": 1000
          },
          "claimableNowKw": {
            "type": "number",
            "description": "The unweighted constrained-minus-optimal load currently claimable by live sessions, in kW.",
            "example": 650
          },
          "claimableIfPredictedKw": {
            "type": "number",
            "description": "The unweighted constrained-minus-optimal load claimable if predicted arrivals materialize, in kW.",
            "example": 250
          },
          "unabsorbedKw": {
            "type": "number",
            "description": "The requested setpoint not accounted for by claimed asset schedules, in kW.",
            "example": 100
          },
          "pendingArrivalsKw": {
            "type": "number",
            "description": "The unabsorbed setpoint magnitude expected to be recruitable from sessions not yet claimed, as they materialize, in kW.",
            "example": 75
          },
          "infeasibleKw": {
            "type": "number",
            "description": "The unabsorbed setpoint magnitude beyond what the fleet's remaining sessions can deliver, in kW.",
            "example": 25
          }
        },
        "required": [
          "timestamp",
          "requestedKw",
          "claimableNowKw",
          "claimableIfPredictedKw",
          "unabsorbedKw",
          "pendingArrivalsKw",
          "infeasibleKw"
        ],
        "additionalProperties": false
      },
      "FlexShape": {
        "type": "object",
        "properties": {
          "zoneId": {
            "type": "string",
            "description": "The zone this shape belongs to.",
            "example": "NO1"
          },
          "computedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When this shape was computed.",
            "example": "2026-03-17T10:00:00Z"
          },
          "chunkSizeMinutes": {
            "type": "number",
            "description": "The size of each chunk in minutes.",
            "example": 15
          },
          "revisionId": {
            "type": "string",
            "description": "Revision identifier derived from the underlying forecast data. Changes when a recomputation produces different data; identical data yields the same identifier."
          },
          "assetCount": {
            "type": "integer",
            "minimum": 0,
            "description": "The number of unique assets represented by the containing forecast or realized-load chunk.",
            "example": 60
          },
          "startAt": {
            "type": "string",
            "format": "date-time",
            "description": "The timestamp of the first chunk.",
            "example": "2026-03-17T10:00:00Z"
          },
          "endAt": {
            "type": "string",
            "format": "date-time",
            "description": "The timestamp after the last chunk.",
            "example": "2026-03-19T10:00:00Z"
          },
          "chunks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlexShapeChunk"
            },
            "description": "The forecast chunks aggregated across all assets in the zone."
          },
          "deliverable": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlexShapeDeliverableAccountingChunk"
            },
            "description": "Per-chunk accounting of how requested relative setpoints map to claimed asset schedules. This field is only included for clients with the `flexShapeDeliverableAccounting` feature flag enabled, and is omitted otherwise."
          }
        },
        "required": [
          "zoneId",
          "computedAt",
          "chunkSizeMinutes",
          "revisionId",
          "assetCount",
          "startAt",
          "endAt",
          "chunks"
        ],
        "additionalProperties": false,
        "description": "The flex shape for a zone. The primary endpoint for trading algorithms — one HTTP request per zone returns everything needed to construct bid curves."
      },
      "SegmentedFlexShapeChunk": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "The start timestamp of the chunk.",
            "example": "2026-03-17T10:00:00Z"
          },
          "forecast": {
            "type": "object",
            "properties": {
              "expectedKw": {
                "type": "number",
                "description": "The expected mean load in kW.",
                "example": 75000
              },
              "minimumKw": {
                "type": "number",
                "description": "The achievable minimum mean load in kW.",
                "example": 55000
              },
              "maximumKw": {
                "type": "number",
                "description": "The achievable maximum mean load in kW.",
                "example": 101000
              },
              "confidence": {
                "type": "number",
                "description": "Probability that the expectedKw forecast is within a small (configurable) margin of the realized load (0.0-1.0).",
                "example": 0.95
              }
            },
            "required": [
              "expectedKw",
              "minimumKw",
              "maximumKw",
              "confidence"
            ],
            "additionalProperties": false,
            "description": "Forecast attributes for this chunk, with a confidence score."
          }
        },
        "required": [
          "timestamp",
          "forecast"
        ],
        "additionalProperties": false
      },
      "SegmentedFlexShapeGroup": {
        "type": "object",
        "properties": {
          "groupId": {
            "type": "string",
            "description": "The group identifier within the requested dimension. For `system:asset_composition` the configured groups are `ev` (households with at least an EV) and `ev_pv` (households with an EV and physical or virtual solar).",
            "example": "ev_pv"
          },
          "assetCount": {
            "type": "integer",
            "minimum": 0,
            "description": "The number of unique assets represented by the containing forecast or realized-load chunk.",
            "example": 42
          },
          "chunks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SegmentedFlexShapeChunk"
            },
            "description": "The forecast chunks aggregated across the assets in this group."
          }
        },
        "required": [
          "groupId",
          "assetCount",
          "chunks"
        ],
        "additionalProperties": false,
        "description": "The shape contribution of one group in the dimension."
      },
      "SegmentedFlexShape": {
        "type": "object",
        "properties": {
          "zoneId": {
            "type": "string",
            "description": "The zone this shape belongs to.",
            "example": "NO1"
          },
          "computedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When this shape was computed.",
            "example": "2026-03-17T10:00:00Z"
          },
          "chunkSizeMinutes": {
            "type": "number",
            "description": "The size of each chunk in minutes.",
            "example": 15
          },
          "revisionId": {
            "type": "string",
            "description": "Revision identifier derived from the underlying forecast data. Changes when a recomputation produces different data; identical data yields the same identifier."
          },
          "total": {
            "type": "object",
            "properties": {
              "assetCount": {
                "type": "integer",
                "minimum": 0,
                "description": "The number of unique assets represented by the containing forecast or realized-load chunk.",
                "example": 60
              },
              "startAt": {
                "type": "string",
                "format": "date-time",
                "description": "The timestamp of the first chunk.",
                "example": "2026-03-17T10:00:00Z"
              },
              "endAt": {
                "type": "string",
                "format": "date-time",
                "description": "The timestamp after the last chunk.",
                "example": "2026-03-19T10:00:00Z"
              },
              "chunks": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/SegmentedFlexShapeChunk"
                },
                "description": "The forecast chunks aggregated across all assets in the zone."
              }
            },
            "required": [
              "assetCount",
              "startAt",
              "endAt",
              "chunks"
            ],
            "additionalProperties": false,
            "description": "The total shape across all assets in the zone. For each curve in each chunk, the group shapes and unassigned bucket reconcile with the total within `ceil(1000 * (8 * Number.EPSILON * max(1, abs(totalKw)) * bucketCount + (bucketCount + 1) * 0.000501)) / 1000` kW, where `bucketCount` is the number of groups plus the unassigned bucket. Their asset counts sum exactly to `total.assetCount`."
          },
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SegmentedFlexShapeGroup"
            },
            "description": "One entry per configured group in the requested dimension."
          },
          "unassigned": {
            "type": "object",
            "properties": {
              "assetCount": {
                "type": "integer",
                "minimum": 0,
                "description": "The number of unique assets represented by the containing forecast or realized-load chunk.",
                "example": 18
              },
              "chunks": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/SegmentedFlexShapeChunk"
                },
                "description": "The forecast chunks aggregated across assets without a resolved group assignment."
              }
            },
            "required": [
              "assetCount",
              "chunks"
            ],
            "additionalProperties": false,
            "description": "The shape contribution of assets without a resolved group assignment in the requested dimension."
          }
        },
        "required": [
          "zoneId",
          "computedAt",
          "chunkSizeMinutes",
          "revisionId",
          "total",
          "groups",
          "unassigned"
        ],
        "additionalProperties": false,
        "description": "The flex shape for a zone, segmented by the requested dimension into one shape per group plus an unassigned bucket."
      },
      "FlexShapeHistoryChunk": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "The start timestamp of the completed chunk.",
            "example": "2026-03-17T10:00:00Z"
          },
          "loadKw": {
            "type": "number",
            "description": "The realized mean load in kW.",
            "example": 74250
          },
          "minimumKw": {
            "type": [
              "number",
              "null"
            ],
            "description": "The achievable minimum mean load in kW, time-averaged over the chunk. Null when no plugged-in eligible fleet was present during the chunk.",
            "example": 53000
          },
          "maximumKw": {
            "type": [
              "number",
              "null"
            ],
            "description": "The achievable maximum mean load in kW, time-averaged over the chunk. Null when no plugged-in eligible fleet was present during the chunk.",
            "example": 99000
          },
          "assetCount": {
            "type": "integer",
            "minimum": 0,
            "description": "The number of unique assets represented by the containing forecast or realized-load chunk.",
            "example": 60
          }
        },
        "required": [
          "timestamp",
          "loadKw",
          "minimumKw",
          "maximumKw",
          "assetCount"
        ],
        "additionalProperties": false
      },
      "FlexShapeHistory": {
        "type": "object",
        "properties": {
          "zoneId": {
            "type": "string",
            "description": "The zone this historical load belongs to.",
            "example": "NO1"
          },
          "from": {
            "type": "string",
            "format": "date-time",
            "description": "Start of the queried time range.",
            "example": "2026-03-17T00:00:00Z"
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "description": "End of the queried time range.",
            "example": "2026-03-18T00:00:00Z"
          },
          "chunkSizeMinutes": {
            "type": "number",
            "description": "The size of each chunk in minutes.",
            "example": 15
          },
          "chunks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlexShapeHistoryChunk"
            },
            "description": "The realized load chunks persisted for the queried range."
          }
        },
        "required": [
          "zoneId",
          "from",
          "to",
          "chunkSizeMinutes",
          "chunks"
        ],
        "additionalProperties": false,
        "description": "Historical realized fleet load and achievable load band for a zone."
      },
      "FlexShapeSegmentedHistoryGroup": {
        "type": "object",
        "properties": {
          "groupId": {
            "type": "string",
            "description": "The group identifier within the requested dimension, as resolved when each chunk was measured. For `system:asset_composition` the groups are `ev` and `ev_pv`.",
            "example": "ev_pv"
          },
          "chunks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlexShapeHistoryChunk"
            },
            "description": "The realized load chunks for the assets that belonged to this group when each chunk was measured."
          }
        },
        "required": [
          "groupId",
          "chunks"
        ],
        "additionalProperties": false,
        "description": "The realized load contribution of one group."
      },
      "FlexShapeSegmentedHistory": {
        "type": "object",
        "properties": {
          "zoneId": {
            "type": "string",
            "description": "The zone this historical load belongs to.",
            "example": "NO1"
          },
          "from": {
            "type": "string",
            "format": "date-time",
            "description": "Start of the queried time range.",
            "example": "2026-03-17T00:00:00Z"
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "description": "End of the queried time range.",
            "example": "2026-03-18T00:00:00Z"
          },
          "chunkSizeMinutes": {
            "type": "number",
            "description": "The size of each chunk in minutes.",
            "example": 15
          },
          "groupBy": {
            "type": "string",
            "description": "The dimension the load is segmented by.",
            "example": "region"
          },
          "total": {
            "type": "object",
            "properties": {
              "chunks": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/FlexShapeHistoryChunk"
                },
                "description": "The realized load chunks aggregated across all groups. Each chunk's `loadKw` and band equal the sum of the group chunks and the unassigned bucket at that timestamp, to within rounding precision. `assetCount` is the unique zone-wide count also returned by unsegmented history; it can be lower than the sum of the bucket counts when an asset was represented in more than one bucket during the chunk. Only chunks whose segmented breakdown was captured (i.e. measured after segmentation shipped) are included."
              }
            },
            "required": [
              "chunks"
            ],
            "additionalProperties": false,
            "description": "The total realized load across all groups."
          },
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlexShapeSegmentedHistoryGroup"
            },
            "description": "One entry per group that had members during the queried range. A group's chunks are sparse: a chunk appears only where the group had members at that timestamp."
          },
          "unassigned": {
            "type": "object",
            "properties": {
              "chunks": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/FlexShapeHistoryChunk"
                },
                "description": "The realized load chunks for assets without a resolved group assignment in the requested dimension."
              }
            },
            "required": [
              "chunks"
            ],
            "additionalProperties": false,
            "description": "The realized load contribution of assets without a group assignment."
          }
        },
        "required": [
          "zoneId",
          "from",
          "to",
          "chunkSizeMinutes",
          "groupBy",
          "total",
          "groups",
          "unassigned"
        ],
        "additionalProperties": false,
        "description": "Historical realized fleet load for a zone, segmented by the requested dimension into one entry per group plus an unassigned bucket. Membership is frozen from its dimension-specific source when each chunk is measured, so later household changes, renames, and reassignments do not rewrite history."
      },
      "FlexShapeUpdatePayload": {
        "type": "object",
        "properties": {
          "chunks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "timestamp": {
                  "type": "string",
                  "format": "date-time",
                  "description": "The timestamp of the chunk to set or clear.",
                  "example": "2026-03-17T10:15:00Z"
                },
                "relativeSetpoint": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The relative setpoint constraint in kW. Set to null to remove an existing constraint.",
                  "example": 5000
                }
              },
              "required": [
                "timestamp",
                "relativeSetpoint"
              ],
              "additionalProperties": false
            },
            "description": "The chunks to update. Each entry sets or clears a constraint at the given timestamp."
          }
        },
        "required": [
          "chunks"
        ],
        "additionalProperties": false,
        "description": "Payload for previewing or applying shape constraint updates."
      },
      "FlexShapeStatus": {
        "type": "object",
        "properties": {
          "zoneId": {
            "type": "string",
            "description": "The zone this status belongs to.",
            "example": "NO1"
          },
          "computedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When this status was computed.",
            "example": "2026-03-17T10:00:00Z"
          },
          "isForecastStable": {
            "type": "boolean",
            "description": "Whether the forecast revision variance of near-term horizons is within configured bounds."
          },
          "isSolvent": {
            "type": "boolean",
            "description": "Whether the execution engine has sufficient inventory of asset flexibility to fulfill its plans."
          },
          "isControlNominal": {
            "type": "boolean",
            "description": "Whether the success rate of asset control actions is within typical expectations."
          }
        },
        "required": [
          "zoneId",
          "computedAt",
          "isForecastStable",
          "isSolvent",
          "isControlNominal"
        ],
        "additionalProperties": false,
        "description": "Health indicators for a zone. Trading systems use these as circuit-breaker inputs."
      },
      "SessionBlockMode": {
        "type": "string",
        "description": "Extensible enum. Whether the block represents active charging or an intended restriction pause.\n  * `CHARGING`: The block represents active or planned charging.\n  * `RESTRICTION`: The block represents a period where charging is intended to be paused due to a restriction. It normally carries no energy, but may have positive kWh if charging continued anyway, for example because a stop command failed or was delayed.",
        "examples": [
          "CHARGING",
          "RESTRICTION"
        ],
        "title": "Session Block Mode"
      },
      "SessionBlockType": {
        "type": "string",
        "description": "Extensible enum. The type of charge block. `UNKNOWN` is energy delivered in a period the session did not plan for: charging the system did not initiate, for example the vehicle charging on its own. Only appears on settled sessions, and always reported with `source: UNKNOWN`, `flexibility: NONE`.",
        "examples": [
          "BATTERY_RESERVE",
          "REGULAR",
          "IMMEDIATE_START",
          "RESTRICTION",
          "UNKNOWN"
        ],
        "title": "Session Block Type"
      },
      "SessionBlockSource": {
        "type": "string",
        "description": "Extensible enum. Where this block came from. `POLICY` and `USER_OVERRIDE` mirror the target source. `UNKNOWN` means the charging was not initiated by the schedule or the user, so its origin is unknown; it always pairs with `type: UNKNOWN`.",
        "examples": [
          "POLICY",
          "USER_OVERRIDE",
          "UNKNOWN"
        ],
        "title": "Session Block Source"
      },
      "SessionBlockFlexibility": {
        "type": "string",
        "enum": [
          "FULL",
          "LIMITED",
          "NONE"
        ],
        "title": "Session Block Flexibility",
        "description": "How much scheduling freedom this block had.\n  * `FULL`: The block could move by at least one hour.\n  * `LIMITED`: The block could move, but by less than one hour.\n  * `NONE`: The block could not move."
      },
      "SessionBlock": {
        "type": "object",
        "properties": {
          "mode": {
            "$ref": "#/components/schemas/SessionBlockMode"
          },
          "type": {
            "$ref": "#/components/schemas/SessionBlockType"
          },
          "source": {
            "$ref": "#/components/schemas/SessionBlockSource",
            "description": "Where this block came from. `POLICY` is the weekly schedule, `USER_OVERRIDE` is a change the user made. A block keeps the source that was in effect when that part of the session was planned, so if the user overrides mid-session, earlier blocks stay `POLICY` while later ones report `USER_OVERRIDE`. `UNKNOWN` means the charging was not initiated by the schedule or the user, so its origin is unknown; it appears only on settled sessions and always pairs with `type: UNKNOWN`.",
            "example": "POLICY"
          },
          "flexibility": {
            "$ref": "#/components/schemas/SessionBlockFlexibility",
            "description": "How much scheduling freedom this block had when it was planned. `FULL` means at least one hour of movable window, `LIMITED` means movable by less than one hour, and `NONE` means not movable.",
            "example": "FULL"
          },
          "kwhSum": {
            "type": "number",
            "minimum": 0,
            "description": "The total energy delivered during this block in kWh. For completed and in-progress blocks, this is the actual energy delivered. For future (tentative) blocks, this is the system's estimate.",
            "example": 12.4
          },
          "startAt": {
            "type": "string",
            "format": "date-time",
            "description": "While ACTIVE, this is when the block started (if past) or is tentatively planned to start (if future). While SETTLED, this is when the block actually started.",
            "example": "2020-04-07T17:04:26Z"
          },
          "endAt": {
            "type": "string",
            "format": "date-time",
            "description": "While ACTIVE, this is when the block ended (if past) or is tentatively planned to end (if future). While SETTLED, this is when the block actually ended.",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "mode",
          "type",
          "source",
          "flexibility",
          "kwhSum",
          "startAt",
          "endAt"
        ],
        "additionalProperties": false,
        "title": "Session Block",
        "description": "A discrete window within the session. Use `mode` to distinguish between charging blocks and intended restriction pause blocks. For `RESTRICTION` blocks, `source` reflects the restriction's origin (`POLICY` from the schedule, or `USER_OVERRIDE` from a manual restriction). A block with `type: UNKNOWN` / `source: UNKNOWN` is energy delivered in a period the session did not plan for, for example the vehicle charging on its own.",
        "example": {
          "mode": "CHARGING",
          "type": "BATTERY_RESERVE",
          "source": "POLICY",
          "flexibility": "NONE",
          "kwhSum": 3.2,
          "startAt": "2023-04-01T12:00:00Z",
          "endAt": "2023-04-01T13:00:00Z"
        }
      },
      "SessionRegularTargetSource": {
        "type": "string",
        "description": "Extensible enum. Whether this target follows the default policy or a user override.",
        "examples": [
          "POLICY",
          "USER_OVERRIDE"
        ],
        "title": "Regular Target Source"
      },
      "SessionRegularTarget": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1,
            "description": "Incrementing identifier for this target within the session.",
            "example": 1
          },
          "type": {
            "type": "string",
            "enum": [
              "REGULAR"
            ]
          },
          "source": {
            "$ref": "#/components/schemas/SessionRegularTargetSource"
          },
          "batteryReserve": {
            "type": "number",
            "minimum": 0,
            "description": "The battery reserve percentage. Charging to this level is always prioritised.",
            "example": 20
          },
          "minimumChargeTarget": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "description": "The minimum charge target as a battery percentage.",
            "example": 50
          },
          "readyBy": {
            "type": "string",
            "format": "date-time",
            "description": "The time by which the minimum charge target should be reached.",
            "example": "2023-04-01T07:00:00Z"
          }
        },
        "required": [
          "id",
          "type",
          "source",
          "batteryReserve",
          "minimumChargeTarget",
          "readyBy"
        ],
        "additionalProperties": false,
        "title": "Regular Target",
        "description": "A regular target that follows the policy schedule or a user override."
      },
      "SessionImmediateStartTarget": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1,
            "description": "Incrementing identifier for this target within the session.",
            "example": 1
          },
          "type": {
            "type": "string",
            "enum": [
              "IMMEDIATE_START"
            ]
          },
          "minimumChargeTarget": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "description": "The minimum charge target as a battery percentage.",
            "example": 70
          }
        },
        "required": [
          "id",
          "type",
          "minimumChargeTarget"
        ],
        "additionalProperties": false,
        "title": "Immediate Start Target",
        "description": "A target that charges immediately to a battery level."
      },
      "SessionRegularOnTargetOutcome": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "REGULAR"
            ]
          },
          "targetId": {
            "type": "integer",
            "minimum": 1,
            "description": "The target this outcome is evaluated against.",
            "example": 1
          },
          "state": {
            "type": "string",
            "enum": [
              "ON_TARGET"
            ],
            "description": "The minimum charge target is estimated to be reached by the ready-by time."
          },
          "batteryLevelAtReadyBy": {
            "type": "null",
            "description": "Always null for on-target outcomes."
          },
          "minimumChargeTargetReachedAt": {
            "type": "null",
            "description": "Always null for on-target outcomes."
          }
        },
        "required": [
          "type",
          "targetId",
          "state",
          "batteryLevelAtReadyBy",
          "minimumChargeTargetReachedAt"
        ],
        "additionalProperties": false,
        "title": "Regular On-Target Outcome",
        "description": "Outcome when the charge target is expected to be met by the ready-by time."
      },
      "SessionRegularOffTargetOutcome": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "REGULAR"
            ]
          },
          "targetId": {
            "type": "integer",
            "minimum": 1,
            "description": "The target this outcome is evaluated against.",
            "example": 1
          },
          "state": {
            "type": "string",
            "enum": [
              "OFF_TARGET"
            ],
            "description": "The target cannot be reached by the ready-by time."
          },
          "batteryLevelAtReadyBy": {
            "type": "number",
            "minimum": 0,
            "description": "The estimated battery percentage at the ready-by time.",
            "example": 42
          },
          "minimumChargeTargetReachedAt": {
            "type": "string",
            "format": "date-time",
            "description": "The estimated time at which the minimum charge target will be reached. Null when a projection is unavailable, for example if charging has failed to start.",
            "example": "2023-04-01T12:30:00Z"
          }
        },
        "required": [
          "type",
          "targetId",
          "state",
          "batteryLevelAtReadyBy",
          "minimumChargeTargetReachedAt"
        ],
        "additionalProperties": false,
        "title": "Regular Off-Target Outcome",
        "description": "Outcome when the charge target cannot be met by the ready-by time."
      },
      "SessionRegularOutcome": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/SessionRegularOnTargetOutcome"
          },
          {
            "$ref": "#/components/schemas/SessionRegularOffTargetOutcome"
          }
        ],
        "discriminator": {
          "propertyName": "state",
          "mapping": {
            "ON_TARGET": "#/components/schemas/SessionRegularOnTargetOutcome",
            "OFF_TARGET": "#/components/schemas/SessionRegularOffTargetOutcome"
          }
        },
        "title": "Regular Outcome",
        "description": "Outcome assessment for a regular target. Discriminated on `state`: ON_TARGET includes projected battery level and timing; OFF_TARGET indicates the target cannot be met."
      },
      "SessionImmediateStartOutcome": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "IMMEDIATE_START"
            ]
          },
          "targetId": {
            "type": "integer",
            "minimum": 1,
            "description": "The target this outcome is evaluated against.",
            "example": 1
          },
          "minimumChargeTargetReachedAt": {
            "type": "string",
            "format": "date-time",
            "description": "The estimated time at which the minimum charge target will be reached. Null when a projection is unavailable, for example if charging has failed to start.",
            "example": "2023-04-01T12:30:00Z"
          }
        },
        "required": [
          "type",
          "targetId",
          "minimumChargeTargetReachedAt"
        ],
        "additionalProperties": false,
        "title": "Immediate Start Outcome",
        "description": "Outcome assessment for an immediate start target."
      },
      "SessionStartFailError": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "START_FAIL"
            ]
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false,
        "title": "Start Fail Error",
        "description": "Charging failed to start."
      },
      "SessionStopFailError": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "STOP_FAIL"
            ]
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false,
        "title": "Stop Fail Error",
        "description": "Charging failed to stop."
      },
      "SessionCapability": {
        "type": "string",
        "description": "Extensible enum. A capability required for session management.",
        "examples": [
          "chargeState",
          "location",
          "startCharging",
          "stopCharging"
        ],
        "title": "Session Capability"
      },
      "SessionMissingCapabilitiesError": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "MISSING_CAPABILITIES"
            ]
          },
          "missingCapabilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionCapability"
            },
            "description": "The capabilities that the vehicle is missing."
          }
        },
        "required": [
          "type",
          "missingCapabilities"
        ],
        "additionalProperties": false,
        "title": "Missing Capabilities Error",
        "description": "The vehicle is missing required capabilities."
      },
      "RestrictionSource": {
        "type": "string",
        "description": "Extensible enum. The source of the restriction.\n  * `USER_OVERRIDE`: A user-created restriction.\n  * `POLICY`: A restriction from the policy's restriction schedule.",
        "examples": [
          "USER_OVERRIDE",
          "POLICY"
        ],
        "title": "Restriction Source"
      },
      "SessionRestriction": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "FULL"
            ],
            "description": "The type of restriction."
          },
          "source": {
            "$ref": "#/components/schemas/RestrictionSource"
          },
          "startsAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the restriction started.",
            "example": "2020-04-07T17:04:26Z"
          },
          "endsAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the restriction will end.",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "type",
          "source",
          "startsAt",
          "endsAt"
        ],
        "additionalProperties": false,
        "title": "Session Restriction",
        "description": "A restriction that requests charging to pause on the session."
      },
      "TariffCost": {
        "type": "object",
        "properties": {
          "actual": {
            "type": "number",
            "description": "The energy cost of this session based on when charging actually occurred. Calculated by multiplying the energy delivered in each 15-minute interval by the tariff rate at that time.",
            "example": 3.45
          },
          "baseline": {
            "type": "number",
            "description": "The hypothetical energy cost if the same total energy had been charged immediately starting at plug-in time, without smart charging optimization.",
            "example": 5.12
          },
          "savings": {
            "type": "number",
            "minimum": 0,
            "description": "Money saved by shifting charging to cheaper tariff periods. Zero when the tariff is flat, since there is no price variation to optimize against.",
            "example": 1.67
          }
        },
        "required": [
          "actual",
          "baseline",
          "savings"
        ],
        "additionalProperties": false,
        "title": "Tariff Cost",
        "description": "Tariff-based cost comparison between actual (smart-charged) and baseline (immediate) charging."
      },
      "Valuation": {
        "type": "object",
        "properties": {
          "currency": {
            "type": "string",
            "description": "ISO 4217 currency code for the cost values.",
            "example": "EUR"
          },
          "tariffCost": {
            "$ref": "#/components/schemas/TariffCost",
            "description": "Tariff-based cost breakdown comparing actual and baseline charging costs."
          }
        },
        "required": [
          "currency",
          "tariffCost"
        ],
        "additionalProperties": false,
        "title": "Valuation",
        "description": "Tariff-based cost comparison between actual (smart-charged) and baseline (immediate) charging.\n\n**Prerequisites:** Requires a tariff formula configured via the Tariff API for the session's charging location. When no tariff is configured, or when the configured tariff's price data did not cover the session, `valuation` is null.\n\n**How it works:** `tariffCost.actual` reflects what the session cost based on the optimized charging schedule. `tariffCost.baseline` estimates what it would have cost to charge the same energy immediately at plug-in time. Both use tariff rates only — market/spot prices are not included.\n\n**Limitations:** For flat-rate tariffs (single price at all times), `savings` will always be zero since there is no price variation for the optimizer to exploit. Cost values are approximated to 15-minute intervals, matching the resolution of the energy delivery timeseries."
      },
      "SettledSession": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The unique identifier for this session."
          },
          "state": {
            "type": "string",
            "enum": [
              "SETTLED"
            ]
          },
          "policyId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The unique identifier for the policy associated with this session."
          },
          "vehicleId": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The unique identifier for the vehicle associated with this session."
          },
          "locationId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The unique identifier for the location associated with this session."
          },
          "pluggedInAt": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the vehicle was plugged in.",
            "example": "2023-04-01T12:00:00Z"
          },
          "pluggedOutAt": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the vehicle was unplugged.",
            "example": "2023-04-01T13:00:00Z"
          },
          "blocks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionBlock"
            },
            "description": "Discrete windows of active charging that occurred during the session."
          },
          "statistics": {
            "type": "object",
            "properties": {
              "aggregated": {
                "type": "object",
                "properties": {
                  "kwhSum": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "minimum": 0,
                    "description": "The total amount of energy charged in kWh.",
                    "example": 33.2
                  },
                  "batteryFrom": {
                    "type": "number",
                    "minimum": 0,
                    "description": "The battery percentage at the start of the session.",
                    "example": 50
                  },
                  "batteryTo": {
                    "type": "number",
                    "minimum": 0,
                    "description": "The final battery percentage.",
                    "example": 60
                  }
                },
                "required": [
                  "kwhSum",
                  "batteryFrom",
                  "batteryTo"
                ],
                "additionalProperties": false,
                "description": "Aggregated statistics for the session."
              },
              "timeseries": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "startAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "The start of this 15-minute interval.",
                      "example": "2023-04-01T12:00:00Z"
                    },
                    "kwh": {
                      "type": "number",
                      "minimum": 0,
                      "description": "The energy delivered in kWh over this 15-minute interval.",
                      "example": 1.55
                    }
                  },
                  "required": [
                    "startAt",
                    "kwh"
                  ],
                  "additionalProperties": false
                },
                "description": "15-minute interval energy delivery data for the session."
              }
            },
            "required": [
              "aggregated",
              "timeseries"
            ],
            "additionalProperties": false,
            "description": "Energy delivery statistics for the session."
          },
          "target": {
            "type": "object",
            "properties": {
              "latest": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/SessionRegularTarget"
                  },
                  {
                    "$ref": "#/components/schemas/SessionImmediateStartTarget"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "The latest target configuration. Null for unmanaged sessions (e.g. public charging) where the system did not control the charge. Use `type` to distinguish between `REGULAR` and `IMMEDIATE_START` targets."
              }
            },
            "required": [
              "latest"
            ],
            "additionalProperties": false,
            "description": "What the system is charging towards for this session."
          },
          "outcome": {
            "type": "object",
            "properties": {
              "latest": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/SessionRegularOutcome"
                  },
                  {
                    "$ref": "#/components/schemas/SessionImmediateStartOutcome"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "The final outcome assessment. Null for unmanaged sessions. Use `type` to distinguish between `REGULAR` and `IMMEDIATE_START` outcomes, then `state` to distinguish `ON_TARGET` from `OFF_TARGET` within regular outcomes."
              }
            },
            "required": [
              "latest"
            ],
            "additionalProperties": false,
            "description": "Whether the target will be met for this session."
          },
          "error": {
            "type": "object",
            "properties": {
              "latest": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/SessionStartFailError"
                  },
                  {
                    "$ref": "#/components/schemas/SessionStopFailError"
                  },
                  {
                    "$ref": "#/components/schemas/SessionMissingCapabilitiesError"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "The latest error state. Null when there is no active error. Use `type` to identify the error kind."
              }
            },
            "required": [
              "latest"
            ],
            "additionalProperties": false,
            "description": "Error state for this session."
          },
          "restrictions": {
            "type": "object",
            "properties": {
              "current": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/SessionRestriction"
                  },
                  {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "The restriction currently constraining charging, or null if none is in effect. When both a `POLICY` and a `USER_OVERRIDE` window are active, `USER_OVERRIDE` takes precedence. When the session is in `ACTIVE:IMMEDIATE_START`, `current` is null because the immediate-start override suppresses restriction enforcement; the underlying schedule windows remain visible in `all`. Reflects the restriction state at the time the session was last updated. For live updates, subscribe to the `flex.session.updated` webhook."
                  }
                ]
              },
              "all": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/SessionRestriction"
                },
                "description": "All restriction windows for this session, sorted by `startsAt`. Covers at least the next 24 hours. Includes policy-scheduled and user-override restrictions. Empty for settled sessions; their historic restriction periods appear as `RESTRICTION`-mode entries in `blocks`. Active sessions project POLICY windows from the restriction schedule snapshotted at plug-in, so mid-session policy edits do not affect them. Upcoming sessions project POLICY windows from the current policy schedule. Reflects the restriction state when the session was last updated. For live updates, subscribe to the `flex.session.updated` webhook."
              }
            },
            "required": [
              "current",
              "all"
            ],
            "additionalProperties": false,
            "description": "Restrictions on this session."
          },
          "valuation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Valuation"
              },
              {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Tariff-based cost and savings analysis for this session. Null when no tariff formula is configured for the charging location, or when the configured tariff's price data did not cover the session."
              }
            ]
          }
        },
        "required": [
          "id",
          "state",
          "policyId",
          "vehicleId",
          "locationId",
          "pluggedInAt",
          "pluggedOutAt",
          "blocks",
          "statistics",
          "target",
          "outcome",
          "error",
          "restrictions",
          "valuation"
        ],
        "additionalProperties": false,
        "title": "Settled Session",
        "description": "A vehicle's charging session that has completed — the vehicle has been unplugged."
      },
      "PaginatedSessionList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SettledSession"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated list of sessions."
      },
      "ActiveOrUpcomingSessionState": {
        "type": "string",
        "enum": [
          "UPCOMING",
          "ACTIVE:BATTERY_RESERVE",
          "ACTIVE:REGULAR",
          "ACTIVE:IMMEDIATE_START"
        ],
        "title": "Active or Upcoming Session State",
        "description": "The current state of the session.\n  * `UPCOMING`: Initial state, created shortly after the previous session has settled.\n  * `ACTIVE:BATTERY_RESERVE`: Vehicle is plugged in, charging to maintain battery reserve.\n  * `ACTIVE:REGULAR`: Vehicle is plugged in, smart charging according to schedule.\n  * `ACTIVE:IMMEDIATE_START`: Vehicle is plugged in, charging immediately.",
        "example": "ACTIVE:REGULAR"
      },
      "ActiveOrUpcomingSession": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The unique identifier for this session."
          },
          "state": {
            "$ref": "#/components/schemas/ActiveOrUpcomingSessionState"
          },
          "policyId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The unique identifier for the policy associated with this session."
          },
          "vehicleId": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The unique identifier for the vehicle associated with this session."
          },
          "locationId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The unique identifier for the location associated with this session."
          },
          "pluggedInAt": {
            "type": "string",
            "format": "date-time",
            "description": "The date and time when the vehicle was plugged in.",
            "example": "2023-04-01T12:00:00Z"
          },
          "pluggedOutAt": {
            "type": "null",
            "description": "Always null. The vehicle has not been unplugged yet."
          },
          "blocks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionBlock"
            },
            "description": "Discrete windows of active charging within the session. Empty while UPCOMING. While ACTIVE, blocks represent a mix of past charging and planned future charging — past blocks are final, future blocks are tentative and may shift as the schedule re-optimizes."
          },
          "statistics": {
            "type": "object",
            "properties": {
              "aggregated": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "kwhSum": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "minimum": 0,
                    "description": "The total amount of energy charged in kWh.",
                    "example": 33.2
                  },
                  "batteryFrom": {
                    "type": "number",
                    "minimum": 0,
                    "description": "The battery percentage at the start of the session.",
                    "example": 50
                  },
                  "batteryTo": {
                    "type": "number",
                    "minimum": 0,
                    "description": "The current battery percentage while ACTIVE, or the final battery percentage when SETTLED.",
                    "example": 60
                  }
                },
                "required": [
                  "kwhSum",
                  "batteryFrom",
                  "batteryTo"
                ],
                "additionalProperties": false,
                "description": "Aggregated statistics for the session. Null while UPCOMING."
              },
              "timeseries": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "startAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "The start of this 15-minute interval.",
                      "example": "2023-04-01T12:00:00Z"
                    },
                    "kwh": {
                      "type": "number",
                      "minimum": 0,
                      "description": "The energy delivered in kWh over this 15-minute interval.",
                      "example": 1.55
                    }
                  },
                  "required": [
                    "startAt",
                    "kwh"
                  ],
                  "additionalProperties": false
                },
                "description": "15-minute interval energy delivery data. Empty while UPCOMING."
              }
            },
            "required": [
              "aggregated",
              "timeseries"
            ],
            "additionalProperties": false,
            "description": "Energy delivery statistics for the session."
          },
          "target": {
            "type": "object",
            "properties": {
              "latest": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/SessionRegularTarget"
                  },
                  {
                    "$ref": "#/components/schemas/SessionImmediateStartTarget"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "The latest target configuration. Null for unmanaged sessions (e.g. public charging) where the system did not control the charge. Use `type` to distinguish between `REGULAR` and `IMMEDIATE_START` targets."
              }
            },
            "required": [
              "latest"
            ],
            "additionalProperties": false,
            "description": "What the system is charging towards for this session."
          },
          "outcome": {
            "type": "object",
            "properties": {
              "latest": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/SessionRegularOutcome"
                  },
                  {
                    "$ref": "#/components/schemas/SessionImmediateStartOutcome"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "The latest outcome assessment. Null before the first estimate is available. Use `type` to distinguish between `REGULAR` and `IMMEDIATE_START` outcomes, then `state` to distinguish `ON_TARGET` from `OFF_TARGET` within regular outcomes."
              }
            },
            "required": [
              "latest"
            ],
            "additionalProperties": false,
            "description": "Whether the target will be met for this session."
          },
          "error": {
            "type": "object",
            "properties": {
              "latest": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/SessionStartFailError"
                  },
                  {
                    "$ref": "#/components/schemas/SessionStopFailError"
                  },
                  {
                    "$ref": "#/components/schemas/SessionMissingCapabilitiesError"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "The latest error state. Null when there is no active error. Use `type` to identify the error kind."
              }
            },
            "required": [
              "latest"
            ],
            "additionalProperties": false,
            "description": "Error state for this session."
          },
          "restrictions": {
            "type": "object",
            "properties": {
              "current": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/SessionRestriction"
                  },
                  {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "The restriction currently constraining charging, or null if none is in effect. When both a `POLICY` and a `USER_OVERRIDE` window are active, `USER_OVERRIDE` takes precedence. When the session is in `ACTIVE:IMMEDIATE_START`, `current` is null because the immediate-start override suppresses restriction enforcement; the underlying schedule windows remain visible in `all`. Reflects the restriction state at the time the session was last updated. For live updates, subscribe to the `flex.session.updated` webhook."
                  }
                ]
              },
              "all": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/SessionRestriction"
                },
                "description": "All restriction windows for this session, sorted by `startsAt`. Covers at least the next 24 hours. Includes policy-scheduled and user-override restrictions. Empty for settled sessions; their historic restriction periods appear as `RESTRICTION`-mode entries in `blocks`. Active sessions project POLICY windows from the restriction schedule snapshotted at plug-in, so mid-session policy edits do not affect them. Upcoming sessions project POLICY windows from the current policy schedule. Reflects the restriction state when the session was last updated. For live updates, subscribe to the `flex.session.updated` webhook."
              }
            },
            "required": [
              "current",
              "all"
            ],
            "additionalProperties": false,
            "description": "Restrictions on this session."
          }
        },
        "required": [
          "id",
          "state",
          "policyId",
          "vehicleId",
          "locationId",
          "pluggedInAt",
          "pluggedOutAt",
          "blocks",
          "statistics",
          "target",
          "outcome",
          "error",
          "restrictions"
        ],
        "additionalProperties": false,
        "title": "Active or Upcoming Session",
        "description": "A vehicle's charging session that is waiting for plug-in (UPCOMING) or currently plugged in (ACTIVE)."
      },
      "SessionRestrictionPayload": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "FULL"
            ],
            "description": "The type of restriction. Currently only `FULL` (restrict all planned charging) is supported."
          },
          "endsAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the restriction should end. Must be in the future.",
            "example": "2030-06-11T20:00:00Z"
          }
        },
        "required": [
          "type",
          "endsAt"
        ],
        "additionalProperties": false,
        "title": "Session Restriction Payload",
        "description": "Request body for creating a restriction on a session."
      },
      "SessionRestrictionResponse": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "FULL"
            ],
            "description": "The type of restriction."
          },
          "source": {
            "type": "string",
            "enum": [
              "USER_OVERRIDE"
            ],
            "description": "The source of the restriction."
          },
          "startsAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the restriction started.",
            "example": "2020-04-07T17:04:26Z"
          },
          "endsAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the restriction will end.",
            "example": "2020-04-07T17:04:26Z"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the restriction was created.",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "type",
          "source",
          "startsAt",
          "endsAt",
          "createdAt"
        ],
        "additionalProperties": false,
        "title": "Session Restriction Response",
        "description": "The created restriction."
      },
      "SessionsStatisticsRow": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Extensible enum. Category of the underlying session blocks.\n  * `BATTERY_RESERVE`: Charging up to the battery reserve level. Policy-driven and always reported with `flexibility: NONE`.\n  * `REGULAR`: Flexible charging that follows the schedule. Each block reports `FULL`, `LIMITED`, or `NONE`, based on how much room it had to move when planned.\n  * `IMMEDIATE_START`: Charging triggered by a user override. Always reported with `flexibility: NONE`.\n  * `RESTRICTION`: A window where charging was meant to be paused. Normally carries no energy, but may report positive kWh if the vehicle kept charging anyway, for example because a stop command failed or was delayed.\n  * `UNKNOWN`: Energy that does not match any planned charging, either delivered outside a planned window or impossible to tie to a specific block. This row keeps each bucket's total complete, so every delivered kWh is accounted for. Always reported with `source: UNKNOWN`, `flexibility: NONE`.",
            "examples": [
              "BATTERY_RESERVE",
              "REGULAR",
              "IMMEDIATE_START",
              "RESTRICTION",
              "UNKNOWN"
            ]
          },
          "source": {
            "type": "string",
            "description": "Extensible enum. Whether the block was driven by the policy schedule or a user override.\n  * `POLICY`: The block came from the policy's weekly schedule.\n  * `USER_OVERRIDE`: The block came from a user override of the target.\n  * `UNKNOWN`: Energy with no known origin: charging the schedule and the user did not initiate, plus energy that cannot be tied to a specific block. Always reported with `type: UNKNOWN`, `flexibility: NONE`.",
            "examples": [
              "POLICY",
              "USER_OVERRIDE",
              "UNKNOWN"
            ]
          },
          "flexibility": {
            "type": "string",
            "description": "Extensible enum. Scheduling freedom the underlying blocks had when planned. `BATTERY_RESERVE` and `IMMEDIATE_START` rows always report `NONE`.\n  * `FULL`: The blocks could move by at least one hour.\n  * `LIMITED`: The blocks could move, but by less than one hour.\n  * `NONE`: The blocks could not move.",
            "examples": [
              "FULL",
              "LIMITED",
              "NONE"
            ]
          },
          "tag": {
            "type": "string",
            "description": "Extensible enum. A custom label applied to this row's energy, available only when configured for your account. Contact your CSM to learn more.",
            "examples": [
              "TIER_1"
            ]
          },
          "kwhSum": {
            "type": "number",
            "minimum": 0,
            "description": "Total kWh delivered for this `(type, source, flexibility)` combination. Settled sessions only.",
            "example": 12.4
          }
        },
        "required": [
          "type",
          "source",
          "flexibility",
          "kwhSum"
        ],
        "title": "Sessions Statistics Row",
        "description": "Settled kWh for one `(type, source, flexibility)` combination within a single time bucket (one `DAY` or `MONTH`, set by `resolution`)."
      },
      "SessionsStatisticsBucket": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "description": "Start of this bucket as a local calendar date. For `DAY` resolution this is the local day; for `MONTH` it is the first day of the local calendar month.",
            "example": "2026-04-01"
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionsStatisticsRow"
            },
            "description": "One row per `(type, source, flexibility)` combination the system can produce. Combinations with no energy in this bucket are reported with `kwhSum: 0` rather than omitted. The set of combinations may grow in future releases."
          }
        },
        "required": [
          "date",
          "rows"
        ],
        "title": "Sessions Statistics Bucket",
        "description": "Aggregated kWh from sessions that settled within this bucket, grouped by `(type, source, flexibility)`."
      },
      "SessionsStatisticsResponse": {
        "type": "object",
        "properties": {
          "resolution": {
            "type": "string",
            "enum": [
              "DAY",
              "MONTH"
            ],
            "description": "Bucket size used for aggregating the report."
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SessionsStatisticsBucket"
            },
            "description": "Buckets covering the requested window, ordered by `date` ascending. One entry per bucket from `startDate` (inclusive) up to `endDate` (exclusive)."
          }
        },
        "required": [
          "resolution",
          "results"
        ],
        "title": "Sessions Statistics Response",
        "description": "Aggregated kWh grouped by `(type, source, flexibility)`, bucketed by `resolution`.",
        "example": {
          "resolution": "DAY",
          "results": [
            {
              "date": "2026-04-01",
              "rows": [
                {
                  "type": "REGULAR",
                  "source": "POLICY",
                  "flexibility": "FULL",
                  "kwhSum": 6.8
                },
                {
                  "type": "REGULAR",
                  "source": "POLICY",
                  "flexibility": "LIMITED",
                  "kwhSum": 1.2
                },
                {
                  "type": "REGULAR",
                  "source": "POLICY",
                  "flexibility": "NONE",
                  "kwhSum": 0.5
                },
                {
                  "type": "REGULAR",
                  "source": "USER_OVERRIDE",
                  "flexibility": "FULL",
                  "kwhSum": 0
                },
                {
                  "type": "REGULAR",
                  "source": "USER_OVERRIDE",
                  "flexibility": "LIMITED",
                  "kwhSum": 0
                },
                {
                  "type": "REGULAR",
                  "source": "USER_OVERRIDE",
                  "flexibility": "NONE",
                  "kwhSum": 2.4
                },
                {
                  "type": "BATTERY_RESERVE",
                  "source": "POLICY",
                  "flexibility": "NONE",
                  "kwhSum": 0.9
                },
                {
                  "type": "IMMEDIATE_START",
                  "source": "USER_OVERRIDE",
                  "flexibility": "NONE",
                  "kwhSum": 3.1
                },
                {
                  "type": "RESTRICTION",
                  "source": "POLICY",
                  "flexibility": "NONE",
                  "kwhSum": 0
                },
                {
                  "type": "RESTRICTION",
                  "source": "USER_OVERRIDE",
                  "flexibility": "NONE",
                  "kwhSum": 0
                },
                {
                  "type": "UNKNOWN",
                  "source": "UNKNOWN",
                  "flexibility": "NONE",
                  "kwhSum": 0
                }
              ]
            },
            {
              "date": "2026-04-02",
              "rows": [
                {
                  "type": "REGULAR",
                  "source": "POLICY",
                  "flexibility": "FULL",
                  "kwhSum": 9.3
                },
                {
                  "type": "REGULAR",
                  "source": "POLICY",
                  "flexibility": "LIMITED",
                  "kwhSum": 0
                },
                {
                  "type": "REGULAR",
                  "source": "POLICY",
                  "flexibility": "NONE",
                  "kwhSum": 0
                },
                {
                  "type": "REGULAR",
                  "source": "USER_OVERRIDE",
                  "flexibility": "FULL",
                  "kwhSum": 0
                },
                {
                  "type": "REGULAR",
                  "source": "USER_OVERRIDE",
                  "flexibility": "LIMITED",
                  "kwhSum": 0
                },
                {
                  "type": "REGULAR",
                  "source": "USER_OVERRIDE",
                  "flexibility": "NONE",
                  "kwhSum": 0
                },
                {
                  "type": "BATTERY_RESERVE",
                  "source": "POLICY",
                  "flexibility": "NONE",
                  "kwhSum": 0
                },
                {
                  "type": "IMMEDIATE_START",
                  "source": "USER_OVERRIDE",
                  "flexibility": "NONE",
                  "kwhSum": 0
                },
                {
                  "type": "RESTRICTION",
                  "source": "POLICY",
                  "flexibility": "NONE",
                  "kwhSum": 0.6
                },
                {
                  "type": "RESTRICTION",
                  "source": "USER_OVERRIDE",
                  "flexibility": "NONE",
                  "kwhSum": 0
                },
                {
                  "type": "UNKNOWN",
                  "source": "UNKNOWN",
                  "flexibility": "NONE",
                  "kwhSum": 0
                }
              ]
            }
          ]
        }
      },
      "SessionTargetRegularPayload": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "REGULAR"
            ]
          },
          "minimumChargeTarget": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "description": "The minimum charge target as a battery percentage. If omitted, the policy's default target is used.",
            "example": 65
          },
          "readyBy": {
            "type": "string",
            "format": "date-time",
            "description": "The time by which the vehicle should be charged. Must be in the future and within 1 week. If omitted, the policy's default deadline is used.",
            "example": "2025-06-11T07:30:00Z"
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false,
        "title": "Regular Session Target",
        "description": "Set a custom charge target and/or deadline for the session. At least one of `minimumChargeTarget` or `readyBy` must be provided."
      },
      "SessionTargetImmediateStartPayload": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "IMMEDIATE_START"
            ]
          },
          "minimumChargeTarget": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "description": "The target battery level to immediately charge up to. Must be less than or equal to the vehicle's charge limit.",
            "example": 60
          }
        },
        "required": [
          "type",
          "minimumChargeTarget"
        ],
        "additionalProperties": false,
        "title": "Immediate Start Session Target",
        "description": "Force the vehicle to start charging immediately to the specified battery level."
      },
      "SessionTargetPayload": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/SessionTargetRegularPayload"
          },
          {
            "$ref": "#/components/schemas/SessionTargetImmediateStartPayload"
          }
        ],
        "discriminator": {
          "propertyName": "type",
          "mapping": {
            "REGULAR": "#/components/schemas/SessionTargetRegularPayload",
            "IMMEDIATE_START": "#/components/schemas/SessionTargetImmediateStartPayload"
          }
        },
        "title": "Session Target Payload",
        "description": "The target to set on a session. Discriminated on `type`: `REGULAR` optimizes charging to reach the target by a deadline, `IMMEDIATE_START` forces immediate charging."
      },
      "TariffDirection": {
        "type": "string",
        "enum": [
          "import",
          "export"
        ],
        "description": "The direction of energy flow. 'import' is for electricity consumption costs, 'export' is for feed-in/selling electricity back to the grid.",
        "example": "import"
      },
      "TariffUnit": {
        "type": "string",
        "enum": [
          "kWh",
          "scalar"
        ],
        "description": "The unit of the tariff. 'kWh' indicates a rate in currency per kilowatt-hour (e.g., 0.28 EUR/kWh). 'scalar' indicates a dimensionless multiplier used in formulas (e.g., 1.15 for a 15% markup).",
        "example": "kWh"
      },
      "Tariff": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[\\w:-]+$",
            "description": "Unique identifier for the tariff.",
            "example": "energy-import"
          },
          "direction": {
            "$ref": "#/components/schemas/TariffDirection"
          },
          "currency": {
            "type": "string",
            "minLength": 3,
            "maxLength": 3,
            "pattern": "^[A-Z]{3}$",
            "description": "ISO 4217 currency code. Present for tariffs with per 'kWh', absent for scalar tariffs.",
            "example": "EUR"
          },
          "per": {
            "$ref": "#/components/schemas/TariffUnit"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the tariff was created.",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the tariff was last updated.",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "id",
          "direction",
          "per",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false,
        "description": "A tariff holds timestamped rate data for electricity pricing. Tariffs are combined via formulas at locations to compute resolved rates."
      },
      "PaginatedTariffList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tariff"
            }
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Paginated list of tariffs."
      },
      "TariffCreatePayload": {
        "type": "object",
        "properties": {
          "direction": {
            "$ref": "#/components/schemas/TariffDirection"
          },
          "currency": {
            "type": "string",
            "minLength": 3,
            "maxLength": 3,
            "pattern": "^[A-Z]{3}$",
            "description": "ISO 4217 currency code. Required when 'per' is 'kWh'. Omit when 'per' is 'scalar'.",
            "example": "EUR"
          },
          "per": {
            "$ref": "#/components/schemas/TariffUnit"
          }
        },
        "required": [
          "direction",
          "per"
        ],
        "additionalProperties": false,
        "description": "Payload for creating a tariff. The tariff is created empty — push rate data separately via the timeseries endpoint."
      },
      "TariffTimeseriesValue": {
        "type": "object",
        "properties": {
          "at": {
            "type": "string",
            "format": "date-time",
            "description": "Timezone-aware timestamp when this rate becomes effective. The rate applies from this point until the next value (or until the window end).",
            "example": "2024-06-15T00:00:00+02:00"
          },
          "rate": {
            "type": "number",
            "maximum": 50000,
            "minimum": -50000,
            "description": "The rate value. For kWh tariffs, this is in currency per kilowatt-hour. For scalar tariffs, this is a dimensionless value.",
            "example": 0.25
          }
        },
        "required": [
          "at",
          "rate"
        ],
        "additionalProperties": false,
        "description": "A timeseries data point marking a rate change. The rate applies from this point until the next point."
      },
      "TariffTimeseries": {
        "type": "object",
        "properties": {
          "tariffId": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[\\w:-]+$",
            "description": "Unique identifier for the tariff.",
            "example": "energy-import"
          },
          "direction": {
            "$ref": "#/components/schemas/TariffDirection"
          },
          "currency": {
            "type": "string",
            "minLength": 3,
            "maxLength": 3,
            "pattern": "^[A-Z]{3}$",
            "description": "ISO 4217 currency code. Present for kWh tariffs, absent for scalar tariffs.",
            "example": "EUR"
          },
          "per": {
            "$ref": "#/components/schemas/TariffUnit"
          },
          "from": {
            "type": "string",
            "format": "date",
            "example": "2024-06-15",
            "description": "Start of the queried time range (local date)."
          },
          "to": {
            "type": "string",
            "format": "date",
            "example": "2024-06-15",
            "description": "End of the queried time range (local date)."
          },
          "timezoneName": {
            "type": "string",
            "maxLength": 64,
            "description": "IANA timezone name used for the query.",
            "example": "Europe/Berlin"
          },
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TariffTimeseriesValue"
            },
            "description": "The timeseries values marking rate changes. Each value indicates the rate from that timestamp until the next value (or until 'to'). Values are ordered chronologically."
          }
        },
        "required": [
          "tariffId",
          "direction",
          "per",
          "from",
          "to",
          "timezoneName",
          "values"
        ],
        "additionalProperties": false,
        "description": "A tariff's rate data over a time range."
      },
      "TariffTimeseriesPushPayload": {
        "type": "object",
        "properties": {
          "to": {
            "type": "string",
            "format": "date-time",
            "description": "End of the replacement window (exclusive). All existing data in [firstValue.at, to) is replaced with the provided values. Data outside this window is untouched.",
            "example": "2024-06-15T00:00:00+02:00"
          },
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TariffTimeseriesValue"
            },
            "minItems": 1,
            "maxItems": 10000,
            "description": "The timeseries values for this window. At least one value is required. Values must be strictly ascending by `at` (no duplicates), and the final value's `at` must be before `to`. Each value defines the rate from its timestamp until the next value (or until 'to'). The first value's 'at' defines the start of the replacement window."
          }
        },
        "required": [
          "to",
          "values"
        ],
        "additionalProperties": false,
        "description": "Payload for pushing timeseries data. Replaces all existing data in the window [firstValue.at, to) with the provided values."
      },
      "TariffTimeseriesIdempotencyPayloadMismatchProblem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "https://developers.enode.com/api/problems/idempotency-key-payload-mismatch"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Idempotency key payload mismatch"
            ]
          },
          "detail": {
            "type": "string",
            "description": "Detailed problem description for idempotency-key payload mismatch.",
            "example": "This Idempotency-Key has already been used with a different push payload."
          }
        },
        "required": [
          "type",
          "title",
          "detail"
        ]
      },
      "TariffOverwriteLimitExceededProblem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "https://developers.enode.com/api/problems/tariff-overwrite-limit-exceeded"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Tariff overwrite limit exceeded"
            ]
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation of why the overwrite budget was exceeded.",
            "example": "This push would overwrite 1200 existing data point(s). The 24-hour overwrite budget of 5000 points has 4500 points used."
          },
          "retryAfter": {
            "type": "string",
            "format": "date-time",
            "description": "The earliest time at which some budget capacity may be freed. This is the start of the next UTC hour, when the oldest hourly bucket falls out of the sliding window.",
            "example": "2020-04-07T17:04:26Z"
          },
          "redundantPoints": {
            "type": "integer",
            "description": "The number of existing data points this push would overwrite.",
            "example": 1200
          },
          "used": {
            "type": "integer",
            "description": "The number of overwrite points already consumed in the current 24-hour window.",
            "example": 4500
          },
          "budget": {
            "type": "integer",
            "description": "The total overwrite point budget per 24-hour window.",
            "example": 5000
          },
          "remaining": {
            "type": "integer",
            "description": "The number of overwrite points remaining in the current 24-hour window.",
            "example": 500
          }
        },
        "required": [
          "type",
          "title",
          "retryAfter"
        ]
      },
      "LocationTariffFormula": {
        "type": "object",
        "properties": {
          "locationId": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The location this formula belongs to."
          },
          "direction": {
            "$ref": "#/components/schemas/TariffDirection"
          },
          "variables": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "maxLength": 64,
              "pattern": "^[\\w:-]+$",
              "description": "Unique identifier for the tariff.",
              "example": "energy-import"
            },
            "description": "Maps variable names to tariff IDs. Variables can then be referenced in the formula expression.",
            "example": {
              "spot": "epex-spot-eur",
              "grid": "grid-fee-standard"
            }
          },
          "formula": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "description": "A formula expression that combines tariffs to compute the final rate.\n\n**Syntax:**\n- Variable references: use names defined in the variables mapping (e.g., `spot`, `grid`)\n- Decimal literals: numbers like `0.03`, `1.15` (dimensionless scalars)\n- Unit constants: `EUR/kWh`, `USD/kWh`, etc. — annotate a number with rate dimension\n- Operators: `+` (add), `-` (subtract/negate), `*` (multiply), `/` (divide)\n- Grouping: parentheses for precedence `(a + b) * c`\n- Functions: `min(a, b)`, `max(a, b)`, `clamp(x, lo, hi)`, `abs(x)`, `round(x, n)`\n\n**Dimensional rules:**\n- The formula must evaluate to a rate (currency/kWh)\n- Number literals are scalars — multiply by a unit constant (e.g. `EUR/kWh`) to create a rate\n- Rate +/- Rate → Rate\n- Scalar * Rate → Rate\n- Rate * Scalar → Rate\n- Rate / Scalar → Rate\n- Rate / Rate → Scalar\n- Scalar * Scalar → Scalar\n- Scalar / Scalar → Scalar\n- Rate * Rate → Invalid\n- Scalar +/- Rate → Invalid\n- Scalar / Rate → Invalid\n\n**Examples:**\n- `spot` — use spot price directly\n- `1.15 * spot` — 15% markup on spot\n- `spot / 1000` — convert from MWh to kWh\n- `clamp(spot, 0 * EUR/kWh, 0.50 * EUR/kWh)` — spot price clamped between 0 and 0.50 EUR/kWh\n- `max(spot, 0 * EUR/kWh) * markup + grid + 0.02 * EUR/kWh` — floored spot with markup, grid fee, and margin\n- `round(spot + grid, 4)` — round to 4 decimal places",
            "example": "max(spot, 0 * EUR/kWh) * 1.15 + grid + 0.03 * EUR/kWh"
          }
        },
        "required": [
          "locationId",
          "direction",
          "variables",
          "formula"
        ],
        "additionalProperties": false,
        "description": "A tariff formula for a location and direction. Defines how tariffs are combined to compute the final rate."
      },
      "LocationTariffFormulaPayload": {
        "type": "object",
        "properties": {
          "direction": {
            "$ref": "#/components/schemas/TariffDirection"
          },
          "variables": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "maxLength": 64,
              "pattern": "^[\\w:-]+$",
              "description": "Unique identifier for the tariff.",
              "example": "energy-import"
            },
            "description": "Maps variable names to tariff IDs. Variables can then be referenced in the formula expression.",
            "example": {
              "spot": "epex-spot-eur",
              "grid": "grid-fee-standard"
            }
          },
          "formula": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "description": "A formula expression that combines tariffs to compute the final rate.\n\n**Syntax:**\n- Variable references: use names defined in the variables mapping (e.g., `spot`, `grid`)\n- Decimal literals: numbers like `0.03`, `1.15` (dimensionless scalars)\n- Unit constants: `EUR/kWh`, `USD/kWh`, etc. — annotate a number with rate dimension\n- Operators: `+` (add), `-` (subtract/negate), `*` (multiply), `/` (divide)\n- Grouping: parentheses for precedence `(a + b) * c`\n- Functions: `min(a, b)`, `max(a, b)`, `clamp(x, lo, hi)`, `abs(x)`, `round(x, n)`\n\n**Dimensional rules:**\n- The formula must evaluate to a rate (currency/kWh)\n- Number literals are scalars — multiply by a unit constant (e.g. `EUR/kWh`) to create a rate\n- Rate +/- Rate → Rate\n- Scalar * Rate → Rate\n- Rate * Scalar → Rate\n- Rate / Scalar → Rate\n- Rate / Rate → Scalar\n- Scalar * Scalar → Scalar\n- Scalar / Scalar → Scalar\n- Rate * Rate → Invalid\n- Scalar +/- Rate → Invalid\n- Scalar / Rate → Invalid\n\n**Examples:**\n- `spot` — use spot price directly\n- `1.15 * spot` — 15% markup on spot\n- `spot / 1000` — convert from MWh to kWh\n- `clamp(spot, 0 * EUR/kWh, 0.50 * EUR/kWh)` — spot price clamped between 0 and 0.50 EUR/kWh\n- `max(spot, 0 * EUR/kWh) * markup + grid + 0.02 * EUR/kWh` — floored spot with markup, grid fee, and margin\n- `round(spot + grid, 4)` — round to 4 decimal places",
            "example": "max(spot, 0 * EUR/kWh) * 1.15 + grid + 0.03 * EUR/kWh"
          }
        },
        "required": [
          "direction",
          "variables",
          "formula"
        ],
        "additionalProperties": false,
        "description": "Payload for setting a tariff formula at a location. Replaces any existing formula for the specified direction."
      },
      "ResolvedTariffInterval": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "resolved"
            ]
          },
          "startAt": {
            "type": "string",
            "format": "date-time",
            "description": "Start of this interval (inclusive) with timezone offset.",
            "example": "2024-06-15T00:00:00+02:00"
          },
          "endAt": {
            "type": "string",
            "format": "date-time",
            "description": "End of this interval (exclusive) with timezone offset.",
            "example": "2024-06-15T00:00:00+02:00"
          },
          "formula": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "description": "The formula used to compute the rate for this interval.",
            "example": "max(spot, 0 * EUR/kWh) * 1.15 + grid + 0.03 * EUR/kWh"
          },
          "rate": {
            "type": "number",
            "maximum": 50000,
            "minimum": -50000,
            "description": "The computed rate for this interval in currency per kWh.",
            "example": 0.25
          }
        },
        "required": [
          "type",
          "startAt",
          "endAt",
          "formula",
          "rate"
        ],
        "additionalProperties": false,
        "description": "A resolved interval with a computed rate."
      },
      "UnresolvedTariffInterval": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "unresolved"
            ]
          },
          "startAt": {
            "type": "string",
            "format": "date-time",
            "description": "Start of this unresolved interval (inclusive) with timezone offset.",
            "example": "2024-06-15T00:00:00+02:00"
          },
          "endAt": {
            "type": "string",
            "format": "date-time",
            "description": "End of this unresolved interval (exclusive) with timezone offset.",
            "example": "2024-06-15T00:00:00+02:00"
          }
        },
        "required": [
          "type",
          "startAt",
          "endAt"
        ],
        "additionalProperties": false,
        "description": "An unresolved interval where the formula cannot be evaluated due to missing tariff data."
      },
      "ResolvedTariff": {
        "type": "object",
        "properties": {
          "locationId": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The location these resolved tariffs are for."
          },
          "direction": {
            "$ref": "#/components/schemas/TariffDirection"
          },
          "currency": {
            "type": "string",
            "minLength": 3,
            "maxLength": 3,
            "pattern": "^[A-Z]{3}$",
            "description": "ISO 4217 currency code of the resolved rate.",
            "example": "EUR"
          },
          "per": {
            "type": "string",
            "enum": [
              "kWh"
            ],
            "description": "The energy unit. Resolved tariffs are always rates in currency per kWh."
          },
          "from": {
            "type": "string",
            "format": "date",
            "example": "2024-06-15",
            "description": "Start of the resolved time range (local date)."
          },
          "to": {
            "type": "string",
            "format": "date",
            "example": "2024-06-15",
            "description": "End of the resolved time range (local date)."
          },
          "timezoneName": {
            "type": "string",
            "maxLength": 64,
            "description": "IANA timezone name used to resolve local date boundaries and annotate interval timestamps.",
            "example": "Europe/Berlin"
          },
          "intervals": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/ResolvedTariffInterval"
                },
                {
                  "$ref": "#/components/schemas/UnresolvedTariffInterval"
                }
              ],
              "discriminator": {
                "propertyName": "type",
                "mapping": {
                  "resolved": "#/components/schemas/ResolvedTariffInterval",
                  "unresolved": "#/components/schemas/UnresolvedTariffInterval"
                }
              }
            },
            "description": "The time intervals with their rates. Intervals are contiguous and non-overlapping. Resolved intervals contain computed rates; unresolved intervals indicate missing data."
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "locationId",
          "direction",
          "currency",
          "per",
          "from",
          "to",
          "timezoneName",
          "intervals",
          "pagination"
        ],
        "additionalProperties": false,
        "description": "Resolved tariff pricing for a location over a time range. The location's formula is evaluated at each point in time to produce a series of intervals."
      },
      "PublicSolarConfigurationPayload": {
        "type": "object",
        "properties": {
          "capacity": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "Peak capacity in kilowatts (kWp) of the solar system",
            "example": 5.5
          },
          "azimuth": {
            "type": [
              "number",
              "null"
            ],
            "minimum": 0,
            "exclusiveMaximum": 360,
            "description": "Compass direction the solar panels face, measured in degrees relative to true north. Valid values are 0–359, where 0 = north, 90 = east, 180 = south, and 270 = west.",
            "example": 180
          },
          "tilt": {
            "type": [
              "number",
              "null"
            ],
            "minimum": 0,
            "maximum": 90,
            "description": "Vertical angle of the solar panels in degrees from the horizontal plane. Values range from 0–90, where 0 = horizontal and 90 = vertical.",
            "example": 30
          },
          "userId": {
            "type": "string",
            "description": "The userId associated with this solar configuration"
          },
          "locationId": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The locationId associated with this solar configuration"
          }
        },
        "required": [
          "capacity",
          "azimuth",
          "tilt",
          "userId",
          "locationId"
        ],
        "additionalProperties": false,
        "description": "Payload for creating a solar configuration"
      },
      "SolarConfigurationResponse": {
        "type": "object",
        "properties": {
          "capacity": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "Peak capacity in kilowatts (kWp) of the solar system",
            "example": 5.5
          },
          "azimuth": {
            "type": [
              "number",
              "null"
            ],
            "minimum": 0,
            "exclusiveMaximum": 360,
            "description": "Compass direction the solar panels face, measured in degrees relative to true north. Valid values are 0–359, where 0 = north, 90 = east, 180 = south, and 270 = west.",
            "example": 180
          },
          "tilt": {
            "type": [
              "number",
              "null"
            ],
            "minimum": 0,
            "maximum": 90,
            "description": "Vertical angle of the solar panels in degrees from the horizontal plane. Values range from 0–90, where 0 = horizontal and 90 = vertical.",
            "example": 30
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The ID of this Solar Configuration"
          },
          "userId": {
            "type": "string",
            "description": "The userId associated with this solar configuration"
          },
          "locationId": {
            "type": "string",
            "format": "uuid",
            "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
            "x-format": {
              "guid": true
            },
            "description": "The locationId associated with this solar configuration"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this Solar Configuration was created",
            "example": "2020-04-07T17:04:26Z"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Time when this Solar Configuration was last updated",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "capacity",
          "azimuth",
          "tilt",
          "id",
          "userId",
          "locationId",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "PaginatedSolarConfigurationList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SolarConfigurationResponse"
            },
            "description": "List of solar configurations"
          },
          "pagination": {
            "$ref": "#/components/schemas/PaginationCursors"
          }
        },
        "required": [
          "data",
          "pagination"
        ]
      },
      "PublicSolarConfigurationUpdatePayload": {
        "type": "object",
        "properties": {
          "capacity": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "Peak capacity in kilowatts (kWp) of the solar system",
            "example": 5.5
          },
          "azimuth": {
            "type": [
              "number",
              "null"
            ],
            "minimum": 0,
            "exclusiveMaximum": 360,
            "description": "Compass direction the solar panels face, measured in degrees relative to true north. Valid values are 0–359, where 0 = north, 90 = east, 180 = south, and 270 = west.",
            "example": 180
          },
          "tilt": {
            "type": [
              "number",
              "null"
            ],
            "minimum": 0,
            "maximum": 90,
            "description": "Vertical angle of the solar panels in degrees from the horizontal plane. Values range from 0–90, where 0 = horizontal and 90 = vertical.",
            "example": 30
          }
        },
        "additionalProperties": false,
        "description": "Payload for updating a solar configuration"
      },
      "UserVehicleDiscovered": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:vehicle:discovered"
            ]
          },
          "vehicle": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Vehicle"
              },
              {
                "type": "object",
                "properties": {
                  "location": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/VehicleLocation"
                      },
                      {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "uuid",
                            "example": "07f8368d-be7e-4dbd-8cf0-94d00dd67ad3",
                            "x-format": {
                              "guid": true
                            },
                            "description": "ID of the location the vehicle is currently positioned at (if any)."
                          }
                        },
                        "required": [
                          "id"
                        ],
                        "additionalProperties": false
                      }
                    ],
                    "description": "Vehicle's GPS coordinates with timestamp"
                  }
                },
                "required": [
                  "location"
                ],
                "additionalProperties": false
              }
            ]
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "vehicle"
        ],
        "additionalProperties": false,
        "title": "user:vehicle:discovered",
        "description": "Occurs whenever a new vehicle is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data."
      },
      "UserVehicleUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:vehicle:updated"
            ]
          },
          "vehicle": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Vehicle"
              },
              {
                "type": "object",
                "properties": {
                  "location": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/VehicleLocation"
                      },
                      {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "uuid",
                            "example": "07f8368d-be7e-4dbd-8cf0-94d00dd67ad3",
                            "x-format": {
                              "guid": true
                            },
                            "description": "ID of the location the vehicle is currently positioned at (if any)."
                          }
                        },
                        "required": [
                          "id"
                        ],
                        "additionalProperties": false
                      }
                    ],
                    "description": "Vehicle's GPS coordinates with timestamp"
                  }
                },
                "required": [
                  "location"
                ],
                "additionalProperties": false
              }
            ]
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "vehicle",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "user:vehicle:updated",
        "description": "Occurs whenever a vehicle's properties are updated."
      },
      "UserVehicleDeleted": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:vehicle:deleted"
            ]
          },
          "vehicle": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Vehicle"
              },
              {
                "type": "object",
                "properties": {
                  "location": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/VehicleLocation"
                      },
                      {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "uuid",
                            "example": "07f8368d-be7e-4dbd-8cf0-94d00dd67ad3",
                            "x-format": {
                              "guid": true
                            },
                            "description": "ID of the location the vehicle is currently positioned at (if any)."
                          }
                        },
                        "required": [
                          "id"
                        ],
                        "additionalProperties": false
                      }
                    ],
                    "description": "Vehicle's GPS coordinates with timestamp"
                  }
                },
                "required": [
                  "location"
                ],
                "additionalProperties": false
              }
            ]
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "vehicle"
        ],
        "additionalProperties": false,
        "title": "user:vehicle:deleted",
        "description": "Occurs whenever a vehicle is deleted. The payload reflects the last known state of the asset before deletion."
      },
      "UserChargerDiscovered": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:charger:discovered"
            ]
          },
          "charger": {
            "$ref": "#/components/schemas/Charger"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "charger"
        ],
        "additionalProperties": false,
        "title": "user:charger:discovered",
        "description": "Occurs whenever a new charger is discovered for a user."
      },
      "UserChargerUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:charger:updated"
            ]
          },
          "charger": {
            "$ref": "#/components/schemas/Charger"
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "charger",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "user:charger:updated",
        "description": "Occurs whenever a charger is updated."
      },
      "UserChargerDeleted": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:charger:deleted"
            ]
          },
          "charger": {
            "$ref": "#/components/schemas/Charger"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "charger"
        ],
        "additionalProperties": false,
        "title": "user:charger:deleted",
        "description": "Occurs whenever a charger is deleted. The payload reflects the last known state of the asset before deletion."
      },
      "UserHvacDiscovered": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:hvac:discovered"
            ]
          },
          "hvac": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "HVAC unit ID"
              },
              "userId": {
                "type": "string",
                "description": "The ID of the user that linked this hvac."
              },
              "vendor": {
                "$ref": "#/components/schemas/HvacVendor"
              },
              "lastSeen": {
                "type": "string",
                "format": "date-time",
                "description": "The last time Enode successfully communicated with the vendor or when the HVAC unit was initially linked.",
                "example": "2020-04-07T17:04:26Z"
              },
              "isReachable": {
                "type": "boolean",
                "description": "Indicates whether Enode can currently access live data from the HVAC. If the HVAC is not reachable, data updates will be delayed."
              },
              "consumptionRate": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "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."
              },
              "information": {
                "type": "object",
                "properties": {
                  "brand": {
                    "$ref": "#/components/schemas/Brand"
                  },
                  "model": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Device model name"
                  },
                  "displayName": {
                    "type": "string",
                    "description": "Name of the device, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names."
                  },
                  "groupName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Name of the group the device belongs to, as set by the user on the device/vendor. Groups are typically presented as \"rooms\" or \"zones\"."
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "HEATING",
                      "COOLING",
                      "HEAT_PUMP",
                      "AGGREGATOR"
                    ],
                    "description": "Classification of the connected HVAC device.\n\n * `HEATING`: A direct heating device, such as an electric panel heater\n\n * `COOLING`: A direct cooling device, such as an air conditioner \n\n * `HEAT_PUMP`: An air-to-air heat pump capable of both heating and cooling\n\n * `AGGREGATOR`: A device that is capable of controlling various HVAC systems behind it, such as a smart thermostat"
                  }
                },
                "required": [
                  "brand",
                  "model",
                  "displayName",
                  "groupName",
                  "category"
                ],
                "additionalProperties": false,
                "description": "Descriptive information about the HVAC unit"
              },
              "temperatureState": {
                "type": "object",
                "properties": {
                  "currentTemperature": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Current air temperature reported by device in degrees Celsius."
                  },
                  "isActive": {
                    "type": "boolean",
                    "description": "Whether the HVAC unit is actively heating or cooling."
                  },
                  "lastUpdated": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "Time of last temperature state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer",
                    "example": "2020-04-07T17:04:26Z"
                  }
                },
                "required": [
                  "currentTemperature",
                  "isActive",
                  "lastUpdated"
                ],
                "additionalProperties": false,
                "description": "Latest information about temperature. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
              },
              "thermostatState": {
                "type": "object",
                "properties": {
                  "mode": {
                    "$ref": "#/components/schemas/HvacMode"
                  },
                  "heatSetpoint": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "If mode allows, heat when `currentTemperature` falls below this point."
                  },
                  "coolSetpoint": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "If mode allows, cool when `currentTemperature` rises above this point."
                  },
                  "holdType": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/HvacHoldType"
                      },
                      {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "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."
                      }
                    ]
                  },
                  "lastUpdated": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "Time of last thermostat state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer.",
                    "example": "2020-04-07T17:04:26Z"
                  }
                },
                "required": [
                  "mode",
                  "heatSetpoint",
                  "coolSetpoint",
                  "holdType",
                  "lastUpdated"
                ],
                "additionalProperties": false,
                "description": "Latest information about the thermostat state. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
              },
              "scopes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Scopes that the user has granted for this HVAC unit.",
                "example": [
                  "hvac:control:mode",
                  "hvac:read:data"
                ]
              },
              "capabilities": {
                "type": "object",
                "properties": {
                  "capableModes": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "$ref": "#/components/schemas/HvacMode"
                    },
                    "description": "A list of valid modes for this HVAC unit."
                  },
                  "coolSetpointRange": {
                    "$ref": "#/components/schemas/NullableTemperatureRange",
                    "description": "The range of allowable values for `coolSetpoint`."
                  },
                  "heatSetpointRange": {
                    "$ref": "#/components/schemas/NullableTemperatureRange",
                    "description": "The range of allowable values for `heatSetpoint`."
                  },
                  "setpointDifferenceRange": {
                    "$ref": "#/components/schemas/NullableTemperatureDifferenceRange",
                    "description": "A constraint specifying the minimum and maximum allowable difference between `heatSetpoint` and `coolSetpoint`. Only applicable in `AUTO` mode."
                  },
                  "setFollowSchedule": {
                    "$ref": "#/components/schemas/Capability",
                    "description": "Supports following a schedule set on the device."
                  },
                  "setPermanentHold": {
                    "$ref": "#/components/schemas/Capability",
                    "description": "Supports setting a permanent hold."
                  }
                },
                "required": [
                  "capableModes",
                  "coolSetpointRange",
                  "heatSetpointRange",
                  "setpointDifferenceRange",
                  "setFollowSchedule",
                  "setPermanentHold"
                ],
                "additionalProperties": false,
                "description": "An object describing valid states for this HVAC unit."
              },
              "location": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "uuid",
                    "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                    "x-format": {
                      "guid": true
                    },
                    "description": "ID of the charging location the HVAC unit is housed at (if any)"
                  }
                },
                "required": [
                  "id"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "userId",
              "vendor",
              "lastSeen",
              "isReachable",
              "consumptionRate",
              "information",
              "temperatureState",
              "thermostatState",
              "scopes",
              "capabilities",
              "location"
            ],
            "additionalProperties": false,
            "example": {
              "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
              "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
              "vendor": "ADAX",
              "lastSeen": "2020-04-07T17:04:26.000Z",
              "isReachable": true,
              "consumptionRate": 1.8,
              "information": {
                "brand": "ADAX",
                "model": "Neo Wi-Fi Skirting",
                "displayName": "Bedroom Panel Heater",
                "groupName": "Bedroom",
                "category": "HEATING"
              },
              "location": {
                "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
              },
              "capabilities": {
                "capableModes": [
                  "HEAT",
                  "COOL",
                  "OFF"
                ],
                "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"
              ]
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "hvac"
        ],
        "additionalProperties": false,
        "title": "user:hvac:discovered",
        "description": "Occurs whenever a new HVAC is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data."
      },
      "UserHvacUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:hvac:updated"
            ]
          },
          "hvac": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "HVAC unit ID"
              },
              "userId": {
                "type": "string",
                "description": "The ID of the user that linked this hvac."
              },
              "vendor": {
                "$ref": "#/components/schemas/HvacVendor"
              },
              "lastSeen": {
                "type": "string",
                "format": "date-time",
                "description": "The last time Enode successfully communicated with the vendor or when the HVAC unit was initially linked.",
                "example": "2020-04-07T17:04:26Z"
              },
              "isReachable": {
                "type": "boolean",
                "description": "Indicates whether Enode can currently access live data from the HVAC. If the HVAC is not reachable, data updates will be delayed."
              },
              "consumptionRate": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "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."
              },
              "information": {
                "type": "object",
                "properties": {
                  "brand": {
                    "$ref": "#/components/schemas/Brand"
                  },
                  "model": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Device model name"
                  },
                  "displayName": {
                    "type": "string",
                    "description": "Name of the device, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names."
                  },
                  "groupName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Name of the group the device belongs to, as set by the user on the device/vendor. Groups are typically presented as \"rooms\" or \"zones\"."
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "HEATING",
                      "COOLING",
                      "HEAT_PUMP",
                      "AGGREGATOR"
                    ],
                    "description": "Classification of the connected HVAC device.\n\n * `HEATING`: A direct heating device, such as an electric panel heater\n\n * `COOLING`: A direct cooling device, such as an air conditioner \n\n * `HEAT_PUMP`: An air-to-air heat pump capable of both heating and cooling\n\n * `AGGREGATOR`: A device that is capable of controlling various HVAC systems behind it, such as a smart thermostat"
                  }
                },
                "required": [
                  "brand",
                  "model",
                  "displayName",
                  "groupName",
                  "category"
                ],
                "additionalProperties": false,
                "description": "Descriptive information about the HVAC unit"
              },
              "temperatureState": {
                "type": "object",
                "properties": {
                  "currentTemperature": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Current air temperature reported by device in degrees Celsius."
                  },
                  "isActive": {
                    "type": "boolean",
                    "description": "Whether the HVAC unit is actively heating or cooling."
                  },
                  "lastUpdated": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "Time of last temperature state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer",
                    "example": "2020-04-07T17:04:26Z"
                  }
                },
                "required": [
                  "currentTemperature",
                  "isActive",
                  "lastUpdated"
                ],
                "additionalProperties": false,
                "description": "Latest information about temperature. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
              },
              "thermostatState": {
                "type": "object",
                "properties": {
                  "mode": {
                    "$ref": "#/components/schemas/HvacMode"
                  },
                  "heatSetpoint": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "If mode allows, heat when `currentTemperature` falls below this point."
                  },
                  "coolSetpoint": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "If mode allows, cool when `currentTemperature` rises above this point."
                  },
                  "holdType": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/HvacHoldType"
                      },
                      {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "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."
                      }
                    ]
                  },
                  "lastUpdated": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "Time of last thermostat state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer.",
                    "example": "2020-04-07T17:04:26Z"
                  }
                },
                "required": [
                  "mode",
                  "heatSetpoint",
                  "coolSetpoint",
                  "holdType",
                  "lastUpdated"
                ],
                "additionalProperties": false,
                "description": "Latest information about the thermostat state. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
              },
              "scopes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Scopes that the user has granted for this HVAC unit.",
                "example": [
                  "hvac:control:mode",
                  "hvac:read:data"
                ]
              },
              "capabilities": {
                "type": "object",
                "properties": {
                  "capableModes": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "$ref": "#/components/schemas/HvacMode"
                    },
                    "description": "A list of valid modes for this HVAC unit."
                  },
                  "coolSetpointRange": {
                    "$ref": "#/components/schemas/NullableTemperatureRange",
                    "description": "The range of allowable values for `coolSetpoint`."
                  },
                  "heatSetpointRange": {
                    "$ref": "#/components/schemas/NullableTemperatureRange",
                    "description": "The range of allowable values for `heatSetpoint`."
                  },
                  "setpointDifferenceRange": {
                    "$ref": "#/components/schemas/NullableTemperatureDifferenceRange",
                    "description": "A constraint specifying the minimum and maximum allowable difference between `heatSetpoint` and `coolSetpoint`. Only applicable in `AUTO` mode."
                  },
                  "setFollowSchedule": {
                    "$ref": "#/components/schemas/Capability",
                    "description": "Supports following a schedule set on the device."
                  },
                  "setPermanentHold": {
                    "$ref": "#/components/schemas/Capability",
                    "description": "Supports setting a permanent hold."
                  }
                },
                "required": [
                  "capableModes",
                  "coolSetpointRange",
                  "heatSetpointRange",
                  "setpointDifferenceRange",
                  "setFollowSchedule",
                  "setPermanentHold"
                ],
                "additionalProperties": false,
                "description": "An object describing valid states for this HVAC unit."
              },
              "location": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "uuid",
                    "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                    "x-format": {
                      "guid": true
                    },
                    "description": "ID of the charging location the HVAC unit is housed at (if any)"
                  }
                },
                "required": [
                  "id"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "userId",
              "vendor",
              "lastSeen",
              "isReachable",
              "consumptionRate",
              "information",
              "temperatureState",
              "thermostatState",
              "scopes",
              "capabilities",
              "location"
            ],
            "additionalProperties": false,
            "example": {
              "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
              "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
              "vendor": "ADAX",
              "lastSeen": "2020-04-07T17:04:26.000Z",
              "isReachable": true,
              "consumptionRate": 1.8,
              "information": {
                "brand": "ADAX",
                "model": "Neo Wi-Fi Skirting",
                "displayName": "Bedroom Panel Heater",
                "groupName": "Bedroom",
                "category": "HEATING"
              },
              "location": {
                "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
              },
              "capabilities": {
                "capableModes": [
                  "HEAT",
                  "COOL",
                  "OFF"
                ],
                "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"
              ]
            }
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "hvac",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "user:hvac:updated",
        "description": "Occurs whenever an HVAC's properties are updated."
      },
      "UserHvacDeleted": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:hvac:deleted"
            ]
          },
          "hvac": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "HVAC unit ID"
              },
              "userId": {
                "type": "string",
                "description": "The ID of the user that linked this hvac."
              },
              "vendor": {
                "$ref": "#/components/schemas/HvacVendor"
              },
              "lastSeen": {
                "type": "string",
                "format": "date-time",
                "description": "The last time Enode successfully communicated with the vendor or when the HVAC unit was initially linked.",
                "example": "2020-04-07T17:04:26Z"
              },
              "isReachable": {
                "type": "boolean",
                "description": "Indicates whether Enode can currently access live data from the HVAC. If the HVAC is not reachable, data updates will be delayed."
              },
              "consumptionRate": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "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."
              },
              "information": {
                "type": "object",
                "properties": {
                  "brand": {
                    "$ref": "#/components/schemas/Brand"
                  },
                  "model": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Device model name"
                  },
                  "displayName": {
                    "type": "string",
                    "description": "Name of the device, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names."
                  },
                  "groupName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Name of the group the device belongs to, as set by the user on the device/vendor. Groups are typically presented as \"rooms\" or \"zones\"."
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "HEATING",
                      "COOLING",
                      "HEAT_PUMP",
                      "AGGREGATOR"
                    ],
                    "description": "Classification of the connected HVAC device.\n\n * `HEATING`: A direct heating device, such as an electric panel heater\n\n * `COOLING`: A direct cooling device, such as an air conditioner \n\n * `HEAT_PUMP`: An air-to-air heat pump capable of both heating and cooling\n\n * `AGGREGATOR`: A device that is capable of controlling various HVAC systems behind it, such as a smart thermostat"
                  }
                },
                "required": [
                  "brand",
                  "model",
                  "displayName",
                  "groupName",
                  "category"
                ],
                "additionalProperties": false,
                "description": "Descriptive information about the HVAC unit"
              },
              "temperatureState": {
                "type": "object",
                "properties": {
                  "currentTemperature": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Current air temperature reported by device in degrees Celsius."
                  },
                  "isActive": {
                    "type": "boolean",
                    "description": "Whether the HVAC unit is actively heating or cooling."
                  },
                  "lastUpdated": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "Time of last temperature state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer",
                    "example": "2020-04-07T17:04:26Z"
                  }
                },
                "required": [
                  "currentTemperature",
                  "isActive",
                  "lastUpdated"
                ],
                "additionalProperties": false,
                "description": "Latest information about temperature. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
              },
              "thermostatState": {
                "type": "object",
                "properties": {
                  "mode": {
                    "$ref": "#/components/schemas/HvacMode"
                  },
                  "heatSetpoint": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "If mode allows, heat when `currentTemperature` falls below this point."
                  },
                  "coolSetpoint": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "If mode allows, cool when `currentTemperature` rises above this point."
                  },
                  "holdType": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/HvacHoldType"
                      },
                      {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "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."
                      }
                    ]
                  },
                  "lastUpdated": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time",
                    "description": "Time of last thermostat state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer.",
                    "example": "2020-04-07T17:04:26Z"
                  }
                },
                "required": [
                  "mode",
                  "heatSetpoint",
                  "coolSetpoint",
                  "holdType",
                  "lastUpdated"
                ],
                "additionalProperties": false,
                "description": "Latest information about the thermostat state. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
              },
              "scopes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Scopes that the user has granted for this HVAC unit.",
                "example": [
                  "hvac:control:mode",
                  "hvac:read:data"
                ]
              },
              "capabilities": {
                "type": "object",
                "properties": {
                  "capableModes": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "$ref": "#/components/schemas/HvacMode"
                    },
                    "description": "A list of valid modes for this HVAC unit."
                  },
                  "coolSetpointRange": {
                    "$ref": "#/components/schemas/NullableTemperatureRange",
                    "description": "The range of allowable values for `coolSetpoint`."
                  },
                  "heatSetpointRange": {
                    "$ref": "#/components/schemas/NullableTemperatureRange",
                    "description": "The range of allowable values for `heatSetpoint`."
                  },
                  "setpointDifferenceRange": {
                    "$ref": "#/components/schemas/NullableTemperatureDifferenceRange",
                    "description": "A constraint specifying the minimum and maximum allowable difference between `heatSetpoint` and `coolSetpoint`. Only applicable in `AUTO` mode."
                  },
                  "setFollowSchedule": {
                    "$ref": "#/components/schemas/Capability",
                    "description": "Supports following a schedule set on the device."
                  },
                  "setPermanentHold": {
                    "$ref": "#/components/schemas/Capability",
                    "description": "Supports setting a permanent hold."
                  }
                },
                "required": [
                  "capableModes",
                  "coolSetpointRange",
                  "heatSetpointRange",
                  "setpointDifferenceRange",
                  "setFollowSchedule",
                  "setPermanentHold"
                ],
                "additionalProperties": false,
                "description": "An object describing valid states for this HVAC unit."
              },
              "location": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "uuid",
                    "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                    "x-format": {
                      "guid": true
                    },
                    "description": "ID of the charging location the HVAC unit is housed at (if any)"
                  }
                },
                "required": [
                  "id"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "userId",
              "vendor",
              "lastSeen",
              "isReachable",
              "consumptionRate",
              "information",
              "temperatureState",
              "thermostatState",
              "scopes",
              "capabilities",
              "location"
            ],
            "additionalProperties": false,
            "example": {
              "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
              "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
              "vendor": "ADAX",
              "lastSeen": "2020-04-07T17:04:26.000Z",
              "isReachable": true,
              "consumptionRate": 1.8,
              "information": {
                "brand": "ADAX",
                "model": "Neo Wi-Fi Skirting",
                "displayName": "Bedroom Panel Heater",
                "groupName": "Bedroom",
                "category": "HEATING"
              },
              "location": {
                "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
              },
              "capabilities": {
                "capableModes": [
                  "HEAT",
                  "COOL",
                  "OFF"
                ],
                "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"
              ]
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "hvac"
        ],
        "additionalProperties": false,
        "title": "user:hvac:deleted",
        "description": "Occurs whenever an HVAC is deleted. The payload reflects the last known state of the asset before deletion."
      },
      "UserInverterDiscovered": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:inverter:discovered"
            ]
          },
          "inverter": {
            "$ref": "#/components/schemas/Inverter"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "inverter"
        ],
        "additionalProperties": false,
        "title": "user:inverter:discovered",
        "description": "Occurs whenever a new inverter is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data."
      },
      "UserInverterUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:inverter:updated"
            ]
          },
          "inverter": {
            "$ref": "#/components/schemas/Inverter"
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "inverter",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "user:inverter:updated",
        "description": "Occurs whenever an inverter's properties are updated."
      },
      "UserInverterDeleted": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:inverter:deleted"
            ]
          },
          "inverter": {
            "$ref": "#/components/schemas/Inverter"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "inverter"
        ],
        "additionalProperties": false,
        "title": "user:inverter:deleted",
        "description": "Occurs whenever an inverter is deleted. The payload reflects the last known state of the asset before deletion."
      },
      "InverterStatisticsResolutionEntry": {
        "type": "object",
        "properties": {
          "unit": {
            "type": "string",
            "enum": [
              "kWh"
            ],
            "description": "The unit of measurement for power production data. Always kWh.",
            "example": "kWh"
          },
          "data": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Time bucket start as a RFC3339 timestamp. Offset may be Z or ±hh:mm. In the unlikely event that an inverter changes timezone, the offset from when the data was retrieved is used, not the inverter's current timezone.",
                  "example": "2023-01-19T23:00:00+01:00"
                },
                "value": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The energy produced (kWh) in the specified interval. Null if no data is available.",
                  "example": 1.1
                }
              },
              "required": [
                "date",
                "value"
              ]
            },
            "description": "An array of data points representing the power production statistics.",
            "example": [
              {
                "date": "2021-01-19T00:15:00+01:00",
                "value": 1.1
              }
            ]
          }
        },
        "required": [
          "unit",
          "data"
        ]
      },
      "InverterStatistics": {
        "type": "object",
        "properties": {
          "timezone": {
            "type": "string",
            "description": "The timezone of the inverter.",
            "example": "Europe/Oslo"
          },
          "resolutions": {
            "type": "object",
            "properties": {
              "QUARTER_HOUR": {
                "$ref": "#/components/schemas/InverterStatisticsResolutionEntry"
              },
              "DAY": {
                "$ref": "#/components/schemas/InverterStatisticsResolutionEntry"
              }
            }
          }
        },
        "required": [
          "timezone",
          "resolutions"
        ]
      },
      "UserInverterStatisticsUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:inverter:statistics-updated"
            ]
          },
          "statistics": {
            "allOf": [
              {
                "$ref": "#/components/schemas/InverterStatistics"
              },
              {
                "type": "object",
                "properties": {
                  "inverterId": {
                    "type": "string"
                  },
                  "day": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "month": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "year": {
                    "type": "number"
                  }
                },
                "required": [
                  "inverterId",
                  "day",
                  "month",
                  "year"
                ]
              }
            ]
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "statistics"
        ],
        "additionalProperties": false,
        "title": "user:inverter:statistics-updated",
        "description": "Occurs whenever inverter statistics are updated."
      },
      "UserBatteryDiscovered": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:battery:discovered"
            ]
          },
          "battery": {
            "$ref": "#/components/schemas/Battery"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "battery"
        ],
        "additionalProperties": false,
        "title": "user:battery:discovered",
        "description": "Occurs whenever a new battery is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data."
      },
      "UserBatteryUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:battery:updated"
            ]
          },
          "battery": {
            "$ref": "#/components/schemas/Battery"
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "battery",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "user:battery:updated",
        "description": "Occurs whenever a battery's properties are updated."
      },
      "UserBatteryDeleted": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:battery:deleted"
            ]
          },
          "battery": {
            "$ref": "#/components/schemas/Battery"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "battery"
        ],
        "additionalProperties": false,
        "title": "user:battery:deleted",
        "description": "Occurs whenever a battery is deleted. The payload reflects the last known state of the asset before deletion."
      },
      "UserMeterDiscovered": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:meter:discovered"
            ]
          },
          "meter": {
            "$ref": "#/components/schemas/Meter"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "meter"
        ],
        "additionalProperties": false,
        "title": "user:meter:discovered",
        "description": "Occurs whenever a new meter is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data."
      },
      "UserMeterUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:meter:updated"
            ]
          },
          "meter": {
            "$ref": "#/components/schemas/Meter"
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "meter",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "user:meter:updated",
        "description": "Occurs whenever a meter's properties are updated."
      },
      "UserMeterDeleted": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:meter:deleted"
            ]
          },
          "meter": {
            "$ref": "#/components/schemas/Meter"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "meter"
        ],
        "additionalProperties": false,
        "title": "user:meter:deleted",
        "description": "Occurs whenever a meter is deleted. The payload reflects the last known state of the asset before deletion."
      },
      "UserCredentialsInvalidated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:credentials:invalidated"
            ]
          },
          "vendor": {
            "$ref": "#/components/schemas/Vendor"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "vendor"
        ],
        "additionalProperties": false,
        "title": "user:credentials:invalidated",
        "description": "Occurs whenever the connection needs to be relinked."
      },
      "UserActionUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:vendor-action:updated"
            ]
          },
          "vendorAction": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HvacActionPermanentHold"
              },
              {
                "$ref": "#/components/schemas/HvacActionFollowSchedule"
              },
              {
                "$ref": "#/components/schemas/MaxCurrentAction"
              },
              {
                "$ref": "#/components/schemas/ChargeAction"
              },
              {
                "$ref": "#/components/schemas/OperationModeAction"
              },
              {
                "$ref": "#/components/schemas/ChargeRateLimitAction"
              }
            ]
          },
          "updatedFields": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "vendorAction",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "user:vendor-action:updated",
        "description": "Occurs whenever an action changes state."
      },
      "SystemHeartbeat": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "event": {
            "type": "string",
            "enum": [
              "system:heartbeat"
            ]
          },
          "pendingEvents": {
            "type": "number",
            "minimum": 0
          }
        },
        "required": [
          "createdAt",
          "version",
          "event",
          "pendingEvents"
        ],
        "additionalProperties": false
      },
      "WebhookTest": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "event": {
            "type": "string",
            "enum": [
              "enode:webhook:test"
            ]
          }
        },
        "required": [
          "createdAt",
          "version",
          "event"
        ],
        "additionalProperties": false
      },
      "UserHEMSystemDiscovered": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:hem-system:discovered"
            ]
          },
          "hemSystem": {
            "$ref": "#/components/schemas/HEMSystem"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "hemSystem"
        ],
        "additionalProperties": false,
        "title": "user:hem-system:discovered",
        "description": "Occurs whenever a new HEM System is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data."
      },
      "UserHEMSystemUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:hem-system:updated"
            ]
          },
          "hemSystem": {
            "$ref": "#/components/schemas/HEMSystem"
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "hemSystem",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "user:hem-system:updated",
        "description": "Occurs whenever a HEM System's properties are updated."
      },
      "UserHEMSystemDeleted": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "user:hem-system:deleted"
            ]
          },
          "hemSystem": {
            "$ref": "#/components/schemas/HEMSystem"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "hemSystem"
        ],
        "additionalProperties": false,
        "title": "user:hem-system:deleted",
        "description": "Occurs whenever a HEM System is deleted. The payload reflects the last known state of the asset before deletion."
      },
      "FlexVehiclePolicyCreated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "flex:vehicle-policy:created"
            ]
          },
          "policy": {
            "$ref": "#/components/schemas/FlexPolicy"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "policy"
        ],
        "additionalProperties": false,
        "title": "flex:vehicle-policy:created"
      },
      "FlexVehiclePolicyUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "flex:vehicle-policy:updated"
            ]
          },
          "policy": {
            "$ref": "#/components/schemas/FlexPolicy"
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "policy",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "flex:vehicle-policy:updated"
      },
      "FlexVehiclePolicyDeleted": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "flex:vehicle-policy:deleted"
            ]
          },
          "policy": {
            "$ref": "#/components/schemas/FlexPolicy"
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "policy"
        ],
        "additionalProperties": false,
        "title": "flex:vehicle-policy:deleted"
      },
      "FlexPolicyOverrideUpcomingSchedulePayload": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "UPCOMING_SCHEDULE"
            ]
          },
          "readyBy": {
            "type": "string",
            "format": "date-time",
            "description": "The timestamp at which the user wants their vehicle to be charged by. Overrides the upcoming deadline set in the Flex Policy. Must be in the future.",
            "example": "2020-04-07T17:04:26Z"
          },
          "minimumChargeTarget": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "title": "Minimum Charge Target",
            "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
            "example": 80
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false,
        "title": "Upcoming Schedule Policy Override",
        "description": "The request payload to create a UPCOMING_SCHEDULE override for a Flex Policy. An upcoming schedule override allows you to set a custom ready-by time and target for the upcoming charging session."
      },
      "FlexPolicyOverrideUpcomingScheduleStatus": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "UPCOMING_SCHEDULE"
            ]
          },
          "readyBy": {
            "type": "string",
            "format": "date-time",
            "description": "The timestamp at which the user wants their vehicle to be charged by. Overrides the upcoming deadline set in the Flex Policy. Must be in the future.",
            "example": "2020-04-07T17:04:26Z"
          },
          "minimumChargeTarget": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "title": "Minimum Charge Target",
            "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
            "example": 80
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false,
        "title": "Override Next Day Schedule",
        "description": "A next-day schedule override applied to a Flex Policy, shown as a part of the Flex Status entity."
      },
      "FlexPolicyOverrideImmediateStartPayload": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "IMMEDIATE_START"
            ]
          },
          "target": {
            "type": "number",
            "description": "The target batteryLevel to immediately charge up to. Must be less than or equal to the vehicle's `chargeLimit`. Charging sessions resulting from this override are reflected in the Policy Status State as `IMMEDIATE:OVERRIDE`.",
            "example": 50
          }
        },
        "required": [
          "type",
          "target"
        ],
        "additionalProperties": false,
        "title": "Immediate Start Policy Override",
        "description": "The request payload to create an immediate start override for a Flex Policy."
      },
      "FlexPolicyOverrideImmediateStartStatus": {
        "allOf": [
          {
            "$ref": "#/components/schemas/FlexPolicyOverrideImmediateStartPayload"
          },
          {
            "type": "object",
            "properties": {
              "estimatedFinishAt": {
                "type": "string",
                "format": "date-time",
                "description": "The estimated time at which the vehicle will reach the target charge batteryLevel. Null when the session has not yet activated (e.g. vehicle is not plugged in).",
                "example": null
              }
            },
            "required": [
              "estimatedFinishAt"
            ],
            "additionalProperties": false
          }
        ],
        "title": "Flex Policy Immediate Start Override",
        "description": "An immediate start override applied to a Flex Policy, shown as a part of the Flex Status entity. An immediate start override forces a car to immediately start charging to a specific battery level."
      },
      "FlexPolicyOverrideStatus": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/FlexPolicyOverrideUpcomingScheduleStatus"
          },
          {
            "$ref": "#/components/schemas/FlexPolicyOverrideImmediateStartStatus"
          },
          {
            "type": "null"
          }
        ],
        "title": "Flex Policy Override Status",
        "description": "An override applied to a Flex Policy, shown as a part of the Flex Status entity. The override is either a next-day schedule override or an immediate start override."
      },
      "FlexPolicySessionBlock": {
        "type": "object",
        "properties": {
          "statusState": {
            "type": "string",
            "enum": [
              "UNAVAILABLE",
              "IMMEDIATE:OVERRIDE",
              "SCHEDULE:BATTERY_RESERVE",
              "SCHEDULE:REGULAR",
              "SCHEDULE:OVERRIDE",
              "SCHEDULE:INFLEXIBLE"
            ],
            "title": "Flex Policy Status State",
            "description": "The state of the Policy Status during this charging block."
          },
          "estimatedStartAt": {
            "type": "string",
            "format": "date-time",
            "description": "The estimated start time of the charging block.",
            "example": "2020-04-07T17:04:26Z"
          },
          "estimatedEndAt": {
            "type": "string",
            "format": "date-time",
            "description": "The estimated end time of the charging block.",
            "example": "2020-04-07T17:04:26Z"
          }
        },
        "required": [
          "statusState",
          "estimatedStartAt",
          "estimatedEndAt"
        ],
        "additionalProperties": false,
        "description": "A block of time in which the vehicle is expected to be charging."
      },
      "FlexPolicyStatus": {
        "type": "object",
        "properties": {
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "The timestamp of the last update to the flex policy.",
            "example": "2020-04-07T17:04:26Z"
          },
          "policyId": {
            "type": "string",
            "description": "The ID of the policy."
          },
          "locationId": {
            "type": "string",
            "description": "The ID of the location."
          },
          "vehicleId": {
            "type": "string",
            "description": "The ID of the vehicle."
          },
          "state": {
            "type": "string",
            "enum": [
              "UNAVAILABLE",
              "IMMEDIATE:OVERRIDE",
              "SCHEDULE:BATTERY_RESERVE",
              "SCHEDULE:REGULAR",
              "SCHEDULE:OVERRIDE",
              "SCHEDULE:INFLEXIBLE"
            ],
            "title": "Flex Policy Status State",
            "description": "The state of the flex policy. \n  * `UNAVAILABLE`: The vehicle is unavailable for Flexible EV Charging for some reason, for example, because it is not plugged in, or not the Policy's location. \n  * `IMMEDIATE:OVERRIDE`: The vehicle is charging to some target battery level because of a temporary override.\n  * `SCHEDULE:BATTERY_RESERVE`: The vehicle is charging to a battery reserve level, and will stop after reaching that level. \n  * `SCHEDULE:REGULAR`: The vehicle is following the regular schedule and actively participating in Flexible EV Charging. \n  * `SCHEDULE:OVERRIDE`: The vehicle is following a schedule override, and is still actively participating in Flexible EV Charging. \n  * `SCHEDULE:INFLEXIBLE`: The vehicle doesn't have enough time to charge to the target battery level, so there isn't any opportunity to flex the charging."
          },
          "batteryReserve": {
            "type": "number",
            "maximum": 50,
            "minimum": 0,
            "description": "Upon arrival at the location, the vehicle will immediately charge to this battery level without regard to prices or flexibility demands. This charging is reflected in the Policy Status State as `SCHEDULE:BATTERY_RESERVE`. Must be between 0% and 20%. Note: For Mercedes-Benz vehicles, `batteryReserve` must be set to `50`, as these vehicles always charge to 50% SOC upon plug-in."
          },
          "settings": {
            "type": "object",
            "properties": {
              "regularSchedule": {
                "type": "object",
                "properties": {
                  "deadline": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "pattern": "^(((?:[01]\\d|2[0-3]):[0-5]\\d)|24:00)$",
                    "description": "The time of day the user wants their vehicle to be charged by on a specific day of the week.",
                    "example": "07:00",
                    "title": "Deadline"
                  },
                  "readyBy": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The upcoming deadline represented as a RFC3339 UTC timestamp.",
                    "example": "2020-04-07T17:04:26Z"
                  },
                  "minimumChargeTarget": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "minimum": 0,
                    "maximum": 100,
                    "title": "Minimum Charge Target",
                    "description": "The minimum acceptable battery level the user needs to reach by their deadline on a specific day of the week. The vehicle may, under some circumstances, charge to a higher battery level than the `minimumChargeTarget`. If the `minimumChargeTarget` is higher than the vehicle's `chargeLimit`, the vehicle will charge to the `chargeLimit` instead. Must be greater than or equal to the `batteryReserve`. For Mercedes-Benz vehicles, the `minimumChargeTarget` minimum is 50%, see `batteryReserve` for more details.",
                    "example": 80
                  }
                },
                "required": [
                  "deadline",
                  "readyBy",
                  "minimumChargeTarget"
                ],
                "additionalProperties": false,
                "description": "Today's schedule settings, resolved from the weekly schedule."
              },
              "override": {
                "$ref": "#/components/schemas/FlexPolicyOverrideStatus"
              }
            },
            "required": [
              "regularSchedule",
              "override"
            ],
            "additionalProperties": false
          },
          "session": {
            "type": "object",
            "properties": {
              "blocks": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/FlexPolicySessionBlock"
                }
              }
            },
            "required": [
              "blocks"
            ],
            "additionalProperties": false,
            "description": "An object containing information about the vehicle's current plug session.",
            "example": {
              "blocks": [
                {
                  "statusState": "SCHEDULE:BATTERY_RESERVE",
                  "estimatedStartAt": "2025-05-22T12:30:00Z",
                  "estimatedEndAt": "2025-05-22T14:45:00Z"
                },
                {
                  "statusState": "SCHEDULE:REGULAR",
                  "estimatedStartAt": "2025-05-22T20:30:00Z",
                  "estimatedEndAt": "2025-05-22T22:30:00Z"
                }
              ]
            }
          }
        },
        "required": [
          "updatedAt",
          "policyId",
          "locationId",
          "vehicleId",
          "state",
          "batteryReserve",
          "settings",
          "session"
        ],
        "additionalProperties": false,
        "description": "A view of the current flex policy settings, including any active overrides."
      },
      "FlexVehiclePolicyStatusUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "flex:vehicle-policy:status"
            ]
          },
          "policyStatus": {
            "$ref": "#/components/schemas/FlexPolicyStatus"
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "policyStatus",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "flex:vehicle-policy:status",
        "description": "Occurs whenever a Flex vehicle policy's status is updated."
      },
      "FlexSessionUpdated": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "user": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "User ID"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "event": {
            "type": "string",
            "enum": [
              "flex:session:updated"
            ]
          },
          "session": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ActiveOrUpcomingSession"
              },
              {
                "$ref": "#/components/schemas/SettledSession"
              }
            ],
            "discriminator": {
              "propertyName": "state",
              "mapping": {
                "UPCOMING": "#/components/schemas/ActiveOrUpcomingSession",
                "ACTIVE:BATTERY_RESERVE": "#/components/schemas/ActiveOrUpcomingSession",
                "ACTIVE:REGULAR": "#/components/schemas/ActiveOrUpcomingSession",
                "ACTIVE:IMMEDIATE_START": "#/components/schemas/ActiveOrUpcomingSession",
                "SETTLED": "#/components/schemas/SettledSession"
              }
            }
          },
          "updatedFields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "user",
          "event",
          "session",
          "updatedFields"
        ],
        "additionalProperties": false,
        "title": "flex:session:updated"
      },
      "FlexTariffCoverageAlert": {
        "type": "object",
        "properties": {
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO8601 UTC timestamp",
            "example": "2020-04-07T17:04:26Z"
          },
          "version": {
            "type": "string",
            "description": "API version of the payload",
            "example": "2024-10-01"
          },
          "event": {
            "type": "string",
            "enum": [
              "flex:tariff-coverage:alert"
            ]
          },
          "affectedTariffIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "IDs of the tariffs missing timeseries coverage in this event. If there are more affected tariffs than fit in one event, multiple events are sent."
          },
          "issues": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        },
        "required": [
          "createdAt",
          "version",
          "event",
          "affectedTariffIds"
        ],
        "title": "flex:tariff-coverage:alert",
        "description": "Sent when one or more vehicles lack tariff timeseries data for the next 24 hours, leading to sub-optimal smart charging plans that do not take tariffs into account. Contains a summary of issues."
      },
      "PaginationQueryAfter": {
        "type": "string",
        "description": "Opaque cursor used to fetch next page. Cannot be set together with `before`. Refer to [Pagination](/api/reference#pagination) for more information.",
        "example": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa"
      },
      "PaginationQueryBefore": {
        "type": "string",
        "description": "Opaque cursor used to fetch previous page. Cannot be used together with `after`. Refer to [Pagination](/api/reference#pagination) for more information.",
        "example": "MjAyMy0wNy0xOFQxMDowODowMi4zNzNa"
      },
      "PaginationQueryPageSize": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "description": "Number of records to return per page. Default page size is 50.",
        "example": 50
      },
      "UserPathId": {
        "type": "string",
        "description": "ID of the User."
      },
      "UserPathIdForLinking": {
        "type": "string",
        "description": "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."
      },
      "AssetId": {
        "type": "string",
        "description": "The ID of the already linked asset to relink."
      },
      "VehiclePathId": {
        "type": "string",
        "description": "ID of the Vehicle.",
        "example": "ad84e742-0f46-4cf4-b0db-7d890f8f23f5"
      },
      "ActionPathId": {
        "type": "string",
        "format": "uuid",
        "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
        "x-format": {
          "guid": true
        },
        "description": "ID of the Action."
      },
      "ChargerPathId": {
        "type": "string",
        "description": "ID of the Charger.",
        "example": "ad84e742-0f46-4cf4-b0db-7d890f8f23f5"
      },
      "PathBatteryId": {
        "type": "string",
        "format": "uuid",
        "description": "The ID of the battery to look up.",
        "example": "54d827e1-8355-4fed-97b5-55940d1d09ba"
      },
      "PathBatteryTargetId": {
        "type": "string",
        "format": "uuid",
        "description": "The ID of the battery being targeted.",
        "example": "54d827e1-8355-4fed-97b5-55940d1d09ba"
      },
      "HvacPathId": {
        "type": "string",
        "description": "ID of the HVAC unit.",
        "example": "8f39fa8d-8f10-4984-a319-741dc23848c0"
      },
      "PathInverterId": {
        "type": "string",
        "format": "uuid",
        "description": "ID of the solar inverter",
        "example": "54d827e1-8355-4fed-97b5-55940d1d09ba"
      },
      "PathMeterId": {
        "type": "string",
        "format": "uuid",
        "description": "The ID of the meter you are looking up",
        "example": "54d827e1-8355-4fed-97b5-55940d1d09ba"
      },
      "PathHemSystemId": {
        "type": "string",
        "format": "uuid",
        "description": "The ID of the HEM System to look up.",
        "example": "54d827e1-8355-4fed-97b5-55940d1d09ba"
      },
      "LocationPathId": {
        "type": "string",
        "format": "uuid",
        "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
        "x-format": {
          "guid": true
        },
        "description": "ID of the Location."
      },
      "InterventionPathId": {
        "type": "string",
        "format": "uuid",
        "description": "ID of the intervention.",
        "example": "ad84e742-0f46-4cf4-b0db-7d890f8f23f5"
      },
      "WebhookPathId": {
        "type": "string",
        "format": "uuid",
        "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
        "x-format": {
          "guid": true
        },
        "description": "ID of the Webhook."
      },
      "FlexShapeDimensionPathId": {
        "type": "string",
        "maxLength": 64,
        "pattern": "^[\\w:-]+$",
        "description": "ID of the Flex Shape dimension, as configured by Enode for your organization.",
        "example": "region"
      },
      "FlexZonePathId": {
        "type": "string",
        "enum": [
          "NO1",
          "NO2",
          "NO3",
          "NO4",
          "NO5",
          "SE1",
          "SE2",
          "SE3",
          "SE4",
          "DK1",
          "DK2",
          "FI",
          "EE",
          "LV",
          "LT",
          "AT",
          "BE",
          "GER",
          "FR",
          "NL",
          "PL",
          "ES",
          "PT",
          "CH"
        ],
        "description": "The zone identifier. Corresponds to a market bidding zone (e.g., NO1, BE, SE3).",
        "example": "NO1"
      },
      "PriceSignalPushIdempotencyKeyHeader": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Optional key used to deduplicate retries. A key remains bound to its original semantic payload for the lifetime of the retained price revision.",
        "example": "63bc5f16-8747-4206-8f4f-c53184d37ae8"
      },
      "TariffPathId": {
        "type": "string",
        "maxLength": 64,
        "pattern": "^[\\w:-]+$",
        "description": "Unique identifier for the tariff.",
        "example": "energy-import"
      },
      "TariffPushIdempotencyKeyHeader": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Required key used to deduplicate retries for identical push requests. Completed idempotency records are retained for 24 hours, while in-progress locks expire after 3 minutes.",
        "example": "63bc5f16-8747-4206-8f4f-c53184d37ae8"
      },
      "SolarConfigurationListQueryUserId": {
        "type": "string",
        "description": "Filter solar configurations by user ID."
      },
      "SolarConfigurationListQueryLocationId": {
        "type": "string",
        "format": "uuid",
        "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
        "x-format": {
          "guid": true
        },
        "description": "Filter solar configurations by location ID."
      },
      "SolarConfigurationPathId": {
        "type": "string",
        "format": "uuid",
        "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
        "x-format": {
          "guid": true
        },
        "description": "ID of the Solar Configuration."
      }
    },
    "parameters": {
      "PaginationQueryAfter": {
        "schema": {
          "$ref": "#/components/schemas/PaginationQueryAfter"
        },
        "required": false,
        "description": "Opaque cursor used to fetch next page. Cannot be set together with `before`. Refer to [Pagination](/api/reference#pagination) for more information.",
        "name": "after",
        "in": "query"
      },
      "PaginationQueryBefore": {
        "schema": {
          "$ref": "#/components/schemas/PaginationQueryBefore"
        },
        "required": false,
        "description": "Opaque cursor used to fetch previous page. Cannot be used together with `after`. Refer to [Pagination](/api/reference#pagination) for more information.",
        "name": "before",
        "in": "query"
      },
      "PaginationQueryPageSize": {
        "schema": {
          "$ref": "#/components/schemas/PaginationQueryPageSize"
        },
        "required": false,
        "description": "Number of records to return per page. Default page size is 50.",
        "name": "pageSize",
        "in": "query"
      },
      "UserPathId": {
        "schema": {
          "$ref": "#/components/schemas/UserPathId"
        },
        "required": true,
        "description": "ID of the User.",
        "name": "userId",
        "in": "path"
      },
      "UserPathIdForLinking": {
        "schema": {
          "$ref": "#/components/schemas/UserPathIdForLinking"
        },
        "required": true,
        "description": "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.",
        "name": "userId",
        "in": "path"
      },
      "AssetId": {
        "schema": {
          "$ref": "#/components/schemas/AssetId"
        },
        "required": true,
        "description": "The ID of the already linked asset to relink.",
        "name": "assetId",
        "in": "path"
      },
      "VehiclePathId": {
        "schema": {
          "$ref": "#/components/schemas/VehiclePathId"
        },
        "required": true,
        "description": "ID of the Vehicle.",
        "name": "vehicleId",
        "in": "path"
      },
      "ActionPathId": {
        "schema": {
          "$ref": "#/components/schemas/ActionPathId"
        },
        "required": true,
        "description": "ID of the Action.",
        "name": "actionId",
        "in": "path"
      },
      "ChargerPathId": {
        "schema": {
          "$ref": "#/components/schemas/ChargerPathId"
        },
        "required": true,
        "description": "ID of the Charger.",
        "name": "chargerId",
        "in": "path"
      },
      "PathBatteryId": {
        "schema": {
          "$ref": "#/components/schemas/PathBatteryId"
        },
        "required": true,
        "description": "The ID of the battery to look up.",
        "name": "batteryId",
        "in": "path"
      },
      "PathBatteryTargetId": {
        "schema": {
          "$ref": "#/components/schemas/PathBatteryTargetId"
        },
        "required": true,
        "description": "The ID of the battery being targeted.",
        "name": "batteryId",
        "in": "path"
      },
      "HvacPathId": {
        "schema": {
          "$ref": "#/components/schemas/HvacPathId"
        },
        "required": true,
        "description": "ID of the HVAC unit.",
        "name": "hvacId",
        "in": "path"
      },
      "PathInverterId": {
        "schema": {
          "$ref": "#/components/schemas/PathInverterId"
        },
        "required": true,
        "description": "ID of the solar inverter",
        "name": "inverterId",
        "in": "path"
      },
      "PathMeterId": {
        "schema": {
          "$ref": "#/components/schemas/PathMeterId"
        },
        "required": true,
        "description": "The ID of the meter you are looking up",
        "name": "meterId",
        "in": "path"
      },
      "PathHemSystemId": {
        "schema": {
          "$ref": "#/components/schemas/PathHemSystemId"
        },
        "required": true,
        "description": "The ID of the HEM System to look up.",
        "name": "hemSystemId",
        "in": "path"
      },
      "LocationPathId": {
        "schema": {
          "$ref": "#/components/schemas/LocationPathId"
        },
        "required": true,
        "description": "ID of the Location.",
        "name": "locationId",
        "in": "path"
      },
      "InterventionPathId": {
        "schema": {
          "$ref": "#/components/schemas/InterventionPathId"
        },
        "required": true,
        "description": "ID of the intervention.",
        "name": "interventionId",
        "in": "path"
      },
      "WebhookPathId": {
        "schema": {
          "$ref": "#/components/schemas/WebhookPathId"
        },
        "required": true,
        "description": "ID of the Webhook.",
        "name": "webhookId",
        "in": "path"
      },
      "FlexShapeDimensionPathId": {
        "schema": {
          "$ref": "#/components/schemas/FlexShapeDimensionPathId"
        },
        "required": true,
        "description": "ID of the Flex Shape dimension, as configured by Enode for your organization.",
        "name": "dimensionId",
        "in": "path"
      },
      "FlexZonePathId": {
        "schema": {
          "$ref": "#/components/schemas/FlexZonePathId"
        },
        "required": true,
        "description": "The zone identifier. Corresponds to a market bidding zone (e.g., NO1, BE, SE3).",
        "name": "zoneId",
        "in": "path"
      },
      "PriceSignalPushIdempotencyKeyHeader": {
        "schema": {
          "$ref": "#/components/schemas/PriceSignalPushIdempotencyKeyHeader"
        },
        "required": false,
        "description": "Optional key used to deduplicate retries. A key remains bound to its original semantic payload for the lifetime of the retained price revision.",
        "name": "Idempotency-Key",
        "in": "header"
      },
      "TariffPathId": {
        "schema": {
          "$ref": "#/components/schemas/TariffPathId"
        },
        "required": true,
        "description": "Unique identifier for the tariff.",
        "name": "tariffId",
        "in": "path"
      },
      "TariffPushIdempotencyKeyHeader": {
        "schema": {
          "$ref": "#/components/schemas/TariffPushIdempotencyKeyHeader"
        },
        "required": true,
        "description": "Required key used to deduplicate retries for identical push requests. Completed idempotency records are retained for 24 hours, while in-progress locks expire after 3 minutes.",
        "name": "Idempotency-Key",
        "in": "header"
      },
      "SolarConfigurationListQueryUserId": {
        "schema": {
          "$ref": "#/components/schemas/SolarConfigurationListQueryUserId"
        },
        "required": false,
        "description": "Filter solar configurations by user ID.",
        "name": "userId",
        "in": "query"
      },
      "SolarConfigurationListQueryLocationId": {
        "schema": {
          "$ref": "#/components/schemas/SolarConfigurationListQueryLocationId"
        },
        "required": false,
        "description": "Filter solar configurations by location ID.",
        "name": "locationId",
        "in": "query"
      },
      "SolarConfigurationPathId": {
        "schema": {
          "$ref": "#/components/schemas/SolarConfigurationPathId"
        },
        "required": true,
        "description": "ID of the Solar Configuration.",
        "name": "solarConfigurationId",
        "in": "path"
      }
    }
  },
  "paths": {
    "/users": {
      "get": {
        "summary": "List Users",
        "operationId": "listUsers",
        "description": "Returns a paginated list of all users.",
        "tags": [
          "User Management"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated list of users. Use query parameters to retrieve more results.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedUsersListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}": {
      "get": {
        "summary": "Get User",
        "operationId": "getUser",
        "description": "Returns metadata about the given User ID, including a list of vendors for which the User has provided credentials.",
        "tags": [
          "User Management"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserResponse"
                },
                "example": {
                  "id": "123456789-ABc",
                  "linkedVendors": [
                    {
                      "vendor": "TESLA",
                      "vendorType": "vehicle",
                      "isValid": true
                    }
                  ]
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Unlink User",
        "operationId": "deleteUsersUserid",
        "description": "Deletes a User and all of their data permanently and invalidates any associated sessions, authorization codes, and access/refresh tokens.",
        "tags": [
          "User Management"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        }
      }
    },
    "/users/{userId}/vendors/{vendor}": {
      "delete": {
        "summary": "Disconnect Vendor",
        "operationId": "disconnectUserVendor",
        "description": "Disconnect a single Vendor from the User's account.\n\nAll stored data about their Vendor account will be deleted, and any assets that were provided by that Vendor will disappear from the system.",
        "tags": [
          "User Management"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/Vendor",
              "description": "Vendor to be unlinked."
            },
            "required": true,
            "description": "Vendor to be unlinked.",
            "name": "vendor",
            "in": "path"
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        }
      }
    },
    "/users/{userId}/vendors/{vendor}/{vendorType}": {
      "delete": {
        "summary": "Disconnect Vendor Type",
        "operationId": "disconnectUserVendorVendorType",
        "description": "Disconnect a specific vendor type from the User's account. Assets of this type from that Vendor will be removed. If no other types from that vendor remain, all its stored data will be deleted.",
        "tags": [
          "User Management"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/Vendor",
              "description": "Vendor to be unlinked."
            },
            "required": true,
            "description": "Vendor to be unlinked.",
            "name": "vendor",
            "in": "path"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/VendorType"
            },
            "required": true,
            "name": "vendorType",
            "in": "path"
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        }
      }
    },
    "/users/{userId}/link": {
      "post": {
        "summary": "Link User",
        "operationId": "postUsersUseridLink",
        "description": "Creates a short-lived (24 hours), single-use device linking session. Use the returned `linkUrl` to present Link UI to your user via [mobile in-app browsers](/docs/link-ui#mobile-in-app-browsers) or [web redirects](/docs/link-ui#web-redirects), or use the `linkToken` to present Link UI via the [Link SDKs](/docs/link-ui#mobile-sd-ks).",
        "tags": [
          "User Management"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathIdForLinking"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkUserPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkUserResponse"
                }
              }
            }
          },
          "403": {
            "description": "Connections limit reached for this client",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConnectionsLimitReachedProblem"
                }
              }
            }
          }
        }
      }
    },
    "/assets/{assetId}/relink": {
      "post": {
        "summary": "Relink Asset",
        "operationId": "postAssetsAssetidRelink",
        "description": "Creates a short-lived (24 hours), single-use device linking session specifically tailored for relinking. See our [relinking guide](https://developers.enode.com/docs/link-ui/relinking) for more details. Use the returned `linkUrl` to present Link UI to your user via [mobile in-app browsers](/docs/link-ui#mobile-in-app-browsers) or [web redirects](/docs/link-ui#web-redirects), or use the `linkToken` to present Link UI via the [Link SDKs](/docs/link-ui#mobile-sd-ks).",
        "tags": [
          "User Management"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/AssetId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RelinkUserPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkUserResponse"
                }
              }
            }
          },
          "400": {
            "description": "Asset not found or already linked",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}/authorization": {
      "delete": {
        "summary": "Deauthorize User",
        "operationId": "deleteUsersUseridAuthorization",
        "description": "Deletes the User's stored vendor authorizations and credentials, invalidates any associated sessions, authorization codes, and access/refresh tokens.\n\nAll other User data is retained, and if the User is sent through the Link User flow in the future, their account will be just as they left it.\n\nThere is no dedicated webhook event but you'll receive deleted events for all assets that were associated with the user.",
        "tags": [
          "User Management"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        }
      }
    },
    "/vehicles": {
      "get": {
        "summary": "List Vehicles",
        "operationId": "getVehicles",
        "description": "Returns a paginated list of all available Vehicles",
        "tags": [
          "Vehicles"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedVehicleList"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}/vehicles": {
      "get": {
        "summary": "List User Vehicles",
        "operationId": "listUserVehicles",
        "description": "Paginated list of user vehicles.",
        "tags": [
          "Vehicles"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedVehicleList"
                }
              }
            }
          }
        }
      }
    },
    "/vehicles/{vehicleId}": {
      "get": {
        "summary": "Get Vehicle",
        "operationId": "getVehicle",
        "tags": [
          "Vehicles"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/VehiclePathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Vehicle"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "location": {
                          "allOf": [
                            {
                              "$ref": "#/components/schemas/VehicleLocation"
                            },
                            {
                              "type": "object",
                              "properties": {
                                "id": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "format": "uuid",
                                  "example": "07f8368d-be7e-4dbd-8cf0-94d00dd67ad3",
                                  "x-format": {
                                    "guid": true
                                  },
                                  "description": "ID of the location the vehicle is currently positioned at (if any)."
                                }
                              },
                              "required": [
                                "id"
                              ],
                              "additionalProperties": false
                            }
                          ],
                          "description": "Vehicle's GPS coordinates with timestamp"
                        }
                      },
                      "required": [
                        "location"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/vehicles/{vehicleId}/max-current": {
      "post": {
        "summary": "Set Max Current",
        "operationId": "postVehiclesVehicleidMaxCurrent",
        "deprecated": true,
        "description": "Deprecated: Use [Set Charge Rate Limit](/api/reference#postVehiclesVehicleidChargeRateLimit) instead, which accepts a target in kW.\n\nSet the max current the vehicle is allowed to consume during charging. Currently only supported for Tesla vehicles and behind a feature flag. Reach out to Customer Success to get access. \n\nThis request creates an Action that will retry until the vehicle's `maxCurrent` matches the expected value. The Action must complete before any further commands are sent to the vehicle. Only one Action can be active for a specific vehicle 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 Vehicle Action](/api/reference#getVehiclesAction). ",
        "tags": [
          "Vehicles",
          "Early Adopter"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/VehiclePathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TargetMaxCurrent"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaxCurrentAction"
                }
              }
            }
          },
          "400": {
            "description": "A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the vehicle cannot perform the action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/vehicles/{vehicleId}/charge-rate-limit": {
      "post": {
        "summary": "Set Charge Rate Limit",
        "operationId": "postVehiclesVehicleidChargeRateLimit",
        "description": "Sets the charge rate limit for a vehicle in kW. The vehicle must be plugged into a charger that supports this capability. Creates an Action that retries until the vehicle's `chargeRateLimit` matches the target value. Setting chargeRateLimit also changes maxCurrent.\n\nOnly one Action can be active for a specific vehicle at a time. If a new Action is created, the previous Action will be automatically cancelled and transitioned to the `CANCELLED` state. Track transitions via the `user:vendor-action:updated` webhook event or [Get Vehicle Action](/api/reference#getVehiclesAction).\n\nIf you are interested in joining the Early Adopter program, please reach out to Enode with a short description of your use case.",
        "tags": [
          "Vehicles",
          "Early Adopter"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/VehiclePathId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChargeRateLimitPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VehicleChargeRateLimitAction"
                }
              }
            }
          },
          "400": {
            "description": "A precondition check failed. This occurs if the vehicle is not capable, not plugged in, or the charge rate limit is outside the allowed range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/vehicles/actions/{actionId}": {
      "get": {
        "summary": "Get Vehicle Action",
        "description": "Returns the current state of the requested Action.",
        "operationId": "getVehiclesAction",
        "tags": [
          "Vehicles"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ActionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VehicleAction"
                }
              }
            }
          },
          "404": {
            "description": "Action not found."
          }
        }
      }
    },
    "/vehicles/actions/{actionId}/cancel": {
      "post": {
        "summary": "Cancel Vehicle Action",
        "description": "Cancels a pending vehicle action, halting any further attempts by Enode to execute it.\n\nNote: 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.",
        "operationId": "cancelVehicleAction",
        "tags": [
          "Vehicles"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ActionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChargeAction"
                }
              }
            }
          },
          "404": {
            "description": "Action not found."
          },
          "409": {
            "description": "Action already in a resolved state.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChargeAction"
                }
              }
            }
          }
        }
      }
    },
    "/vehicles/{vehicleId}/refresh-hint": {
      "post": {
        "summary": "Refresh Vehicle Data",
        "description": "Use this endpoint to initiate an expedited data refresh for the specified vehicle.\n\nNote: 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.  \nThis 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.",
        "operationId": "vehiclesRefreshHint",
        "tags": [
          "Vehicles"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/VehiclePathId"
          }
        ],
        "responses": {
          "204": {
            "description": "Refresh hint registered successfully.",
            "content": {}
          },
          "404": {
            "description": "The specified vehicle was not found."
          }
        }
      }
    },
    "/chargers": {
      "get": {
        "summary": "List Chargers",
        "operationId": "listChargers",
        "description": "Returns a paginated list of all Chargers.",
        "tags": [
          "Chargers"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedChargerList"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}/chargers": {
      "get": {
        "summary": "List User Chargers",
        "description": "Returns a paginated list of chargers for the given userId.",
        "operationId": "listUserChargers",
        "tags": [
          "Chargers"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedChargerList"
                }
              }
            }
          }
        }
      }
    },
    "/chargers/{chargerId}": {
      "get": {
        "summary": "Get Charger",
        "operationId": "getCharger",
        "tags": [
          "Chargers"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ChargerPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Charger"
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "Set location for a charger",
        "operationId": "updateCharger",
        "description": "Update the `locationId` field on a Charger.",
        "tags": [
          "Chargers"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ChargerPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChargerUpdatePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Charger"
                }
              }
            }
          }
        }
      }
    },
    "/chargers/{chargerId}/max-current": {
      "post": {
        "summary": "Set Max Current",
        "operationId": "postSetChargerMaxCurrent",
        "deprecated": true,
        "description": "Deprecated: Use [Set Charge Rate Limit](/api/reference#postSetChargerChargeRateLimit) instead, which accepts a target in kW.\n\nRegister 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 Action](/api/reference#getChargersAction).",
        "tags": [
          "Chargers"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ChargerPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TargetMaxCurrent"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaxCurrentAction"
                }
              }
            }
          },
          "400": {
            "description": "A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the charger cannot perform the action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/chargers/{chargerId}/charge-rate-limit": {
      "post": {
        "summary": "Set Charge Rate Limit",
        "operationId": "postSetChargerChargeRateLimit",
        "description": "Sets the charge rate limit for a charger in kW. Creates an Action that retries until the charger's `chargeRateLimit` matches the target value. Setting chargeRateLimit also changes maxCurrent.\n\nOnly one Action can be active per charger - creating a new one cancels the previous action (state: `CANCELLED`). The Action must complete before sending further commands. Track transitions via the user:vendor-action:updated webhook or [Get Charger Action](/api/reference#getChargersAction).\n\nWe recommend updating this setting no more than once every 15 minutes. Frequent changes to the charge rate limit may cause the vehicle to interrupt the charging session.",
        "tags": [
          "Chargers",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ChargerPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChargeRateLimitPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChargeRateLimitAction"
                }
              }
            }
          },
          "400": {
            "description": "A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the charger cannot perform the action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/chargers/actions/{actionId}": {
      "get": {
        "summary": "Get Charger Action",
        "description": "Returns the current state of the requested Action.",
        "operationId": "getChargersAction",
        "tags": [
          "Chargers"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ActionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChargerAction"
                }
              }
            }
          },
          "404": {
            "description": "Action not found."
          }
        }
      }
    },
    "/chargers/actions/{actionId}/cancel": {
      "post": {
        "summary": "Cancel Charger Action",
        "description": "Cancels a pending Action, halting any further attempts by Enode to execute it.\n\nNote: 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.",
        "operationId": "cancelChargerAction",
        "tags": [
          "Chargers"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ActionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChargerAction"
                },
                "example": {
                  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                  "createdAt": "2023-08-01T01:00:00Z",
                  "updatedAt": "2023-08-01T01:00:00Z",
                  "completedAt": "2023-08-01T01:00:00Z",
                  "state": "CONFIRMED",
                  "targetId": "f723fed5-73aa-4004-b7f0-89e5173ee15e",
                  "targetType": "charger",
                  "kind": "START",
                  "failureReason": null
                }
              }
            }
          },
          "404": {
            "description": "Action not found."
          },
          "409": {
            "description": "Action already in a resolved state.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChargerAction"
                },
                "example": {
                  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                  "createdAt": "2023-08-01T01:00:00Z",
                  "updatedAt": "2023-08-01T01:00:00Z",
                  "completedAt": "2023-08-01T01:00:00Z",
                  "state": "CONFIRMED",
                  "targetId": "f723fed5-73aa-4004-b7f0-89e5173ee15e",
                  "targetType": "charger",
                  "kind": "START",
                  "failureReason": null
                }
              }
            }
          }
        }
      }
    },
    "/chargers/{chargerId}/refresh-hint": {
      "post": {
        "summary": "Refresh Charger Data",
        "description": "Use this endpoint to initiate an expedited data refresh for the specified charger.\n\nNote: 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.  \nThis 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.",
        "operationId": "chargersRefreshHint",
        "tags": [
          "Chargers"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ChargerPathId"
          }
        ],
        "responses": {
          "204": {
            "description": "Refresh hint registered successfully.",
            "content": {}
          },
          "404": {
            "description": "The specified charger was not found."
          }
        }
      }
    },
    "/batteries": {
      "get": {
        "summary": "List Batteries",
        "operationId": "listBatteries",
        "description": "Returns a paginated list of all Batteries.",
        "tags": [
          "Batteries",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedBatteryList"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}/batteries": {
      "get": {
        "summary": "List User Batteries",
        "description": "Returns a paginated list of batteries for the given userId.",
        "operationId": "listUserBatteries",
        "tags": [
          "Batteries",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedBatteryList"
                }
              }
            }
          }
        }
      }
    },
    "/batteries/{batteryId}": {
      "get": {
        "summary": "Get Battery",
        "operationId": "getBattery",
        "tags": [
          "Batteries",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathBatteryId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Battery"
                }
              }
            }
          }
        }
      }
    },
    "/batteries/{batteryId}/operation-mode": {
      "post": {
        "summary": "Set Operation Mode for Battery",
        "operationId": "postUserSetOperationMode",
        "description": "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. Regardless of operation mode, the battery's charge limit will not fall below `dischargeLimit` except in emergency power situations. Transitions can be tracked via the `user:vendor-action:updated` webhook event or [Get Operation Mode Action](/api/reference#getBatteriesAction).",
        "tags": [
          "Batteries",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathBatteryTargetId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/setBatteryOperationModePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OperationModeAction"
                }
              }
            }
          },
          "400": {
            "description": "A precondition check failed that is unlikely to change within the action's timeout window. This occurs if the battery cannot perform the action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/batteries/actions/{actionId}": {
      "get": {
        "summary": "Get Operation Mode Action",
        "description": "Returns the current state of the requested Action.",
        "operationId": "getBatteriesAction",
        "tags": [
          "Batteries",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ActionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OperationModeAction"
                }
              }
            }
          },
          "404": {
            "description": "Action not found."
          }
        }
      }
    },
    "/batteries/actions/{actionId}/cancel": {
      "post": {
        "summary": "Cancel Battery Action",
        "description": "Cancels a pending battery Action, halting any further attempts by Enode to execute it.\n\nNote: 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.",
        "operationId": "cancelBatteryAction",
        "tags": [
          "Batteries",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ActionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OperationModeAction"
                },
                "example": {
                  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                  "createdAt": "2023-08-01T01:00:00Z",
                  "updatedAt": "2023-08-01T01:00:00Z",
                  "completedAt": "2023-08-01T01:00:00Z",
                  "state": "CANCELLED",
                  "targetId": "f723fed5-73aa-4004-b7f0-89e5173ee15e",
                  "targetType": "battery",
                  "targetState": {
                    "operationMode": "IMPORT_FOCUS"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Action not found."
          },
          "409": {
            "description": "Action already in a resolved state and can therefore not be cancelled.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                      "x-format": {
                        "guid": true
                      },
                      "description": "The ID of the action."
                    },
                    "userId": {
                      "type": "string",
                      "description": "The ID of the user that owns the target of this action.",
                      "example": "d5bd4771-864e-4ae5-b913-dfb5cdcd5772"
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Time when this action was created",
                      "example": "2020-04-07T17:04:26Z"
                    },
                    "updatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Time when this action was last updated",
                      "example": "2020-04-07T17:04:26Z"
                    },
                    "completedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "Time when the action transitioned to a non-pending state.",
                      "example": "2020-04-07T17:04:26Z"
                    },
                    "targetId": {
                      "type": "string",
                      "description": "ID of the battery which this action is controlling.",
                      "example": "ac03a513-5494-4e1c-9dd7-2a29dc024312"
                    },
                    "targetType": {
                      "type": "string",
                      "enum": [
                        "battery"
                      ]
                    },
                    "targetState": {
                      "$ref": "#/components/schemas/setBatteryOperationModePayload"
                    },
                    "failureReason": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ActionFailureReason"
                        },
                        {
                          "type": [
                            "object",
                            "null"
                          ]
                        }
                      ]
                    },
                    "state": {
                      "type": "string",
                      "enum": [
                        "CONFIRMED",
                        "FAILED",
                        "CANCELLED"
                      ],
                      "description": "The real-time status of an action executed on a target. \n\n * `CONFIRMED`: Successful transition of the target to the desired state. \n * `FAILED`: The target did not respond to the action before timing out. Enode has ceased sending additional commands. \n * `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."
                    }
                  },
                  "required": [
                    "id",
                    "userId",
                    "createdAt",
                    "updatedAt",
                    "completedAt",
                    "targetId",
                    "targetType",
                    "targetState",
                    "failureReason",
                    "state"
                  ],
                  "additionalProperties": false
                }
              }
            }
          }
        }
      }
    },
    "/batteries/{batteryId}/refresh-hint": {
      "post": {
        "summary": "Refresh Battery Data",
        "description": "Use this endpoint to initiate an expedited data refresh for the specified battery.\n\nNote: 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.  \nThis 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.",
        "operationId": "batteriesRefreshHint",
        "tags": [
          "Batteries",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathBatteryTargetId"
          }
        ],
        "responses": {
          "204": {
            "description": "Refresh hint registered successfully.",
            "content": {}
          },
          "404": {
            "description": "The specified battery was not found."
          }
        }
      }
    },
    "/hvacs": {
      "get": {
        "summary": "List HVAC units",
        "operationId": "listHVACs",
        "description": "Paginated list of HVAC units",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedHVACList"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}/hvacs": {
      "get": {
        "summary": "List User HVAC units",
        "description": "Paginated list of HVAC units for the given User",
        "operationId": "listUserHVACs",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedHVACList"
                }
              }
            }
          }
        }
      }
    },
    "/hvacs/{hvacId}": {
      "put": {
        "summary": "Set Location for an HVAC unit",
        "operationId": "updateHVAC",
        "description": "Update the `locationId` field on an HVAC unit.",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/HvacPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/hvacUpdatePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successfully updated HVAC unit",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "HVAC unit ID"
                    },
                    "userId": {
                      "type": "string",
                      "description": "The ID of the user that linked this hvac."
                    },
                    "vendor": {
                      "$ref": "#/components/schemas/HvacVendor"
                    },
                    "lastSeen": {
                      "type": "string",
                      "format": "date-time",
                      "description": "The last time Enode successfully communicated with the vendor or when the HVAC unit was initially linked.",
                      "example": "2020-04-07T17:04:26Z"
                    },
                    "isReachable": {
                      "type": "boolean",
                      "description": "Indicates whether Enode can currently access live data from the HVAC. If the HVAC is not reachable, data updates will be delayed."
                    },
                    "consumptionRate": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "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."
                    },
                    "information": {
                      "type": "object",
                      "properties": {
                        "brand": {
                          "$ref": "#/components/schemas/Brand"
                        },
                        "model": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Device model name"
                        },
                        "displayName": {
                          "type": "string",
                          "description": "Name of the device, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names."
                        },
                        "groupName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Name of the group the device belongs to, as set by the user on the device/vendor. Groups are typically presented as \"rooms\" or \"zones\"."
                        },
                        "category": {
                          "type": "string",
                          "enum": [
                            "HEATING",
                            "COOLING",
                            "HEAT_PUMP",
                            "AGGREGATOR"
                          ],
                          "description": "Classification of the connected HVAC device.\n\n * `HEATING`: A direct heating device, such as an electric panel heater\n\n * `COOLING`: A direct cooling device, such as an air conditioner \n\n * `HEAT_PUMP`: An air-to-air heat pump capable of both heating and cooling\n\n * `AGGREGATOR`: A device that is capable of controlling various HVAC systems behind it, such as a smart thermostat"
                        }
                      },
                      "required": [
                        "brand",
                        "model",
                        "displayName",
                        "groupName",
                        "category"
                      ],
                      "additionalProperties": false,
                      "description": "Descriptive information about the HVAC unit"
                    },
                    "temperatureState": {
                      "type": "object",
                      "properties": {
                        "currentTemperature": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Current air temperature reported by device in degrees Celsius."
                        },
                        "isActive": {
                          "type": "boolean",
                          "description": "Whether the HVAC unit is actively heating or cooling."
                        },
                        "lastUpdated": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "format": "date-time",
                          "description": "Time of last temperature state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer",
                          "example": "2020-04-07T17:04:26Z"
                        }
                      },
                      "required": [
                        "currentTemperature",
                        "isActive",
                        "lastUpdated"
                      ],
                      "additionalProperties": false,
                      "description": "Latest information about temperature. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
                    },
                    "thermostatState": {
                      "type": "object",
                      "properties": {
                        "mode": {
                          "$ref": "#/components/schemas/HvacMode"
                        },
                        "heatSetpoint": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "If mode allows, heat when `currentTemperature` falls below this point."
                        },
                        "coolSetpoint": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "If mode allows, cool when `currentTemperature` rises above this point."
                        },
                        "holdType": {
                          "allOf": [
                            {
                              "$ref": "#/components/schemas/HvacHoldType"
                            },
                            {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "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."
                            }
                          ]
                        },
                        "lastUpdated": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "format": "date-time",
                          "description": "Time of last thermostat state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer.",
                          "example": "2020-04-07T17:04:26Z"
                        }
                      },
                      "required": [
                        "mode",
                        "heatSetpoint",
                        "coolSetpoint",
                        "holdType",
                        "lastUpdated"
                      ],
                      "additionalProperties": false,
                      "description": "Latest information about the thermostat state. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
                    },
                    "scopes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Scopes that the user has granted for this HVAC unit.",
                      "example": [
                        "hvac:control:mode",
                        "hvac:read:data"
                      ]
                    },
                    "capabilities": {
                      "type": "object",
                      "properties": {
                        "capableModes": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "items": {
                            "$ref": "#/components/schemas/HvacMode"
                          },
                          "description": "A list of valid modes for this HVAC unit."
                        },
                        "coolSetpointRange": {
                          "$ref": "#/components/schemas/NullableTemperatureRange",
                          "description": "The range of allowable values for `coolSetpoint`."
                        },
                        "heatSetpointRange": {
                          "$ref": "#/components/schemas/NullableTemperatureRange",
                          "description": "The range of allowable values for `heatSetpoint`."
                        },
                        "setpointDifferenceRange": {
                          "$ref": "#/components/schemas/NullableTemperatureDifferenceRange",
                          "description": "A constraint specifying the minimum and maximum allowable difference between `heatSetpoint` and `coolSetpoint`. Only applicable in `AUTO` mode."
                        },
                        "setFollowSchedule": {
                          "$ref": "#/components/schemas/Capability",
                          "description": "Supports following a schedule set on the device."
                        },
                        "setPermanentHold": {
                          "$ref": "#/components/schemas/Capability",
                          "description": "Supports setting a permanent hold."
                        }
                      },
                      "required": [
                        "capableModes",
                        "coolSetpointRange",
                        "heatSetpointRange",
                        "setpointDifferenceRange",
                        "setFollowSchedule",
                        "setPermanentHold"
                      ],
                      "additionalProperties": false,
                      "description": "An object describing valid states for this HVAC unit."
                    },
                    "location": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "format": "uuid",
                          "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                          "x-format": {
                            "guid": true
                          },
                          "description": "ID of the charging location the HVAC unit is housed at (if any)"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "id",
                    "userId",
                    "vendor",
                    "lastSeen",
                    "isReachable",
                    "consumptionRate",
                    "information",
                    "temperatureState",
                    "thermostatState",
                    "scopes",
                    "capabilities",
                    "location"
                  ],
                  "additionalProperties": false,
                  "example": {
                    "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
                    "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
                    "vendor": "ADAX",
                    "lastSeen": "2020-04-07T17:04:26.000Z",
                    "isReachable": true,
                    "consumptionRate": 1.8,
                    "information": {
                      "brand": "ADAX",
                      "model": "Neo Wi-Fi Skirting",
                      "displayName": "Bedroom Panel Heater",
                      "groupName": "Bedroom",
                      "category": "HEATING"
                    },
                    "location": {
                      "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
                    },
                    "capabilities": {
                      "capableModes": [
                        "HEAT",
                        "COOL",
                        "OFF"
                      ],
                      "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"
                    ]
                  }
                }
              }
            }
          }
        }
      },
      "get": {
        "summary": "Get HVAC Unit",
        "operationId": "getHVAC",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/HvacPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "HVAC unit ID"
                    },
                    "userId": {
                      "type": "string",
                      "description": "The ID of the user that linked this hvac."
                    },
                    "vendor": {
                      "$ref": "#/components/schemas/HvacVendor"
                    },
                    "lastSeen": {
                      "type": "string",
                      "format": "date-time",
                      "description": "The last time Enode successfully communicated with the vendor or when the HVAC unit was initially linked.",
                      "example": "2020-04-07T17:04:26Z"
                    },
                    "isReachable": {
                      "type": "boolean",
                      "description": "Indicates whether Enode can currently access live data from the HVAC. If the HVAC is not reachable, data updates will be delayed."
                    },
                    "consumptionRate": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "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."
                    },
                    "information": {
                      "type": "object",
                      "properties": {
                        "brand": {
                          "$ref": "#/components/schemas/Brand"
                        },
                        "model": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Device model name"
                        },
                        "displayName": {
                          "type": "string",
                          "description": "Name of the device, as set by the user on the device/vendor. If no user-specified name is available, we construct a fallback name using the vendor/device/model names."
                        },
                        "groupName": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Name of the group the device belongs to, as set by the user on the device/vendor. Groups are typically presented as \"rooms\" or \"zones\"."
                        },
                        "category": {
                          "type": "string",
                          "enum": [
                            "HEATING",
                            "COOLING",
                            "HEAT_PUMP",
                            "AGGREGATOR"
                          ],
                          "description": "Classification of the connected HVAC device.\n\n * `HEATING`: A direct heating device, such as an electric panel heater\n\n * `COOLING`: A direct cooling device, such as an air conditioner \n\n * `HEAT_PUMP`: An air-to-air heat pump capable of both heating and cooling\n\n * `AGGREGATOR`: A device that is capable of controlling various HVAC systems behind it, such as a smart thermostat"
                        }
                      },
                      "required": [
                        "brand",
                        "model",
                        "displayName",
                        "groupName",
                        "category"
                      ],
                      "additionalProperties": false,
                      "description": "Descriptive information about the HVAC unit"
                    },
                    "temperatureState": {
                      "type": "object",
                      "properties": {
                        "currentTemperature": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Current air temperature reported by device in degrees Celsius."
                        },
                        "isActive": {
                          "type": "boolean",
                          "description": "Whether the HVAC unit is actively heating or cooling."
                        },
                        "lastUpdated": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "format": "date-time",
                          "description": "Time of last temperature state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer",
                          "example": "2020-04-07T17:04:26Z"
                        }
                      },
                      "required": [
                        "currentTemperature",
                        "isActive",
                        "lastUpdated"
                      ],
                      "additionalProperties": false,
                      "description": "Latest information about temperature. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
                    },
                    "thermostatState": {
                      "type": "object",
                      "properties": {
                        "mode": {
                          "$ref": "#/components/schemas/HvacMode"
                        },
                        "heatSetpoint": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "If mode allows, heat when `currentTemperature` falls below this point."
                        },
                        "coolSetpoint": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "If mode allows, cool when `currentTemperature` rises above this point."
                        },
                        "holdType": {
                          "allOf": [
                            {
                              "$ref": "#/components/schemas/HvacHoldType"
                            },
                            {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "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."
                            }
                          ]
                        },
                        "lastUpdated": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "format": "date-time",
                          "description": "Time of last thermostat state update. Reflects when the OEM reported a change or Enode recorded a change in any field, whichever is newer.",
                          "example": "2020-04-07T17:04:26Z"
                        }
                      },
                      "required": [
                        "mode",
                        "heatSetpoint",
                        "coolSetpoint",
                        "holdType",
                        "lastUpdated"
                      ],
                      "additionalProperties": false,
                      "description": "Latest information about the thermostat state. `null` values indicate we are unable to determine a value for the field based on the information coming from the vendor."
                    },
                    "scopes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Scopes that the user has granted for this HVAC unit.",
                      "example": [
                        "hvac:control:mode",
                        "hvac:read:data"
                      ]
                    },
                    "capabilities": {
                      "type": "object",
                      "properties": {
                        "capableModes": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "items": {
                            "$ref": "#/components/schemas/HvacMode"
                          },
                          "description": "A list of valid modes for this HVAC unit."
                        },
                        "coolSetpointRange": {
                          "$ref": "#/components/schemas/NullableTemperatureRange",
                          "description": "The range of allowable values for `coolSetpoint`."
                        },
                        "heatSetpointRange": {
                          "$ref": "#/components/schemas/NullableTemperatureRange",
                          "description": "The range of allowable values for `heatSetpoint`."
                        },
                        "setpointDifferenceRange": {
                          "$ref": "#/components/schemas/NullableTemperatureDifferenceRange",
                          "description": "A constraint specifying the minimum and maximum allowable difference between `heatSetpoint` and `coolSetpoint`. Only applicable in `AUTO` mode."
                        },
                        "setFollowSchedule": {
                          "$ref": "#/components/schemas/Capability",
                          "description": "Supports following a schedule set on the device."
                        },
                        "setPermanentHold": {
                          "$ref": "#/components/schemas/Capability",
                          "description": "Supports setting a permanent hold."
                        }
                      },
                      "required": [
                        "capableModes",
                        "coolSetpointRange",
                        "heatSetpointRange",
                        "setpointDifferenceRange",
                        "setFollowSchedule",
                        "setPermanentHold"
                      ],
                      "additionalProperties": false,
                      "description": "An object describing valid states for this HVAC unit."
                    },
                    "location": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "format": "uuid",
                          "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                          "x-format": {
                            "guid": true
                          },
                          "description": "ID of the charging location the HVAC unit is housed at (if any)"
                        }
                      },
                      "required": [
                        "id"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "id",
                    "userId",
                    "vendor",
                    "lastSeen",
                    "isReachable",
                    "consumptionRate",
                    "information",
                    "temperatureState",
                    "thermostatState",
                    "scopes",
                    "capabilities",
                    "location"
                  ],
                  "additionalProperties": false,
                  "example": {
                    "id": "8f39fa8d-8f10-4984-a319-741dc23848c0",
                    "userId": "17d9f847-8a1c-4158-adaa-4911a7acd5f9",
                    "vendor": "ADAX",
                    "lastSeen": "2020-04-07T17:04:26.000Z",
                    "isReachable": true,
                    "consumptionRate": 1.8,
                    "information": {
                      "brand": "ADAX",
                      "model": "Neo Wi-Fi Skirting",
                      "displayName": "Bedroom Panel Heater",
                      "groupName": "Bedroom",
                      "category": "HEATING"
                    },
                    "location": {
                      "id": "8d90101b-3f2f-462a-bbb4-1ed320d33bbe"
                    },
                    "capabilities": {
                      "capableModes": [
                        "HEAT",
                        "COOL",
                        "OFF"
                      ],
                      "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"
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/hvacs/actions/{actionId}": {
      "get": {
        "summary": "Get Action",
        "description": "Returns the current state of the requested action.",
        "operationId": "getHvacsAction",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ActionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HvacAction"
                }
              }
            }
          },
          "404": {
            "description": "Action not found."
          }
        }
      }
    },
    "/hvacs/actions/{actionId}/cancel": {
      "post": {
        "summary": "Cancel HVAC Action",
        "description": "Cancels a pending HVAC action, halting any further attempts by Enode to execute it.\n\nNote: 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.",
        "operationId": "cancelHvacAction",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/ActionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HvacAction"
                },
                "example": {
                  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                  "createdAt": "2023-08-01T01:00:00Z",
                  "updatedAt": "2023-08-01T01:00:00Z",
                  "completedAt": "2023-08-01T01:00:00Z",
                  "state": "CANCELLED",
                  "targetId": "f723fed5-73aa-4004-b7f0-89e5173ee15e",
                  "targetType": "hvac",
                  "target": {
                    "coolSetpoint": 21,
                    "mode": "COOL",
                    "holdType": "PERMANENT"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Action not found."
          },
          "409": {
            "description": "Action already in a resolved state.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HvacAction"
                },
                "example": {
                  "id": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
                  "createdAt": "2023-08-01T01:00:00Z",
                  "updatedAt": "2023-08-01T01:00:00Z",
                  "completedAt": "2023-08-01T01:00:00Z",
                  "state": "CONFIRMED",
                  "targetId": "f723fed5-73aa-4004-b7f0-89e5173ee15e",
                  "targetType": "hvac",
                  "target": {
                    "coolSetpoint": 21,
                    "mode": "COOL",
                    "holdType": "PERMANENT"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/hvacs/{hvacId}/follow-schedule": {
      "post": {
        "summary": "Set HVAC unit to follow device schedule",
        "operationId": "postSetHvacFollowSchedule",
        "description": "Tell an HVAC unit to follow the schedule set on the device. Only available if the target's `capabilities.setFollowSchedule.isCapable` is set to `true`. This endpoint can be used to cancel permanent holds. We retry sending the command until the HVAC unit's fields transition to the expected values. Note that this request will complete before any commands are sent to the HVAC unit. You may react to transitions by listening for the `user:vendor-action:updated` webhook event or polling the [HVAC action endpoint](/api/reference#getHvacsAction).",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/HvacPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Resulting HVAC action",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HvacActionFollowSchedule"
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "HVAC unit controlled by an Enode Schedule",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/hvacs/{hvacId}/refresh-hint": {
      "post": {
        "summary": "Refresh HVAC unit data",
        "description": "Use this endpoint to initiate an expedited data refresh for the specified HVAC unit.\n\nNote: 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.  \nThis 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.",
        "operationId": "hvacsRefreshHint",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/HvacPathId"
          }
        ],
        "responses": {
          "204": {
            "description": "Refresh hint registered successfully.",
            "content": {}
          },
          "404": {
            "description": "The specified hvac was not found."
          }
        }
      }
    },
    "/hvacs/{hvacId}/permanent-hold": {
      "post": {
        "summary": "Set HVAC unit Mode as Permanent Hold",
        "operationId": "postSetHvacPermanentHold",
        "description": "Tell an HVAC unit to enter a permanent hold. Only available if the target's `capabilities.setPermanentHold.isCapable` is set to `true`. We retry sending the command until the HVAC unit's `target` field transition to the expected value. Note that this request will complete before any commands are sent to the HVAC unit. You may react to transitions by listening for the `user:vendor-action:updated` webhook event or polling the [HVAC action endpoint](/api/reference#getHvacsAction).",
        "tags": [
          "HVAC"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/HvacPathId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HVACSetPermanentHoldPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resulting action",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HvacActionPermanentHold"
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "HVAC unit controlled by an Enode Schedule",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/inverters": {
      "get": {
        "summary": "List Solar Inverters",
        "operationId": "listInverters",
        "description": "Returns a paginated list of all available Solar Inverters",
        "tags": [
          "Solar inverters"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedInverterList"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}/inverters": {
      "get": {
        "summary": "List User Solar Inverters",
        "operationId": "listUserInverters",
        "tags": [
          "Solar inverters"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedInverterList"
                }
              }
            }
          }
        }
      }
    },
    "/inverters/{inverterId}": {
      "get": {
        "summary": "Get Solar Inverter",
        "operationId": "getInverter",
        "tags": [
          "Solar inverters"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathInverterId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Inverter"
                }
              }
            }
          }
        }
      }
    },
    "/inverters/{inverterId}/refresh-hint": {
      "post": {
        "summary": "Refresh Inverter data",
        "description": "Use this endpoint to initiate an expedited data refresh for the specified inverter.\n\nNote: 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.  \nThis 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.",
        "operationId": "invertersRefreshHint",
        "tags": [
          "Solar inverters"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathInverterId"
          }
        ],
        "responses": {
          "204": {
            "description": "Refresh hint registered successfully.",
            "content": {}
          },
          "404": {
            "description": "The specified inverter was not found."
          }
        }
      }
    },
    "/meters/{meterId}": {
      "get": {
        "summary": "Get Meter",
        "operationId": "getMeter",
        "tags": [
          "Meters",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathMeterId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Meter"
                }
              }
            }
          }
        }
      }
    },
    "/meters/{meterId}/refresh-hint": {
      "post": {
        "summary": "Refresh meter data",
        "description": "Use this endpoint to initiate an expedited data refresh for the specified meter.\n\nNote: 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.  \nThis 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.",
        "operationId": "metersRefreshHint",
        "tags": [
          "Meters",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathMeterId"
          }
        ],
        "responses": {
          "204": {
            "description": "Refresh hint registered successfully.",
            "content": {}
          },
          "404": {
            "description": "The specified meter was not found."
          }
        }
      }
    },
    "/users/{userId}/meters": {
      "get": {
        "summary": "List User Meters",
        "description": "Returns a paginated list of meters for the given userId.",
        "operationId": "listUserMeters",
        "tags": [
          "Meters",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedMeterList"
                }
              }
            }
          }
        }
      }
    },
    "/meters": {
      "get": {
        "summary": "List Meters",
        "operationId": "listMeters",
        "description": "Returns a paginated list of all Meters.",
        "tags": [
          "Meters",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedMeterList"
                }
              }
            }
          }
        }
      }
    },
    "/hem-systems": {
      "get": {
        "summary": "List HEM Systems",
        "operationId": "listHems",
        "description": "Returns a paginated list of all HEM Systems.",
        "tags": [
          "HEM Systems",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedHEMSystemList"
                }
              }
            }
          }
        }
      }
    },
    "/hem-systems/{hemSystemId}": {
      "get": {
        "summary": "Get HEM System by ID",
        "operationId": "getHemsById",
        "description": "Returns a single HEM System by ID.",
        "tags": [
          "HEM Systems",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathHemSystemId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HEMSystem"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}/hem-systems": {
      "get": {
        "summary": "List HEM Systems for User",
        "operationId": "listHemsForUser",
        "description": "Returns a paginated list of all HEM Systems for a specific user.",
        "tags": [
          "HEM Systems",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedHEMSystemList"
                }
              }
            }
          }
        }
      }
    },
    "/hem-systems/{hemSystemId}/refresh-hint": {
      "post": {
        "summary": "Refresh HEM System Status Data",
        "description": "Use this endpoint to initiate an expedited data refresh for the specified HEM System.\n\nNote: 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.  \nThis 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.",
        "operationId": "hemsRefreshHint",
        "tags": [
          "HEM Systems",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathHemSystemId"
          }
        ],
        "responses": {
          "204": {
            "description": "Refresh hint registered successfully.",
            "content": {}
          },
          "404": {
            "description": "The specified HEM System was not found."
          }
        }
      }
    },
    "/hem-systems/{hemSystemId}/statistics": {
      "get": {
        "summary": "Get HEM System Statistics",
        "operationId": "getHemsStatistics",
        "description": "Returns time-bucketed metrics for a specific HEM System, including solar generation, household consumption, grid import/export, battery level, and charge/discharge. \n\nThe endpoint supports querying by DAY (YYYY-MM-DD), MONTH (YYYY-MM), and YEAR (YYYY) intervals from the system’s installation date up to the current date. DAY queries return the most granular available resolution, MONTH queries report daily buckets, and YEAR queries report monthly buckets. All timestamps are localized to the HEM system’s configured timezone. For energy/power series, buckets < 1 hour (e.g., PT5M, PT15M) report average power (kW); buckets ≥ 1 hour report energy (kWh). When data is not available, `isAvailable` will be false with a reason. \n Note: Battery level is only available for DAY interval queries and is reported as state-of-charge (%).",
        "tags": [
          "HEM Systems",
          "Statistics",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PathHemSystemId"
          },
          {
            "schema": {
              "type": "string"
            },
            "required": true,
            "name": "interval",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HemsStats"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statusCode": {
                      "type": "number",
                      "enum": [
                        400
                      ]
                    },
                    "headers": {
                      "type": "object",
                      "properties": {
                        "content-type": {
                          "type": "string",
                          "enum": [
                            "application/problem+json; charset=utf-8"
                          ]
                        }
                      },
                      "required": [
                        "content-type"
                      ]
                    },
                    "body": {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string",
                          "enum": [
                            "Bad Request"
                          ]
                        },
                        "detail": {
                          "type": "string",
                          "description": "Detailed problem description",
                          "example": "Request Interval 2024-01 is before the installation of the HEM system 2025-01-15T00:00:00Z"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ]
                    }
                  },
                  "required": [
                    "statusCode",
                    "headers",
                    "body"
                  ]
                }
              }
            }
          },
          "422": {
            "description": "HEM System Statistics Not Available",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statusCode": {
                      "type": "number",
                      "enum": [
                        422
                      ]
                    },
                    "headers": {
                      "type": "object",
                      "properties": {
                        "content-type": {
                          "type": "string",
                          "enum": [
                            "application/problem+json; charset=utf-8"
                          ]
                        }
                      },
                      "required": [
                        "content-type"
                      ]
                    },
                    "body": {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/hem-system-statistics-not-available"
                          ]
                        },
                        "title": {
                          "type": "string",
                          "enum": [
                            "HEM System Statistics Not Available"
                          ]
                        },
                        "detail": {
                          "type": "string",
                          "description": "Detailed problem description",
                          "example": "Statistics are not available for this HEM System at the requested interval"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ]
                    }
                  },
                  "required": [
                    "statusCode",
                    "headers",
                    "body"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Vendor Temporarily Unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statusCode": {
                      "type": "number",
                      "enum": [
                        503
                      ]
                    },
                    "headers": {
                      "type": "object",
                      "properties": {
                        "content-type": {
                          "type": "string",
                          "enum": [
                            "application/problem+json; charset=utf-8"
                          ]
                        },
                        "retry-after": {
                          "type": "number"
                        }
                      },
                      "required": [
                        "content-type",
                        "retry-after"
                      ]
                    },
                    "body": {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/vendor-temporarily-unavailable"
                          ]
                        },
                        "title": {
                          "type": "string",
                          "enum": [
                            "Vendor Temporarily Unavailable"
                          ]
                        },
                        "detail": {
                          "type": "string",
                          "description": "Detailed problem description",
                          "example": "Vendor timed out. Please try again later."
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ]
                    }
                  },
                  "required": [
                    "statusCode",
                    "headers",
                    "body"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/locations": {
      "get": {
        "summary": "List Locations",
        "operationId": "getLocations",
        "description": "Returns a paginated list of all Locations.",
        "tags": [
          "Locations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedLocationList"
                }
              }
            }
          }
        }
      }
    },
    "/users/{userId}/locations": {
      "get": {
        "summary": "List User Locations",
        "operationId": "getUserlocations",
        "description": "Returns a paginated list of Locations for the given user.",
        "tags": [
          "Locations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedLocationList"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Create Location",
        "description": "Create a Location for a User. Each Location defines a geofence with a 200 m enter radius and a 270 m exit radius. A user's Locations must be at least 200 m apart. The API rejects any new Location whose coordinates fall within the geofence of an existing one.",
        "operationId": "createLocation",
        "tags": [
          "Locations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/UserPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LocationPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/locations/{locationId}": {
      "get": {
        "summary": "Get Location",
        "description": "Fetch a Location.",
        "operationId": "getLocation",
        "tags": [
          "Locations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationResponse"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Delete Location",
        "operationId": "deleteLocation",
        "description": "Delete a Location.",
        "tags": [
          "Locations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "Update Location",
        "operationId": "updateLocation",
        "description": "Updates a Location. Note: the API does not re-validate the minimum distance constraint on update. If you move a Location's coordinates, ensure they remain at least 200 m from any other Location belonging to the same user.",
        "tags": [
          "Locations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PartialLocation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/interventions": {
      "get": {
        "summary": "List Interventions",
        "operationId": "listInterventions",
        "description": "Returns a list of all supported interventions.\n\nThe `language` parameter can be used to specify the language of the resolution title and description.",
        "tags": [
          "Interventions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "enum": [
                "en-US",
                "en-GB",
                "de-DE",
                "fr-FR",
                "es-ES",
                "it-IT",
                "ja-JP",
                "pt-PT",
                "lv-LV",
                "lt-LT",
                "nl-NL",
                "nl-BE",
                "nb-NO",
                "pl-PL",
                "sv-SE",
                "da-DK",
                "fi-FI",
                "ro-RO"
              ],
              "description": "Preferred BCP47 language code - Request translation for the specified language. Falls back to `en-US` if not provided or provided language code is unsupported.",
              "example": "en-GB"
            },
            "required": false,
            "description": "Preferred BCP47 language code - Request translation for the specified language. Falls back to `en-US` if not provided or provided language code is unsupported.",
            "name": "language",
            "in": "query"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/VendorType",
              "description": "Only return interventions for the specified vendor type."
            },
            "required": false,
            "description": "Only return interventions for the specified vendor type.",
            "example": "vehicle",
            "name": "vendorType",
            "in": "query"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/Vendor",
              "description": "Only return interventions for the specified vendor."
            },
            "required": false,
            "description": "Only return interventions for the specified vendor.",
            "example": "VOLKSWAGEN",
            "name": "vendor",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterventionsList"
                }
              }
            }
          }
        }
      }
    },
    "/interventions/{interventionId}": {
      "get": {
        "summary": "Get Intervention",
        "operationId": "getIntervention",
        "description": "Returns a single intervention.\n\nThe `language` parameter can be used to specify the language of the resolution title and description.",
        "tags": [
          "Interventions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/InterventionPathId"
          },
          {
            "schema": {
              "type": "string",
              "enum": [
                "en-US",
                "en-GB",
                "de-DE",
                "fr-FR",
                "es-ES",
                "it-IT",
                "ja-JP",
                "pt-PT",
                "lv-LV",
                "lt-LT",
                "nl-NL",
                "nl-BE",
                "nb-NO",
                "pl-PL",
                "sv-SE",
                "da-DK",
                "fi-FI",
                "ro-RO"
              ],
              "description": "Preferred BCP47 language code - Request translation for the specified language. Falls back to `en-US` if not provided or provided language code is unsupported.",
              "example": "en-GB"
            },
            "required": false,
            "description": "Preferred BCP47 language code - Request translation for the specified language. Falls back to `en-US` if not provided or provided language code is unsupported.",
            "name": "language",
            "in": "query"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/VendorType",
              "description": "Only return interventions for the specified vendor type."
            },
            "required": false,
            "description": "Only return interventions for the specified vendor type.",
            "example": "vehicle",
            "name": "vendorType",
            "in": "query"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/Vendor",
              "description": "Only return interventions for the specified vendor."
            },
            "required": false,
            "description": "Only return interventions for the specified vendor.",
            "example": "VOLKSWAGEN",
            "name": "vendor",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Intervention"
                }
              }
            }
          },
          "404": {
            "description": "Intervention not found."
          }
        }
      }
    },
    "/webhooks": {
      "post": {
        "summary": "Create Webhook",
        "operationId": "createWebhook",
        "description": "Create a webhook.",
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookCreatePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookResponse"
                }
              }
            }
          },
          "400": {
            "description": "Webhook already exists.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookNotValidProblem"
                }
              }
            }
          }
        }
      },
      "get": {
        "summary": "List Webhooks",
        "operationId": "listWebhooks",
        "description": "Returns a paginated list of webhooks.",
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedWebhookList"
                }
              }
            }
          }
        }
      }
    },
    "/webhooks/{webhookId}": {
      "patch": {
        "summary": "Update Webhook",
        "operationId": "updateWebhook",
        "description": "Update a webhook.",
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookUpdatePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookResponse"
                }
              }
            }
          },
          "404": {
            "description": "Webhook not found or already deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookNotFoundProblem"
                }
              }
            }
          }
        }
      },
      "get": {
        "summary": "Get Webhook",
        "operationId": "getWebhook",
        "description": "Returns webhook with the given ID, if it exists.",
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookResponse"
                }
              }
            }
          },
          "404": {
            "description": "Webhook not found or already deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookNotFoundProblem"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Delete Webhook",
        "operationId": "deleteWebhook",
        "description": "Deletes webhook with the given ID, if it exists.",
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookPathId"
          }
        ],
        "responses": {
          "204": {
            "description": "Successfully deleted",
            "content": {}
          },
          "404": {
            "description": "Webhook not found or already deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookNotFoundProblem"
                }
              }
            }
          }
        }
      }
    },
    "/webhooks/{webhookId}/test": {
      "post": {
        "summary": "Test Webhook",
        "operationId": "testWebhook",
        "description": "Send a `enode:webhook:test` payload to the webhook. If the webhook is inactive, it'll be reactivated on success.",
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestWebhook"
                }
              }
            }
          },
          "404": {
            "description": "Webhook not found or already deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookNotFoundProblem"
                }
              }
            }
          }
        }
      }
    },
    "/integrations": {
      "get": {
        "summary": "List supported vendors per asset type",
        "operationId": "getIntegrations",
        "description": "Lists available vendors across asset types. The list of available vendors can be customized in your client. Learn more about [vendors requiring activation](https://developers.enode.io/api/capabilities/vehicles?glossary&value=activation-required).",
        "tags": [
          "Service Health"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "default": "vehicle,charger,hvac,inverter,battery,meter"
            },
            "required": false,
            "name": "assetTypes",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Integration"
                  },
                  "example": [
                    {
                      "vendor": "TESLA",
                      "displayName": "Tesla",
                      "portalName": "Tesla",
                      "status": "READY",
                      "linkingStatus": "READY",
                      "assetTypes": [
                        "battery",
                        "charger",
                        "inverter",
                        "meter",
                        "vehicle"
                      ],
                      "scopes": [
                        "battery:control:operation_mode",
                        "battery:read:data",
                        "battery:read:location",
                        "charger:control:charging",
                        "charger:read:data",
                        "inverter:read:data",
                        "inverter:read:location",
                        "meter:read:data",
                        "meter:read:location",
                        "vehicle:control:charging",
                        "vehicle:read:data",
                        "vehicle:read:location"
                      ]
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/health/chargers": {
      "get": {
        "summary": "Check Available Charger Vendors",
        "operationId": "getHealthChargerVendors",
        "description": "Lists the available charger vendors, including the activated vendors that your client has access to. Learn more about [vendors requiring activation](https://developers.enode.io/api/capabilities/vehicles?glossary&value=activation-required).",
        "tags": [
          "Service Health"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ChargerHealth"
                  },
                  "example": [
                    {
                      "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"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/health/vehicles": {
      "get": {
        "summary": "Check Available Vehicle Vendors",
        "operationId": "getHealthVehicleVendors",
        "description": "Lists the available vehicle vendors, including the activated vendors that your client has access to. Learn more about [vendors requiring activation](https://developers.enode.io/api/capabilities/vehicles?glossary&value=activation-required).",
        "tags": [
          "Service Health"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VehicleHealth"
                  },
                  "example": [
                    {
                      "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"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/health/batteries": {
      "get": {
        "summary": "Check Available Battery Vendors",
        "operationId": "getHealthBatteryVendors",
        "description": "Lists the available battery vendors, including the activated vendors that your client has access to. Learn more about [vendors requiring activation](https://developers.enode.io/api/capabilities/batteries?glossary&value=activation-required).",
        "tags": [
          "Service Health",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BatteryHealth"
                  },
                  "example": [
                    {
                      "vendor": "ENPHASE",
                      "displayName": "Enphase",
                      "portalName": "Enphase",
                      "status": "READY",
                      "linkingStatus": "READY"
                    },
                    {
                      "vendor": "HUAWEI",
                      "displayName": "Huawei",
                      "portalName": "Huawei",
                      "status": "READY",
                      "linkingStatus": "READY"
                    },
                    {
                      "vendor": "TESLA",
                      "displayName": "Tesla",
                      "portalName": "Tesla",
                      "status": "READY",
                      "linkingStatus": "READY"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/health/inverters": {
      "get": {
        "summary": "Check Available Inverter Vendors",
        "operationId": "getHealthInverterVendors",
        "description": "Lists the available inverter vendors, including the activated vendors that your client has access to. Learn more about [vendors requiring activation](https://developers.enode.io/api/capabilities/vehicles?glossary&value=activation-required).",
        "tags": [
          "Service Health"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InverterHealth"
                  },
                  "example": [
                    {
                      "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"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/health/hvacs": {
      "get": {
        "summary": "Check Available Hvac Vendors",
        "operationId": "getHealthHvacVendors",
        "description": "Lists the available HVAC vendors, including the activated vendors that your client has access to. Learn more about [vendors requiring activation](https://developers.enode.io/api/capabilities/vehicles?glossary&value=activation-required).",
        "tags": [
          "Service Health"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HvacHealth"
                  },
                  "example": [
                    {
                      "vendor": "MILL",
                      "displayName": "Mill",
                      "portalName": "Mill",
                      "status": "READY",
                      "linkingStatus": "READY"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/health/meters": {
      "get": {
        "summary": "Check Available Meter Vendors",
        "operationId": "getHealthMeterVendors",
        "description": "Lists the available Meter vendors, including the activated vendors that your client has access to. Learn more about [vendors requiring activation](https://developers.enode.io/api/capabilities/vehicles?glossary&value=activation-required).",
        "tags": [
          "Service Health",
          "Beta"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MeterHealth"
                  },
                  "example": [
                    {
                      "vendor": "TESLA",
                      "displayName": "Tesla",
                      "portalName": "Tesla",
                      "status": "READY",
                      "linkingStatus": "READY"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/health/ready": {
      "get": {
        "summary": "Check Service Readiness",
        "operationId": "getHealthReady",
        "security": [],
        "description": "Gets the combined health status of the service and all functionalities and dependencies.",
        "tags": [
          "Service Health"
        ],
        "responses": {
          "204": {
            "description": "All functionalities are operating nominally.",
            "content": {}
          },
          "503": {
            "description": "At least one functionality of the system is not operating nominally.",
            "content": {}
          }
        }
      }
    },
    "/flex/vehicle-policies": {
      "post": {
        "summary": "Create Policy",
        "operationId": "createFlexPolicy",
        "description": "Create a new Flexible EV Charging Policy, associated with one location and vehicle pair. Only one policy can be created per unique pair of location and vehicle. A Flex Policy cannot be enabled on a vehicle controlled by other Enode features, like Schedules or Smart Charging.\n\nCreating a Flex Policy will first emit a [Flex Policy Created](/api/reference#flexvehicle-policycreated), then a [Flex Policy Status](/api/reference#flexvehicle-policystatus) event as the Policy Status gets re-calculated.",
        "tags": [
          "Flexible EV Charging"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexPolicyPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Policy created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlexPolicy"
                }
              }
            }
          },
          "400": {
            "description": "Invalid policy configuration",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationError"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/invalid-flex-vehicle"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Invalid Flex Vehicle"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/invalid-battery-reserve"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Invalid Battery Reserve"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/invalid-minimum-charge-target"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Invalid Minimum Charge Target"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/target-exceeds-charge-limit"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Target Exceeds Charge Limit"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Vehicle or location not found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          },
          "409": {
            "description": "A policy already exists for this vehicle and location pair.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/duplicate-flex-policy"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Duplicate Flex Policy"
                }
              }
            }
          },
          "422": {
            "description": "Vehicle controlled by a Schedule or has active Smart Charging Plan.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/enode-controlled-entity"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Enode Controlled Entity"
                }
              }
            }
          }
        }
      },
      "get": {
        "summary": "List Policies",
        "operationId": "listFlexPolicies",
        "description": "Lists all Flexible EV Charging Policies, optionally filtered by location and/or user. See our [Pagination documentation](/api/reference#pagination) for information on how to paginate the results.",
        "tags": [
          "Flexible EV Charging"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          },
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              }
            },
            "required": false,
            "name": "locationId",
            "in": "query"
          },
          {
            "schema": {
              "type": "string"
            },
            "required": false,
            "name": "userId",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Policies retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedFlexPolicyList"
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameters",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationError"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/flex/vehicle-policies/{policyId}": {
      "get": {
        "summary": "Get Policy",
        "operationId": "getFlexPolicy",
        "description": "Get a Flexible EV Charging Policy",
        "tags": [
          "Flexible EV Charging"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Policy ID",
              "description": "The ID of the flex policy."
            },
            "required": true,
            "description": "The ID of the flex policy.",
            "name": "policyId",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Policy retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlexPolicy"
                }
              }
            }
          },
          "404": {
            "description": "Policy not found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/flex-policy-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Flex Policy Not Found"
                }
              }
            }
          }
        }
      },
      "patch": {
        "summary": "Update Policy",
        "operationId": "updateFlexPolicy",
        "description": "Performs a partial update of a Flexible EV Charging Policy. The update will first emit a [Flex Policy Updated](/api/reference#flexvehicle-policyupdated) event, then a [Flex Policy Status](/api/reference#flexvehicle-policystatus) event as the Policy Status gets re-calculated.",
        "tags": [
          "Flexible EV Charging"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Policy ID",
              "description": "The ID of the flex policy."
            },
            "required": true,
            "description": "The ID of the flex policy.",
            "name": "policyId",
            "in": "path"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicFlexPolicyUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Policy updated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlexPolicy"
                }
              }
            }
          },
          "400": {
            "description": "Invalid policy update",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationError"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/invalid-battery-reserve"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Invalid Battery Reserve"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/invalid-minimum-charge-target"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Invalid Minimum Charge Target"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/target-exceeds-charge-limit"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Target Exceeds Charge Limit"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Policy not found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/flex-policy-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Flex Policy Not Found"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Delete Policy",
        "operationId": "deleteFlexPolicy",
        "description": "Deletes a Flexible EV Charging Policy. The deletion will first emit a [Flex Policy Deleted](/api/reference#flexvehicle-policydeleted) event, then a [Flex Policy Status](/api/reference#flexvehicle-policystatus) event as the Policy Status gets re-calculated.",
        "tags": [
          "Flexible EV Charging"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Policy ID",
              "description": "The ID of the flex policy."
            },
            "required": true,
            "description": "The ID of the flex policy.",
            "name": "policyId",
            "in": "path"
          }
        ],
        "responses": {
          "204": {
            "description": "Policy deleted"
          },
          "404": {
            "description": "Policy not found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/flex-policy-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Flex Policy Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/locations/{locationId}": {
      "put": {
        "summary": "Set Location Zone",
        "operationId": "setFlexLocationZone",
        "description": "Assign a location to a zone. The zone determines which price signal and optimization context applies to this location.",
        "tags": [
          "Price Signals"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexLocationZonePayload"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Zone assignment accepted.",
            "content": {}
          },
          "400": {
            "description": "Invalid location zone payload.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Location not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/flex/locations/{locationId}/dimensions/{dimensionId}": {
      "put": {
        "summary": "Set Location Dimension Group",
        "operationId": "setFlexLocationDimensionGroup",
        "description": "Assign a location to a group in a Flex Shape segmentation dimension. Dimensions and their groups are configured by Enode and agreed upfront with your organization. A location belongs to at most one group per dimension; assigning a new group replaces the previous assignment, and repeating an assignment is idempotent. Dimensions prefixed with `system:` are managed by Enode and cannot be modified.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          },
          {
            "$ref": "#/components/parameters/FlexShapeDimensionPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexLocationGroupAssignmentPayload"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Group assignment accepted.",
            "content": {}
          },
          "400": {
            "description": "Unknown dimension or group, or the dimension is managed by Enode.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Location not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Clear Location Dimension Group",
        "operationId": "clearFlexLocationDimensionGroup",
        "description": "Remove a location's group assignment for a Flex Shape segmentation dimension.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          },
          {
            "$ref": "#/components/parameters/FlexShapeDimensionPathId"
          }
        ],
        "responses": {
          "204": {
            "description": "Group assignment cleared.",
            "content": {}
          },
          "400": {
            "description": "Unknown dimension, or the dimension is managed by Enode.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Location not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/flex/locations/dimensions/{dimensionId}/assignments": {
      "put": {
        "summary": "Batch Set Location Dimension Groups",
        "operationId": "setFlexLocationDimensionGroups",
        "description": "Assign many locations to groups in one Flex Shape segmentation dimension. Dimensions and their groups are configured by Enode and agreed upfront with your organization. Each location belongs to at most one group per dimension; assigning a new group replaces the previous assignment, and repeating unchanged assignments is idempotent. Locations not included in the request keep their current assignments. The request is applied atomically: validation failures reject the entire batch without partial writes. Dimensions prefixed with `system:` are managed by Enode and cannot be modified.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexShapeDimensionPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexLocationGroupBatchAssignmentPayload"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Batch group assignments accepted.",
            "content": {}
          },
          "400": {
            "description": "Invalid payload, duplicate location, unknown dimension or group, or the dimension is managed by Enode.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "At least one location was not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/flex/locations/{locationId}/dimensions": {
      "get": {
        "summary": "List Location Dimension Groups",
        "operationId": "listFlexLocationDimensionGroups",
        "description": "List the current Flex Shape segmentation dimension group assignments for a location.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Current group assignments for the location.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlexLocationGroupAssignmentsResponse"
                }
              }
            }
          },
          "404": {
            "description": "Location not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/flex/zones/{zoneId}": {
      "get": {
        "summary": "Get Zone",
        "operationId": "getFlexZone",
        "description": "Get a zone by ID. Zones are automatically derived from the market bidding zones of the client's connected vehicles.",
        "tags": [
          "Price Signals"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlexZone"
                }
              }
            }
          },
          "404": {
            "description": "Zone not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/zones": {
      "get": {
        "summary": "List Zones",
        "operationId": "listFlexZones",
        "description": "List all zones where the client has connected vehicles.",
        "tags": [
          "Price Signals"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Successful.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FlexZone"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/flex/price-signals/{zoneId}": {
      "put": {
        "summary": "Push Price Signal",
        "operationId": "pushFlexPriceSignal",
        "description": "Push a price signal for a zone. Replaces all existing data in the window [firstValue.at, to) with the provided values. Each push may trigger re-optimization of all assets in the zone.",
        "tags": [
          "Price Signals"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          },
          {
            "$ref": "#/components/parameters/PriceSignalPushIdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PriceSignalPushPayload"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Price signal accepted. An identical idempotent retry returns the original revision metadata without applying the replacement again.",
            "headers": {
              "ETag": {
                "description": "SHA-256 entity tag for the normalized semantic payload.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Enode-Price-Revision-Id": {
                "description": "Stable Enode revision identifier for the accepted price payload.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "content": {}
          },
          "400": {
            "description": "Invalid request payload, or a currency that does not match the existing price-signal stream.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/price-signal-currency-mismatch"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Price Signal Currency Mismatch"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "The provided Idempotency-Key has already been used with a different semantic payload.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PriceSignalIdempotencyPayloadMismatchProblem"
                }
              }
            }
          }
        }
      },
      "get": {
        "summary": "Get Price Signal",
        "operationId": "getFlexPriceSignal",
        "description": "Retrieve the current price signal for a zone over a time range.",
        "tags": [
          "Price Signals"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          },
          {
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "Start of the time range (UTC).",
              "example": "2024-06-15T00:00:00Z"
            },
            "required": true,
            "description": "Start of the time range (UTC).",
            "name": "from",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "End of the time range (UTC).",
              "example": "2024-06-16T00:00:00Z"
            },
            "required": true,
            "description": "End of the time range (UTC).",
            "name": "to",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful. The `values` array is empty when no price signal exists in the requested window.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PriceSignalResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameters.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Zone not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/shape/{zoneId}": {
      "get": {
        "summary": "Get Flex Shape",
        "operationId": "getFlexShape",
        "description": "Get the flex shape for a zone. Returns the total flexible load forecast — one HTTP request per zone returns everything needed to construct bid curves.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Shape retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlexShape"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request parameters, or the Flex Shape API is not activated for this client.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/zone-not-activated"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Zone Not Activated"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Zone not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      },
      "patch": {
        "summary": "Update Shape Constraints",
        "operationId": "updateFlexShapeConstraints",
        "description": "Apply constraint changes to the flex shape. Sets or clears relative setpoint constraints on individual chunks. Changes take effect on the next shape computation.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexShapeUpdatePayload"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Constraints updated.",
            "content": {}
          },
          "400": {
            "description": "Invalid request parameters, or the Flex Shape API is not activated for this client.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/zone-not-activated"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Zone Not Activated"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Zone not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/shape/{zoneId}/dimensions/{dimensionId}/groups": {
      "get": {
        "summary": "Get Segmented Flex Shape",
        "operationId": "getSegmentedFlexShape",
        "description": "Get the flex shape for a zone segmented by one configured dimension. The response contains one entry per group plus an unassigned bucket for assets that have not been assigned to any group.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          },
          {
            "$ref": "#/components/parameters/FlexShapeDimensionPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Segmented shape retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SegmentedFlexShape"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request parameters, unknown dimension, or the Flex Shape API is not activated for this client.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/zone-not-activated"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Zone Not Activated"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Zone not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/shape/{zoneId}/history": {
      "get": {
        "summary": "Get Flex Shape History",
        "operationId": "getFlexShapeHistory",
        "description": "Get the historical realized fleet load and envelope for a zone over a time range. The realized counterpart to the GET /flex/shape forecast. Pass `groupBy` to segment the realized load by a configured dimension (one entry per group plus an `unassigned` bucket, with membership frozen when each chunk is measured); omit it for the total-only response.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          },
          {
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "Start of the time range (UTC).",
              "example": "2026-03-17T00:00:00Z"
            },
            "required": true,
            "description": "Start of the time range (UTC).",
            "name": "from",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "End of the time range (UTC, exclusive). The range must be 31 days or less.",
              "example": "2026-03-18T00:00:00Z"
            },
            "required": true,
            "description": "End of the time range (UTC, exclusive). The range must be 31 days or less.",
            "name": "to",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "maxLength": 64,
              "pattern": "^[\\w:-]+$",
              "description": "Segment the realized load by a configured dimension. When set, the response is broken down into one entry per group plus an `unassigned` bucket, with membership frozen when each chunk is measured. Customer-configured dimensions snapshot location assignments; `system:asset_composition` snapshots the Enode user's household composition for the EV/EV+solar split. Omit for the total-only response.",
              "example": "region"
            },
            "required": false,
            "description": "Segment the realized load by a configured dimension. When set, the response is broken down into one entry per group plus an `unassigned` bucket, with membership frozen when each chunk is measured. Customer-configured dimensions snapshot location assignments; `system:asset_composition` snapshots the Enode user's household composition for the EV/EV+solar split. Omit for the total-only response.",
            "name": "groupBy",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "History retrieved. The segmented shape is returned when `groupBy` is set, otherwise the total-only shape.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/FlexShapeHistory"
                    },
                    {
                      "$ref": "#/components/schemas/FlexShapeSegmentedHistory"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameters, or the Flex Shape API is not activated for this client.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/zone-not-activated"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Zone Not Activated"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/flex/shape/{zoneId}/preview": {
      "post": {
        "summary": "Preview Shape Update",
        "operationId": "previewFlexShapeUpdate",
        "description": "Preview the effect of constraint changes on the flex shape without persisting them. Returns the shape as it would look after applying the provided chunk updates.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexShapeUpdatePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Preview shape retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlexShape"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request parameters, or the Flex Shape API is not activated for this client.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/zone-not-activated"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Zone Not Activated"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Zone not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/shape/{zoneId}/status": {
      "get": {
        "summary": "Get Flex Status",
        "operationId": "getFlexStatus",
        "description": "Health indicators for a zone. Trading systems use these as circuit-breaker inputs to detect unusual or unpredictable behavior.",
        "tags": [
          "Shape"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/FlexZonePathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Status retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlexShapeStatus"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request parameters, or the Flex Shape API is not activated for this client.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/zone-not-activated"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Zone Not Activated"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Zone not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/vehicle-policies/sessions": {
      "get": {
        "summary": "List Settled Sessions",
        "operationId": "listFlexSessions",
        "description": "Lists settled Flexible EV Charging Sessions, optionally filtered by policy, location, or vehicle. When filtering by `vehicleId`, each real-world charging event appears once — the managed session is returned if one exists, otherwise the unmanaged session. See our [Pagination documentation](/api/reference#pagination) for information on how to paginate the results.",
        "tags": [
          "Flexible EV Charging Sessions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          },
          {
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "Return sessions with a `pluggedInAt` at or after this time.",
              "example": "2020-04-07T17:04:26Z"
            },
            "required": false,
            "description": "Return sessions with a `pluggedInAt` at or after this time.",
            "name": "from",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "Return sessions with a `pluggedOutAt` at or before this time.",
              "example": "2020-04-07T17:04:26Z"
            },
            "required": false,
            "description": "Return sessions with a `pluggedOutAt` at or before this time.",
            "name": "to",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "description": "Filter sessions by policy ID."
            },
            "required": false,
            "description": "Filter sessions by policy ID.",
            "name": "policyId",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "description": "Filter sessions by location ID."
            },
            "required": false,
            "description": "Filter sessions by location ID.",
            "name": "locationId",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "description": "Filter sessions by vehicle ID. Each real-world charging event appears once — the managed session is returned if one exists, otherwise the unmanaged session."
            },
            "required": false,
            "description": "Filter sessions by vehicle ID. Each real-world charging event appears once — the managed session is returned if one exists, otherwise the unmanaged session.",
            "name": "vehicleId",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Sessions retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedSessionList"
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameters",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flex/vehicle-policies/{policyId}/session": {
      "get": {
        "summary": "Get Active Session",
        "operationId": "getActiveFlexSession",
        "description": "Get the current active or upcoming Flexible EV Charging Session for a policy. The session provides real-time visibility into what the system is charging towards (target), whether it will succeed (outcome), the actual charge windows (blocks), and energy delivery data (statistics).",
        "tags": [
          "Flexible EV Charging Sessions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Policy ID",
              "description": "The ID of the vehicle policy."
            },
            "required": true,
            "description": "The ID of the vehicle policy.",
            "name": "policyId",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Session retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActiveOrUpcomingSession"
                }
              }
            }
          },
          "404": {
            "description": "Session not found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/vehicle-policies/{policyId}/sessions/{sessionId}": {
      "get": {
        "summary": "Get Settled Session",
        "operationId": "getFlexSession",
        "description": "Get a settled Flexible EV Charging Session, either managed or unmanaged. The session provides the actual charge windows (blocks), energy delivery data (statistics), and final outcome.",
        "tags": [
          "Flexible EV Charging Sessions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Policy ID",
              "description": "The ID of the vehicle policy."
            },
            "required": true,
            "description": "The ID of the vehicle policy.",
            "name": "policyId",
            "in": "path"
          },
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Session ID",
              "description": "The ID of the session."
            },
            "required": true,
            "description": "The ID of the session.",
            "name": "sessionId",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Session retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SettledSession"
                }
              }
            }
          },
          "404": {
            "description": "Session not found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/sessions/{sessionId}/restriction": {
      "post": {
        "summary": "Create Session Restriction",
        "operationId": "createFlexSessionRestriction",
        "description": "Create a restriction (pause) on an active or upcoming session. The system immediately requests charging to stop and plans charging around the restriction window. If a restriction already exists, the new one replaces it. Creating a restriction while an immediate-start override is active cancels the immediate start.",
        "tags": [
          "Flexible EV Charging Sessions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Session ID",
              "description": "The ID of the session."
            },
            "required": true,
            "description": "The ID of the session.",
            "name": "sessionId",
            "in": "path"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionRestrictionPayload"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Restriction created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionRestrictionResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request parameters or no active or upcoming session",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationError"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/no-active-session"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "No Active or Upcoming Session"
                    }
                  ]
                }
              }
            }
          },
          "423": {
            "description": "Flex policy is temporarily locked",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/flex-policy-locked"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "enum": [
                        "Flex policy locked"
                      ]
                    },
                    "detail": {
                      "type": "string",
                      "enum": [
                        "Another operation is currently updating this Flex policy. Retry after a short delay."
                      ]
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Flex Policy Locked"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Delete Session Restriction",
        "operationId": "deleteFlexSessionRestriction",
        "description": "Remove the active restriction from a session. The optimizer resumes normal scheduling.",
        "tags": [
          "Flexible EV Charging Sessions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Session ID",
              "description": "The ID of the session."
            },
            "required": true,
            "description": "The ID of the session.",
            "name": "sessionId",
            "in": "path"
          }
        ],
        "responses": {
          "204": {
            "description": "Restriction removed"
          },
          "404": {
            "description": "No active restriction found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/restriction-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Restriction Not Found"
                }
              }
            }
          },
          "423": {
            "description": "Flex policy is temporarily locked",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/flex-policy-locked"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "enum": [
                        "Flex policy locked"
                      ]
                    },
                    "detail": {
                      "type": "string",
                      "enum": [
                        "Another operation is currently updating this Flex policy. Retry after a short delay."
                      ]
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Flex Policy Locked"
                }
              }
            }
          }
        }
      }
    },
    "/flex/vehicle-policies/statistics": {
      "get": {
        "summary": "Get Sessions Statistics",
        "operationId": "getFlexSessionsStatistics",
        "description": "Returns the energy delivered by settled Flexible EV Charging Sessions, grouped by `type`, `source`, and `flexibility`, then bucketed over time by `resolution`.\n\nA session falls in the bucket that contains its `sessionEndTime`. Only settled sessions are counted; active and upcoming sessions are excluded.\n\nEach request must set `locationId`, `vehicleId`, or both. A single request can span up to 90 days at `DAY` resolution, or 6 months at `MONTH` resolution.",
        "tags": [
          "Flexible EV Charging Sessions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "Inclusive start of the report window in local time, as an RFC3339 timestamp. Truncated to the bucket boundary: local start of day for `DAY`, local start of month for `MONTH`.",
              "example": "2020-04-07T17:04:26Z"
            },
            "required": true,
            "description": "Inclusive start of the report window in local time, as an RFC3339 timestamp. Truncated to the bucket boundary: local start of day for `DAY`, local start of month for `MONTH`.",
            "name": "startDate",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "date-time",
              "description": "Exclusive end of the report window in local time, as an RFC3339 timestamp. Truncated to the bucket boundary: local start of day for `DAY`, local start of month for `MONTH`.",
              "example": "2020-04-07T17:04:26Z"
            },
            "required": true,
            "description": "Exclusive end of the report window in local time, as an RFC3339 timestamp. Truncated to the bucket boundary: local start of day for `DAY`, local start of month for `MONTH`.",
            "name": "endDate",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "enum": [
                "DAY",
                "MONTH"
              ],
              "default": "DAY",
              "description": "Bucket size for aggregating the report. `DAY` returns one bucket per local day; `MONTH` returns one bucket per local calendar month."
            },
            "required": false,
            "description": "Bucket size for aggregating the report. `DAY` returns one bucket per local day; `MONTH` returns one bucket per local calendar month.",
            "name": "resolution",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "description": "Optionally limit the report to sessions at this location. When provided, the location timezone defines the report buckets."
            },
            "required": false,
            "description": "Optionally limit the report to sessions at this location. When provided, the location timezone defines the report buckets.",
            "name": "locationId",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "description": "Optionally limit the report to sessions for this vehicle. If provided without `locationId`, the vehicle's active Flex Policy determines the location and bucket timezone."
            },
            "required": false,
            "description": "Optionally limit the report to sessions for this vehicle. If provided without `locationId`, the vehicle's active Flex Policy determines the location and bucket timezone.",
            "name": "vehicleId",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Statistics retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionsStatisticsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Returns the `validation-error` problem type when query parameters fail schema validation (wrong type, format, or enum value). Returns the `bad-request` problem type when parameters are valid but violate a business rule, such as exceeding the allowed date range.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationError"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Not found. A referenced `locationId`, `vehicleId`, or active Flex Policy does not exist.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/sessions/{sessionId}/target": {
      "put": {
        "summary": "Set Session Target",
        "operationId": "setFlexSessionTarget",
        "description": "Set or replace the target on an active or upcoming session.\n\nA `REGULAR` target sets a custom charge target and deadline — the system optimizes charging to reach `minimumChargeTarget` by `readyBy`.\n\nAn `IMMEDIATE_START` target forces the vehicle to start charging immediately to `minimumChargeTarget`.\n\nSetting a target replaces any existing override on the session. An `IMMEDIATE_START` target cancels any active restriction.",
        "tags": [
          "Flexible EV Charging Sessions"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "4eaeb363-296d-4ccc-a973-7805e6f400bd",
              "x-format": {
                "guid": true
              },
              "title": "Session ID",
              "description": "The ID of the session."
            },
            "required": true,
            "description": "The ID of the session.",
            "name": "sessionId",
            "in": "path"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionTargetPayload"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Target set"
          },
          "400": {
            "description": "Invalid target configuration",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationError"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/target-exceeds-charge-limit"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Target Exceeds Charge Limit"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/invalid-minimum-charge-target"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Invalid Minimum Charge Target"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "No active or upcoming session found for this session ID",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/no-active-session"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "No Active or Upcoming Session"
                }
              }
            }
          },
          "423": {
            "description": "Flex policy is temporarily locked",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/flex-policy-locked"
                      ]
                    },
                    "title": {
                      "type": "string",
                      "enum": [
                        "Flex policy locked"
                      ]
                    },
                    "detail": {
                      "type": "string",
                      "enum": [
                        "Another operation is currently updating this Flex policy. Retry after a short delay."
                      ]
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Flex Policy Locked"
                }
              }
            }
          }
        }
      }
    },
    "/flex/tariffs": {
      "get": {
        "summary": "List Tariffs",
        "operationId": "listFlexTariffs",
        "description": "List all tariffs. Supports pagination.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedTariffList"
                }
              }
            }
          }
        }
      }
    },
    "/flex/tariffs/{tariffId}": {
      "post": {
        "summary": "Create Tariff",
        "operationId": "createFlexTariff",
        "description": "Create a tariff. The tariff ID is client-provided. If a tariff with the same ID and definition already exists, the existing tariff is returned. A newly created tariff is empty — push rate data separately via the timeseries endpoint.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/TariffPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TariffCreatePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "A tariff with this ID and definition already exists. The existing tariff is returned.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Tariff"
                }
              }
            }
          },
          "201": {
            "description": "Tariff created successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Tariff"
                }
              }
            }
          },
          "409": {
            "description": "A tariff with this ID already exists with a different definition.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/tariff-already-exists"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Tariff Already Exists"
                }
              }
            }
          }
        }
      },
      "get": {
        "summary": "Get Tariff",
        "operationId": "getFlexTariff",
        "description": "Get a tariff by ID.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/TariffPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Tariff"
                }
              }
            }
          },
          "404": {
            "description": "Tariff not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/tariff-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Tariff Not Found"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Delete Tariff",
        "operationId": "deleteFlexTariff",
        "description": "Delete a tariff and all its data. A tariff cannot be deleted if it is referenced by any location's formula.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/TariffPathId"
          }
        ],
        "responses": {
          "204": {
            "description": "Tariff deleted successfully.",
            "content": {}
          },
          "404": {
            "description": "Tariff not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/tariff-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Tariff Not Found"
                }
              }
            }
          },
          "409": {
            "description": "Tariff is referenced by one or more location formulas and cannot be deleted.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/tariff-referenced-by-formulas"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Tariff Referenced By Formulas"
                }
              }
            }
          }
        }
      }
    },
    "/flex/tariffs/{tariffId}/timeseries": {
      "get": {
        "summary": "Get Tariff Timeseries",
        "operationId": "getFlexTariffTimeseries",
        "description": "Get a tariff's rate data as a timeseries over a time range. The from and to parameters are local dates. The timezoneName parameter is required to interpret the date boundaries and annotate response values with UTC offsets. The query range must not exceed 90 days. The response is capped at 51840 values; narrow the range if this limit is exceeded.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/TariffPathId"
          },
          {
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2024-06-15",
              "description": "Start of the time range (local date). The range from `from` to `to` must not exceed 90 days."
            },
            "required": true,
            "description": "Start of the time range (local date). The range from `from` to `to` must not exceed 90 days.",
            "name": "from",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2024-06-15",
              "description": "End of the time range (local date)."
            },
            "required": true,
            "description": "End of the time range (local date).",
            "name": "to",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "maxLength": 64,
              "description": "IANA timezone name. Required to interpret the local time boundaries and annotate response values with UTC offsets.",
              "example": "Europe/Berlin"
            },
            "required": true,
            "description": "IANA timezone name. Required to interpret the local time boundaries and annotate response values with UTC offsets.",
            "name": "timezoneName",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TariffTimeseries"
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameters. Possible reasons: query range exceeds 90 days, invalid date format, or missing required parameters.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Tariff not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/tariff-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Tariff Not Found"
                }
              }
            }
          },
          "422": {
            "description": "The requested range would return too many timeseries points.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/tariff-timeseries-response-too-large"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    },
                    "maxPoints": {
                      "type": "integer",
                      "description": "The maximum number of timeseries points returned.",
                      "example": 51840
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail",
                    "maxPoints"
                  ],
                  "title": "Tariff Timeseries Response Too Large"
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "Push Tariff Timeseries Data",
        "operationId": "pushFlexTariffTimeseries",
        "description": "Push rate data to a tariff. The provided values replace all data in the window [firstValue.at, to). Each value defines a step-function rate from its timestamp until the next value. Values must be strictly ascending by `at`, and the final value's `at` must be before `to`. The first value must be within the current hour or later. Timestamps must be timezone-aware (ISO 8601 with UTC offset). An Idempotency-Key header is required to deduplicate client retries. Completed idempotency records are retained for 24 hours; in-progress locks expire after 3 minutes.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/TariffPathId"
          },
          {
            "$ref": "#/components/parameters/TariffPushIdempotencyKeyHeader"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TariffTimeseriesPushPayload"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Timeseries data replaced successfully.",
            "content": {}
          },
          "400": {
            "description": "Invalid request. Idempotency-Key may be missing/invalid, values must be strictly ascending by timestamp, the final value must be before `to`, at least one value is required, timestamps may be invalid, or the first value is before the current hour.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Tariff not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/tariff-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Tariff Not Found"
                }
              }
            }
          },
          "409": {
            "description": "Conflict. The provided Idempotency-Key is currently in use for an in-flight request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Entity. The provided Idempotency-Key has already been used with a different payload.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/TariffTimeseriesIdempotencyPayloadMismatchProblem"
                }
              }
            }
          },
          "429": {
            "description": "Overwrite budget exceeded. This push would overwrite more existing data points than the 24-hour budget allows.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/TariffOverwriteLimitExceededProblem"
                }
              }
            }
          }
        }
      }
    },
    "/flex/locations/{locationId}/tariff-formula": {
      "get": {
        "summary": "Get Location Tariff Formula",
        "operationId": "getFlexLocationTariffFormula",
        "description": "Get the tariff formula for a location and direction.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/TariffDirection",
              "description": "The energy direction of the formula to retrieve."
            },
            "required": true,
            "description": "The energy direction of the formula to retrieve.",
            "name": "direction",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationTariffFormula"
                }
              }
            }
          },
          "404": {
            "description": "Location or formula not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "Set Location Tariff Formula",
        "operationId": "setFlexLocationTariffFormula",
        "description": "Create or replace the tariff formula for a location and direction. The formula defines how tariffs combine to compute the final rate. The API validates formula syntax, confirms the formula evaluates to a rate (currency/kWh), verifies that the variables map and formula references match, and checks that all referenced tariffs exist and share the same currency and direction.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LocationTariffFormulaPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Formula set successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationTariffFormula"
                }
              }
            }
          },
          "400": {
            "description": "Invalid formula. The formula may have syntax errors, reference non-existent tariffs, have invalid dimensional analysis (e.g., adding a scalar to a rate), or reference tariffs with mismatched currencies or directions.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/bad-request"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Bad Request"
                }
              }
            }
          },
          "404": {
            "description": "Location not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Delete Location Tariff Formula",
        "operationId": "deleteFlexLocationTariffFormula",
        "description": "Delete the tariff formula for a location and direction.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/TariffDirection",
              "description": "The direction of the formula to delete."
            },
            "required": true,
            "description": "The direction of the formula to delete.",
            "name": "direction",
            "in": "query"
          }
        ],
        "responses": {
          "204": {
            "description": "Formula deleted successfully.",
            "content": {}
          },
          "404": {
            "description": "Location or formula not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/formula-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Formula Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/flex/locations/{locationId}/tariffs/resolved": {
      "get": {
        "summary": "Get Resolved Tariffs",
        "operationId": "getFlexResolvedTariffs",
        "description": "Evaluate the location's tariff formula over a time range and return the computed rate at each interval. Interval timestamps include UTC offsets for unambiguous DST handling. Unresolved intervals indicate missing tariff data. The query range must not exceed 90 days. Supports cursor pagination with pageSize, after, and before.",
        "tags": [
          "Tariffs"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/LocationPathId"
          },
          {
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2024-06-15",
              "description": "Start of the time range to resolve (local date). The range from `from` to `to` must not exceed 90 days."
            },
            "required": true,
            "description": "Start of the time range to resolve (local date). The range from `from` to `to` must not exceed 90 days.",
            "name": "from",
            "in": "query"
          },
          {
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2024-06-15",
              "description": "End of the time range to resolve (local date)."
            },
            "required": true,
            "description": "End of the time range to resolve (local date).",
            "name": "to",
            "in": "query"
          },
          {
            "schema": {
              "$ref": "#/components/schemas/TariffDirection",
              "description": "The energy direction to resolve."
            },
            "required": true,
            "description": "The energy direction to resolve.",
            "name": "direction",
            "in": "query"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResolvedTariff"
                }
              }
            }
          },
          "400": {
            "description": "Invalid query parameters.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/bad-request"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Bad Request"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "https://developers.enode.com/api/problems/stale-formula-references"
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "detail": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "title",
                        "detail"
                      ],
                      "title": "Stale Formula References"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Location not found or no formula configured for the specified direction.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "https://developers.enode.com/api/problems/formula-not-found"
                      ]
                    },
                    "title": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "type",
                    "title",
                    "detail"
                  ],
                  "title": "Formula Not Found"
                }
              }
            }
          }
        }
      }
    },
    "/solar-configurations": {
      "post": {
        "summary": "Create Solar Configuration",
        "description": "Create a Solar Configuration for a given location. A location may have multiple Solar Configurations to represent individual arrays of panels (for example, varying azimuths or tilt).",
        "operationId": "createSolarConfiguration",
        "tags": [
          "Solar Configurations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicSolarConfigurationPayload"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SolarConfigurationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Location does not belong to user"
          },
          "404": {
            "description": "User or location not found"
          },
          "409": {
            "description": "A solar configuration with the same parameters already exists"
          }
        }
      },
      "get": {
        "summary": "List Solar Configurations",
        "description": "Returns a paginated list of all Solar Configurations.",
        "operationId": "listSolarConfigurations",
        "tags": [
          "Solar Configurations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/PaginationQueryAfter"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryBefore"
          },
          {
            "$ref": "#/components/parameters/PaginationQueryPageSize"
          },
          {
            "$ref": "#/components/parameters/SolarConfigurationListQueryUserId"
          },
          {
            "$ref": "#/components/parameters/SolarConfigurationListQueryLocationId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedSolarConfigurationList"
                }
              }
            }
          },
          "400": {
            "description": "Invalid pagination parameters",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/solar-configurations/{solarConfigurationId}": {
      "get": {
        "summary": "Get Solar Configuration",
        "description": "Get a Solar Configuration by ID.",
        "operationId": "getSolarConfiguration",
        "tags": [
          "Solar Configurations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/SolarConfigurationPathId"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SolarConfigurationResponse"
                }
              }
            }
          },
          "404": {
            "description": "Solar configuration not found"
          }
        }
      },
      "patch": {
        "summary": "Update Solar Configuration",
        "description": "Update a Solar Configuration by ID.",
        "operationId": "updateSolarConfiguration",
        "tags": [
          "Solar Configurations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/SolarConfigurationPathId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicSolarConfigurationUpdatePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SolarConfigurationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Solar configuration not found"
          }
        }
      },
      "delete": {
        "summary": "Delete Solar Configuration",
        "description": "Delete a Solar Configuration by ID.",
        "operationId": "deleteSolarConfiguration",
        "tags": [
          "Solar Configurations"
        ],
        "security": [
          {
            "ClientAccessToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/SolarConfigurationPathId"
          }
        ],
        "responses": {
          "204": {
            "description": "Successfully deleted"
          },
          "404": {
            "description": "Solar configuration not found"
          }
        }
      }
    }
  },
  "webhooks": {
    "user:vehicle:discovered": {
      "post": {
        "summary": "user:vehicle:discovered",
        "operationId": "user:vehicle:discovered",
        "description": "Occurs whenever a new vehicle is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserVehicleDiscovered"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:vehicle:updated": {
      "post": {
        "summary": "user:vehicle:updated",
        "operationId": "user:vehicle:updated",
        "description": "Occurs whenever a vehicle's properties are updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserVehicleUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:vehicle:deleted": {
      "post": {
        "summary": "user:vehicle:deleted",
        "operationId": "user:vehicle:deleted",
        "description": "Occurs whenever a vehicle is deleted. The payload reflects the last known state of the asset before deletion.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserVehicleDeleted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:charger:discovered": {
      "post": {
        "summary": "user:charger:discovered",
        "operationId": "user:charger:discovered",
        "description": "Occurs whenever a new charger is discovered for a user.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserChargerDiscovered"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:charger:updated": {
      "post": {
        "summary": "user:charger:updated",
        "operationId": "user:charger:updated",
        "description": "Occurs whenever a charger is updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserChargerUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:charger:deleted": {
      "post": {
        "summary": "user:charger:deleted",
        "operationId": "user:charger:deleted",
        "description": "Occurs whenever a charger is deleted. The payload reflects the last known state of the asset before deletion.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserChargerDeleted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:hvac:discovered": {
      "post": {
        "summary": "user:hvac:discovered",
        "operationId": "user:hvac:discovered",
        "description": "Occurs whenever a new HVAC is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserHvacDiscovered"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:hvac:updated": {
      "post": {
        "summary": "user:hvac:updated",
        "operationId": "user:hvac:updated",
        "description": "Occurs whenever an HVAC's properties are updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserHvacUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:hvac:deleted": {
      "post": {
        "summary": "user:hvac:deleted",
        "operationId": "user:hvac:deleted",
        "description": "Occurs whenever an HVAC is deleted. The payload reflects the last known state of the asset before deletion.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserHvacDeleted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:inverter:discovered": {
      "post": {
        "summary": "user:inverter:discovered",
        "operationId": "user:inverter:discovered",
        "description": "Occurs whenever a new inverter is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserInverterDiscovered"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:inverter:updated": {
      "post": {
        "summary": "user:inverter:updated",
        "operationId": "user:inverter:updated",
        "description": "Occurs whenever an inverter's properties are updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserInverterUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:inverter:deleted": {
      "post": {
        "summary": "user:inverter:deleted",
        "operationId": "user:inverter:deleted",
        "description": "Occurs whenever an inverter is deleted. The payload reflects the last known state of the asset before deletion.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserInverterDeleted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:inverter:statistics-updated": {
      "post": {
        "summary": "user:inverter:statistics-updated",
        "operationId": "user:inverter:statistics-updated",
        "description": "Occurs whenever inverter statistics are updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserInverterStatisticsUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:battery:discovered": {
      "post": {
        "summary": "user:battery:discovered",
        "operationId": "user:battery:discovered",
        "description": "Occurs whenever a new battery is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserBatteryDiscovered"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:battery:updated": {
      "post": {
        "summary": "user:battery:updated",
        "operationId": "user:battery:updated",
        "description": "Occurs whenever a battery's properties are updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserBatteryUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:battery:deleted": {
      "post": {
        "summary": "user:battery:deleted",
        "operationId": "user:battery:deleted",
        "description": "Occurs whenever a battery is deleted. The payload reflects the last known state of the asset before deletion.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserBatteryDeleted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:meter:discovered": {
      "post": {
        "summary": "user:meter:discovered",
        "operationId": "user:meter:discovered",
        "description": "Occurs whenever a new meter is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserMeterDiscovered"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:meter:updated": {
      "post": {
        "summary": "user:meter:updated",
        "operationId": "user:meter:updated",
        "description": "Occurs whenever a meter's properties are updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserMeterUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:meter:deleted": {
      "post": {
        "summary": "user:meter:deleted",
        "operationId": "user:meter:deleted",
        "description": "Occurs whenever a meter is deleted. The payload reflects the last known state of the asset before deletion.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserMeterDeleted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:credentials:invalidated": {
      "post": {
        "summary": "user:credentials:invalidated",
        "operationId": "user:credentials:invalidated",
        "description": "Occurs whenever the connection needs to be relinked.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserCredentialsInvalidated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:vendor-action:updated": {
      "post": {
        "summary": "user:vendor-action:updated",
        "operationId": "user:vendor-action:updated",
        "description": "Occurs whenever an action changes state.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserActionUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "system:heartbeat": {
      "post": {
        "summary": "system:heartbeat",
        "operationId": "system:heartbeat",
        "description": "Occurs whenever a system heartbeat event is triggered.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SystemHeartbeat"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "enode:webhook:test": {
      "post": {
        "summary": "enode:webhook:test",
        "operationId": "enode:webhook:test",
        "description": "Occurs whenever a webhook test event is triggered.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookTest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:hem-system:discovered": {
      "post": {
        "summary": "user:hem-system:discovered",
        "operationId": "user:hem-system:discovered",
        "description": "Occurs whenever a new HEM System is discovered for a user. Only `information` properties will be populated. All other properties will be `null`. Shortly after discovery, you'll receive an `:updated` event that contains additional data.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserHEMSystemDiscovered"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:hem-system:updated": {
      "post": {
        "summary": "user:hem-system:updated",
        "operationId": "user:hem-system:updated",
        "description": "Occurs whenever a HEM System's properties are updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserHEMSystemUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "user:hem-system:deleted": {
      "post": {
        "summary": "user:hem-system:deleted",
        "operationId": "user:hem-system:deleted",
        "description": "Occurs whenever a HEM System is deleted. The payload reflects the last known state of the asset before deletion.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserHEMSystemDeleted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "flex:vehicle-policy:created": {
      "post": {
        "summary": "flex:vehicle-policy:created",
        "operationId": "flex:vehicle-policy:created",
        "description": "Occurs whenever a Flex vehicle policy is created.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexVehiclePolicyCreated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "flex:vehicle-policy:updated": {
      "post": {
        "summary": "flex:vehicle-policy:updated",
        "operationId": "flex:vehicle-policy:updated",
        "description": "Occurs whenever a Flex vehicle policy is updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexVehiclePolicyUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "flex:vehicle-policy:deleted": {
      "post": {
        "summary": "flex:vehicle-policy:deleted",
        "operationId": "flex:vehicle-policy:deleted",
        "description": "Occurs whenever a Flex vehicle policy is deleted.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexVehiclePolicyDeleted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "flex:vehicle-policy:status": {
      "post": {
        "summary": "flex:vehicle-policy:status",
        "operationId": "flex:vehicle-policy:status",
        "description": "Occurs whenever a Flex vehicle policy's status is updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexVehiclePolicyStatusUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "flex:session:updated": {
      "post": {
        "summary": "flex:session:updated",
        "operationId": "flex:session:updated",
        "description": "Occurs whenever a Flex charging session is updated.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexSessionUpdated"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    },
    "flex:tariff-coverage:alert": {
      "post": {
        "summary": "flex:tariff-coverage:alert",
        "operationId": "flex:tariff-coverage:alert",
        "description": "Occurs when tariff data coverage gaps are detected that may affect Flex optimization.",
        "security": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlexTariffCoverageAlert"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscriber should return 200 OK to acknowledge the webhook has been received"
          }
        }
      }
    }
  }
}