Skip to Content

Errors

Every error response is JSON, shaped as:

{ "success": false, "error": "Human-readable message", "code": "machine_readable_code" }

Build your error handling against code, not the error message string — the message text may change without notice, code won’t.

Authentication & authorization

StatuscodeCauseFix
401missing_api_keyNo Authorization header, or it isn’t Bearer <key>Add Authorization: Bearer dt_live_...
401invalid_api_keyThe key doesn’t match any issued key, or is malformedDouble-check the key; regenerate if it was never a real key
401revoked_api_keyThe key was revoked in the dashboardGenerate a new key
403insufficient_scopeThe key doesn’t have the render:write scopeGenerate a key with render:write, or add the scope to an existing key

Request validation

StatuscodeCauseFix
400(none)Body isn’t valid JSONCheck your JSON encoding
400(none)Body matches neither the {templateId} nor {canvas, layers} shapeSee POST /v1/render for the two accepted shapes
404template_not_foundtemplateId doesn’t exist, or belongs to a different workspaceVerify the ID in the dashboard. Cross-tenant IDs intentionally 404 rather than 403

Rate limits & billing

StatuscodeCauseFix
429rate_limitedMore than the per-key rate limit in the last 60 secondsBack off and retry — see the Retry-After header and Rate Limits
402(none — see paywall object)Workspace render-credit balance is below the cost of one renderTop up credits or upgrade your plan — see Billing & Credits

A 402 response includes a paywall object with more detail:

{ "success": false, "error": "Insufficient credits (0 credits / ~0 renders remaining, 10 credits required per render).", "paywall": { "required": true, "reason": "CREDITS_EXHAUSTED", "balance": 0, "rendersRemaining": 0, "upgradeUrl": "/dashboard/billing", "message": "Credits depleted. Upgrade your subscription or top up credits to continue rendering unbranded graphics." } }

Server / upstream errors

StatusCause
5xxThe render engine returned an error for this specific payload (e.g. an unreachable image URL, or a malformed layer) — check details in the response body
500An unexpected server-side error. If this persists, it’s worth reporting

Transient 5xx/network errors are worth a small number of retries with backoff. 401, 403, 400, and 404 will not succeed on retry without changing the request.