What are the Scribble API rate limits?
For developers
120 requests a minute, per key. Going over returns 429 with a Retry-After header giving the seconds until the current minute window resets. The limit is per key, not per organisation, so two keys get two budgets. Ask us if you need it raised.
| Property | Value |
|---|---|
| Default limit | 120 requests per minute |
| Scope | Per API key |
| Window | A fixed clock minute, not a rolling window |
| Response | 429 with body code rate_limited |
| Header | Retry-After, in seconds until the window resets |
| Counted | Every authenticated request, successful or not |
{
"error": {
"code": "rate_limited",
"message": "This key is limited to 120 requests a minute. Try again in 33s, or ask us to raise the limit.",
"docs": "https://scribblecards.com/app/integrations"
}
}The accompanying header on that response was retry-after: 33.
#Planning around it
| Records | Time at the default limit |
|---|---|
| 500 | About 4 minutes |
| 2,000 | About 17 minutes |
| 10,000 | About 84 minutes |
For a one-off bulk send, a campaign is usually the better tool than a loop over the API: it prices the whole run, previews the extremes and lets you cancel. Use the API for the steady drip of event-driven cards.
import time, requests
def post_card(session, body, key):
while True:
res = session.post(
"https://scribblecards.com/api/v1/cards",
headers={"Authorization": f"Bearer {key}"},
json=body,
timeout=30,
)
if res.status_code != 429:
return res
# The header is authoritative. Do not guess, and do not
# back off exponentially past it: the window is a clock minute.
time.sleep(int(res.headers.get("Retry-After", "60")) + 1)Last checked against the product on . Something wrong or missing? Tell us.