Skip to main content
WEBHOOK
render.event
{
  "event": "render.succeeded",
  "renderId": "0193c2c3-1111-7aaa-8bbb-000000000001",
  "templateId": "0193c2c3-0000-7aaa-8bbb-000000000000",
  "status": "succeeded",
  "downloadUrl": "https://cdn.craftkit.dev/craftkit-renders/…​.pdf",
  "errorMessage": null,
  "createdAt": "2026-06-05T10:00:00.000Z",
  "completedAt": "2026-06-05T10:00:00.420Z"
}

Authorizations

Authorization
string
header
required

Project API key (ck_live_… or ck_test_…) presented as a bearer token. For embed partner endpoints this is the partner secret key, which is the same credential type.

Headers

x-craftkit-event
string
required

The event name (mirrors the body's event field).

Example:

"render.succeeded"

x-craftkit-signature
string
required

HMAC-SHA256 of the raw request body, keyed with the subscription secret, hex-encoded (no prefix). Verify before trusting the payload.

x-craftkit-timestamp
string
required

Unix epoch seconds when the delivery was signed. Use with the signature to reject stale replays.

x-craftkit-delivery-id
string<uuid>
required

Stable delivery id, reused across retries. Key your idempotency on it.

Body

application/json

Body of a render.* outgoing webhook.

event
enum<string>
required
Available options:
render.succeeded,
render.failed
renderId
string<uuid>
required
templateId
string<uuid>
required
status
string
required

Terminal render status.

Example:

"succeeded"

createdAt
string<date-time>
required
downloadUrl
string | null

Public PDF URL on success; null when public delivery isn't configured or on failure.

errorMessage
string | null

Set on render.failed.

completedAt
string<date-time> | null

Response

2XX

Return any 2xx to acknowledge. Non-2xx / timeout triggers retry.