POST
https://api.craftkit.dev/v1/hooks/:token{ data: … } wrapper. Inbound renders share the rendering pipeline with
POST /v1/templates/:slug/render: same Zod validation, versioning,
dashboard row, and outgoing webhooks.
Authorization
Inbound webhooks are not authenticated with a project API key. The per-template token in the URL identifies the template; an optional HMAC signature proves the payload’s integrity.Optional. Hex-encoded HMAC-SHA256 of the raw request body, keyed by the template’s inbound
secret. When present it is verified; when absent the request is accepted (toggle enforcement per
template in the dashboard for production traffic).
Path parameters
The per-template inbound token from the Use this template → Inbound webhook panel. Identifies
and authenticates the target template.
Body
The body is the flat variable data — the manifest keys for the target template, with no envelope. Scalars nest by dot-path; loops are keyed by their dot-free top-level key. Keys absent from the manifest are stripped. Invalid payloads return400 invalid_input_data with the offending fields in
issues.fieldErrors.
Response
202 when a render is queued.
Render id (UUIDv7).
Always
queued on accept.GET this with your project bearer token to poll the render.Errors
| Status | code | Meaning |
|---|---|---|
| 400 | invalid_json | Body is not valid JSON. |
| 400 | invalid_input_data | Body did not match the template manifest (issues included). |
| 401 | invalid_signature | x-craftkit-signature was present but did not match. |
| 404 | invalid_token | No template matches this inbound token. |
| 409 | no_published_version | Template has no published version yet. |
| 503 | queue_unavailable | Render queue is temporarily unreachable — retry. |
cURL
202