| Status | Error | Meaning |
|---|---|---|
| 400 | bad_json | Body wasn't valid JSON or didn't match the expected shape. |
| 400 | transform_failed | A field's transform code failed. The body lists each failed field. |
| 400 | ttl_exceeds_plan | ttlSeconds is above your tier's max. Response includes maxAllowedSeconds + suggested upgrade tier. |
| 400 | invalid_recipient_email | /sign-requests rejected the supplied recipient address. |
| 400 | recipient_email_required | /sign-requests body omitted recipientEmail. |
| 400 | no_signature_placeholder | The template has no sign-here field. Add one in the editor. |
| 400 | template_or_render_required | /sign-requests body had neither templateId nor renderId. |
| 400 | template_and_render_exclusive | /sign-requests body had both templateId and renderId. Send exactly one. |
| 400 | invalid_ttl | ttlSeconds wasn't a positive integer. (Values over 30 days are clamped, not rejected.) |
| 400 | render_not_a_pdf | renderId points at a ZIP render. Only PDF renders can be signed. |
| 400 | render_has_no_template | renderId points at a render with no linked template, so the signature positions are unknown. |
| 404 | render_not_found | renderId doesn't exist in this workspace. |
| 400 | template_has_password | Password-protected templates can't be sent for signature. Clear the password first. |
| 400 | schema_validation_failed | data didn't match the template's JSON Schema. See Schemas. |
| 500 | schema_invalid | The template's stored schema doesn't compile. Fix it in the dashboard. |
| 402 | license_upgrade_required | Self-hosted: the endpoint needs an enterprise license. |
| 503 | smtp_not_configured | Self-hosted: sign requests need SMTP configured. See the Self-host guide. |
| 400 | not_a_pdf | Template create rejected — the uploaded file isn't a PDF (no %PDF- magic header). Re-upload the source PDF. |
| 400 | empty_pdf | Template create rejected — the uploaded file is zero bytes. |
| 400 | truncated_pdf | Template create rejected — the uploaded PDF has no %%EOF marker. The upload was probably cut short; retry. |
| 400 | unsafe_pdf | The PDF uses an unsupported feature (embedded JS, launch actions, XFA). marker names it; strip and re-upload. |
| 401 | invalid_key | API key missing, malformed, or revoked. |
| 402 | render_quota_exceeded | Workspace at or above its monthly render limit. On Free this is a hard cap — upgrade to clear. Paid tiers only see it once the prepaid balance can't cover overage; topping up also clears it. |
| 402 | paid_tier_required | /sign-requests on a Free tenant. Sign-requests are a paid-tier feature. |
| 402 | sign_request_quota_exceeded | Monthly sign-request quota used up and no balance left. Top up or upgrade. |
| 502 | email_send_failed | /sign-requests couldn't deliver the recipient email. No counter bump, no balance charge — safe to retry. |
| 502 | storage_upload_failed | /sign-requests couldn't store the pre-sign PDF. No counter bump. |
| 403 | tenant_suspended | Workspace is suspended. Contact support. |
| 404 | not_found | Template / job ID doesn't exist or isn't visible to your key. |
| 410 | expired_or_unknown | The sign link is unknown, already used, or expired. |
| 429 | too_many_requests | Rate limit. Honor Retry-After. See Rate limits. |
| 503 | renderer_busy | At capacity. Sleep Retry-After seconds and retry — nothing was charged. |
| 504 | render_failed | Render timed out — usually a very heavy template. Retry once, or split the batch. |
Need help?
Open a ticket from the in-app Support page, or email [email protected].