ev.energy v2 API

The official ev.energy v2 REST API. 210 operations across 180 paths covering users, vehicles, EVSEs, charging sessions, schedules, tariffs, regions, solar, solar forecasts, home batteries, boundary meters, CT clamps, HEM systems, sites, carbon intensity, grid data, programs, rebates, subscriptions, notifications, support tickets and VPP dispatch. OAuth 2.0 (authorization code with PKCE, and client credentials) with 35 fine-grained scopes; RFC 9457 problem-details errors; RFC 5988 Link-header pagination; ULID-prefixed resource IDs.

Documentation

Specifications

Other Resources

OpenAPI Specification

ev-energy-api-v2-openapi.yaml Raw ↑
openapi: 3.1.0
x-redocly:
  openapi:
    hideSchemaTitles: true
info:
  title: ev.energy v2 API
  version: '2.0'
  contact:
    email: developers@ev.energy
    url: developers.ev.energy
    name: ev.energy developers
  description: The official API for ev.energy, version 2.
  license:
    name: Proprietary
    url: https://ev.energy
  termsOfService: ''
servers:
  - url: https://api.ev.energy/v2
    description: Live API for both production and sandbox requests.
    x-internal: false
  - description: Staging server for internal testing only.
    url: https://api-staging.ev.energy/v2
    x-internal: true
