Rate limits

When a route's limit is exceeded the API answers 429 with the standard error envelope (error: rate_limited, see /docs/errors#rate_limited), a Retry-After header with the seconds until the window resets, and the limit in hint:

{
  "error": "rate_limited",
  "error_description": "Too many requests: this route allows 60 per minute.",
  "error_uri": "https://api.bind.co/docs/errors#rate_limited",
  "fault": "client_problem",
  "hint": {"limit": "60 per 1 minute", "retry_after_seconds": 23},
  "request_id": "req_xxxxxxxxxx"
}

Wait Retry-After seconds, then retry; back off exponentially if you keep hitting it.

Every answer from a limited route carries the budget you have left, so you can slow down before you reach a 429. That includes errors such as a 401 or a 412: an answer refused before the limit was counted shows the full window.

Header Meaning
X-RateLimit-Limit Requests the window allows
X-RateLimit-Remaining Requests left in the current window
X-RateLimit-Reset When the window resets, in Unix seconds
X-RateLimit-Resource The family the route counts against: read, write and so on (below)

Counts are kept by each server instance, so these numbers are approximate. Browsers can read every one of these headers, as well as Retry-After, X-Request-Id, ETag, Location, Deprecation, Sunset and Link.

Webhook budgets

Counted per application (or per endpoint), rolling one-minute window; the reply is the same 429 envelope with hint.limit_per_minute.

Action Limit
POST /v1/webhook-endpoints/{public_id}/test (per endpoint) 10 per minute
POST /v1/webhook-deliveries/{public_id}/redeliver and POST /v1/webhook-events/{public_id}/redeliver (per application) 60 per minute
Active webhook endpoints (per application) 10 — a 409 conflict, not a rate limit

Per-route limits

Counted per application and user: each user your application acts for has their own budget, and another application's traffic never uses yours. POST /oauth2/token, /oauth2/revoke and /oauth2/introspect are counted per application (the client_id you authenticate with); the consent pages, called before a user is signed in, per calling IP address. Fixed window. Counts are kept by each server instance, so a limit is approximate: you may get a few more requests than the table says before a 429. This table is generated from the running API, so it is always current for the routes in the API reference. The webhook event-type list is outside the reference; its limit is stated in the webhooks guide. Limits may tighten; the 429 envelope and Retry-After are the contract, not the numbers.

Every route in the API reference belongs to one family: sign_in, token, read or write; only these guide pages and static files have none. The table shows each family's standard limit; your application's limit for a family may be set differently, and the X-RateLimit-Limit header always carries the one that applies to you. A few routes also carry a fixed second limit, listed after the family's.

