Webhooks

Cademí sends an HTTPS POST to your endpoint when something happens in your account: a student is created, completes a lesson, passes an exam, receives a certificate. Your endpoint answers with a 2xx status, and Cademí retries the delivery when it does not.

Payload versions

Every webhook has a payload version, which decides the body your endpoint receives. Deliveries, retries, and signatures are the same for every version.

Version 3Version 2Version 1
StatusCurrentOlder formatDeprecated
EventsThe API event catalog, such as lesson_progress.completed (Webhooks v3 reference)Dashboard events, such as course.concluded (Webhooks v2 reference)The version 2 events, with names in Portuguese (Webhooks v1 reference)
IDsPublic, such as usr_42NumericNumeric
Personal dataYour choice: IDs only, masked, or full (payload_detail)Always sentAlways sent
Events per webhookSeveral, with filters by resourceOneOne

Where to create a webhook

  • In the dashboard, at Settings > Integrations > Webhooks, in any version. See Set up in the dashboard.
  • Through the API, with POST /webhooks, always version 3. See API webhooks.

The body

In version 3, every event carries its id, type, version, occurred_at, and the event data, with records identified by public ID:

{
  "id": "evt_01J8Z3TESTE",
  "type": "lesson_progress.completed",
  "version": 1,
  "occurred_at": "2026-09-29T12:00:00Z",
  "data": {
    "lesson_id": "les_42",
    "product_id": "prd_42",
    "user_id": "usr_42"
  },
  "delivery_id": "whd_01J8Z3TESTE",
  "attempt": 1
}

With payload_detail set to masked or full, the body also carries expanded, with the student, product, and lesson ready to use. Each event page lists the full body and every field.

Receiving events

  1. Answer quickly with a 2xx status, and process the event afterwards. A slow answer counts as a failure and the delivery is retried.
  2. Discard repeated deliveries: a retry carries the same event ID.
  3. Verify the Cademi-Signature header before trusting the body. See Signatures.

See Deliveries and retries for timeouts, retries, and the delivery history.

On this page