Two ways in
Webhook
For another service calling HERO. Authenticated by a secret that belongs to
one automation, so the caller needs no HERO account.
API
For your own code. Authenticated by your personal token, so the run records
who started it.
Webhook
The secret may be sent as
X-Hero-Webhook-Secret or as
Authorization: Bearer whsec_…, whichever your service can set.API
403.
What you can post
Any JSON body, up to 1 MB. An object or an array both work — a service that batches events into a list is a normal caller, not a special case. A body larger than the limit is refused with413 rather than truncated, so a
run never acts on half a message.
Both surfaces accept 200 requests per minute. Above that you get
429.Reading the fields you sent
Anywhere a step takes text — an email body, an AI instruction, a cell value — write ahero:trigger/payload token and HERO substitutes what you posted.
Put a dot after payload, then use slashes to go deeper:
The
@ menu offers what you posted as a starting point and inserts
@[what you posted](hero:trigger/payload), which resolves to the whole body.
Add the path yourself to narrow it to one field — the label is only what you
read, the part in brackets is what resolves.
A field you did not send resolves to an empty string, not to the token itself. A
step that depends on one will act on a blank rather than fail loudly, so branch
on it if it matters:
Routing one endpoint to different work
Services that send several kinds of event usually post a type field. Start one automation, then split on that field with a path step — one branch per event kind, and a fallback for everything you have not handled yet. That keeps one URL and one secret per integration, rather than an automation for every message type your service might send.Checking what arrived
Open the automation and expand a run. A run started by a post shows What was posted — the exact body HERO received. Reach for it first when a step produces nothing: almost always the field is nested a level deeper than the token assumed, or the service names it something else. The run cannot tell you that a field was missing, because a missing field and an empty one resolve the same way.Responses
Not sending the same thing twice
Send anIdempotency-Key header — on either endpoint — and a repeat of the same
key returns the original run instead of starting another:
200 with replayed: true, so a service that retries on timeout
cannot run your workflow twice. Use the sending service’s own event id.