OpenADR 3 API

OpenADR 3 is the RESTful third generation of the OpenADR protocol, defined in full by a single OpenAPI 3.0 document published by the OpenADR Alliance. It supports energy-retailer-to-energy-customer demand response programs through operations to create, update, delete, and search programs, events, reports, subscriptions, VENs (Virtual End Nodes), and VEN resources, plus an /auth/token endpoint. Version 3.1.0 adds MQTT notifier topics, VEN-scoped topics for object privacy, and VTN discovery. Security is OAuth 2.0 client credentials with JWT bearer tokens and role-scoped grants that separate what a Business Logic (BL/VTN) client may write from what a VEN may write. This is a protocol contract, not an Alliance-hosted service — every implementer (a utility, aggregator, or vendor VTN) stands up its own base URL, so no single baseURL exists. The specification documents themselves are distributed by the Alliance through a registration form; the OpenAPI files harvested here came from a public Apache-2.0 copy of the Alliance release.

Documentation

Specifications

Schemas & Data

Other Resources

🔗
Conformance
https://www.openadr.org/openadr-3-certification
🔗
SourceCode
https://github.com/grid-coordination/openadr3-specification
🔗
Overlay
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/overlays/openadr-alliance-openadr-3-1-1-overlay.yaml
🔗
Overlay
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/overlays/openadr-alliance-openadr-3-1-0-overlay.yaml
🔗
Overlay
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/overlays/openadr-alliance-openadr-3-0-1-overlay.yaml
🔗
Overlay
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/overlays/openadr-alliance-openadr-3-0-0-overlay.yaml
🔗
Webhooks
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/asyncapi/openadr-alliance-webhooks.yml
🔗
Examples
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/examples/openadr-alliance-examples.yml
🔗
DataModel
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/data-model/openadr-alliance-data-model.yml
🔗
ErrorCatalog
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/errors/openadr-alliance-problem-types.yml
🔗
ToolCrosswalk
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/mcp/openadr-alliance-tool-crosswalk.yml
🔗
MCPCandidate
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/mcp/openadr-alliance-mcp.yml
🔗
APIsJSON
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/apis.yml
🔗
Arazzo
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/arazzo/_index.yml
🔗
Arazzo
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/arazzo/openadr-alliance-dispatch-event.yml
🔗
Arazzo
https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/arazzo/openadr-alliance-ven-onboard-and-subscribe.yml

OpenAPI Specification

openadr-3-1-1-openapi.yaml Raw ↑
---
openapi: 3.0.0
info:
  title: OpenADR 3 API
  version: 1.0.0
  description: |
    The OpenADR 3 API supports energy retailer to energy customer Demand Response programs.
    See OpenADR 3 User Guide and Definitions for detailed descriptions of usage.
    The API includes the following capabilities and operations:

    __Manage programs:__

    * Create/Update/Delete a program
    * Search programs

    __Manage events:__

    * Create/Update/Delete an event
    * Search events

    __Manage reports:__

    * Create/Update/Delete a report
    * Search reports

    __Manage subscriptions:__

    * Create/Update/Delete subscriptions to programs, events, and reports
    * Search subscriptions
    * Subscriptions allows clients to register a callback URL (webhook) to be notified
      on the change of state of a resource

    __Manage vens:__

    * Create/Update/Delete vens and ven resources
    * Search ven and ven resources

    __List notifiers:__

    * List all notification protocols, and for each notifier, usage details

    __List MQTT notifier object topic names:__

    * List all MQTT broker topic names for an object and the operations upon the object

    __Manage tokens:__

    * Obtain an access token
    * This endpoint is provided as a convenience and may be neglected in a commercial implementation
  contact:
    email: info@openadr.org
  license:
    name: Apache 2.0
    url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
tags:
  - name: programs
    description: Demand response programs
  - name: reports
    description: Reports
  - name: events
    description: Events
  - name: subscriptions
    description: Webhook subscriptions
  - name: vens
    description: Virtual end nodes
  - name: resources
    description: VEN resources
  - name: Auth
    description: Authorization server and token endpoints
  - name: notifiers
    description: Notification bindings (e.g. webhooks, MQTT)
  - name: MQTT_notifier
    description: MQTT notifier topic listings
