Limits, errors and safety
Rate limits and their headers, body size, the error shape and status codes, and what a key can never do.
- Rate limits: 120 requests a minute per key and 20,000 a day per account. Every answer carries
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset(Unix seconds); a 429 addsRetry-After. - Bodies are JSON objects up to 64 KB. Unknown fields are refused, by name, with a 400.
- Errors look like
{ "error": { "code": "not_found", "message": "…" } }, withdetails.issueswhen a field is wrong anddetails.planLimitwhen a plan limit was reached. - What a key cannot do: change your password or email, manage billing, make other keys, or reach anything the app itself does not let you reach. It is not for pages in a browser — there are no CORS headers, on purpose — keep it on a server or in a tool on your own machine.
- If a key leaks, revoke it in Settings → Integrations; the next request with it is a 401. We store only a hash of each key, so nobody can read it back, us included.
Status codes
| Status | Meaning |
|---|---|
| 200 / 201 | It worked; 201 when something was made. |
| 400 | The request could not be read — a missing field, a wrong type, a field we do not list. The message names it. |
| 401 | No key, a malformed key, or a key that was revoked. |
| 403 | The account is not on Pro or Max (plan_required), or may not do that (forbidden, plan_limit). |
| 404 | Not yours, or gone. |
| 409 / 412 | A conflict — a saved note changed under you, or a key limit. |
| 413 | A body over 64 KB. |
| 422 | Readable, but not usable — Markdown that will not fit a note. |
| 429 | Over the rate limit. Wait Retry-After seconds. |
| 500 / 503 | Our side. Try again in a moment. |