Corteksa

Webhooks

CRM — Webhooks

Get CRM record changes pushed to your endpoint instead of polling. Internally a record mutation emits a data.* event; the public webhook layer fans it out to your subscribed URL as a stable record.* event.

Public events

Defined in the webhook event catalog (webhook/events/webhook-event-catalog.ts):

Public eventInternal verbFires when
record.createdCREATEA record is created in a CRM object
record.updatedUPDATEA record is updated
record.deletedDELETEA record is deleted

Subscribe by exact name; unknown names are rejected at create time. List them live at GET /api/v1/webhooks/events.

Manage subscriptions — /api/v1/webhooks

An API key (or admin JWT) owns its subscriptions:

Method & pathPurpose
GET /webhooks/eventsThe public event catalog
POST /webhooks/subscriptionsRegister a target_url (HTTPS) + events[] → returns a signing secret
GET /webhooks/subscriptions · /:slugList / get your subscriptions
DELETE /webhooks/subscriptions/:slugDelete a subscription

Delivery & signature

Each delivery carries these headers:

HeaderValue
X-Corteksa-Eventthe public event name (record.created, …)
X-Corteksa-Deliveryunique delivery id (dedupe on this)
X-Corteksa-Signaturet=<unixSeconds>,v1=<hmac-sha256> over the raw body

Verify the v1 HMAC against your secret over the raw body before trusting the payload, return 200 fast, and work async — non-2xx responses retry with backoff, so make your handler idempotent. Full walkthrough: Receive webhooks.

Loop prevention

A write made through an API key or OAuth token is tagged with its source (sourceApiKeyId / sourceOauthClientId). The fanout won't deliver that event back to a subscription owned by the same credential — so your own writes don't trigger your own webhook.

These are Corteksa → your app webhooks. For provider → Corteksa messaging webhooks (WhatsApp/Facebook replies), see Messaging › Webhooks.

Next

On this page