OpenADR Alliance · Arazzo Workflow

Onboard a VEN, attach a resource, and subscribe to event notifications

Version 1.0.0

VEN-side onboarding against an OpenADR 3.1.1 VTN: authenticate, register the VEN, attach a controllable resource, ask the VTN which notifier bindings it supports, and register a webhook subscription for event notifications. Every operationId is verified against the OpenADR 3.1.1 specification.

1 workflow 5 source APIs 1 provider
View Spec View on GitHub EnergyUnited StatesUtilitiesElectricityDemand ResponseGridDEROpenADRStandardsSmart GridEV ChargingCertificationArazzoWorkflows

Provider

openadr-alliance

Workflows

onboard-ven-and-subscribe
Authenticate, register a VEN and resource, then subscribe to EVENT notifications.
Requires a token with write_vens, write_subscriptions and a VEN read scope. The VEN variants of the request bodies are used (VenVenRequest / VenResourceRequest) — a VEN may not set clientID, venID or targets.
5 steps inputs: callbackBearerToken, callbackUrl, clientID, clientSecret, resourceName, venName outputs: resourceID, subscriptionID, venID
1
get-token
2
register-ven
VEN-side body — objectType and venName only.
3
attach-resource
Attach a controllable device. On 3.1.x resources are first-level at /resources.
4
list-notifiers
Which notifier bindings does this VTN support? WEBHOOK is always true; MQTT is optional.
5
subscribe-to-events
Register the webhook. callbackUrl and bearerToken sit inside objectOperations, not at the root.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: Onboard a VEN, attach a resource, and subscribe to event notifications
  version: 1.0.0
  description: >-
    VEN-side onboarding against an OpenADR 3.1.1 VTN: authenticate, register the VEN, attach
    a controllable resource, ask the VTN which notifier bindings it supports, and register a
    webhook subscription for event notifications. Every operationId is verified against the
    OpenADR 3.1.1 specification.
sourceDescriptions:
- name: authApi
  url: ../openapi/openadr-alliance-auth-api-openapi.yml
  type: openapi
- name: notifiersApi
  url: ../openapi/openadr-alliance-notifiers-api-openapi.yml
  type: openapi
- name: resourcesApi
  url: ../openapi/openadr-alliance-resources-api-openapi.yml
  type: openapi
- name: subscriptionsApi
  url: ../openapi/openadr-alliance-subscriptions-api-openapi.yml
  type: openapi
- name: vensApi
  url: ../openapi/openadr-alliance-vens-api-openapi.yml
  type: openapi
workflows:
- workflowId: onboard-ven-and-subscribe
  summary: Authenticate, register a VEN and resource, then subscribe to EVENT notifications.
  description: >-
    Requires a token with write_vens, write_subscriptions and a VEN read scope. The VEN
    variants of the request bodies are used (VenVenRequest / VenResourceRequest) — a VEN may
    not set clientID, venID or targets.
  inputs:
    type: object
    required: [clientID, clientSecret, venName, resourceName, callbackUrl]
    properties:
      clientID: {type: string}
      clientSecret: {type: string}
      venName: {type: string}
      resourceName: {type: string}
      callbackUrl: {type: string, format: uri, description: HTTPS endpoint the VTN will POST notifications to}
      callbackBearerToken: {type: string, description: token the VTN presents back so the receiver can authenticate its calls}
  steps:
  - stepId: get-token
    operationId: fetchToken
    requestBody:
      contentType: application/x-www-form-urlencoded
      payload:
        grant_type: client_credentials
        client_id: $inputs.clientID
        client_secret: $inputs.clientSecret
        scope: read_ven_objects write_vens write_subscriptions
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      accessToken: $response.body#/access_token
  - stepId: register-ven
    description: VEN-side body — objectType and venName only.
    operationId: createVen
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.get-token.outputs.accessToken
    requestBody:
      contentType: application/json
      payload:
        objectType: VEN
        venName: $inputs.venName
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      venID: $response.body#/id
  - stepId: attach-resource
    description: Attach a controllable device. On 3.1.x resources are first-level at /resources.
    operationId: createResource
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.get-token.outputs.accessToken
    requestBody:
      contentType: application/json
      payload:
        objectType: RESOURCE
        resourceName: $inputs.resourceName
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      resourceID: $response.body#/id
  - stepId: list-notifiers
    description: Which notifier bindings does this VTN support? WEBHOOK is always true; MQTT is optional.
    operationId: listAllNotifiers
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.get-token.outputs.accessToken
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      webhookSupported: $response.body#/WEBHOOK
  - stepId: subscribe-to-events
    description: Register the webhook. callbackUrl and bearerToken sit inside objectOperations, not at the root.
    operationId: createSubscription
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.get-token.outputs.accessToken
    requestBody:
      contentType: application/json
      payload:
        clientName: $inputs.venName
        objectOperations:
        - objects: [EVENT]
          operations: [CREATE, UPDATE, DELETE]
          callbackUrl: $inputs.callbackUrl
          bearerToken: $inputs.callbackBearerToken
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      subscriptionID: $response.body#/id
  outputs:
    venID: $steps.register-ven.outputs.venID
    resourceID: $steps.attach-resource.outputs.resourceID
    subscriptionID: $steps.subscribe-to-events.outputs.subscriptionID

Work with this as data

Every workflow 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 arazzo workflows

4 MCP tools reach this
  • find_arazzoBrowse and filter every workflow in the catalog.
  • 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 workflow
curl "https://apis.io/api/v1/arazzo/openadr-alliance-ven-onboard-and-subscribe"
All arazzo workflows
curl "https://apis.io/api/v1/arazzo?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.