Webhook: jobcompleted
POSTed to the job’s registered webhook URL when the job completes. Delivery is at-least-once: dedupe on X-Hedra-Webhook-Id and verify X-Hedra-Webhook-Signature before acting.
Headers
Deduplication id: the job's own id (job_<uuid>), byte-identical across every retry and every replay. Signed.
Unix epoch seconds the delivery was signed at; reject it when more than 5 minutes old. Signed.
The event this delivery announces. Signed.
"job.completed"1-based attempt number within the current delivery cycle. Informational and outside the signature; do not branch on it.
x >= 1true when an operator asked for this event to be sent again — process it even if its id was already recorded. Signed.
true, false Hex-encoded ed25519 signature over the canonical string documented on the Webhooks tag; verify against the key from GET /webhooks/public-key before acting on the request.
Body
Body of a webhook delivery: the GET /jobs/{job_id} result envelope without its poll-only fields (logs, cost, currency) — poll the job to read those.
The four states a job can be in.
IN_QUEUE, IN_PROGRESS, COMPLETED, FAILED The quality level this job ran at; present only for models that offer quality levels.
The prompt this job ran with. When enhance_prompt was set, this is the rewritten prompt the model received rather than the one submitted. Absent on models that take no prompt.
Timing for this job; present on completed jobs only.
Response
Acknowledged; any 2xx stops the retry ladder. Other responses are retried per the Webhooks tag.