Route Methods Family Limit
/.well-known/oauth-authorization-server GET read 60 per 1 minute
/oauth2/authorize GET sign_in 60 per 1 minute
/oauth2/authorize/preflight GET read 60 per 1 minute
/oauth2/introspect POST token 60 per 1 minute
/oauth2/revoke POST token 60 per 1 minute
/oauth2/token POST token 60 per 1 minute
/v1/.well-known/oauth-authorization-server GET read 60 per 1 minute
/v1/contacts GET read 60 per 1 minute
/v1/contacts POST write 60 per 1 minute
/v1/contacts/search POST read 60 per 1 minute
/v1/contacts/{contact_id} GET read 60 per 1 minute
/v1/contacts/{contact_id} PATCH write 60 per 1 minute
/v1/contacts/{contact_id}/confirm POST write 60 per 1 minute
/v1/contacts/{contact_id}/merge POST write 60 per 1 minute
/v1/contacts/{contact_id}/reject POST write 60 per 1 minute
/v1/contacts/{contact_id}/reset POST write 60 per 1 minute
/v1/contacts/{contact_id}/restore POST write 60 per 1 minute
/v1/contacts/{contact_id}/suggestions GET read 60 per 1 minute
/v1/contacts/{contact_id}/unmerge POST write 60 per 1 minute
/v1/drafts GET read 60 per 1 minute
/v1/drafts/count GET read 60 per 1 minute
/v1/drafts/goals GET read 60 per 1 minute
/v1/drafts/goals POST write 60 per 1 minute
/v1/drafts/goals/available-roles GET read 60 per 1 minute
/v1/drafts/goals/{goal_id} DELETE write 60 per 1 minute
/v1/drafts/goals/{goal_id} GET read 60 per 1 minute
/v1/drafts/goals/{goal_id} PATCH write 60 per 1 minute
/v1/drafts/{draft_id} GET read 60 per 1 minute
/v1/drafts/{draft_id} PATCH write 60 per 1 minute
/v1/drafts/{draft_id}/later POST write 60 per 1 minute
/v1/drafts/{draft_id}/reject POST write 60 per 1 minute
/v1/drafts/{draft_id}/save POST write 60 per 1 minute
/v1/drafts/{draft_id}/send POST write 60 per 1 minute
/v1/emails/{email_id}/web-link GET read 60 per 1 minute
/v1/oauth2/authorize GET sign_in 60 per 1 minute
/v1/oauth2/authorize/preflight GET read 60 per 1 minute
/v1/oauth2/clients/me GET read 60 per 1 minute
/v1/oauth2/introspect POST token 60 per 1 minute
/v1/oauth2/revoke POST token 60 per 1 minute
/v1/oauth2/token POST token 60 per 1 minute
/v1/operations GET read 60 per 1 minute
/v1/operations/expenses POST write 60 per 1 minute
/v1/operations/expenses/chaser/outreach-approval GET read 60 per 1 minute
/v1/operations/expenses/chaser/owner-escalation GET read 60 per 1 minute
/v1/operations/expenses/chaser/self-help GET read 60 per 1 minute
/v1/operations/expenses/search POST read 60 per 1 minute
/v1/operations/expenses/{operation_id} DELETE write 60 per 1 minute
/v1/operations/expenses/{operation_id} GET read 60 per 1 minute
/v1/operations/expenses/{operation_id} PATCH write 60 per 1 minute
/v1/operations/expenses/{operation_id}/chaser GET read 60 per 1 minute
/v1/operations/expenses/{operation_id}/chaser/outreach-approval/confirm POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/chaser/outreach-approval/reject POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/chaser/owner-escalation/dismiss POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/chaser/self-help/confirm POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/chaser/self-help/reject POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/confirm POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/merge POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/reject POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/reset POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/restore POST write 60 per 1 minute
/v1/operations/expenses/{operation_id}/unmerge POST write 60 per 1 minute
/v1/operations/payroll-operations POST write 60 per 1 minute
/v1/operations/payroll-operations/chaser/outreach-approval GET read 60 per 1 minute
/v1/operations/payroll-operations/chaser/owner-escalation GET read 60 per 1 minute
/v1/operations/payroll-operations/chaser/self-help GET read 60 per 1 minute
/v1/operations/payroll-operations/search POST read 60 per 1 minute
/v1/operations/payroll-operations/{operation_id} DELETE write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id} GET read 60 per 1 minute
/v1/operations/payroll-operations/{operation_id} PATCH write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/chaser GET read 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/chaser/outreach-approval/confirm POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/chaser/outreach-approval/reject POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/chaser/owner-escalation/dismiss POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/chaser/self-help/confirm POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/chaser/self-help/reject POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/confirm POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/merge POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/reject POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/reset POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/restore POST write 60 per 1 minute
/v1/operations/payroll-operations/{operation_id}/unmerge POST write 60 per 1 minute
/v1/operations/purchase-loan-financing POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/chaser/outreach-approval GET read 60 per 1 minute
/v1/operations/purchase-loan-financing/chaser/owner-escalation GET read 60 per 1 minute
/v1/operations/purchase-loan-financing/chaser/self-help GET read 60 per 1 minute
/v1/operations/purchase-loan-financing/search POST read 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id} DELETE write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id} GET read 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id} PATCH write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/chaser GET read 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/chaser/outreach-approval/confirm POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/chaser/outreach-approval/reject POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/chaser/owner-escalation/dismiss POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/chaser/self-help/confirm POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/chaser/self-help/reject POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/confirm POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/merge POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/reject POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/reset POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/restore POST write 60 per 1 minute
/v1/operations/purchase-loan-financing/{operation_id}/unmerge POST write 60 per 1 minute
/v1/operations/{operation_type}/schema GET read 60 per 1 minute
/v1/profile/company-profile/{company_id} GET read 60 per 1 minute
/v1/profile/company-profile/{company_id} PATCH write 60 per 1 minute
/v1/profile/company-profile/{company_id}/confirm POST write 60 per 1 minute
/v1/profile/company-profile/{company_id}/reset POST write 60 per 1 minute
/v1/profile/company-profile/{company_id}/suggestions GET read 60 per 1 minute
/v1/profile/company/search POST read 60 per 1 minute
/v1/profile/company/{company_id} GET read 60 per 1 minute
/v1/profile/company/{company_id} PATCH write 60 per 1 minute
/v1/profile/user GET read 60 per 1 minute
/v1/profile/user PATCH write 60 per 1 minute
/v1/profile/user-profile GET read 60 per 1 minute
/v1/profile/user-profile PATCH write 60 per 1 minute
/v1/profile/user-profile/confirm POST write 60 per 1 minute
/v1/profile/user-profile/reset POST write 60 per 1 minute
/v1/profile/user-profile/suggestions GET read 60 per 1 minute
/v1/roles GET read 60 per 1 minute
/v1/roles POST write 60 per 1 minute
/v1/roles/families GET read 60 per 1 minute
/v1/roles/search POST read 60 per 1 minute
/v1/roles/{role_id} GET read 60 per 1 minute
/v1/roles/{role_id} PATCH write 60 per 1 minute
/v1/roles/{role_id}/confirm POST write 60 per 1 minute
/v1/roles/{role_id}/reject POST write 60 per 1 minute
/v1/roles/{role_id}/reset POST write 60 per 1 minute
/v1/roles/{role_id}/restore POST write 60 per 1 minute
/v1/roles/{role_id}/suggestions GET read 60 per 1 minute
/v1/webhook-deliveries GET read 60 per 1 minute
/v1/webhook-deliveries/{public_id} GET read 60 per 1 minute
/v1/webhook-deliveries/{public_id}/redeliver POST write 60 per 1 minute
/v1/webhook-endpoints GET read 60 per 1 minute
/v1/webhook-endpoints POST write 60 per 1 minute
/v1/webhook-endpoints/{public_id} DELETE write 60 per 1 minute
/v1/webhook-endpoints/{public_id} GET read 60 per 1 minute
/v1/webhook-endpoints/{public_id} PATCH write 60 per 1 minute
/v1/webhook-endpoints/{public_id}/rotate-secret POST write 60 per 1 minute
/v1/webhook-endpoints/{public_id}/test POST write 60 per 1 minute
/v1/webhook-events GET read 60 per 1 minute
/v1/webhook-events/{public_id} GET read 60 per 1 minute
/v1/webhook-events/{public_id}/redeliver POST write 60 per 1 minute