Axle Energy 3. Sites API

Register your sites with Axle; configure market participation

Operations 20

GET /entities/site Get Sites #
POST /entities/site Create Site #
POST /entities/site/initialise Initialise Site #
POST /entities/site/check-eligibility Check Eligibility #
POST /entities/site/{site_id}/enrol Enrol Site #
POST /entities/site/onboard Onboard #
POST /entities/site/{site_id}/unenrol Unenrol Site #
POST /entities/site/onboard-site-and-asset Onboard Site And Asset #
POST /entities/site/{site_id}/offboard-site-and-assets Offboard Site And Assets #
GET /entities/site/{site_id} Get Site #
DELETE /entities/site/{site_id} Delete Site #
PATCH /entities/site/{site_id} Update Site #
GET /entities/site/{site_id}/eligibility Get Site Eligibility #
POST /entities/site/{site_id}/meter-consent Add Site Meter Consent #
POST /entities/site/{site_id}/dispatch-consent Add Site Dispatch Consent #
POST /entities/site/{site_id}/dispatch-deconsent Remove Site Dispatch Consent #
POST /entities/site/{site_id}/token Add Site Auth Token #
GET /entities/site/{site_id}/flex-events Get Site Flex Events #
GET /entities/site/{site_id}/price-curve Get Price Curve #
GET /entities/site/{site_id}/oauth/{provider}/initiate Initiate Site Oauth #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/axle-energy-3-sites-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

axle-energy-3-sites-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Axle 1. Authentication 3. Sites API
  description: For full documentation please see our official docs at <a href='http://docs.axle.energy'>docs.axle.energy</a>
  version: 1.4.6
servers:
- url: https://api.axle.energy
tags:
- name: 3. Sites
  description: Register your sites with Axle; configure market participation
