Skip to main content
Fifteen minutes, end to end. You need a URL Custral can reach over the public internet and workspace admin access.
1

Stand up an endpoint

Anything that answers POST with a 2xx will do. Using the TypeScript SDK, the receiver is three lines:
Mount express.raw({type: "application/json"}) on the webhook route. A JSON-parsed body cannot be verified, because re-serializing it does not reproduce the bytes that were signed.
2

Expose it

In development, a tunnel is the quickest route:
Custral refuses localhost, private and link-local IP addresses, and any scheme other than http or https. See What Custral will and will not call.
3

Register the endpoint

Open Settings → Developers → Webhooks, choose Add webhook, paste the URL, and tick the events you want.You can also ask the assistant, or any MCP client holding a key with the webhooks:manage scope:
Register a webhook at https://abc123.ngrok.io/hooks/custral for record.created and record.updated.
See Managing subscriptions for both paths in full.
4

Copy the signing secret

Creating the endpoint returns a whsec_… secret once. Put it in your environment as CUSTRAL_WEBHOOK_SECRET before you close the dialog.
Lost it? Nothing can retrieve it. Rotate the secret to get a new one, and update your environment at the same time.
5

Fire a real event

Create a record on any object in the workspace. Within a second or two your handler should log its id.Nothing arrived? Open the endpoint in settings and read its delivery log: every attempt is recorded with the HTTP status your server returned. Start at Troubleshooting.

Verifying without the SDK

The signature is a Stripe-style HMAC, so it is a handful of lines in any language. The full algorithm and the reasoning behind each step is on Verifying signatures.

What’s next

Event catalog

The exact payload of every event.

Delivery and retries

Timeouts, retries, and why your handler must be idempotent.