Skip to main content
The OpenAlex API uses a usage-based rate limiting system. Different endpoint types have different costs per request.
API key required starting February 13, 2026. API keys are free—get yours here. See the announcement for details.

Getting an API Key

API keys are free. Here’s how to get one:
  1. Create a free account at openalex.org
  2. Go to openalex.org/settings/api to get your key
  3. Add api_key=YOUR_KEY to your API calls
curl "https://api.openalex.org/works?api_key=YOUR_KEY"
Without an API key, you’re limited to $0.01/day of usage—enough for quick tests, but not for real work.

Rate Limits

PlanDaily AllowanceRequests/Second
No API key$0.01100
Free API key$1100
Paid planHigher limits100
Academic researchers can often get increased limits for free—contact support@openalex.org.

Pricing by Endpoint

TierExampleCost
Singleton — Retrieve by ID or DOI/works/W123 or /works/doi:10.1234/fooFree
List / Filter — Query and filter entities/works?filter=institution.id:I123$0.10 / 1,000 calls
Search — Full-text keyword search/works?search=climate+change$1 / 1,000 calls
Semantic — AI-powered semantic search/works?search.semantic=climate+change$10 / 1,000 calls
Content Download — Cached PDF via content APIcontent.openalex.org/works/{id}.pdf$10 / 1,000 downloads
Text/Aboutness (deprecated)/text/topics$0.01 / call

What you can do for free every day

With a free API key ($1/day), you can make per day:
  • Unlimited singleton requests (they’re free)
  • 10,000 list/filter requests, or
  • 1,000 search requests, or
  • 100 semantic searches or content downloads, or
  • Any mix totaling $1

Common Activity Costs

ActivityCallsCost
Download 1,000 PDFs1,000 content downloads$10
Retrieve 1M Works about “Climate Change AND Kelp”~5,000 paginated search calls$5
Retrieve 1M Works by DOI from a list1M singleton callsFree
Filter all Works from an Institution (1M results)~5,000 list calls$0.50
Daily research (20 searches, 200 filters, 50 lookups)270 callsFree

High-cost endpoints

Some endpoints cost significantly more:
EndpointCostDaily limit (free)Notes
Search$1 / 1,000 calls~1,000 requests?search= query parameter
Semantic search$10 / 1,000 calls~100 requests?search.semantic=
Content downloads$10 / 1,000 files~100 filesPDF or TEI XML
Aboutness (/text)$0.01 / call~100 requestsDeprecated
Planning bulk content downloads? Downloading all 60M available PDFs would cost ~$600,000. Contact us about enterprise pricing for large-scale projects.

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)

Check Your Status

Check your current rate limit status using 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
    }
  }
}

Exceeding Limits

If you exceed your daily limit or make more than 100 requests per second, you’ll get 429 Too Many Requests errors. Best practices:

Query Limits

Beyond rate limits, individual queries 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

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")