paths:
  /entities/site:
    get:
      tags:
      - 3. Sites
      summary: Get Sites
      description: 'Retrieve sites, optionally filtering by MPAN or postcode.


        Returns a page of sites with the total count and the requested subset of site records. Use the limit and offset parameters to navigate through pages of results.'
      operationId: get_sites_entities_site_get
      parameters:
      - description: Filter sites by MPAN
        required: false
        schema:
          type: string
          title: Mpan
          description: Filter sites by MPAN
        name: mpan
        in: query
      - description: Filter sites by postcode
        required: false
        schema:
          type: string
          title: Postcode
          description: Filter sites by postcode
        name: postcode
        in: query
      - description: Maximum number of sites to return (1-5000)
        required: false
        schema:
          type: integer
          maximum: 5000.0
          minimum: 1.0
          title: Limit
          description: Maximum number of sites to return (1-5000)
          default: 10
        name: limit
        in: query
      - description: Number of sites to skip for pagination
        required: false
        schema:
          type: integer
          minimum: 0.0
          title: Offset
          description: Number of sites to skip for pagination
          default: 0
        name: offset
        in: query
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteResponsePage'
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
    post:
      tags:
      - 3. Sites
      summary: Create Site
      description: 'Register a new site.


        The site must have a valid address and postcode. If a site with the same address already exists, a 409 error will be returned with the existing site ID.'
      operationId: create_site_entities_site_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteResponse'
        '400':
          description: Invalid request or site already exists
        '404':
          description: Referenced entity not found
        '409':
          description: Site with same address already exists
        '422':
          description: Unprocessable Content
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorWithDetail'
        '500':
          description: Internal server error
      security:
      - OAuth2PasswordBearer: []
  /entities/site/initialise:
    post:
      tags:
      - 3. Sites
      summary: Initialise Site
      description: 'Initialise a site with one or more assets.


        This endpoint upserts the site and assets (creating them if they don''t exist, or filling in missing fields if they do), and returns eligibility information.


        **No enrollment side effects**: Use the `/enrol` endpoint to commit to enrollment.'
      operationId: initialise_site_entities_site_initialise_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InitialiseRequest'
        required: true
      responses:
        '200':
          description: Successfully initialised site and assets
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InitialiseResponse'
        '400':
          description: Invalid request (e.g. missing boundary meter consent T&Cs)
        '404':
          description: Referenced entity not found
        '409':
          description: Asset conflict (e.g. asset type mismatch or asset registered to a different site)
        '500':
          description: Server error during initialisation
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/check-eligibility:
    post:
      tags:
      - 3. Sites
      summary: Check Eligibility
      description: Check whether an MPAN, optionally combined with an asset model, is eligible for enrolment. No data is persisted.
      operationId: check_eligibility_entities_site_check_eligibility_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EligibilityCheckRequest'
        required: true
      responses:
        '200':
          description: Eligibility evaluated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EligibilityCheckResponse'
        '404':
          description: Referenced entity not found (e.g. unknown asset_model)
        '500':
          description: Server error during eligibility check
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/enrol:
    post:
      tags:
      - 3. Sites
      summary: Enrol Site
      description: 'Enrol a site in a proposition.


        This is the commitment point — it activates the proposition for the site.


        Idempotent: if the site is already enrolled, returns `already_enrolled` without making changes.


        If the site previously withdrew from this proposition, returns 422. Set `override_withdrawal` to true to re-enrol.'
      operationId: enrol_site_entities_site__site_id__enrol_post
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EnrolRequest'
        required: true
      responses:
        '200':
          description: Successfully enrolled or already enrolled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnrolResponse'
        '404':
          description: Site not found or not authorized
        '422':
          description: Eligibility prerequisites not met or previously withdrew consent
        '500':
          description: Internal server error
      security:
      - OAuth2PasswordBearer: []
  /entities/site/onboard:
    post:
      tags:
      - 3. Sites
      summary: Onboard
      description: 'Initialise a site and its assets, and enrol them in a proposition in a single call.


        This endpoint will:

        1. Upsert the site and asset(s)

        2. Enrol in the relevant flex proposition


        The response returns the site and asset IDs you''ll use in subsequent calls, and the enrolment outcome.


        Onboarding is idempotent and atomic — sending the same site or asset returns the existing record with any new fields merged in; if enrolment fails, nothing is stored.'
      operationId: onboard_entities_site_onboard_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OnboardRequest'
        required: true
      responses:
        '200':
          description: Site and assets persisted, site enrolled in proposition
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OnboardResponse'
              example:
                site:
                  site_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  site_created: true
                  fields_updated: []
                  warnings: []
                assets:
                - asset_id: b2c3d4e5-f6a7-8901-bcde-f23456789012
                  external_id: charger-001
                  asset_created: true
                  fields_updated: []
                  warnings: []
                enrolment:
                  site_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  status: enrolled
        '400':
          description: Invalid request (missing meter consent, invalid email, etc.)
        '404':
          description: Referenced entity not found
        '409':
          description: Asset conflict (e.g. asset type mismatch or asset registered to a different site)
        '422':
          description: Eligibility prerequisites not met or previously withdrew consent
        '500':
          description: Server error
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/unenrol:
    post:
      tags:
      - 3. Sites
      summary: Unenrol Site
      description: 'Unenrol a site from a proposition.


        Withdraws the site from the proposition and prevents further scheduling. Does not delete the site or its assets.


        Use when the user is opting out of this proposition specifically — for example, they toggled it off in your app. The site and assets are kept, any other propositions they''re enrolled in (such as Capacity Market) are unaffected, and the user can re-enrol later and still access their payments.


        If the user is leaving entirely (moving house, support-led removal, etc.), use `offboard-site-and-assets` instead.


        Idempotent: if the site is already unenrolled, returns `already_unenrolled` without making changes.'
      operationId: unenrol_site_entities_site__site_id__unenrol_post
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UnenrolRequest'
        required: true
      responses:
        '200':
          description: Successfully unenrolled or already unenrolled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnenrolResponse'
        '404':
          description: Site not found or not authorized
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/onboard-site-and-asset:
    post:
      tags:
      - 3. Sites
      summary: Onboard Site And Asset
      description: '**Deprecated** — prefer [`/onboard`](/api-reference/entities/site/onboard) instead.


        The new `/onboard` endpoint supports multiple assets per site in a single call and includes improvements in idempotency, resilience and response details.


        ---


        Register a site, asset, and dispatch consent in a single call.


        Creates the site and asset, grants consent, and enrols in the relevant flex proposition.


        This endpoint will:

        1. Create the site

        2. Create the asset associated with the site

        3. Enrol in the relevant flex proposition


        Returns the created site and asset, including their IDs. Fails if the site or asset already exists.'
      operationId: onboard_site_and_asset_entities_site_onboard_site_and_asset_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OnboardingRequest'
        required: true
      responses:
        '200':
          description: Successfully onboarded site and asset
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OnboardingResponse'
        '400':
          description: Invalid request
        '409':
          description: Site or asset already exists
        '422':
          description: Eligibility prerequisites not met for the requested dispatch method
        '500':
          description: Server error during onboarding
      deprecated: true
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/offboard-site-and-assets:
    post:
      tags:
      - 3. Sites
      summary: Offboard Site And Assets
      description: 'Offboard a site and all its associated assets in a single operation.


        Unenrols from every proposition, and deletes the site and assets in accordance with data retention policies.


        Use when the user is leaving entirely — for example, they''ve moved house, or your support team is removing them. Payments can no longer be accessed afterwards.


        If the user is only opting out of one proposition (e.g. toggling Flex Lite off in your app), use `unenrol` instead — it preserves the site and any other propositions they''re enrolled in.'
      operationId: offboard_site_and_assets_entities_site__site_id__offboard_site_and_assets_post
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      responses:
        '200':
          description: Successfully offboarded site and asset
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OnboardingResponse'
        '400':
          description: Invalid request
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Server error during offboarding
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}:
    get:
      tags:
      - 3. Sites
      summary: Get Site
      description: 'Retrieve a specific site by its UUID.


        Returns the site details if it exists.'
      operationId: get_site_entities_site__site_id__get
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteResponse'
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
    delete:
      tags:
      - 3. Sites
      summary: Delete Site
      description: 'Delete an existing site by its UUID.


        The site will only be deleted if it has no associated assets or other objects. Returns a confirmation message upon successful deletion.'
      operationId: delete_site_entities_site__site_id__delete
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      responses:
        '204':
          description: Site successfully deleted
        '400':
          description: Site cannot be deleted due to associated objects
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
    patch:
      tags:
      - 3. Sites
      summary: Update Site
      description: 'Update an existing site''s information.


        Only fields included in the request will be updated. Returns the updated site details.'
      operationId: update_site_entities_site__site_id__patch
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteUpdateRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteResponse'
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/eligibility:
    get:
      tags:
      - 3. Sites
      summary: Get Site Eligibility
      description: Read-only eligibility breakdown for a site and its assets. Returns the list of propositions the site can enrol in, along with per-asset eligibility detail.
      operationId: get_site_eligibility_entities_site__site_id__eligibility_get
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteEligibilityDetail'
        '404':
          description: Site not found or not authorized
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/meter-consent:
    post:
      tags:
      - 3. Sites
      summary: Add Site Meter Consent
      description: 'Add boundary meter consent for a site.


        Confirm that the site has consented for Axle to retrieve its boundary meter readings. This is required for participation in the wholesale market for assets that do not have CoP11 approval, but may also be provided via other endpoints (e.g. during site onboarding). Returns the updated site details with the new consent timestamp.'
      operationId: add_site_meter_consent_entities_site__site_id__meter_consent_post
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteMeterConsentRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteResponse'
        '400':
          description: Invalid request
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/dispatch-consent:
    post:
      tags:
      - 3. Sites
      summary: Add Site Dispatch Consent
      description: 'Add dispatch consent for a site to particpate in flex markets.


        This enables the site to participate with the specified dispatch consent methods. Returns the updated site details with the new dispatch consent information.'
      operationId: add_site_dispatch_consent_entities_site__site_id__dispatch_consent_post
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteDispatchConsentRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteResponse'
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/dispatch-deconsent:
    post:
      tags:
      - 3. Sites
      summary: Remove Site Dispatch Consent
      description: 'Remove dispatch consent for a site to stop participation in flex markets.


        This disables the site''s participation with the specified dispatch consent methods. Returns the updated site details with the consent information removed.'
      operationId: remove_site_dispatch_consent_entities_site__site_id__dispatch_deconsent_post
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteDispatchConsentRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteResponse'
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/token:
    post:
      tags:
      - 3. Sites
      summary: Add Site Auth Token
      description: 'Provide an auth token to Axle, for dispatching the site''s assets.


        This token should provide access to all of the assets registered against the specified site.


        This is only required where Axle is not able to access this site via an aggregated API in your systems.'
      operationId: add_site_auth_token_entities_site__site_id__token_post
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteAuthTokenRequest'
        required: true
      responses:
        '200':
          description: Token successfully processed
          content:
            application/json:
              schema: {}
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/flex-events:
    get:
      tags:
      - 3. Sites
      summary: Get Site Flex Events
      description: 'Get info on flex events the site has participated in, including estimated and final gross revenues.


        These estimates can be used for a variety of purposes, including paying out end-users before the final settlement data is available.However, to avoid overpayments it is recommended to only pay out a percentage of the estimated revenue initially, and top-up once final revenues are available.


        Note: it is possible for gross revenues to be negative in some scenarios, e.g. if the site flexed in the wrong direction by consuming more energy while it was instructed to consume less.'
      operationId: get_site_flex_events_entities_site__site_id__flex_events_get
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteFlexEventsResponse'
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/price-curve:
    get:
      tags:
      - 3. Sites
      summary: Get Price Curve
      description: Half-hourly data of prices per MWh of flexed energy for the asset. Prices are returned from the current Settlement Period until 23:00 UK time on the same day or next day. Next day prices are available from 14:00 UK time.
      operationId: get_price_curve_entities_site__site_id__price_curve_get
      parameters:
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceCurveResponse'
        '404':
          description: Site not found or not authorized to access
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
  /entities/site/{site_id}/oauth/{provider}/initiate:
    get:
      tags:
      - 3. Sites
      summary: Initiate Site Oauth
      description: Initiates OAuth flow by returning the provider's authorisation URL for the client to redirect to
      operationId: initiate_site_oauth_entities_site__site_id__oauth__provider__initiate_get
      parameters:
      - required: true
        schema:
          $ref: '#/components/schemas/OAuthProvider'
        name: provider
        in: path
      - required: true
        schema:
          type: string
          format: uuid
          title: Site Id
        name: site_id
        in: path
      responses:
        '200':
          description: Returns OAuth authorisation URL
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthInitiateResponse'
        '400':
          description: Unsupported OAuth provider or not configured
        '500':
          description: Internal server error
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - OAuth2PasswordBearer: []
components:
  schemas:
    InitialiseSiteResult:
      properties:
        site_id:
          type: string
          format: uuid
          title: Site Id
          description: Axle's internal UUID for the site
        site_created:
          type: boolean
          title: Site Created
          description: True if the site was newly created, False if it was upserted
        fields_updated:
          items:
            type: string
          type: array
          title: Fields Updated
          description: List of site fields that were updated on upsert
        warnings:
          items:
            type: string
          type: array
          title: Warnings
          description: Site-level warnings generated during initialisation
      type: object
      required:
      - site_id
      - site_created
      title: InitialiseSiteResult
      description: Result metadata for a site after upsert.
    EligibilityCheckResponse:
      properties:
        is_half_hourly_settled:
          type: boolean
          title: Is Half Hourly Settled
          description: Whether the site is half-hourly settled, per ECOES.
        propositions:
          items:
            $ref: '#/components/schemas/PropositionEligibility'
          type: array
          title: Propositions
          description: Per-proposition eligibility for the supplied MPAN + asset model combination.
          default: []
      type: object
      required:
      - is_half_hourly_settled
      title: EligibilityCheckResponse
      description: Response model for the ephemeral eligibility check endpoint.
    InitialiseRequest:
      properties:
        site:
          allOf:
          - $ref: '#/components/schemas/SiteRequest'
          title: Site
          description: Site information
          examples:
          - mpan: '1234567890123'
            postcode: SW1A 1AA
            street_address: 10 Downing Street
            email: resident@example.com
            gave_boundary_meter_consent_at: '2026-01-15T10:30:00Z'
        assets:
          items:
            $ref: '#/components/schemas/OnboardingAssetRequest'
          type: array
          title: Assets
          description: One or more assets to register at the site
          examples:
          - - external_id: charger-001
              type: charger
              asset_model: zappi
              installation_date: '2025-06-15'
              properties:
                power_kw: 7.4
      type: object
      required:
      - site
      - assets
      title: InitialiseRequest
      description: 'Request model for initialising a site with one or more assets.


        Upserts the site and assets, returning eligibility information.

        No enrollment side effects (no dispatch consent, no bonus, no email).'
    SiteEligibilityDetail:
      properties:
        eligible_propositions:
          items:
            type: string
            enum:
            - limited_pause
            - full_asset_schedule_control
          type: array
          title: Eligible Propositions
          default: []
        site_id:
          type: string
          format: uuid
          title: Site Id
          examples:
          - a1b2c3d4-e5f6-7890-abcd-ef1234567890
        site_properties:
          allOf:
          - $ref: '#/components/schemas/SiteProperties'
          title: Site Properties
          examples:
          - is_half_hourly_settled: false
            has_meter_consent: true
        assets:
          items:
            $ref: '#/components/schemas/AssetEligibilityDetail'
          type: array
          title: Assets
          default: []
      type: object
      required:
      - site_id
      - site_properties
      title: SiteEligibilityDetail
      description: Eligibility detail for a site's proposition eligibility check.
    OAuthIn

# --- truncated at 32 KB (58 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/axle-energy/refs/heads/main/openapi/axle-energy-3-sites-api-openapi.yml