Reference

Rate limits

Per-endpoint request limits for the Macaaw Public API and how to handle 429 responses.

Limits are counted per user over a 60-second sliding window, separately for each group of endpoints. Sandbox keys share one small limit for everything.

Limits per endpoint group#

EndpointsLive keys (requests / minute)
List, status and delete600
Document details300
Create document100
Send, remind and void100
Downloads100
Create task120
Webhook subscriptions and events60
Signing sessions100
Sandbox keys: 10 requests per minute in total, across all endpoints.

Every endpoint#

EndpointLive limit / minute
GET/documents600
POST/documents100
GET/documents/{id}600
DELETE/documents/{id}600
GET/documents/{id}/details300
POST/documents/{id}/send100
POST/documents/{id}/remind100
PATCH/documents/{id}/status100
GET/documents/{id}/download100
POST/documents/{id}/session100
GET/tools600
POST/tasks120
GET/tasks/{id}600
DELETE/tasks/{id}600
GET/tasks/{id}/download100
POST/invoice-checks120
GET/invoice-checks/{id}600
GET/webhook-subscriptions60
POST/webhook-subscriptions60
GET/webhook-subscriptions/{uuid}60
PATCH/webhook-subscriptions/{uuid}60
DELETE/webhook-subscriptions/{uuid}60
POST/webhook-subscriptions/{uuid}/shared-key60
GET/webhook-events60
POST/webhook-events/{id}/resend60

Headers#

HeaderMeaning
X-RateLimit-LimitRequests allowed in the window for this endpoint group.
X-RateLimit-RemainingRequests left in the current window.
Retry-AfterOn a 429 only: seconds to wait before trying again.
429 Too Many Requests
{
  "type": "rate_limit",
  "code": "RATE_LIMITED",
  "detail": "Too many requests. Please wait a moment."
}

Handling 429#

Wait for Retry-After seconds, then retry. Spread bulk work out instead of sending it in bursts, and prefer webhooks to polling.

async function call(url, init, tries = 5) {
  const res = await fetch(url, init);
  if (res.status !== 429 || tries === 0) return res;
  const wait = Number(res.headers.get('Retry-After') ?? 1);
  await new Promise((r) => setTimeout(r, wait * 1000));
  return call(url, init, tries - 1);
}
Rate limits · Macaaw API