Register a client credential with the VTN's OAuth 2.0 authorization server (client_credentials grant); OpenADR 3.0 uses a RESTful API defined in the openadr3.yaml OpenAPI spec — all payloads are JSON, replacing the SOAP/XML of 2.0b.
Call GET /programs to discover available demand response programs; parse the array of Program objects and store programID values for the programs your VEN participates in.
Poll GET /events?programID={id} on a configurable interval (check VTN documentation for recommended polling frequency); process each Event object, which includes eventName, intervals (an array with dtstart, duration, and payloads), and priorities.
For each active event, evaluate the payload against your DER's operating constraints; submit a POST /reports body with an oadrReport containing your baseline and actual consumption or curtailment telemetry if the program requires reporting.
Submit an opt response via POST /subscriptions or by posting to the VTN's opt endpoint with an Opt object containing optType ('optIn' or 'optOut'), programID, eventID, and venID.
Implement exponential backoff with jitter on polling; on HTTP 429 responses honor the Retry-After header if present, and log events with their intervals to a local store so that a temporary poll failure does not cause missed event processing.
Known gotchas
OpenADR 3.0 (including 3.1.0) uses a fully REST/JSON architecture defined by an OpenAPI YAML file — implementations based on the SOAP/XMPP bindings of 2.0b are not compatible and must be rewritten rather than adapted.
The VTN is the authoritative source for polling interval guidance; polling too frequently may result in rate limiting, while polling too infrequently may cause the VEN to miss event start times — coordinate with the VTN operator to agree on a polling cadence.
Opt responses are not guaranteed to be accepted by the VTN; programs may enforce enrollment constraints or opt-out deadlines, and a 409 Conflict response from the VTN means the opt was rejected — surface this as an alert rather than silently retrying.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp