Send an oadrCreatePartyRegistration SOAP request to the VTN registration endpoint; include oadrProfileName ('2.0b'), oadrTransportType ('simpleHttp'), venID (empty on first registration), and oadrHttpPullModel set to true to indicate pull-based operation.
Parse the oadrCreatedPartyRegistration response; store the assigned venID and registrationID — subsequent requests must include these identifiers, and the VTN may return an HTTP 400 if they are missing or mismatched.
Poll the VTN by sending oadrRequestEvent with your venID and replyLimit (maximum number of events to return); the VTN responds with oadrDistributeEvent containing an array of oadrEvent elements each with eventDescriptor, eiActivePeriod, and eiEventSignals.
For each event, parse the eiEventSignals to extract the signalType (SIMPLE, PRICE, LEVEL, etc.) and signalPayload intervals; map these to actionable commands for your DER controller using your program-specific payload mapping.
Acknowledge each event by sending oadrCreatedEvent with an array of oadrEventResponse items, each containing eventID, modificationNumber, and optType ('optIn' or 'optOut'); the modificationNumber must match the value in the received event or the VTN will reject the acknowledgment.
If the VTN expects periodic check-in, send oadrPoll requests at the configured heartbeat interval; the VTN may piggyback new events on the oadrResponse to the poll, so always process the poll response body.
Known gotchas
The modificationNumber field is critical: VTNs increment it each time an event is modified, and an acknowledgment with a stale modificationNumber will be rejected — always use the modificationNumber from the most recently received oadrDistributeEvent.
OpenADR 2.0b uses SOAP over HTTP with a specific WSDL; many VTN implementations require the Content-Type header to be 'application/xml' or 'text/xml' with a SOAPAction header — omitting these causes silent failures on some VTN implementations.
Pull model VENs bear the latency cost of the polling interval for event delivery; for programs with short lead times (minutes), push mode or a very short polling interval is required — confirm with the DR program administrator before deployment.
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