Errors & limits
Status codes, rate limits, and the monthly signature-request allowance per plan.
Error responses
Errors use conventional HTTP status codes with a JSON body describing the problem:
| Status | When |
|---|---|
400 | The request body failed validation — a missing role, an unknown field in values, a malformed email. The message lists what to fix. |
401 | No API key, or a key that is invalid, revoked, or expired. |
403 | The key works but the action isn't allowed — the plan no longer includes e-signatures, the key's creator left the workspace, or the monthly allowance is used up (limit_reached:signatureRequests). |
404 | Unknown id — including templates that exist but aren't published. |
429 | Rate limited. |
Rate limit
Requests are rate-limited per client at 120 requests per minute. Past
that, requests return 429 until the minute window passes. If you're
polling many signature requests, spread the polls out rather than bursting.
Monthly signature-request allowance
Sending a signature request — from the app or through the API — counts against your workspace's monthly allowance, which resets at the start of each calendar month (UTC):
| Plan | Signature requests / month |
|---|---|
| Starter | 1 |
| Professional | 10 |
| Max | 25 |
| Team Standard | 50 (whole workspace) |
| Team Premium | 100 (whole workspace) |
| Enterprise | Unlimited |
When the allowance is exhausted, POST /esign/submissions returns 403 with
the stable code limit_reached:signatureRequests. Listing templates, polling
status, and downloading signed documents are never metered, and a retried
request with an already-used idempotencyKey is not charged again.
Generating a filled document without sending it for signature (available in the app) doesn't count against the allowance either — only signature requests do.

