Skip to content

GuidesConventions

Rate limits

Limits are per account, per minute, shared by all its keys. Every response tells you where you stand.

The limits

KeysRequests a minuteOf which heavy
Live30060
Test30—

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

HeaderMeaning
RateLimit-LimitThe limit that’s closest to running out (300, 60 or 30).
RateLimit-RemainingRequests left in this minute under that limit.
RateLimit-ResetSeconds until the minute ends.
Retry-AfterOn 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, wait Retry-After seconds before the next call; spread big batches across minutes.
  • Ask for bigger pages (limit=100) rather than more of them.