Webhooks
Mint a signed address any tool can post JSON to, map the payload onto a lead, send signed deliveries out of an automation, and verify the signature both ways.
Webhooks is the escape hatch for everything without a tile of its own. It does two separate jobs: inbound, it mints signed addresses any external tool can POST JSON to, which start a Webhook received automation; outbound, it holds the key your automations sign their deliveries with. No provider account is involved in either direction.
Before you start
Reading the Webhooks tile needs to be an owner, or an automations editor with
the automations permission. Managing endpoints needs owner or admin. Find it
at SettingsIntegrationsWebhooks — Signed addresses
any tool can post to, and the key your automations sign with.
Create an inbound endpoint
Open the Webhooks tile
Find Add endpoint on the card.
Give it a Name
The placeholder is CallRail leads. Maximum 80 characters. Name it after the sender, because that is how you will debug it.
Choose the Verification mode
Address only (the URL is the secret), or signed HMAC on top of the address.
Map lead fields, if you want a lead created
Dot paths into the posted body for name, email, phone, company, website and
message — for example contact.email.
Click Add endpoint
Copy the Address, and the signing secret if you chose signed
They are shown once.
Paste the address into the sending tool
Into its webhook field.
Build an automation on the Webhook received trigger
Scoped to this endpoint.
Address-only or signed
| Address only | Signed | |
|---|---|---|
| What proves the call | The URL itself is the secret | The URL, plus an HMAC signature on every request |
| Good for | A tool that only lets you paste a URL | Anything that can sign, and anything that matters |
| What you copy | The address | The address and the signing secret |
Both secrets are shown exactly once
The card says it plainly: Shown once — rotating replaces it and the previous value stops working. Put the address and the secret into your password manager before you close the dialog. Zyan cannot read them back to you.
Mapping fields onto a lead
The six mapping fields take dot paths into the body the sender posts. If your sender posts this:
{ "contact": { "email": "dana@example.com", "full_name": "Dana Reyes" } }
then the email path is contact.email and the name path is
contact.full_name.
With an email mapped, the endpoint lands a lead — or reuses an existing one with that email. Without an email, no lead is created and the automation still runs on the payload. Mapping is optional: an endpoint that only starts an automation needs no mapping at all.
The signature scheme
One scheme works in both directions, so any third party can speak it either way.
X-Zyan-Timestamp: <unix seconds or milliseconds>
X-Zyan-Signature: sha256=<hex HMAC-SHA256 of "<timestamp>.<raw body>">
The signed string is the timestamp, a full stop, then the raw request body — the exact bytes, before any parsing. Timestamps are accepted within five minutes either side.
| Direction | Which secret | Who needs it |
|---|---|---|
| Inbound | The endpoint's inbound signing secret | Whoever sends you webhooks, so they can sign |
| Outbound | Your outbound signing key | Whoever receives your deliveries, so they can verify |
Verify the raw body, not the parsed object
Re-serialising JSON changes the bytes and the signature will not match. Capture the raw body before your framework parses it.
Sending webhooks out
Add a Send webhook step to an automation. It POSTs or PUTs a signed JSON
envelope to any public https URL you type. Map the fields you want under
data, and add up to five extra headers if the receiver needs them.
The envelope shape:
{
"event": "lead.created",
"data": { "email": "dana@example.com" },
"sent_at": "2026-01-01T12:00:00.000Z",
"source": "zyan"
}
Deliveries also carry X-Zyan-Event, X-Zyan-Event-Id and a
Zyan-Webhooks/1 user agent, alongside the timestamp and signature headers.
Rotate, disable, delete
| Action | What it does |
|---|---|
| Rotate | Replaces the address token only. The old address stops working immediately, and the new one is shown once |
| Disable | Acknowledges senders with a 200 and writes nothing |
| Delete | Removes the endpoint entirely |
Rotating does not change the signing secret
Rotation replaces the address, not the inbound signing secret. To mint a new secret, switch the endpoint to address-only and back to signed. And remember that a rotation breaks the sender the moment you confirm it — have the sending tool open and ready to paste.
An endpoint belongs to the workspace, not to an automation
Drafting, publishing or deleting an automation never changes an address you already pasted into a sender. You can point several automations at the same endpoint, and replace the automation behind it without telling the sender.
Limits
| Limit | Value |
|---|---|
| Request body | 128 KB |
| Payload nesting depth | 4 |
| Keys per object | 200 |
| Array length | 50 |
| String length | 2,000 |
| Receipts per endpoint | 1,000 per hour |
| Receipts per workspace | 2,000 per hour |
| New leads per workspace | 100 per hour |
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The sender gets a 401 or 404 | The token is wrong, or the address was rotated | Re-copy the address from the Webhooks tile and paste it into the sender |
| You cannot tell whether the endpoint or the token is wrong | An unknown endpoint and a wrong token look identical from outside, deliberately | Re-copy the whole address rather than guessing |
| Your signature never verifies | The signed string is the timestamp, a full stop, then the raw body | Sign the raw bytes, not a re-serialised object |
| Requests are rejected as stale | Timestamps are accepted within five minutes either side | Check the sending server's clock |
| No lead is created | No email path is mapped, or the payload has no email at that path | Map email to the right dot path |
| A big payload is rejected | The body is over 128 KB, or the structure is too deep or too wide | Send a smaller payload |
| Deliveries stop after a burst | The per-endpoint or per-workspace hourly cap was reached | Spread the sends out |
| You lost the address or the secret | Both are shown exactly once | Rotate to mint a new address; for a new secret, switch to address-only and back |