Webhooks
Receive signed render.completed / render.failed callbacks and verify the X-Automotion-Signature header.
Instead of polling, pass a webhook_url when creating a render (paid plans
only — on the trial, webhook_url answers
WEBHOOKS_NOT_ALLOWED). Automotion calls
your URL once per render with the terminal state.
Events and payload
Two events exist: render.completed and render.failed. The body is
byte-identical across delivery attempts:
Request headers:
| Header | Meaning |
|---|---|
Content-Type | application/json |
X-Automotion-Signature | t=<unix seconds>,v1=<hex HMAC> — verify this |
X-Automotion-Event | The event name |
X-Automotion-Delivery | Unique delivery id (changes per attempt) |
id is a stable consumer dedupe key (evt_<renderId>_<event>): store it
and ignore repeats — delivery is at-least-once.
Retries
On a non-2xx response or timeout (10 s), delivery retries up to 5 attempts
with backoff delays of 1, 5, 25, 125, 625 seconds after each failure.
Answer 2xx quickly (enqueue your own processing) to avoid retries. URLs must
be publicly resolvable — private/internal addresses are rejected outright
(URL_NOT_ALLOWED) and are not retried.
Verifying the signature
Your webhook signing secret (whsec_…) lives in the
dashboard and can be rotated there at any time. The signature is
computed over the raw request body:
Reject deliveries whose timestamp is more than 5 minutes off your clock (replay protection), and compare digests in constant time.
The exact helper the platform itself tests against ships with the Automotion TypeScript packages:
verifyWebhookSignature never throws and compares in constant time. Parse the
JSON only after verification, and always verify the raw bytes — a
re-serialized body will not match the signature.
Checklist
- Verify the signature against the raw body before trusting anything.
- Dedupe on the payload
id(evt_<renderId>_<event>). - Respond
2xxfast; do heavy work asynchronously. - Treat
render.failedas terminal —render.error.codeexplains why (error catalog). - Rotate the secret from the dashboard if it ever leaks; rotation replaces the old secret immediately.