Webhook event catalog
Every webhook event ChronaPilot fires. Subscribe to a subset on each endpoint, or use ["*"] to receive everything.
| Event | Group | Description |
|---|---|---|
| event.created | Scheduling | Fired when an event is created. |
| event.updated | Scheduling | Fired when any event field is updated. |
| event.cancelled | Scheduling | Fired when an event is cancelled. |
| event.deleted | Scheduling | Fired when an event is hard-deleted (and removed from the source provider when cascaded). |
| event.rescheduled | Scheduling | Specialized — fires only when time-of-day fields change. |
| event.attendee_responded | Scheduling | An attendee responded to an invitation. |
| connection.connected | Sync | A user completed the OAuth flow and a connection is now active. |
| connection.disconnected | Sync | A connection was disconnected by the user or admin. |
| connection.token_expired | Sync | Refresh token failed; the connection requires re-consent. |
| connection.sync_completed | Sync | A full sync round-trip finished successfully. |
| connection.sync_failed | Sync | A sync attempt failed. |
| departure.computed | Intelligence | The first departure window has been computed for an event. |
| departure.updated | Intelligence | An existing departure window has been recomputed (traffic shifted, weather changed). |
| departure.threshold_reached | Intelligence | User is within their pre-alert window before recommended departure. |
| event.health_degraded | Intelligence | Health score dropped below the configured threshold. |
| event.late_predicted | Intelligence | ETA tracking predicts arrival after start time. |
| event.late_confirmed | Intelligence | User is now late (event start time passed without arrival). |
| user.created | User | A new ChronaPilot user was created. |
| user.deactivated | User | A user was paused. |
| user.reactivated | User | A previously deactivated user was restored. |
| user.deleted | User | A user was hard-deleted. Cascades through all their resources. |
| user.location_updated | User | Most-recent location for a user changed (only fires if tracking enabled). |
| user.arrived | User | Geofence-triggered arrival at an event location. |
| voice.session_started | Voice | A voice session opened. |
| voice.session_ended | Voice | A voice session closed. |
| voice.action_executed | Voice | The AI executed a tool on the user's behalf. |
| invitation.sent | Invitation | An invitation email was queued. |
| invitation.delivered | Invitation | Email delivery succeeded (per the email provider). |
| invitation.opened | Invitation | Tracked open (if enabled at the endpoint). |
| invitation.responded | Invitation | Attendee responded. |
Delivery shape
Every delivery body has the same envelope:
JSON
{
"id": "whe_8x9y0z1a2b",
"type": "event.created",
"api_version": "2026-05-20",
"created": 1716247200,
"data": { "object": { ... }, "previous_attributes": { ... } },
"account": "cpa_…",
"livemode": true,
"request_id": "req_..."
}previous_attributes is present on *.updated events and contains the old values of changed fields.
Ordering
We do not guarantee delivery order. Use created timestamps to reconcile.
Retry behavior
24 attempts over 72 hours with exponential backoff. After exhaustion, the delivery is logged and an endpoint.delivery_failed event is fired against a special platform-level webhook (if registered).