OpenAlex data is and will remain available at no cost. Our data snapshot is totally free for bulk download. The API is a freemium service: you get $1 free every day, and after that you pay for what you use. We sell services, not data.
Getting an API Key
To use the API at scale, you need a key. It’s free—just make an account (takes 30 seconds) and copy your key from openalex.org/settings/api. Then add api_key=YOUR_KEY to your API calls:
curl "https://api.openalex.org/works?api_key=YOUR_KEY"
Costs
Pricing by Endpoint
Use per_page=100 to load many results per query—it makes your query budget go much further.
| Operation | Description | Cost per 1,000 calls |
|---|
| Get singleton | Retrieve a single entity by ID or DOI | Free |
| List+Filter | Query and filter entities | $0.10 |
| Search | Full-text keyword search | $1 |
| Semantic search | AI-powered semantic search | $1 |
| Content download | Cached PDF via content API | $10 |
| Text/Aboutness (deprecated) | Topic classification | $10 |
Common Activity Costs
| Activity | Endpoint | Calls | Results | Cost |
|---|
| Search “climate change AND kelp” | Search | 103 | 10,205 | $0.10 |
| All works from Harvard | List+Filter | 8,707 | 870,627 | $0.87 |
| Retrieve works by DOI from a list | Singleton | 1,000,000 | 1,000,000 | Free |
| Daily research (20 searches, 200 filters, 50 lookups) | Mixed | 270 | ~27,000 | $0.04 |
| Download 1,000 PDFs | Content | 1,000 | 1,000 PDFs | $10.00 |
What You Can Do for Free Every Day
Your free API key gives you $1 of free usage every day. With that, you can do a mix of:
| Action | Calls | Results | Example |
|---|
| Get a single entity | Unlimited | Unlimited | Look up a work by DOI |
| List+filter | 10,000 | 1,000,000 | All works from MIT in 2024 |
| Search | 1,000 | 100,000 | Full-text search for “CRISPR” |
| Content download | 100 | 100 PDFs | Download a paper’s full text |
Increased Limits
Need more than $1/day? Paid plans give you higher daily allowances and prepaid usage.
Keeping Tabs on Costs
Per Call
Every API response includes headers showing your current status:
| Header | Description |
|---|
X-RateLimit-Limit | Your total daily limit |
X-RateLimit-Remaining | Remaining for today |
X-RateLimit-Credits-Used | Cost of this request |
X-RateLimit-Reset | Seconds until reset (midnight UTC) |
Every response includes a meta object (see Response Format) with the cost of that request and the total result count, so you can estimate the cost of paginating through all results before committing:
"meta": {
"count": 870627,
"db_response_time_ms": 19,
"page": 1,
"per_page": 100,
"groups_count": null,
"cost_usd": 0.0001
}
Here, cost_usd tells you this call cost $0.0001 (list+filter calls are $0.10 per 1,000), and count tells you 870,627 results at 100 per page = 8,707 calls = $0.87 total.
Overall
Usage Dashboard
Check your usage anytime at openalex.org/settings/usage—accessible from the battery icon in the lower left of openalex.org.
Rate Limit Endpoint
You can also check programmatically via the /rate-limit endpoint:
curl "https://api.openalex.org/rate-limit?api_key=YOUR_KEY"
{
"api_key": "abc...xyz",
"rate_limit": {
"daily_budget_usd": 1,
"daily_used_usd": 0.05,
"daily_remaining_usd": 0.95,
"prepaid_balance_usd": 0,
"prepaid_remaining_usd": 0,
"prepaid_expires_at": null,
"resets_at": "2026-02-20T00:00:00.000Z",
"resets_in_seconds": 43200,
"endpoint_costs_usd": {
"singleton": 0,
"list": 0.0001,
"search": 0.001,
"semantic": 0.01,
"content": 0.01,
"text": 0.01
}
}
}
Tips
Exceeding Limits
If you exceed your daily limit or make more than 100 requests per second, you’ll get 429 Too Many Requests errors.
Individual queries also have these constraints:
| Limit | Value |
|---|
| OR values per filter | 100 |
per_page maximum | 100 |
sample maximum | 10,000 |
| Basic paging limit | 10,000 results |
To retrieve more than 10,000 results, use cursor paging.
Usage Tips
Best practices:
Browser testing: The API uses simple GET requests, so you can test any request in your browser. Install a JSON formatter extension for a better experience:
Efficient bulk extraction:
# Use maximum page size
requests.get("https://api.openalex.org/works?per_page=100&api_key=YOUR_KEY")
# Batch DOI lookups (up to 100 at once)
dois = "10.1234/a|10.1234/b|10.1234/c"
requests.get(f"https://api.openalex.org/works?filter=doi:{dois}&api_key=YOUR_KEY")