The numbers
Patron and Pro share the same request budgets. They differ on active API keys and on resource ceilings such as web monitors and storage.
Every signed-in account can create API keys, including the free plan. No
upgrade is required to call the API.
Two budgets, one request
The two budgets are checked at different points, which is why a cache hit is cheap. The rules that follow from this:- Every operation charges the operation budget, including a
429-free cache hit and includingGET /v1/me. - A cache hit costs an operation but not a fresh extraction. The cached read is attempted first, and the fresh-extraction budget is only checked after the cache misses.
- An over-quota request never reaches the network, so it cannot populate the cache and then be retried into a success.
- Four operations can spend a fresh extraction:
POST /v1/articles/extract,POST /v1/articles/read,POST /v1/articles/search, andPOST /v1/library/itemswhen it carries aurl. The save runs the same metered reader as an article read. Feeds, consumer, and every other library operation never spend one.
Quotas belong to the account, not the key
Published API quotas apply to the account, not independently to each of its credentials. Otherwise five active keys would silently multiply every advertised limit by five.
— server/routes/developer-v1.ts
Creating more API keys does not raise any limit. A second key is for isolating a deployment so you can revoke it alone. Ten keys on one account share one 120-per-minute budget. The same holds for OAuth: every token issued for an account draws on that account’s single budget.
Response headers
Every response carries the operation budget’s current state:X-RateLimit-Scope is the field that decides your recovery. minute means wait under 60 seconds and continue. daily means stop the run and resume tomorrow; retrying in a loop will only burn the day’s budget confirming it is gone.
429 response
429 from the extraction budget
extraction_limit_exceeded does not mean the API is closed to you. Cached article reads, every library operation, and every feeds operation keep working. Branch on code — see Errors.
Read your own limits
GET /v1/me reports the limits and current usage for the authenticated account. Call it once at start-up and cache it for the run. Never hardcode plan numbers into application logic.
Response
200 OK
*Used and *Remaining fields are live counts, not plan constants. They are the right input to a “should I create another monitor?” decision, and they save you a 409.
Active API keys
The ceiling counts active keys. Revoking a key frees its slot immediately. The current value for the authenticated account is
limits.activeApiKeys in the response above. Create keys in the Developer console.
Staying under the limits
1
Read the limits once, at start-up
Call
GET /v1/me and derive your concurrency from
freshExtractionsPerMinute. A hardcoded constant goes stale the moment the
account changes plan.2
Serialize, do not fan out
Parallel requests hit the per-minute bucket together and all fail at once.
A steady serial loop finishes sooner than a burst plus its backoff.
3
Save what you will re-read
Extraction is the scarce budget.
POST /v1/library/items once, then read
from the library as often as you like for the cost of an operation each.4
Branch on X-RateLimit-Scope
minute means sleep and continue. daily means stop the run.5
Never retry a permanent article failure
PAYWALL_ERROR and UNSUPPORTED_PUBLISHER spend an operation every time
and never succeed. See Errors.Next
Errors
Every error code, including the two different
429s and what each means.Read and search articles
Choose the operation that spends the least extraction budget.