GuidesConventions
Rate limits
Limits are per account, per minute, shared by all its keys. Every response tells you where you stand.
The limits
| Keys | Requests a minute | Of which heavy |
|---|---|---|
| Live | 300 | 60 |
| Test | 30 | — |
Heavy calls are POST /v1/envelopes, POST /v1/envelopes/{id}/documents, POST /v1/envelopes/{id}/send and the /v1/uploads calls. They count toward both limits. Bytes you PUT to upload URLs go straight to storage and don’t count.
Minutes are clock minutes. Calls refused before the limit is checked — a bad key, an IP not on the allowlist, an unknown route, a test key on files, a missing scope — don’t count.
Headers
| Header | Meaning |
|---|---|
RateLimit-Limit | The limit that’s closest to running out (300, 60 or 30). |
RateLimit-Remaining | Requests left in this minute under that limit. |
RateLimit-Reset | Seconds until the minute ends. |
Retry-After | On 429 only: seconds to wait. |
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
RateLimit-Limit: 300
RateLimit-Remaining: 0
RateLimit-Reset: 12
Retry-After: 12
{
"type": "https://api.skanything.io/v1/docs/errors#rate_limited",
"title": "Too Many Requests",
"status": 429,
"code": "rate_limited",
"detail": "Too many requests. Try again in 12 seconds.",
"request_id": "req_7c1e5a9d3f2b4e8a6c0d9f1b",
"errors": null
}Staying under
- Use webhooks instead of polling envelopes.
- On
429, waitRetry-Afterseconds before the next call; spread big batches across minutes. - Ask for bigger pages (
limit=100) rather than more of them.