Home
Leap
Leap Webhook Events
Leap · AsyncAPI Specification
Leap Webhook Events
Version 1.1
API Evangelist DERIVED AsyncAPI rendering of Leap's published webhook surface. Leap does not publish an AsyncAPI document; this document was derived from the public event catalog and the published example payloads at: * https://developer.leap.energy/reference/metercreated (event index) * https://developer.leap.energy/reference/connect-events * https://developer.leap.energy/reference/meter-events * https://developer.leap.energy/docs/webhook-setup * https://developer.leap.energy/docs/retry-mechanism * https://developer.leap.energy/docs/webhook-push-notifications-v2 Leap operates TWO independent event surfaces: 1. The general webhook platform (out of beta since November 2025, managed under /v1.1/webhooks) which delivers connect-session and meter/enrollment events using a common {webhook_event_id, payload{webhook_event_type, ...}} envelope. 2. The older dispatch notification surface, configured separately per meter or market group through the Dispatch API V2 webhook endpoints, which posts dispatch timeslots with no webhook_event_type discriminator. Field names, enumerations and example values below are taken verbatim from Leap's published example payloads. No fields have been invented; where Leap does not document a type it is left loose.
View Spec
View on GitHub
Energy United States Electricity Grid Demand Response DER Virtual Power Plant Energy Markets Storage Flexibility EV Charging Smart Metering AsyncAPI Webhooks Events
Channels
platformEvents
Partner receiver URL registered through the general webhook platform. The event types the receiver gets are selected at subscription time.
meterDispatchNotifications
Receiver URL registered with PUT /v2/dispatch/meter/webhook. Delivered as grid dispatch instructions become available; retried every minute for up to 50 attempts.
groupDispatchNotifications
Receiver URL registered with PUT /v2/dispatch/group/webhook, for partners that dispatch pre-configured VPP market groups rather than individual meters.
Messages
✉
connectSessionUpdated
Leap Connect session updated
A customer Leap Connect session was created, advanced, closed or completed.
✉
connectSessionAuthorizationUpdated
Utility authorization updated
A utility data-sharing authorization (Leap Connect redirect or CAISO direct-to-utility) changed state.
✉
meterCreated
Meter created
A new meter was created in the partner account, partner-created or customer-authorized.
✉
meterEnrollmentGlobalStatusUpdated
Global enrollment status updated
✉
meterEnrollmentRequiredActionsUpdated
Required partner actions updated
New, updated or resolved partner actions on a meter. When every action is resolved a final event carries an empty required_actions object.
✉
meterEnrollmentParticipationStatusUpdated
Participation preference updated
✉
meterEnrollmentGroupUpdated
VPP market group updated
The start date, end date or meter membership of a VPP market group changed.
✉
meterDispatchNotification
Meter dispatch notification
✉
groupDispatchNotification
Market group dispatch notification
Servers
https
partner-receiver
The partner's own HTTPS receiver. Leap requires TCP port 443, 8443 or 8843 with TLS 1.2 or 1.3, a JSON body, and any 2xx response within 10 seconds. General-platform webhook URLs are registered through POST /v1.1/webhooks (or the Partner Portal); dispatch webhook URLs are registered through PUT /v2/dispatch/meter/webhook and PUT /v2/dispatch/group/webhook.
AsyncAPI Specification
asyncapi: 3.0.0
info:
title: Leap Webhook Events
version: '1.1'
description: |
API Evangelist DERIVED AsyncAPI rendering of Leap's published webhook surface. Leap does not
publish an AsyncAPI document; this document was derived from the public event catalog and the
published example payloads at:
* https://developer.leap.energy/reference/metercreated (event index)
* https://developer.leap.energy/reference/connect-events
* https://developer.leap.energy/reference/meter-events
* https://developer.leap.energy/docs/webhook-setup
* https://developer.leap.energy/docs/retry-mechanism
* https://developer.leap.energy/docs/webhook-push-notifications-v2
Leap operates TWO independent event surfaces:
1. The general webhook platform (out of beta since November 2025, managed under /v1.1/webhooks)
which delivers connect-session and meter/enrollment events using a common
{webhook_event_id, payload{webhook_event_type, ...}} envelope.
2. The older dispatch notification surface, configured separately per meter or market group
through the Dispatch API V2 webhook endpoints, which posts dispatch timeslots with no
webhook_event_type discriminator.
Field names, enumerations and example values below are taken verbatim from Leap's published
example payloads. No fields have been invented; where Leap does not document a type it is
left loose.
contact:
name: Leap API team
url: https://developer.leap.energy/
email: apiteam@leap.energy
externalDocs:
url: https://developer.leap.energy/docs/webhook-setup
defaultContentType: application/json
servers:
partner-receiver:
host: partner-supplied-receiver.example.com
protocol: https
description: |
The partner's own HTTPS receiver. Leap requires TCP port 443, 8443 or 8843 with TLS 1.2 or
1.3, a JSON body, and any 2xx response within 10 seconds. General-platform webhook URLs are
registered through POST /v1.1/webhooks (or the Partner Portal); dispatch webhook URLs are
registered through PUT /v2/dispatch/meter/webhook and PUT /v2/dispatch/group/webhook.
channels:
platformEvents:
address: /
title: Leap webhook platform events
description: >-
Partner receiver URL registered through the general webhook platform. The event types the
receiver gets are selected at subscription time.
messages:
connectSessionUpdated:
$ref: '#/components/messages/connectSessionUpdated'
connectSessionAuthorizationUpdated:
$ref: '#/components/messages/connectSessionAuthorizationUpdated'
meterCreated:
$ref: '#/components/messages/meterCreated'
meterEnrollmentGlobalStatusUpdated:
$ref: '#/components/messages/meterEnrollmentGlobalStatusUpdated'
meterEnrollmentRequiredActionsUpdated:
$ref: '#/components/messages/meterEnrollmentRequiredActionsUpdated'
meterEnrollmentParticipationStatusUpdated:
$ref: '#/components/messages/meterEnrollmentParticipationStatusUpdated'
meterEnrollmentGroupUpdated:
$ref: '#/components/messages/meterEnrollmentGroupUpdated'
meterDispatchNotifications:
address: /
title: Meter-level dispatch notifications
description: >-
Receiver URL registered with PUT /v2/dispatch/meter/webhook. Delivered as grid dispatch
instructions become available; retried every minute for up to 50 attempts.
messages:
meterDispatchNotification:
$ref: '#/components/messages/meterDispatchNotification'
groupDispatchNotifications:
address: /
title: Market-group dispatch notifications
description: >-
Receiver URL registered with PUT /v2/dispatch/group/webhook, for partners that dispatch
pre-configured VPP market groups rather than individual meters.
messages:
groupDispatchNotification:
$ref: '#/components/messages/groupDispatchNotification'
operations:
receivePlatformEvent:
action: receive
channel:
$ref: '#/channels/platformEvents'
summary: Receive a Leap webhook platform event
description: >-
Return any 2xx within 10 seconds. Leap retries up to 10 times over 8 hours at increasing
intervals (immediate, 1m, 2m, 4m, 8m, 16m, 29m, 1h, 2h, 4h).
receiveMeterDispatch:
action: receive
channel:
$ref: '#/channels/meterDispatchNotifications'
summary: Receive a meter-level dispatch notification
description: >-
Acknowledge with 2xx before scheduling the events downstream. Retries occur every minute for
up to 50 minutes; a dropped acknowledgement can produce a duplicate notification, so the
receiver must be able to de-duplicate on meter_event_id.
receiveGroupDispatch:
action: receive
channel:
$ref: '#/channels/groupDispatchNotifications'
summary: Receive a market-group dispatch notification
description: >-
Same delivery and retry semantics as meter-level dispatch, keyed on market_group_event_id.
components:
messages:
connectSessionUpdated:
name: connect_session.updated
title: Leap Connect session updated
summary: A customer Leap Connect session was created, advanced, closed or completed.
payload:
$ref: '#/components/schemas/ConnectSessionUpdated'
examples:
- name: created
payload:
webhook_event_id: cca07005-1406-4539-8b84-1a5f24cd1575
payload:
webhook_event_type: connect_session.updated
partner_reference: customer-site-123
status: CREATED
connectSessionAuthorizationUpdated:
name: connect_session.authorization_updated
title: Utility authorization updated
summary: A utility data-sharing authorization (Leap Connect redirect or CAISO direct-to-utility) changed state.
payload:
$ref: '#/components/schemas/ConnectSessionAuthorizationUpdated'
examples:
- name: initiated
payload:
webhook_event_id: 3b41a28a-46b3-4082-b13c-a2f812f1bda5
payload:
webhook_event_type: connect_session.authorization_updated
partner_reference: customer-site-123
utility_name: PGE
status: INITIATED
meterCreated:
name: meter.created
title: Meter created
summary: A new meter was created in the partner account, partner-created or customer-authorized.
payload:
$ref: '#/components/schemas/MeterCreated'
examples:
- name: created
payload:
webhook_event_id: 26c8b7c6-3d3c-4d84-9ce9-734930c897d4
payload:
webhook_event_type: meter.created
meter_id: 11111111-1111-1111-1111-111111111111
partner_reference: customer-site-123
transmission_region: CAISO
meter_type: UTILITY_METER
meterEnrollmentGlobalStatusUpdated:
name: meter.enrollment.global-status.updated
title: Global enrollment status updated
payload:
$ref: '#/components/schemas/MeterEnrollmentGlobalStatusUpdated'
meterEnrollmentRequiredActionsUpdated:
name: meter.enrollment.required-actions.updated
title: Required partner actions updated
summary: >-
New, updated or resolved partner actions on a meter. When every action is resolved a final
event carries an empty required_actions object.
payload:
$ref: '#/components/schemas/MeterEnrollmentRequiredActionsUpdated'
meterEnrollmentParticipationStatusUpdated:
name: meter.enrollment.participation-status.updated
title: Participation preference updated
payload:
$ref: '#/components/schemas/MeterEnrollmentParticipationStatusUpdated'
meterEnrollmentGroupUpdated:
name: meter.enrollment.group.updated
title: VPP market group updated
summary: The start date, end date or meter membership of a VPP market group changed.
payload:
$ref: '#/components/schemas/MeterEnrollmentGroupUpdated'
meterDispatchNotification:
name: meter_dispatch_notification
title: Meter dispatch notification
payload:
$ref: '#/components/schemas/MeterDispatchNotification'
groupDispatchNotification:
name: group_dispatch_notification
title: Market group dispatch notification
payload:
$ref: '#/components/schemas/GroupDispatchNotification'
schemas:
WebhookEnvelope:
type: object
description: Common envelope for every general-platform webhook event.
properties:
webhook_event_id:
type: string
format: uuid
payload:
type: object
ConnectSessionUpdated:
allOf:
- $ref: '#/components/schemas/WebhookEnvelope'
- type: object
properties:
payload:
type: object
properties:
webhook_event_type:
type: string
const: connect_session.updated
partner_reference:
type: string
status:
type: string
enum: [CREATED, UPDATED, CLOSED, COMPLETED]
description: >-
CREATED - user reaches the initial screen; UPDATED - user moves to the next step;
CLOSED - user exits prematurely; COMPLETED - user completes the final step. A new
session starts on a new Connect tab or after a 24-hour idle expiry.
ConnectSessionAuthorizationUpdated:
allOf:
- $ref: '#/components/schemas/WebhookEnvelope'
- type: object
properties:
payload:
type: object
properties:
webhook_event_type:
type: string
const: connect_session.authorization_updated
partner_reference:
type: string
utility_name:
type: string
examples: [PGE]
status:
type: string
enum: [INITIATED, COMPLETED, FAILED]
description: >-
INITIATED - user reaches the utility login screen; COMPLETED - authorization
succeeded; FAILED - invalid credentials, MFA error, utility error or cancellation.
MeterCreated:
allOf:
- $ref: '#/components/schemas/WebhookEnvelope'
- type: object
properties:
payload:
type: object
properties:
webhook_event_type:
type: string
const: meter.created
meter_id:
type: string
format: uuid
partner_reference:
type: string
transmission_region:
type: string
examples: [CAISO]
meter_type:
type: string
examples: [UTILITY_METER, DEVICE]
MeterEnrollmentGlobalStatusUpdated:
allOf:
- $ref: '#/components/schemas/WebhookEnvelope'
- type: object
properties:
payload:
type: object
properties:
webhook_event_type:
type: string
const: meter.enrollment.global-status.updated
global_enrollment_status:
type: string
examples: [ELIGIBLE, INELIGIBLE]
meter_id:
type: string
format: uuid
partner_reference:
type: string
transmission_region:
type: string
meter_type:
type: string
MeterEnrollmentRequiredActionsUpdated:
allOf:
- $ref: '#/components/schemas/WebhookEnvelope'
- type: object
properties:
payload:
type: object
properties:
webhook_event_type:
type: string
const: meter.enrollment.required-actions.updated
meter_id:
type: string
format: uuid
transmission_region:
type: string
global_enrollment_status:
type: string
partner_reference:
type: string
meter_type:
type: string
required_actions:
type: object
description: Empty object once every action is resolved.
properties:
partner:
type: array
items:
type: object
properties:
enrollment_deadline_date_time:
type: string
format: date-time
action_type:
type: string
examples: [NO_MISSING_FIELDS]
action_description:
type: string
action_code:
type: string
examples: [SERV_0005]
program_identifier:
type: string
examples: [CEC-DSGS]
delivery_period:
type: string
examples: [CEC-DSGS_2026_MAY_OCT]
MeterEnrollmentParticipationStatusUpdated:
allOf:
- $ref: '#/components/schemas/WebhookEnvelope'
- type: object
properties:
payload:
type: object
properties:
webhook_event_type:
type: string
const: meter.enrollment.participation-status.updated
participation_preference:
type: string
enum: [PARTICIPATE, IDLE, DISENROLL]
start_time:
type: string
format: date-time
meter_id:
type: string
format: uuid
partner_reference:
type: string
transmission_region:
type: string
meter_type:
type: string
MeterEnrollmentGroupUpdated:
allOf:
- $ref: '#/components/schemas/WebhookEnvelope'
- type: object
properties:
payload:
type: object
properties:
webhook_event_type:
type: string
const: meter.enrollment.group.updated
market_group_id:
type: string
format: uuid
market_group_name:
type: string
start_date_time:
type: string
format: date-time
end_date_time:
type: string
format: date-time
meter_ids:
type: array
items:
type: string
format: uuid
DispatchTimeslot:
type: object
properties:
start_time:
type: string
format: date-time
end_time:
type: string
format: date-time
cancelled:
type: boolean
performance_compensation_cap:
type: string
examples: [up-to-site-load, grid-exports-allowed]
priority:
type: integer
is_voluntary:
type: boolean
dispatch_event_types:
type: array
items:
type: string
examples: [day-ahead, hour-ahead, standard, capacity-test]
programs:
type: array
items:
type: string
examples: [CCA, ELRP]
energy_kw:
type: [number, 'null']
description: >-
Awarded kW for the dispatch — the expected power to be curtailed or exported for the
duration of the event. When null, dispatch the maximum you can manage.
nomination_kw:
type: [number, 'null']
description: The nomination in kW — the commitment made to the market for this asset.
MeterDispatchNotification:
type: object
properties:
integration_test_notification:
type: boolean
description: true when triggered by triggerTestMeterDispatchNotification, false for real events.
communication_test:
type: boolean
meter_dispatches:
type: array
items:
type: object
properties:
meter_id:
type: string
format: uuid
partner_reference:
type: string
description: Added to all dispatch notifications in December 2025.
timeslots:
type: array
items:
allOf:
- $ref: '#/components/schemas/DispatchTimeslot'
- type: object
properties:
meter_event_id:
type: string
format: uuid
GroupDispatchNotification:
type: object
properties:
integration_test_notification:
type: boolean
communication_test:
type: boolean
group_dispatches:
type: array
items:
type: object
properties:
market_group_id:
type: string
format: uuid
meter_ids:
type: array
items:
type: string
format: uuid
timeslots:
type: array
items:
allOf:
- $ref: '#/components/schemas/DispatchTimeslot'
- type: object
properties:
market_group_event_id:
type: string
format: uuid