paths:
  /programs:
    get:
      tags:
        - programs
      summary: searches all programs
      operationId: searchAllPrograms
      description: |
        List all programs known to the server.
        May filter results by targets params.
        Use skip and pagination query params to limit response size.
      security:
        - oAuth2ClientCredentials: [read_targets]
        # bearerAuth added here and elsewhere to support RI /ui service. See RI README for description of /ui
        - bearerAuth: []
      parameters:
        - name: targets
          in: query
          description: Indicates targets
          required: false
          schema:
            type: array
            items:
              $ref: '#/components/schemas/target'
        - name: skip
          in: query
          description: number of records to skip for pagination.
          required: false
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: limit
          in: query
          description: maximum number of records to return.
          required: false
          schema:
            type: integer
            format: int32
            maximum: 50
            minimum: 0
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/program'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '500':
          $ref: '#/components/responses/internalServerError'
    post:
      tags:
        - programs
      summary: create a program
      operationId: createProgram
      description: Create a new program in the server.
      security:
        - oAuth2ClientCredentials: [write_programs]
        - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/programRequest'
        description: program item to add.
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/program'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '409':
          $ref: '#/components/responses/conflict'
        '500':
          $ref: '#/components/responses/internalServerError'
  /programs/{programID}:
    parameters:
      - name: programID
        in: path
        schema:
          $ref: '#/components/schemas/objectID'
        required: true
        description: Object ID of the program object.
    get:
      tags:
        - programs
      summary: searches programs by program ID
      operationId: searchProgramByProgramId
      description: |
        Fetch the program specified by the programID in path.
      security:
        - oAuth2ClientCredentials: [read_targets]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/program'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
    put:
      tags:
        - programs
      summary: update a program
      operationId: updateProgram
      description: Update an existing program with the programID in path.
      security:
        - oAuth2ClientCredentials: [write_programs]
        - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/programRequest'
        description: program item to update.
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/program'
        '400':
          description: Bad Request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/problem'
        '403':
          description: Forbidden.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/problem'
        '404':
          description: Not Found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/problem'
        '409':
          description: Conflict. Implementation dependent response if program with the same programName exists.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/problem'
        '500':
          description: Internal Server Error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/problem'
    delete:
      tags:
        - programs
      summary: delete a program
      operationId: deleteProgram
      description: Delete an existing program with the programID in path.
      security:
        - oAuth2ClientCredentials: [write_programs]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/program'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
  /reports:
    get:
      tags:
        - reports
      summary: searches all reports
      operationId: searchAllReports
      description: |
        List all reports known to the server.
        May filter results by programID, eventID,  and clientName as query param.
        Use skip and pagination query params to limit response size.
      security:
        - oAuth2ClientCredentials: [read_ven_objects]
        - bearerAuth: []
      parameters:
        - name: programID
          in: query
          schema:
            $ref: '#/components/schemas/objectID'
          required: false
          description: filter results to reports with programID.
          example: program-999
        - name: eventID
          in: query
          schema:
            $ref: '#/components/schemas/objectID'
          required: false
          description: filter results to reports with eventID.
          example: event-999
        - name: clientName
          in: query
          schema:
            $ref: '#/components/schemas/clientName'
          required: false
          description: filter results to reports with clientName.
          example: '999'
        - name: skip
          in: query
          description: number of records to skip for pagination.
          required: false
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: limit
          in: query
          description: maximum number of records to return.
          required: false
          schema:
            type: integer
            format: int32
            maximum: 50
            minimum: 0
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/report'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '500':
          $ref: '#/components/responses/internalServerError'
    post:
      tags:
        - reports
      summary: add a report
      operationId: createReport
      description: Create a new report in the server.
      security:
        - oAuth2ClientCredentials: [write_reports]
        - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/reportRequest'
        description: report item to add.
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/report'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '409':
          $ref: '#/components/responses/conflict'
        '500':
          $ref: '#/components/responses/internalServerError'
  /reports/{reportID}:
    parameters:
      - name: reportID
        in: path
        schema:
          $ref: '#/components/schemas/objectID'
        required: true
        description: object ID of a report.
    get:
      tags:
        - reports
      summary: searches reports by reportID
      operationId: searchReportsByReportID
      description: |
        Fetch the report specified by the reportID in path.
      security:
        - oAuth2ClientCredentials: [read_ven_objects]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/report'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
    put:
      tags:
        - reports
      summary: update a report
      operationId: updateReport
      description: Update the report specified by the reportID in path.
      security:
        - oAuth2ClientCredentials: [write_reports]
        - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/reportRequest'
        description: Report item to update.
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/report'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '409':
          $ref: '#/components/responses/conflict'
        '500':
          $ref: '#/components/responses/internalServerError'
    delete:
      tags:
        - reports
      summary: delete a report
      operationId: deleteReport
      description: Delete the report specified by the reportID in path.
      security:
        - oAuth2ClientCredentials: [write_reports]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/report'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
  /events:
    get:
      tags:
        - events
      summary: searches all events
      operationId: searchAllEvents
      description: |
        List all events known to the server.
        May filter results by programID query param.
        May filter results by targets params.
        Use skip and pagination query params to limit response size.
      security:
        - oAuth2ClientCredentials: [read_targets]
        - bearerAuth: []
      parameters:
        - name: programID
          in: query
          schema:
            $ref: '#/components/schemas/objectID'
          required: false
          description: filter results to events with programID.
          example: program-999
        - name: targets
          in: query
          description: Indicates targets
          required: false
          schema:
            type: array
            items:
              $ref: '#/components/schemas/target'
        - name: skip
          in: query
          description: number of records to skip for pagination.
          required: false
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: limit
          in: query
          description: maximum number of records to return.
          required: false
          schema:
            type: integer
            format: int32
            maximum: 50
            minimum: 0
        - name: active
          in: query
          description: ignore events that have transpired.
          required: false
          schema:
            type: boolean
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/event'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '500':
          $ref: '#/components/responses/internalServerError'
    post:
      tags:
        - events
      summary: create an event
      operationId: createEvent
      description: Create a new event in the server.
      security:
        - oAuth2ClientCredentials: [write_events]
        - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/eventRequest'
        description: Event item to add.
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/event'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '409':
          $ref: '#/components/responses/conflict'
        '500':
          $ref: '#/components/responses/internalServerError'
  /events/{eventID}:
    parameters:
      - name: eventID
        in: path
        schema:
          $ref: '#/components/schemas/objectID'
        description: object ID of event.
        required: true
    get:
      tags:
        - events
      summary: search events by ID
      operationId: searchEventsByID
      description: |
        Fetch event associated with the eventID in path.
      security:
        - oAuth2ClientCredentials: [read_targets]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/event'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
    put:
      tags:
        - events
      summary: update an event
      operationId: updateEvent
      description: Update the event specified by the eventID in path.
      security:
        - oAuth2ClientCredentials: [write_events]
        - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/eventRequest'
        description: event item to update.
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/event'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '409':
          $ref: '#/components/responses/conflict'
        '500':
          $ref: '#/components/responses/internalServerError'
    delete:
      tags:
        - events
      summary: delete an event
      operationId: deleteEvent
      description: |
        Delete the event specified by the eventID in path.
      security:
        - oAuth2ClientCredentials: [write_events]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/event'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
  /subscriptions:
    get:
      tags:
        - subscriptions
      summary: search subscriptions
      operationId: searchSubscriptions
      description: |
        List all subscriptions.
        May filter results by programID and clientName as query params.
        May filter results by objects as query param. See objectTypes schema.
        Use skip and pagination query params to limit response size.
      security:
        - oAuth2ClientCredentials: [read_ven_objects]
        - bearerAuth: []
      parameters:
        - name: programID
          in: query
          schema:
            $ref: '#/components/schemas/objectID'
          description: filter results to subscriptions with programID.
          required: false
        - name: clientName
          in: query
          schema:
            $ref: '#/components/schemas/clientName'
          description: filter results to subscriptions with clientName.
          required: false
        - name: objects
          in: query
          description: list of objects to subscribe to.
          required: false
          schema:
            type: array
            items:
              $ref: '#/components/schemas/objectTypes'
        - name: skip
          in: query
          description: number of records to skip for pagination.
          required: false
          style: form
          explode: true
          schema:
            minimum: 0
            type: integer
            format: int32
        - name: limit
          in: query
          description: maximum number of records to return.
          required: false
          style: form
          explode: true
          schema:
            maximum: 50
            minimum: 0
            type: integer
            format: int32
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/subscription'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '500':
          $ref: '#/components/responses/internalServerError'
    post:
      tags:
        - subscriptions
      summary: create subscription
      operationId: createSubscription
      description: Create a new subscription.
      security:
        - oAuth2ClientCredentials: [write_subscriptions]
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/subscriptionRequest'
      callbacks:  # Callback definition
        notifyEvent:  # callback Event name
          '{$request.body#/callbackUrl}':  # The callback URL. Refers to the passed URL
            post:
              summary: Sending the notification to the receiver
              security:
                - {}
              requestBody:  # Contents of the callback message
                required: true
                content:
                  application/json:
                    schema:
                      $ref: '#/components/schemas/notification'
              responses:  # Expected responses to the callback message
                '200':
                  description: Your server returns this code if it accepts the callback.
                '400':
                  $ref: '#/components/responses/badRequest'
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/subscription'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '409':
          $ref: '#/components/responses/conflict'
        '500':
          $ref: '#/components/responses/internalServerError'
  /subscriptions/{subscriptionID}:
    parameters:
      - name: subscriptionID
        in: path
        schema:
          $ref: '#/components/schemas/objectID'
        description: object ID of the associated subscription.
        required: true
    get:
      tags:
        - subscriptions
      summary: search subscriptions by ID
      operationId: searchSubscriptionByID
      description: Return the subscription specified by subscriptionID specified in path.
      security:
        - oAuth2ClientCredentials: [read_ven_objects]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/subscription'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
    put:
      tags:
        - subscriptions
      summary: update  subscription
      operationId: updateSubscription
      description: Update the subscription specified by subscriptionID specified in path.
      security:
        - oAuth2ClientCredentials: [write_subscriptions]
        - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/subscriptionRequest'
        description: subscription item to update.
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/subscription'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '409':
          $ref: '#/components/responses/conflict'
        '500':
          $ref: '#/components/responses/internalServerError'
    delete:
      tags:
        - subscriptions
      summary: delete  subscription
      operationId: deleteSubscription
      description: Delete the subscription specified by subscriptionID specified in path.
      security:
        - oAuth2ClientCredentials: [write_subscriptions]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/subscription'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
  /vens:
    get:
      tags:
        - vens
      summary: search vens
      operationId: searchVens
      description: |
        List all vens.
        May filter results by venName as query param.
        May filter results by targets params.
        Use skip and pagination query params to limit response size.
      security:
        - oAuth2ClientCredentials: [read_ven_objects]
        - bearerAuth: []
      parameters:
        - name: venName
          in: query
          description: Indicates ven objects w venName
          required: false
          schema:
            $ref: '#/components/schemas/venName'
        - name: targets
          in: query
          description: Indicates targets
          required: false
          schema:
            type: array
            items:
              $ref: '#/components/schemas/target'
        - name: skip
          in: query
          description: number of records to skip for pagination.
          required: false
          style: form
          explode: true
          schema:
            minimum: 0
            type: integer
            format: int32
        - name: limit
          in: query
          description: maximum number of records to return.
          required: false
          style: form
          explode: true
          schema:
            maximum: 50
            minimum: 0
            type: integer
            format: int32
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ven'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '500':
          $ref: '#/components/responses/internalServerError'
    post:
      tags:
        - vens
      summary: create ven
      operationId: createVen
      description: Create a new ven.
      security:
        - oAuth2ClientCredentials: [write_vens]
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/venRequest'
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ven'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '500':
          $ref: '#/components/responses/internalServerError'
  /vens/{venID}:
    parameters:
      - name: venID
        in: path
        schema:
          $ref: '#/components/schemas/objectID'
        description: object ID of ven.
        required: true
    get:
      tags:
        - vens
      summary: search vens by ID
      operationId: searchVenByID
      description: Return the ven specified by venID specified in path.
      security:
        - oAuth2ClientCredentials: [read_ven_objects]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ven'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
    put:
      tags:
        - vens
      summary: update  ven
      operationId: updateVen
      description: Update the ven specified by venID specified in path.
      security:
        - oAuth2ClientCredentials: [write_vens]
        - bearerAuth: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/venRequest'
        description: ven item to update.
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ven'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '409':
          $ref: '#/components/responses/conflict'
        '500':
          $ref: '#/components/responses/internalServerError'
    delete:
      tags:
        - vens
      summary: delete  ven
      operationId: deleteVen
      description: Delete the ven specified by venID specified in path.
      security:
        - oAuth2ClientCredentials: [write_vens]
        - bearerAuth: []
      responses:
        '200':
          description: OK.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ven'
        '400':
          $ref: '#/components/responses/badRequest'
        '401':
          $ref: '#/components/responses/unauthorized'
        '403':
          $ref: '#/components/responses/forbidden'
        '404':
          $ref: '#/components/responses/notFound'
        '500':
          $ref: '#/components/responses/internalServerError'
  /resources:
    get:
      tags:
        - resources
      summary: search ven resources
      operationId: searchVenResources
      descripti

# --- truncated at 32 KB (89 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/openadr-alliance/refs/heads/main/openapi/openadr-3-1-1-openapi.yaml