GET /api/v1/jobs/{job_id} remains the source of truth, and webhooks are a
convenience layer on top of it.
Add, edit and rotate endpoints from
Dashboard, Webhooks, or through the
API. Each endpoint has its own signing secret, prefixed
whsec_, shown once
when you create or rotate it.Events
Leave
event_types empty to subscribe to every event, including ones added
later. A failed upload is delivered as render.failed, so subscribe to
render.failed if you ingest PSDs.
Endpoints created before the
photo_mockup names were introduced are pinned to
the earlier spelling of the same five events: 2d_mockup.ready,
2d_mockup.rejected, 2d_mockup.failed, 2d_render.succeeded and
2d_render.failed, with kind spelled 2d_create or 2d_render. They keep
receiving them unchanged. The endpoint’s event_naming field reads legacy or
current and says which spelling it receives; new endpoints default to
current. Either spelling is accepted in event_types. Move an existing
endpoint with PATCH { "event_naming": "current" } once your handler reads the
new names.Headers and body
Headers
Body
Create an endpoint
The endpoint object
Deliveries
Every attempt is logged with its HTTP status, attempt count and error.cursor. When another page exists, the response carries
X-Webhook-Next-Cursor. Send that exact value as the next request’s cursor.
When the header is absent, the list is complete.
Paging through deliveries
Retries and replay
Failed deliveries are retried automatically. You can inspect every attempt and replay a single delivery, or replay every failed delivery for an endpoint at once. Treatjob_id plus the event name as the delivery’s idempotency key, persist it
before applying side effects, and return a 2xx response only after processing
succeeds. A replayed delivery can arrive with result_url set to null; when
that happens, fetch the result by polling GET /api/v1/jobs/{job_id}.
Send a test event
Verifying signatures
Check the HMAC before you trust a payload.
Webhook endpoints API
Create, rotate, list, replay and inspect, from your own backend.