Skip to content

Errors & limits

Every DocJet error response is JSON with the same three fields:

{
"error": "Human-readable message",
"code": "MACHINE_READABLE_CODE",
"hint": "What to do about it"
}

Agents and SDKs should branch on code, never on the message text.

CodeHTTPMeaning
AUTH_INVALID401API key missing, malformed, or revoked
PAYLOAD_INVALID422Request body fails validation (wrong shape, oversized HTML, bad webhook_url…)
TEMPLATE_NOT_FOUND404template_id does not exist — list valid IDs with GET /v1/templates
RATE_LIMITED429Per-minute request limit exceeded — back off and retry
QUOTA_EXCEEDED429Monthly render quota exhausted — upgrade or wait for the next period
CONCURRENCY_EXCEEDED429Too many simultaneous renders for your plan — retry after in-flight renders finish
INTERNAL_ERROR500Server-side failure — safe to retry with backoff

Related codes you may see outside rendering: SIGNUP_THROTTLED (429, signup is per-IP throttled), AUTH_EMAIL_EXISTS (409, email already has a key).

All three 429 codes are distinct on purpose:

  • RATE_LIMITED — you’re calling too fast. Wait seconds.
  • CONCURRENCY_EXCEEDED — too many renders in flight at once. Wait for completions.
  • QUOTA_EXCEEDED — the monthly budget is gone. Upgrade via POST /v1/billing/checkout or wait for the period reset.
PlanRenders / monthRate limitConcurrent renders
Demo key (public)503 req/min1
Free10010 req/min1
Starter ($9)1,00060 req/min2
Pro ($29)10,000300 req/min5
Business ($99)100,0001,000 req/min10

Check where you stand at any time:

Terminal window
curl https://api.docjet.dev/v1/keys/usage \
-H "Authorization: Bearer $DOCJET_API_KEY"
  • Raw html payloads: max 512 KB.
  • template_id: must match ^[a-z0-9][a-z0-9-]{0,63}$.
  • webhook_url: HTTPS only, default port, max 2,048 characters.