data.
Common envelope
| Field | Type | Description |
|---|---|---|
id | string | Unique delivery ID, e.g. dlv_01abc…. Same value as the X-Quippy-Delivery-Id header. Use it to dedupe on retries. |
type | string | The event type — e.g. exam.completed. Same as the X-Quippy-Event header. |
created | ISO 8601 string | Timestamp of this delivery attempt. |
institutionId | string | Your institution’s ID. Handy if you run one receiver for many tenants. |
test | boolean (optional) | Present and true only for synthetic test deliveries. |
data | object | Event-specific payload — see below. |
Events
exam.completed — fires when a student submits an exam
exam.completed — fires when a student submits an exam
studentId may
be null for guest / link-based exam modes.grading.done — Coming soon
grading.done — Coming soon
Coming soon. The event type exists in the subscription API — you
can select it when registering an endpoint — but the emit site in the
grading pipeline is not yet wired up. Subscribing today will not
result in any deliveries for this event. Watch for a changelog entry
when it ships.
user.provisioned — fires when an institution user is invited
user.provisioned — fires when an institution user is invited
POST /api/v2/users/invite (or
the Members page in the admin portal). For SSO-auto-provisioned users,
it fires on their first successful SSO sign-in.user.deprovisioned — fires when an institution user is removed
user.deprovisioned — fires when an institution user is removed
subscription.updated — fires when the Stripe subscription status changes
subscription.updated — fires when the Stripe subscription status changes
active,
past_due, canceled, etc. planId may be null if the plan isn’t
recorded on our side.webhook.test — synthetic event from the 'Send test' button
webhook.test — synthetic event from the 'Send test' button
Delivering to multiple endpoints
If you subscribe two endpoints to the same event, each gets its own delivery row with a distinctid — they don’t share attempts or retry
state.