Powernaut resources API

Register, modify or delete flexible resources. You can add flexible resources to each site, such as batteries, heat pumps, electric vehicles, ... They are the physical resource that can offer flexibility. Each resource has an enrolment status for the markets it can participate in, which you can query.

Operations 6

POST /v1/connect/resources Create a resource #
GET /v1/connect/resources Get all resources #
GET /v1/connect/resources/{id} Get a resource #
PATCH /v1/connect/resources/{id} Update a resource #
DELETE /v1/connect/resources/{id} Delete a resource #
GET /v1/connect/resources/{id}/activations Get activations #

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/powernaut-resources-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

powernaut-resources-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Powernaut authentication Resources API
  description: '

    # Getting Started


    Welcome to the Powernaut API Reference!


    Our API offers a robust and secure way to connect your flexible resources to flexibility buyers such as energy utilities/suppliers and system operators.


    This OpenAPI documentation is designed to provide a comprehensive and easy-to-understand guide for developers who are integrating their systems with Powernaut’s platform.


    By leveraging our API, you can seamlessly offer flexibility in several electricity markets, opening up additional revenue streams

    for your resources while contributing to a greener and more efficient electricity grid.

    '
  version: 1.0.0
  contact:
    name: Powernaut Support
    url: https://powernaut.io
    email: support@powernaut.io
  license:
    name: Creative Commons Attribution-ShareAlike 4.0 International
    url: https://creativecommons.org/licenses/by-sa/4.0/
servers:
- url: https://api.sandbox.powernaut.io
  description: Sandbox
- url: https://api.powernaut.io
  description: Production
tags:
- name: resources
  description: 'Register, modify or delete flexible resources.


    You can add flexible resources to each site, such as batteries, heat pumps, electric vehicles, ... They are the physical resource that can offer flexibility.


    Each resource has an enrolment status for the markets it can participate in, which you can query.'
  x-displayName: Resources