paths:
  /:
    get:
      summary: API root
      description: Get links to resources accessible in the API.
      operationId: get-root
      responses:
        '200':
          description: Returns a list of all top-level collection URLs in the API.
          content:
            application/json:
              schema:
                type: object
                properties:
                  users:
                    type: string
                    format: uri
                  carbon_feeds:
                    type: string
                    format: uri
                  evses:
                    type: string
                    format: uri
                  evse_models:
                    type: string
                    format: uri
                  evse_makes:
                    type: string
                    format: uri
                  vehicles:
                    type: string
                    format: uri
                  vehicle_trims:
                    type: string
                    format: uri
                  vehicle_models:
                    type: string
                    format: uri
                  vehicle_makes:
                    type: string
                    format: uri
                  suppliers:
                    type: string
                    format: uri
                  tariffs:
                    type: string
                    format: uri
                  support_tickets:
                    type: string
                    format: uri
                  dispatch_coordinators:
                    type: string
                    format: uri
                  grid_feeds:
                    type: string
                    format: uri
              examples:
                Example:
                  value:
                    users: https://api.ev.energy/v2/users/
                    carbon_feeds: https://api.ev.energy/v2/carbon_feeds/
                    evses: https://api.ev.energy/v2/evses/
                    evse_models: https://api.ev.energy/v2/evse_models/
                    evse_makes: https://api.ev.energy/v2/evse_makes/
                    vehicles: https://api.ev.energy/v2/vehicles/
                    vehicle_trims: https://api.ev.energy/v2/vehicle_trims/
                    vehicle_models: https://api.ev.energy/v2/vehicle_models/
                    vehicle_makes: https://api.ev.energy/v2/vehicle_makes/
                    suppliers: https://api.ev.energy/v2/suppliers/
                    tariffs: https://api.ev.energy/v2/tariffs/
                    support_tickets: https://api.ev.energy/v2/support_tickets/
                    dispatch_coordinators: https://api.ev.energy/v2/dispatch_coordinators/
                    grid_feeds: https://api.ev.energy/v2/grid_feeds/
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      security: []
      parameters:
        - $ref: '#/components/parameters/version-2'
      tags:
        - Root
  /users:
    get:
      summary: List users
      tags:
        - Users
      responses:
        '200':
          description: Returns a list of Users.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
          headers:
            Link:
              $ref: '#/components/headers/link'
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
        '400':
          $ref: '#/components/responses/Problem400BadRequestList'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: get-users
      description: List all the users that the authorization token has access to.
      parameters:
        - $ref: '#/components/parameters/previous'
        - $ref: '#/components/parameters/next'
        - $ref: '#/components/parameters/page_size'
        - $ref: '#/components/parameters/expand-on-user'
        - $ref: '#/components/parameters/email'
        - $ref: '#/components/parameters/version-2'
        - $ref: '#/components/parameters/user'
      security:
        - oauth2:
            - user:read
    post:
      summary: Create user
      tags:
        - Users
      responses:
        '201':
          description: User Created Successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: post-users
      security:
        - oauth2:
            - user:write
      description: Create an individual user in the ev.energy system.
      parameters:
        - $ref: '#/components/parameters/version-2'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/User'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/User'
  /users/{user_id}:
    parameters:
      - $ref: '#/components/parameters/user_id'
    get:
      summary: Retrieve user
      description: Retrieve information about a single, specific user.
      tags:
        - Users
      responses:
        '200':
          description: Returns a single User.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: get-users-user_id
      parameters:
        - $ref: '#/components/parameters/expand-on-user'
        - $ref: '#/components/parameters/version-2'
      security:
        - oauth2:
            - user:read
    patch:
      summary: Update User
      tags:
        - Users
      responses:
        '200':
          description: User updated successfully.
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: patch-users-user_id
      security:
        - oauth2:
            - user:write
      description: Update user information.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/User'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/User'
      parameters:
        - $ref: '#/components/parameters/version-2'
        - $ref: '#/components/parameters/expand-on-user'
  /users/{user_id}/notification_preferences:
    parameters:
      - $ref: '#/components/parameters/user_id'
    get:
      summary: Retrieve user notification preferences
      description: >-
        Retrieve the set of notification groups the user is currently subscribed
        to.
      tags:
        - Users
      responses:
        '200':
          description: Returns the user's notification preferences.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserNotificationPreferences'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: get-users-user_id-notification_preferences
      parameters:
        - $ref: '#/components/parameters/version-2'
      security:
        - oauth2:
            - notification_preferences:read
    patch:
      summary: Update user notification preferences
      description: |-
        Update the user's notification group opt-in state.

        The `groups` object is treated as a partial map: only the keys you
        include are modified. Keys you omit are left untouched. This means
        clients only need to send the groups they want to change, and adding
        new groups to the API in the future cannot accidentally clobber an
        old client's silence on them.

        `PATCH {}` and `PATCH {"groups": {}}` are valid no-ops. Unknown group
        names produce a `400`.
      tags:
        - Users
      responses:
        '200':
          description: Notification preferences updated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserNotificationPreferences'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
        '400':
          $ref: >-
            #/components/responses/Problem400UpdateNotificationPreferencesValidationFailed
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: patch-users-user_id-notification_preferences
      security:
        - oauth2:
            - notification_preferences:write
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserNotificationPreferences'
      parameters:
        - $ref: '#/components/parameters/version-2'
  /users/{user_id}/route_planner_preferences:
    parameters:
      - $ref: '#/components/parameters/user_id'
    get:
      summary: Retrieve route planner preferences
      description: |-
        Retrieve the user's EV Route Planner preferences (default vehicle,
        en-route minimum charger power, and default arrival battery floor).

        A preferences row is created with defaults on first access, so this
        never 404s for an existing, accessible user.
      tags:
        - Users
      operationId: get-users-user_id-route_planner_preferences
      responses:
        '200':
          description: Returns the user's route planner preferences.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RoutePlannerPreferences'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      parameters:
        - $ref: '#/components/parameters/version-2'
      security:
        - oauth2:
            - route_planner_preferences:read
    patch:
      summary: Update route planner preferences
      description: |-
        Update the user's EV Route Planner preferences.

        The body is treated as a partial map: only the keys you include are
        modified, omitted keys are left untouched. `PATCH {}` is a valid no-op.
        `preferred_vehicle` accepts a vehicle URL or `null`;
        `min_charger_power_watts` accepts one of
        `22000, 50000, 100000, 150000, 250000` or `null`.
      tags:
        - Users
      operationId: patch-users-user_id-route_planner_preferences
      responses:
        '200':
          description: Route planner preferences updated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RoutePlannerPreferences'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
        '400':
          $ref: >-
            #/components/responses/Problem400UpdateRoutePlannerPreferencesValidationFailed
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      security:
        - oauth2:
            - route_planner_preferences:write
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RoutePlannerPreferencesUpdate'
      parameters:
        - $ref: '#/components/parameters/version-2'
  /vehicles/{vehicle_id}/connectors:
    parameters:
      - $ref: '#/components/parameters/vehicle_id'
    get:
      summary: Retrieve a vehicle's charging connectors
      description: |-
        Retrieve the vehicle's DC-fast charging connectors: its native plug and
        any adapters it carries. `native_connector` is the per-vehicle value,
        falling back to the vehicle model's default when not overridden (both
        may be null when not yet known).
      tags:
        - Vehicles
      responses:
        '200':
          description: Returns the vehicle's connector configuration.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VehicleConnectors'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: get-vehicles-vehicle_id-connectors
      parameters:
        - $ref: '#/components/parameters/version-2'
      security:
        - oauth2:
            - vehicle:read
    patch:
      summary: Update a vehicle's charging connectors
      description: |-
        Update the vehicle's connectors. The body is a partial map: only the
        keys you include are changed. Set `native_connector` to override the
        model default for this vehicle, or `null` to inherit it. `adaptors`
        replaces the adapter list (send `[]` to clear); adaptors must be
        distinct and must not include the native connector. `PATCH {}` is a
        valid no-op.
      tags:
        - Vehicles
      responses:
        '200':
          description: Connectors updated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VehicleConnectors'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
        '400':
          $ref: >-
            #/components/responses/Problem400UpdateVehicleConnectorsValidationFailed
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: patch-vehicles-vehicle_id-connectors
      security:
        - oauth2:
            - vehicle:write
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VehicleConnectorsUpdate'
      parameters:
        - $ref: '#/components/parameters/version-2'
  /vehicles/{vehicle_id}/state_of_charge:
    parameters:
      - $ref: '#/components/parameters/vehicle_id'
    get:
      summary: Retrieve a vehicle's current state of charge
      description: |-
        Retrieve the vehicle's current battery percentage used to seed route
        plans. `source` indicates where the value came from: `MANUAL` when the
        driver entered it, or `CONNECTED` when it comes from the vehicle's
        telemetry. All fields are null when no value is available.
      tags:
        - Vehicles
      responses:
        '200':
          description: Returns the vehicle's current state of charge.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VehicleStateOfCharge'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: get-vehicles-vehicle_id-state_of_charge
      parameters:
        - $ref: '#/components/parameters/version-2'
      security:
        - oauth2:
            - vehicle:read
    patch:
      summary: Update a vehicle's current state of charge
      description: |-
        Set the vehicle's current battery percentage (Mode-1 manual entry). The
        body is a partial map: `PATCH {}` is a valid no-op. Send
        `state_of_charge_percentage: null` to clear it. `source` is read-only.
      tags:
        - Vehicles
      responses:
        '200':
          description: State of charge updated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VehicleStateOfCharge'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
        '400':
          $ref: >-
            #/components/responses/Problem400UpdateVehicleStateOfChargeValidationFailed
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
      operationId: patch-vehicles-vehicle_id-state_of_charge
      security:
        - oauth2:
            - vehicle:write
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VehicleStateOfChargeUpdate'
      parameters:
        - $ref: '#/components/parameters/version-2'
  /auth/password_reset:
    post:
      summary: Request a password reset email
      description: |-
        Request a password reset email for the account with the supplied
        email address. The response status and body are identical whether
        or not an account exists for the email; clients must not treat the
        success response as confirmation that an account exists.
      tags:
        - Auth
      operationId: post-auth-password_reset
      security: []
      parameters:
        - $ref: '#/components/parameters/version-2'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PasswordResetRequest'
      responses:
        '200':
          description: Reset email request accepted.
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PasswordResetResult'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '422':
          $ref: '#/components/responses/Problem422PasswordResetValidationFailed'
        '429':
          $ref: '#/components/responses/Problem429TooManyRequests'
  /evse_compatibility/check:
    get:
      summary: Check EVSE model compatibility in a country
      description: |-
        Returns whether the given `EVSEModel` is supported in the supplied
        country, and whether the support is `beta` (early-access) or live.
        Used by the onboarding flow to tell the user upfront whether their
        hardware will work before any account-linking step.

        Public endpoint — callable pre-account, no authentication required.

        Country resolution follows this order: explicit `country` query
        parameter, then the `Accept-Language` header, then `US`.

        When `program_id` is supplied, program membership is applied as an
        additional filter on top of the global compatibility check: the
        model must be in the program's `supported_evse_models` list AND
        pass the global region + `EvseCompatibility` check. Region is
        derived from the program's country, so the `country` query
        parameter and `Accept-Language` header are ignored in that case.

        Error responses follow RFC 9457 Problem Details. Problem types
        emitted by this endpoint:

        - `validation-failed-evse-compatibility-check` — missing or
          invalid `evse_model_id` / `country` query parameter (`400`).
        - `evse-model-not-found` — `evse_model_id` does not resolve to
          an `EVSEModel` (`404`).
        - `program-not-found` — `program_id` does not resolve to a
          program (`404`).
      tags:
        - EVSEs
      operationId: get-evse_compatibility-check
      parameters:
        - $ref: '#/components/parameters/version-2'
        - name: evse_model_id
          in: query
          required: true
          description: '`EVSEModel.uid` to check compatibility for.'
          schema:
            type: string
            pattern: emod[A-Z\d]{26}
        - name: country
          in: query
          required: false
          description: ISO-3166 alpha-2 country code. See description for fallback chain.
          schema:
            type: string
            pattern: ^[A-Za-z]{2}$
            minLength: 2
            maxLength: 2
        - $ref: '#/components/parameters/Accept-Language'
        - name: client_id
          in: query
          required: false
          description: |-
            OAuth `Application.client_id`. Mirrors the pre-account
            onboarding endpoints: when supplied and the application has
            sandbox mode enabled, the endpoint returns a canned response
            without touching the database.
          schema:
            type: string
        - name: program_id
          in: query
          required: false
          description: |-
            Program uid. When supplied, the model must be in the
            program's `supported_evse_models` list AND pass the global
            region + `EvseCompatibility` check. Region is derived from
            the program's country; `country` and `Accept-Language` are
            ignored in that case. Omit for the core app's pre-account
            flow where the program is not yet known.
          schema:
            type: string
            pattern: prog[A-Z\d]{26}
      responses:
        '200':
          description: Compatibility verdict for the supplied model and country.
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EVSECompatibilityCheckResult'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
      security: []
  /users/{user_id}/payout_method:
    parameters:
      - $ref: '#/components/parameters/user_id'
    get:
      summary: Retrieve payout method
      description: |
        Retrieve the user's preferred payout method. Returns null fields when
        the user has not set up a payout method.
      tags:
        - Users
      operationId: get-users-user_id-payout-method
      responses:
        '200':
          description: Returns the user's payout method.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PayoutMethod'
          headers:
            EvEnergy-Version:
              $ref: '#/components/headers/version-2'
            X-RateLimit-Limit:
              $ref: '#/components/headers/x-ratelimit-limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/x-ratelimit-remaining'
            RetryAfter:
              $ref: '#/components/headers/retry-after'
        '400':
          $ref: '#/components/responses/Problem400BadRequestRetrieve'
        '401':
          $ref: '#/components/responses/Problem401Unauthorized'
        '403':
          $ref: '#/components/responses/Problem403Forbidden'
        '404':
          $ref: '#/components/responses/Problem404NotFound'
        '405':
          $ref: '#/components/responses/Problem405MethodNotAllowed'
        '406':
          $ref: '#/components/responses/Problem406NotAcceptable'
        '429':
          $ref: '#/compon

# --- truncated at 32 KB (767 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/ev-energy/refs/heads/main/openapi/ev-energy-api-v2-openapi.yaml