Skip to main content
Every failure returns a JSON body. Branch on error_code where it is present, and always keep a default case that surfaces message and details.suggestion, so an unfamiliar code degrades into a readable failure instead of a crash. Every endpoint answers with the same error envelope, so the codes below apply across the API rather than per endpoint. The reference pages show the success response; this page is where the failures live.

Status codes

Error shapes

Most errors carry a human-readable message:
Standard error
PSD and render failures add a machine-readable error_code and a details object with a suggestion:
Structured error

Upload error codes

POST /api/v1/psd/upload returns these on error_code.
LINKED_SMART_OBJECT_CONTENT_MISSING is permanent. Re-uploading the same file produces the same result. Most linked smart objects render fine as placeholders and do not need embedding.

Render error codes

Render, text layer, font, artwork and photo mockup failures use the same error_code field. Take the HTTP status from the response rather than from this table. These are the codes integrations hit most often, not an exhaustive registry.

Rate limits and concurrency limits

Two ceilings answer 429: a request rate, and a cap on how many long operations run at once. Both report their state in response headers, and error.type says which one you hit.

Usage limits

The numbers, the headers, and both 429 bodies.

Retry strategy

Retry 429, 500, 502, 503, 504 and network errors. Do not retry 400, 401, 402, 403, 404 or 422: fix the request or the billing state first.
Retry with backoff
Credits are charged only on successful requests. A failed request is not charged.

Webhooks

Let long jobs call you back instead of polling them.

Plans and limits

Read the live concurrency and template ceilings for an account.