paths:
  /v1/connect/resources:
    post:
      description: 'Create a new resource.


        A maximum of 10 resources can be created per site.'
      operationId: CreateResource
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateResourceDto'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceDto'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestExceptionDto'
        '401':
          description: Not authorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedExceptionDto'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenExceptionDto'
      security:
      - edge-cloud: []
      - cloud-cloud: []
      summary: Create a resource
      tags:
      - resources
      x-codeSamples:
      - source: "import requests\nimport json\n\nurl = \"https://api.powernaut.io/v1/connect/resources\"\n\npayload = json.dumps({\n  \"type\": \"<string>\",\n  \"power\": {\n    \"active\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    },\n    \"reactive\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    }\n  },\n  \"site_id\": \"<uuid>\",\n  \"name\": \"<string>\",\n  \"external_id\": \"<string>\",\n  \"capacity\": {\n    \"minimum\": \"<decimal>\",\n    \"maximum\": \"<decimal>\"\n  },\n  \"group_id\": \"<uuid>\",\n  \"parent_id\": \"<uuid>\",\n  \"webhooks\": {\n    \"accepted\": \"<uri>\"\n  }\n})\nheaders = {\n  'Content-Type': 'application/json',\n  'Accept': 'application/json',\n  'Authorization': 'Bearer <token>'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data=payload)\n\nprint(response.text)\n"
        lang: python
        label: Python
      - source: "const myHeaders = new Headers();\nmyHeaders.append(\"Content-Type\", \"application/json\");\nmyHeaders.append(\"Accept\", \"application/json\");\nmyHeaders.append(\"Authorization\", \"Bearer <token>\");\n\nconst raw = JSON.stringify({\n  \"type\": \"<string>\",\n  \"power\": {\n    \"active\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    },\n    \"reactive\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    }\n  },\n  \"site_id\": \"<uuid>\",\n  \"name\": \"<string>\",\n  \"external_id\": \"<string>\",\n  \"capacity\": {\n    \"minimum\": \"<decimal>\",\n    \"maximum\": \"<decimal>\"\n  },\n  \"group_id\": \"<uuid>\",\n  \"parent_id\": \"<uuid>\",\n  \"webhooks\": {\n    \"accepted\": \"<uri>\"\n  }\n});\n\nconst requestOptions = {\n  method: \"POST\",\n  headers: myHeaders,\n  body: raw,\n  redirect: \"follow\"\n};\n\nfetch(\"https://api.powernaut.io/v1/connect/resources\", requestOptions)\n  .then((response) => response.text())\n  .then((result) => console.log(result))\n  .catch((error) => console.error(error));"
        lang: javascript
        label: JavaScript
      - source: "OkHttpClient client = new OkHttpClient().newBuilder()\n  .build();\nMediaType mediaType = MediaType.parse(\"application/json\");\nRequestBody body = RequestBody.create(mediaType, \"{\\n  \\\"type\\\": \\\"<string>\\\",\\n  \\\"power\\\": {\\n    \\\"active\\\": {\\n      \\\"minimum\\\": \\\"<decimal>\\\",\\n      \\\"maximum\\\": \\\"<decimal>\\\"\\n    },\\n    \\\"reactive\\\": {\\n      \\\"minimum\\\": \\\"<decimal>\\\",\\n      \\\"maximum\\\": \\\"<decimal>\\\"\\n    }\\n  },\\n  \\\"site_id\\\": \\\"<uuid>\\\",\\n  \\\"name\\\": \\\"<string>\\\",\\n  \\\"external_id\\\": \\\"<string>\\\",\\n  \\\"capacity\\\": {\\n    \\\"minimum\\\": \\\"<decimal>\\\",\\n    \\\"maximum\\\": \\\"<decimal>\\\"\\n  },\\n  \\\"group_id\\\": \\\"<uuid>\\\",\\n  \\\"parent_id\\\": \\\"<uuid>\\\",\\n  \\\"webhooks\\\": {\\n    \\\"accepted\\\": \\\"<uri>\\\"\\n  }\\n}\");\nRequest request = new Request.Builder()\n  .url(\"https://api.powernaut.io/v1/connect/resources\")\n  .method(\"POST\", body)\n  .addHeader(\"Content-Type\", \"application/json\")\n  .addHeader(\"Accept\", \"application/json\")\n  .addHeader(\"Authorization\", \"Bearer <token>\")\n  .build();\nResponse response = client.newCall(request).execute();"
        lang: java
        label: Java
      - source: "package main\n\nimport (\n  \"fmt\"\n  \"strings\"\n  \"net/http\"\n  \"io/ioutil\"\n)\n\nfunc main() {\n\n  url := \"https://api.powernaut.io/v1/connect/resources\"\n  method := \"POST\"\n\n  payload := strings.NewReader(`{\n  \"type\": \"<string>\",\n  \"power\": {\n    \"active\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    },\n    \"reactive\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    }\n  },\n  \"site_id\": \"<uuid>\",\n  \"name\": \"<string>\",\n  \"external_id\": \"<string>\",\n  \"capacity\": {\n    \"minimum\": \"<decimal>\",\n    \"maximum\": \"<decimal>\"\n  },\n  \"group_id\": \"<uuid>\",\n  \"parent_id\": \"<uuid>\",\n  \"webhooks\": {\n    \"accepted\": \"<uri>\"\n  }\n}`)\n\n  client := &http.Client {\n  }\n  req, err := http.NewRequest(method, url, payload)\n\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  req.Header.Add(\"Content-Type\", \"application/json\")\n  req.Header.Add(\"Accept\", \"application/json\")\n  req.Header.Add(\"Authorization\", \"Bearer <token>\")\n\n  res, err := client.Do(req)\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  defer res.Body.Close()\n\n  body, err := ioutil.ReadAll(res.Body)\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  fmt.Println(string(body))\n}"
        lang: go
        label: Go
      - source: 'var client = new HttpClient();

          var request = new HttpRequestMessage(HttpMethod.Post, "https://api.powernaut.io/v1/connect/resources");

          request.Headers.Add("Accept", "application/json");

          request.Headers.Add("Authorization", "Bearer <token>");

          var content = new StringContent("{\n  \"type\": \"<string>\",\n  \"power\": {\n    \"active\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    },\n    \"reactive\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    }\n  },\n  \"site_id\": \"<uuid>\",\n  \"name\": \"<string>\",\n  \"external_id\": \"<string>\",\n  \"capacity\": {\n    \"minimum\": \"<decimal>\",\n    \"maximum\": \"<decimal>\"\n  },\n  \"group_id\": \"<uuid>\",\n  \"parent_id\": \"<uuid>\",\n  \"webhooks\": {\n    \"accepted\": \"<uri>\"\n  }\n}", null, "application/json");

          request.Content = content;

          var response = await client.SendAsync(request);

          response.EnsureSuccessStatusCode();

          Console.WriteLine(await response.Content.ReadAsStringAsync());

          '
        lang: csharp
        label: C#
      - source: "curl --location 'https://api.powernaut.io/v1/connect/resources' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Bearer <token>' \\\n--data '{\n  \"type\": \"<string>\",\n  \"power\": {\n    \"active\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    },\n    \"reactive\": {\n      \"minimum\": \"<decimal>\",\n      \"maximum\": \"<decimal>\"\n    }\n  },\n  \"site_id\": \"<uuid>\",\n  \"name\": \"<string>\",\n  \"external_id\": \"<string>\",\n  \"capacity\": {\n    \"minimum\": \"<decimal>\",\n    \"maximum\": \"<decimal>\"\n  },\n  \"group_id\": \"<uuid>\",\n  \"parent_id\": \"<uuid>\",\n  \"webhooks\": {\n    \"accepted\": \"<uri>\"\n  }\n}'"
        lang: curl
        label: cURL
    get:
      description: Gets all resources available to your current authorised scope, or for a site specifically.
      operationId: FindAllResources
      parameters:
      - name: site_id
        required: false
        in: query
        description: Identifier of the site to fetch resources for.
        schema:
          type: string
          format: uuid
      - name: connection_point_id
        required: false
        in: query
        description: 'Identifier of the site to fetch resources for.


          **Note**: This is deprecated, use `site_id` instead.'
        deprecated: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: All resources
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConnectionPointResourcesListDto'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestExceptionDto'
        '401':
          description: Not authorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedExceptionDto'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenExceptionDto'
      security:
      - edge-cloud: []
      - cloud-cloud: []
      summary: Get all resources
      tags:
      - resources
      x-codeSamples:
      - source: "import requests\n\nurl = \"https://api.powernaut.io/v1/connect/resources\"\n\npayload = {}\nheaders = {\n  'Accept': 'application/json',\n  'Authorization': 'Bearer <token>'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data=payload)\n\nprint(response.text)\n"
        lang: python
        label: Python
      - source: "const myHeaders = new Headers();\nmyHeaders.append(\"Accept\", \"application/json\");\nmyHeaders.append(\"Authorization\", \"Bearer <token>\");\n\nconst requestOptions = {\n  method: \"GET\",\n  headers: myHeaders,\n  redirect: \"follow\"\n};\n\nfetch(\"https://api.powernaut.io/v1/connect/resources\", requestOptions)\n  .then((response) => response.text())\n  .then((result) => console.log(result))\n  .catch((error) => console.error(error));"
        lang: javascript
        label: JavaScript
      - source: "OkHttpClient client = new OkHttpClient().newBuilder()\n  .build();\nMediaType mediaType = MediaType.parse(\"text/plain\");\nRequestBody body = RequestBody.create(mediaType, \"\");\nRequest request = new Request.Builder()\n  .url(\"https://api.powernaut.io/v1/connect/resources\")\n  .method(\"GET\", body)\n  .addHeader(\"Accept\", \"application/json\")\n  .addHeader(\"Authorization\", \"Bearer <token>\")\n  .build();\nResponse response = client.newCall(request).execute();"
        lang: java
        label: Java
      - source: "package main\n\nimport (\n  \"fmt\"\n  \"net/http\"\n  \"io/ioutil\"\n)\n\nfunc main() {\n\n  url := \"https://api.powernaut.io/v1/connect/resources\"\n  method := \"GET\"\n\n  client := &http.Client {\n  }\n  req, err := http.NewRequest(method, url, nil)\n\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  req.Header.Add(\"Accept\", \"application/json\")\n  req.Header.Add(\"Authorization\", \"Bearer <token>\")\n\n  res, err := client.Do(req)\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  defer res.Body.Close()\n\n  body, err := ioutil.ReadAll(res.Body)\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  fmt.Println(string(body))\n}"
        lang: go
        label: Go
      - source: 'var client = new HttpClient();

          var request = new HttpRequestMessage(HttpMethod.Get, "https://api.powernaut.io/v1/connect/resources");

          request.Headers.Add("Accept", "application/json");

          request.Headers.Add("Authorization", "Bearer <token>");

          var response = await client.SendAsync(request);

          response.EnsureSuccessStatusCode();

          Console.WriteLine(await response.Content.ReadAsStringAsync());

          '
        lang: csharp
        label: C#
      - source: 'curl --location ''https://api.powernaut.io/v1/connect/resources'' \

          --header ''Accept: application/json'' \

          --header ''Authorization: Bearer <token>'''
        lang: curl
        label: cURL
  /v1/connect/resources/{id}:
    get:
      description: Gets a resource by its unique ID.
      operationId: GetResource
      parameters:
      - name: id
        required: true
        in: path
        description: Identifier of the resource.
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: The resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceDto'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestExceptionDto'
        '401':
          description: Not authorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedExceptionDto'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenExceptionDto'
        '404':
          description: Resource does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundDto_UmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q'
      security:
      - edge-cloud: []
      - cloud-cloud: []
      summary: Get a resource
      tags:
      - resources
    patch:
      description: 'Update a resource by its unique ID.


        Only the properties you provide will be updated. Use `null` to unset a property.'
      operationId: UpdateResource
      parameters:
      - name: id
        required: true
        in: path
        description: Identifier of the resource you want to update.
        schema:
          type: string
          format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateResourceDto'
      responses:
        '202':
          description: Accepted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceDto'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestExceptionDto'
        '401':
          description: Not authorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedExceptionDto'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenExceptionDto'
        '404':
          description: Resource does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundDto_UmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q'
      security:
      - edge-cloud: []
      - cloud-cloud: []
      summary: Update a resource
      tags:
      - resources
    delete:
      description: 'Delete a resource


        **Important**: This action is irreversible and will remove all associated future bids and baselines.'
      operationId: RemoveResource
      parameters:
      - name: id
        required: true
        in: path
        description: Identifier of the resource you want to delete.
        schema:
          type: string
          format: uuid
      responses:
        '204':
          description: Deleted
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestExceptionDto'
        '401':
          description: Not authorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedExceptionDto'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenExceptionDto'
        '404':
          description: Resource does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundDto_UmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q'
      security:
      - edge-cloud: []
      - cloud-cloud: []
      summary: Delete a resource
      tags:
      - resources
  /v1/connect/resources/{id}/activations:
    get:
      description: Gets the activations for a resource.
      operationId: GetActivationsForResource
      parameters:
      - name: id
        required: true
        in: path
        description: Identifier of the resource you want to get activations for.
        schema:
          type: string
          format: uuid
      - name: page
        required: false
        in: query
        description: Page number
        schema:
          type: number
      - name: page_size
        required: false
        in: query
        description: Page size
        schema:
          type: number
      - name: start
        required: false
        in: query
        description: An optional date from which to start filtering activations (ISO 8601)
        schema:
          type: string
      - name: end
        required: false
        in: query
        description: An optional date until which to filter activations (ISO 8601)
        schema:
          type: string
      responses:
        '200':
          description: A paginated list of activations
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProviderActivationSummaryListDto'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestExceptionDto'
        '401':
          description: Not authorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedExceptionDto'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenExceptionDto'
        '404':
          description: Resource does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundDto_UmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q'
      security:
      - edge-cloud: []
      - cloud-cloud: []
      summary: Get activations
      tags:
      - resources
components:
  schemas:
    UnauthorizedExceptionDto:
      type: object
      properties:
        message:
          description: One or more specific error messages
          oneOf:
          - type: string
          - type: array
            items:
              type: string
          example: Unauthorized
        error:
          type: string
          description: Unauthorized
          example: Unauthorized
        status_code:
          type: number
          description: '401'
          example: 401
      required:
      - message
      - error
      - status_code
    BadRequestExceptionDto:
      type: object
      properties:
        message:
          description: One or more specific error messages
          oneOf:
          - type: string
          - type: array
            items:
              type: string
          example:
          - Invalid datetime
          - Invalid page size
        error:
          type: string
          description: Bad Request
          example: Bad Request
        status_code:
          type: number
          description: '400'
          example: 400
      required:
      - message
      - error
      - status_code
    ResourcePowerConstraints:
      type: object
      properties:
        minimum:
          type: string
          description: Minimum level
          example: '-5.1'
          format: decimal
          pattern: ^-?[0-9]{1,15}(.[0-9]{1,6}?)$
        maximum:
          type: string
          description: Maximum level
          example: '5.1'
          format: decimal
          pattern: ^-?[0-9]{1,15}(.[0-9]{1,6}?)$
      required:
      - minimum
      - maximum
    ForbiddenExceptionDto:
      type: object
      properties:
        message:
          description: One or more specific error messages
          oneOf:
          - type: string
          - type: array
            items:
              type: string
          example: Insufficient permissions
        error:
          type: string
          description: Forbidden
          example: Forbidden
        status_code:
          type: number
          description: '403'
          example: 403
      required:
      - message
      - error
      - status_code
    ProviderActivationSummaryListDto:
      type: object
      properties:
        total:
          type: integer
          description: Total amount of results that match the query
          minimum: 0
        items:
          description: Activations for the current page
          type: array
          items:
            $ref: '#/components/schemas/ProviderActivationSummaryDto'
      required:
      - total
      - items
    EnergyDto:
      type: object
      properties:
        delivered:
          type:
          - string
          - 'null'
          description: 'The actual energy delivered by the resource, in `kWh` or `kVARh`, verified by real-time metering.

            It can be negative if, for example, a resources increases its consumption when a decrease was requested.


            This is only available after the activation has been verified, which happens a few minutes after the activation''s time window.'
          format: decimal
          example: '5.1'
          pattern: ^-?[0-9]{1,15}(.[0-9]{1,6}?)$
        requested:
          type: string
          description: The energy requested by the activation, in `kWh` or `kVARh`, based on an initial estimate of available flexibility.
          format: decimal
          example: '5.1'
          pattern: ^-?[0-9]{1,15}(.[0-9]{1,6}?)$
        extra_delivered:
          type:
          - string
          - 'null'
          description: Extra energy delivered beyond the requested amount for procurements without a delivery limit (in `kWh` or `kVARh`). `null` before verification or for procurements with a fixed delivery limit (where overdelivery is not tracked).
          format: decimal
          example: '1.2'
          pattern: ^-?[0-9]{1,15}(.[0-9]{1,6}?)$
      required:
      - delivered
      - requested
      - extra_delivered
    CreateResourceDto:
      type: object
      properties:
        name:
          type: string
          description: Human-readable name for this resource. Useful for reporting, but not required.
          example: Home Battery
          minLength: 1
        external_id:
          type:
          - string
          - 'null'
          description: Reference of the resource in external system (gateway, API, ...), used for mapping identifiers.
          example: NCC-1701
          minLength: 1
        type:
          type: string
          description: Type of energy resource (battery, heat pump, solar, etc.).
          enum:
          - static_battery
          - heat_pump
          - electric_vehicle
          - electric_vehicle_charging_point
          - photovoltaic
          - wind
          - group
          - other
          - meter
          example: static_battery
        power:
          description: Power constraints for this resource.
          allOf:
          - $ref: '#/components/schemas/ResourcePowerDto'
        capacity:
          description: 'Capacity constraints for this resource (in kWh).


            This property is currently only required for battery resources.'
          allOf:
          - $ref: '#/components/schemas/ResourcePowerConstraints'
        site_id:
          type: string
          description: Identifier for the site that this resource is part of.
          format: uuid
        group_id:
          type: string
          description: 'Identifier of the resource group that this resource should belong to.


            Only provide this when you want to immediately associate the resource with an existing group on the same site.'
          format: uuid
        parent_id:
          type:
          - string
          - 'null'
          description: 'Identifier of the physical parent resource in the site topology.


            Constraints:

            - Parent must exist and belong to the same site

            - Only meter-type resources can be parents

            - Group resources cannot have a parent

            - Hierarchy is limited to 10 levels deep'
          format: uuid
        webhooks:
          description: Webhooks related to this resource, for example to be notified about the acceptance of a bid for this resource.
          allOf:
          - $ref: '#/components/schemas/ResourceWebhooksDto'
      required:
      - type
      - power
      - site_id
    ResourceDto:
      type: object
      properties:
        name:
          type: string
          description: Human-readable name for this resource. Useful for reporting, but not required.
          example: Home Battery
          minLength: 1
        type:
          type: string
          description: Type of energy resource (battery, heat pump, solar, etc.).
          enum:
          - static_battery
          - heat_pump
          - electric_vehicle
          - electric_vehicle_charging_point
          - photovoltaic
          - wind
          - group
          - other
          - meter
          example: static_battery
        capacity:
          description: 'Capacity constraints for this resource (in kWh).


            This property is currently only required for battery resources.'
          allOf:
          - $ref: '#/components/schemas/ResourcePowerConstraints'
        site_id:
          type: string
          description: Identifier for the site that this resource is part of.
          format: uuid
        parent_id:
          type:
          - string
          - 'null'
          description: 'Identifier of the physical parent resource in the site topology.


            Used to model hierarchical resource relationships (up to 10 levels deep).'
          format: uuid
        webhooks:
          description: Webhooks related to this resource, for example to be notified about the acceptance of a bid for this resource.
          allOf:
          - $ref: '#/components/schemas/ResourceWebhooksDto'
        id:
          type: string
          description: Unique identifier for the resource
          format: uuid
        external_id:
          type:
          - string
          - 'null'
          description: Reference of the resource in external system (gateway, API, ...), used for mapping identifiers.
          example: NCC-1701
        group_id:
          type:
          - string
          - 'null'
          description: Identifier of the group this resource belongs to.
          format: uuid
        power:
          description: Power constraints for this resource.
          allOf:
          - $ref: '#/components/schemas/ResourcePowerDto'
        created_at:
          type: string
          description: Timestamp for creation of the resource (ISO 8601)
          format: date-time
          example: '2024-01-05T11:30:15Z'
        modified_at:
          type: string
          description: Timestamp for last modification of the resource (ISO 8601)
          format: date-time
          example: '2024-01-05T11:30:15Z'
        last_seen_at:
          type:
          - string
          - 'null'
          description: Timestamp for last metric received from the resource (ISO 8601)
          format: date-time
          example: '2025-01-07T15:08:22Z'
      required:
      - type
      - site_id
      - id
      - power
      - created_at
      - modified_at
      - last_seen_at
    UpdateResourceDto:
      type: object
      properties:
        name:
          type: string
          description: Human-readable name for this resource. Useful for reporting, but not required.
          example: Home Battery
          minLength: 1
        external_id:
          type:
          - string
          - 'null'
          description: Reference of the resource in external system (gateway, API, ...), used for mapping identifiers.
          example: NCC-1701
          minLength: 1
        type:
          type: string
          description: Type of energy resource (battery, heat pump, solar, etc.).
          enum:
          - static_battery
          - heat_pump
          - electric_vehicle
          - electric_vehicle_charging_point
          - photovoltaic
          - wind
          - group
          - other
          - meter
          example: static_battery
        power:
          description: Power constraints for this resource.
          allOf:
          - $ref: '#/components/schemas/ResourcePowerDto'
        capacity:
          description: 'Capacity constraints for this resource (in kWh).


            This property is currently only required for battery resources.'
          allOf:
          - $ref: '#/components/schemas/ResourcePowerConstraints'
        parent_id:
          type:
          - string
          - 'null'
          description: 'Identifier of the physical parent resource in the site topology.


            Set this field to `null` to remove the parent relationship.


            Constraints:

            - Parent must exist and belong to the same site

            - Only meter-type resources can be parents

            - Group resources cannot have a parent

            - Hierarchy is limited to 10 levels deep'
          format: uuid
        webhooks:
          description: Webhooks related to this resource, for example to be notified about the acceptance of a bid for this resource.
          allOf:
          - $ref: '#/components/schemas/ResourceWebhooksDto'
        group_id:
          type:
          - string
          - 'null'
          description: 'Identifier of the resource group that this resource should belong to.


            Set this field to `null` to remove a resource from its existing group.'
          format: uuid
    ConnectionPointResourcesListDto:
      type: object
      properties:
        total:
          type: integer
          description: Total amount of results that match the query
          minimum: 0
        items:
          description: Paginated items
          type: array
          items:
            $ref: '#/components/schemas/ResourceDto'
      required:
      - total
      - items
    ResourcePowerDto:
      type: object
      properties:
     

# --- truncated at 32 KB (36 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/powernaut/refs/heads/main/openapi/powernaut-resources-api-openapi.yml