ZyanDocs

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 SettingsIntegrationsWebhooksSigned 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 onlySigned
What proves the callThe URL itself is the secretThe URL, plus an HMAC signature on every request
Good forA tool that only lets you paste a URLAnything that can sign, and anything that matters
What you copyThe addressThe 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.

DirectionWhich secretWho needs it
InboundThe endpoint's inbound signing secretWhoever sends you webhooks, so they can sign
OutboundYour outbound signing keyWhoever 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

ActionWhat it does
RotateReplaces the address token only. The old address stops working immediately, and the new one is shown once
DisableAcknowledges senders with a 200 and writes nothing
DeleteRemoves 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

LimitValue
Request body128 KB
Payload nesting depth4
Keys per object200
Array length50
String length2,000
Receipts per endpoint1,000 per hour
Receipts per workspace2,000 per hour
New leads per workspace100 per hour

Troubleshooting

SymptomCauseFix
The sender gets a 401 or 404The token is wrong, or the address was rotatedRe-copy the address from the Webhooks tile and paste it into the sender
You cannot tell whether the endpoint or the token is wrongAn unknown endpoint and a wrong token look identical from outside, deliberatelyRe-copy the whole address rather than guessing
Your signature never verifiesThe signed string is the timestamp, a full stop, then the raw bodySign the raw bytes, not a re-serialised object
Requests are rejected as staleTimestamps are accepted within five minutes either sideCheck the sending server's clock
No lead is createdNo email path is mapped, or the payload has no email at that pathMap email to the right dot path
A big payload is rejectedThe body is over 128 KB, or the structure is too deep or too wideSend a smaller payload
Deliveries stop after a burstThe per-endpoint or per-workspace hourly cap was reachedSpread the sends out
You lost the address or the secretBoth are shown exactly onceRotate to mint a new address; for a new secret, switch to address-only and back