1
Stand up an endpoint
Anything that answers
POST with a 2xx will do. Using the
TypeScript SDK, the receiver is three lines: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 atSee Managing subscriptions for both paths in full.https://abc123.ngrok.io/hooks/custralforrecord.createdandrecord.updated.
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.