OpenAlex without an API key: 1,000 requests a day, and mailto no longer helps
Checked 2026-09-08 · Academic and code sources
An anonymous call to api.openalex.org comes back with x-ratelimit-limit: 1000 and x-ratelimit-limit-usd: 0.1 — a budget of 1,000 list requests a day per client, resetting at midnight UTC. Adding mailto= does not change either number, so the polite-pool advice still in the docs buys you nothing on the limit. The 100,000-credit figure in the docs is the free-API-key tier, not the anonymous one.
What we saw
Anonymous request returns a credit budget of 1,000 requests and $0.10. Source (response headers, 2026-09-08).
x-ratelimit-cost-usd: 0.0001 x-ratelimit-credits-used: 1 x-ratelimit-limit: 1000 x-ratelimit-limit-usd: 0.1 x-ratelimit-onetime-remaining: 0 x-ratelimit-prepaid-remaining-usd: 0 x-ratelimit-remaining: 996 x-ratelimit-remaining-usd: 0.0996 x-ratelimit-reset: 68563
Adding mailto= leaves the limit at 1000 and still costs one credit. Source (response headers, 2026-09-08).
x-ratelimit-limit: 1000 x-ratelimit-limit-usd: 0.1 x-ratelimit-remaining: 994 x-ratelimit-credits-used: 1
A 200-record page costs the same one credit as a 1-record page, so per-page=200 is 200x cheaper per record. Source (response headers plus meta.cost_usd, 2026-09-08).
x-ratelimit-credits-used: 1 x-ratelimit-cost-usd: 0.0001 cost_usd 0.0001 n 200
per-page above 200 is rejected with HTTP 400 and a plain message. Source (error body, 2026-09-08).
http=400
{"error":"Pagination error.","message":"per-page parameter must be between 1 and 200."}Offset paging stops dead at 10,000 records; cursor paging is the only way past it. Source (error body, 2026-09-08).
http=400
{"error":"Pagination error.","message":"Maximum results size of 10,000 records is exceeded. Cursor pagination is required for records beyond 10,000. See: https://developers.openalex.org/guides/page-through-results"}cursor=* starts the cursor and the next one arrives in meta.next_cursor; meta.page is null on a cursor request. Source (meta, 2026-09-08).
{
"count": 10894484,
"db_response_time_ms": 21,
"page": null,
"per_page": 2,
"next_cursor": "IlsxMDAuMCwgMTk5NTAsICdodHRwczovL29wZW5hbGV4Lm9yZy9XNDMyMDAxMzkzNiddIg==",
"groups_count": null,
"cost_usd": 0.0001
}The docs page still describes the polite pool and quotes 100,000 credits per day for free users, which is the keyed tier, not what an anonymous call gets. Source (lines 19-20 and 75-87, 2026-09-08).
* max **100,000 credits** per day for free users, and also * max **100 requests** per second (regardless of credit cost). ... ## The polite pool ... To get into the polite pool, you just have to give us an email where we can contact you.
The command
curl -sS -D - -o body.json 'https://api.openalex.org/works?filter=publication_year:2023&per-page=2&cursor=*' | grep -iE '^x-ratelimit'
x-ratelimit-cost-usd: 0.0001 x-ratelimit-credits-used: 1 x-ratelimit-limit: 1000 x-ratelimit-limit-usd: 0.1 x-ratelimit-onetime-remaining: 0 x-ratelimit-prepaid-remaining-usd: 0 x-ratelimit-remaining: 996 x-ratelimit-remaining-usd: 0.0996 x-ratelimit-reset: 68563
Checked 2026-09-08.
for u in '...?per-page=1' '...?per-page=1&mailto=maintainer@opendatanotes.org' '...?per-page=200&select=id&mailto=...'; do curl -sS -D - -o body.json "$u" | grep -iE '^x-ratelimit-(limit|remaining|credits)'; done
x-ratelimit-limit: 1000 x-ratelimit-remaining: 995 x-ratelimit-credits-used: 1 x-ratelimit-limit: 1000 x-ratelimit-remaining: 994 x-ratelimit-credits-used: 1 x-ratelimit-limit: 1000 x-ratelimit-remaining: 993 x-ratelimit-credits-used: 1
Checked 2026-09-08.
curl -sS 'https://api.openalex.org/works?filter=publication_year:2023&per-page=100&page=101'
{"error":"Pagination error.","message":"Maximum results size of 10,000 records is exceeded. Cursor pagination is required for records beyond 10,000. See: https://developers.openalex.org/guides/page-through-results"}Checked 2026-09-08.
| what you send | x-ratelimit-limit | credits used | records back |
|---|---|---|---|
| per-page=1, no mailto | 1000 | 1 | 1 |
| per-page=1, mailto= | 1000 | 1 | 1 |
| per-page=200 + select=id, mailto= | 1000 | 1 | 200 |
| per-page=201 | - | - | HTTP 400, rejected |
| per-page=100&page=101 | - | - | HTTP 400, 10,000-record wall |
Limits
- Measured from one IP with no API key. I did not hold a key, so I could not confirm from the wire that a free key raises the limit to 100,000 — that number comes from the docs.
- I did not spend the budget down to zero, so I have not seen the 429 body OpenAlex sends when the credits run out.
- x-ratelimit-reset counted down by one per second across consecutive calls (68563, 68561, 68555) and 68563 s from the time of the call lands on the next midnight UTC, which matches the documented reset, but I did not sit through a reset.
Open question
Is the 1,000-credit anonymous budget scoped to the IP, or to the IP plus User-Agent? Two clients behind one address would then share it.