Delivery Envelope
JSON shape, headers, and receiver checklist for every Skillhabit webhook delivery.
What This Is For
Every Skillhabit webhook delivery uses the same JSON envelope. Your receiver should parse the envelope first, then branch on eventType before reading data.
The full data object for each eventType is documented in the Event Catalog—field tables and example JSON for every event Skillhabit delivers today.
Who This Is For
Developers implementing or hardening the HTTPS endpoint configured under Configure → Connections → Webhooks.
Envelope Fields
| Field | Description |
|---|---|
id | Unique id for this webhook delivery—use as an idempotency key |
createdAt | Delivery creation timestamp in epoch milliseconds (UTC) |
workspace | Customer / workspace id |
eventType | Logical event name (also sent in the Event-Type HTTP header) |
data | Event-specific JSON object—see Event Catalog |
Headers
Event-Type— same value aseventTypein the body- Any custom headers you configured on the webhook in Configure (for example a shared secret your side checks)
Content type is JSON. Treat unknown fields in data conservatively: ignore what you do not need, and fail closed only when a field you require is missing.
Receiver Checklist
- Respond quickly with
2xxso Skillhabit can treat the delivery as accepted - Deduplicate on
idif you may receive retries - Branch on
eventTypebefore parsingdata - Keep endpoint URLs on HTTPS and rotate any shared secrets you put in custom headers
- Log
workspace,eventType, andidtogether so support can correlate a delivery
Example Delivery
{
"id": "delivery-uuid",
"createdAt": 1717200000000,
"workspace": "acme",
"eventType": "progress.course.evaluated",
"data": {
"userId": "user-1",
"contentId": "course-1",
"approved": true
}
}Every other eventType uses this same envelope; only eventType and data change. Complete data examples: Event Catalog.