All topics
Get started8Account, team & permissions44Units & fields70Records, views & tasks39WhatsApp & Cortex Chat68Email & social27Lead ads & distribution38Automations52Documents & quotes32Dashboards40Cortex AI18Developers & API12
Help Center·448 guidesAll topicsContact support

Automation Webhooks: outgoing, incoming and their signatures

The Send to another app action in an automation signs every request with a secret that’s unique to each automation. The Another app sends data trigger gives you a public URL that accepts JSON up to 64 KB, with an optional signature.

7 min

Outgoing: the Send to another app action

It’s set up from the automation actions. The request carries these headers:

Header
Meaning
X-Workflow-Signature
sha256= + an HMAC of the raw body
X-Workflow-Timestamp
The signing time, in Unix seconds
X-Workflow-Signature-V2
sha256= + an HMAC of timestamp.rawBody (preferred)
X-Corteksa-Payload-Version
1 or 2, for the shape of the automatic body
Idempotency-Key
The same for every attempt of the same step in the same run

The secret is unique to each automation, and starts with whsec_. The app doesn’t show it, so to check requests on your side, add a header of your own under Headers in the step, such as a key your system expects.

Body shape
Content
Version 2 (the default for new steps)
Fields by their IDs, options as { id, label }, assignees by their IDs, and event_id to prevent duplicates
Version 1 (old)
The old shape, with internal numbers
Custom
A JSON template with variables, and no version

Delivery: a 10-second timeout, redirects aren’t followed, and any 2xx is success. It’s retried on 5xx, 408, 425, 429 and network drops, up to 5 attempts, with a gap that starts at 5 seconds and doubles up to 10 minutes. Delivery is “at least once”, so prevent duplicates with Idempotency-Key.

Internal and private addresses are refused. Up to 20 custom headers, and each value up to 2,048 characters.

Incoming: Another app sends data

A trigger in automations that gives you a public URL, POST /api/v1/workflow-hooks/{token}.

Item
Rule
Body
A JSON object of type application/json, up to 64 KB
Signature (optional)
X-Corteksa-Timestamp within 5 minutes, and X-Corteksa-Signature: v1=<HMAC(secret, timestamp.rawBody)>
Duplicate prevention
Idempotency-Key for a day, or the same body within 10 minutes
Rate
60 requests a minute
Listening for a test
10 minutes, during which the next request is captured as a sample without running
Response
202 with request_id and duplicate

Press Add a signing secret to turn on the signature: the secret shows once, and after that every request must be signed. Lost it? Press Make new. Stop checking turns the signature off.

If something goes wrong

What you see
Why
What to do
401 BAD_SIGNATURE
A wrong signature, or an old time.
Sign timestamp.rawBody with the current secret.
409 WORKFLOW_OFF
The automation is turned off.
Turn it on.
413 BODY_TOO_LARGE
The body is larger than 64 KB.
Send less data.
415 BODY_NOT_JSON_OBJECT
The body isn’t a JSON object.
Send an object, with the JSON type.
429 HOOK_RATE_LIMITED
You went over the rate.
Wait as Retry-After says, and send fewer requests.
429 WORKFLOW_RUNS_USED_UP
The month’s automation runs are used up.
404 HOOK_NOT_FOUND
The URL is wrong.
Copy the address again from the automation’s trigger.

Good to know

A captured sample can be up to 16 KB.
The last received time updates at most once a minute.
Did this guide solve it?
If not, we’ll ask what was missing.
Open in Corteksa
Did this guide solve it?

We read every answer. To get a reply, use Contact support.