Skip to main content
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.
OperationDescriptionCost per 1,000 calls
Get singletonRetrieve a single entity by ID or DOIFree
List+FilterQuery and filter entities$0.10
SearchFull-text keyword search$1
Semantic searchAI-powered semantic search$1
Content downloadCached PDF via content API$10
Text/Aboutness (deprecated)Topic classification$10

Common Activity Costs

ActivityEndpointCallsResultsCost
Search “climate change AND kelp”Search10310,205$0.10
All works from HarvardList+Filter8,707870,627$0.87
Retrieve works by DOI from a listSingleton1,000,0001,000,000Free
Daily research (20 searches, 200 filters, 50 lookups)Mixed270~27,000$0.04
Download 1,000 PDFsContent1,0001,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:
ActionCallsResultsExample
Get a single entityUnlimitedUnlimitedLook up a work by DOI
List+filter10,0001,000,000All works from MIT in 2024
Search1,000100,000Full-text search for “CRISPR”
Content download100100 PDFsDownload 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

Rate Limit Headers

Every API response includes headers showing your current status:
HeaderDescription
X-RateLimit-LimitYour total daily limit
X-RateLimit-RemainingRemaining for today
X-RateLimit-Credits-UsedCost of this request
X-RateLimit-ResetSeconds until reset (midnight UTC)

Response Meta

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:
LimitValue
OR values per filter100
per_page maximum100
sample maximum10,000
Basic paging limit10,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")