Virtual Peaker · AsyncAPI Specification

Virtual Peaker Gravity Connect Webhooks

Version

View Spec View on GitHub EnergyUnited StatesUtilitiesElectricityGridDemand ResponseDERDERMSVirtual Power PlantEV ChargingSmart ThermostatsEnergy StorageAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-07-27'
method: derived
source: >-
  openapi/virtual-peaker-gravity-connect-vpp-api-openapi.yml (the five Publishing operations) and
  the Glossary / Device Enrollment / Commands sections of
  https://assets.virtualpeaker.io/gravity-connect/device-partner-api.html
spec_type: none
asyncapi_published: false
asyncapi_note: >-
  Virtual Peaker publishes NO AsyncAPI document. Probed the docs host, the asset host
  (/asyncapi.yaml, /asyncapi.json under /gravity-connect/), the GitHub organization and
  virtual-peaker.com/llms.txt — nothing. This file is the derived catalog of the real, documented
  webhook surface; it is not a fabricated AsyncAPI.
event_surface:
  model: webhook (HTTP POST callbacks), Device Partner -> Virtual Peaker
  verbatim: >-
    "Webhook: A method for apps to provide other applications with real-time information. When an
    event occurs, a HTTP POST callback is sent to the specified webhook URL endpoint. Gravity
    Connect uses webhooks for Device Partners to publish data updates instead of the VPP polling
    for data."
  direction_note: >-
    Gravity Connect inverts the usual webhook shape. Virtual Peaker does not call the integrator's
    callback URL — the integrator (the device OEM) POSTs to Virtual Peaker's fixed publishing
    endpoints. There is no subscription-management API, no callback registration and no
    per-event-type filtering; the analogue of a subscription is the VPP calling the OEM's
    modifySubscription endpoint to turn device publishing on or off.
  endpoint_base: https://partner.virtualpeaker.io/v1
  authentication: >-
    HMAC-SHA256 over the raw body, sent as 'Authorization: Publish <hex-hmac>'
  ack: HTTP 202 Accepted (components.responses.accepted)
  max_payload_bytes: 262144
  retries: exponential backoff on 429, 502, 503, 504; discard on all other errors
  ordering: not guaranteed; every payload carries its own RFC 3339 `time`
events:
- name: signal-setting-published
  operation: publishSignalSetting
  channel: POST /publish/{PROGRAM_PUBLISH_KEY}/update
  secret: DEVICE_PUBLISH_SECRET
  payload: 'uid (string), kind (DeviceKindEnum), signal (SignalSetting[]), setting (SignalSetting[])'
  description: >-
    Device telemetry and configuration. The legal signal/setting keys are device-type specific
    (TSTAT, HWH, battery, EVSE, storage HVAC). Integration testing requires power data in
    5-minute increments or the Energy Interval endpoint.
- name: command-status-published
  operation: publishCommand
  channel: POST /publish/{PROGRAM_PUBLISH_KEY}/command
  secret: PROGRAM_PUBLISH_SECRET
  payload: CommandState (refId required)
  description: >-
    Lifecycle status of a command the VPP dispatched — PENDING, IN_PROGRESS, and terminal states.
- name: device-command-status-published
  operation: publishDeviceCommand
  channel: POST /publish/{PROGRAM_PUBLISH_KEY}/command/device
  secret: DEVICE_PUBLISH_SECRET
  payload: CommandState + uid (both required)
  description: >-
    Per-device status inside a group command, and the channel an individual device uses to report
    OPT_OUT of an event.
- name: device-enrollment-published
  operation: publishDeviceEnrollment
  channel: POST /publish/{PROGRAM_PUBLISH_KEY}/device
  secret: PROGRAM_PUBLISH_SECRET
  payload: 'state (enrolled|unenrolled), device (DeviceDetails), time (date-time), pairingCode (optional)'
  description: >-
    Enrollment and unenrollment of a single device. pairingCode is present only in the Pairing Code
    Device Discovery flow (2-char program prefix + 5 numerics + Luhn check digit).
- name: device-partner-driven-enrollment-published
  operation: publishDevicePartnerDrivenEnrollment
  channel: POST /publish/{PROGRAM_PUBLISH_KEY}/enrollment
  secret: PROGRAM_PUBLISH_SECRET
  payload: 'devices (DeviceDetails[]), site (UserDetails), time (date-time)'
  description: >-
    In-app enrollment, pre-enrollment from OEM-owned marketplaces, and bulk device enrollment.
    Added in spec 2.0.5 — the newest event on the surface.
inbound_callbacks:
  note: >-
    The reverse direction is not webhooks but ordinary authenticated REST: the VPP calls the OEM's
    sendCommand, cancelCommand, modifySubscription and group operations with an OAuth 2.0 bearer
    token. Commands arrive at most 60 seconds before the event start time.
  operations: [sendCommand, cancelCommand, modifySubscription, manageGroupDevices, commandOptOut]