Skill Tracer
Skills › Scientific Agent Skills › paper-lookup › openalex.md

openalex.md

181 lines · skills/paper-lookup/references/openalex.md at 5f2bc03

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# OpenAlex API
2
3OpenAlex is a comprehensive index of 250M+ scholarly works, authors, institutions, sources, and topics. It's the broadest multidisciplinary database in this skill.
4

OpenAlex API

OpenAlex is a comprehensive index of 250M+ scholarly works, authors, institutions, sources, and topics. It's the broadest multidisciplinary database in this skill.

Raw lines 1 to 4
5## Base URL
6
7```
8https://api.openalex.org
9```

Base URL

https://api.openalex.org
Raw lines 5 to 10
11## Authentication
13- **API key recommended** (free). Get one at https://openalex.org/settings/api
14- Pass as `?api_key=YOUR_KEY` or `Authorization: Bearer YOUR_KEY`.
15- Current access is budget-based; do not promise a higher quota from the legacy `mailto` parameter.

Authentication

  • API key recommended (free). Get one at https://openalex.org/settings/api
  • Pass as ?api_key=YOUR_KEY or Authorization: Bearer YOUR_KEY.
  • Current access is budget-based; do not promise a higher quota from the legacy mailto parameter.
Raw lines 11 to 16
17## Rate Limits
19- **100 requests/second** max
20- Usage-based pricing: $0.10/day without a key, $1/day with a free account key
21- Single entity lookups by ID/DOI are free (unlimited)
22- List + filter queries: ~$0.0001 each (~10,000/day free)
23- Search queries: ~$0.001 each (~1,000/day free)

Rate Limits

  • 100 requests/second max
  • Usage-based pricing: $0.10/day without a key, $1/day with a free account key
  • Single entity lookups by ID/DOI are free (unlimited)
  • List + filter queries: ~$0.0001 each (~10,000/day free)
  • Search queries: ~$0.001 each (~1,000/day free)
Raw lines 17 to 24
25## Key Endpoints

Key Endpoints

Raw lines 25 to 26
27### 1. Get a single work
29```
30GET /works/{id}
31```
33Accepts multiple ID formats:
34```
35/works/W2741809807 (OpenAlex ID)
36/works/doi:10.7717/peerj.4375 (DOI)
37/works/pmid:29456894 (PMID)
38/works/https://doi.org/10.7717/peerj.4375 (full DOI URL)
39```

1. Get a single work

GET /works/{id}

Accepts multiple ID formats:

/works/W2741809807                              (OpenAlex ID)
/works/doi:10.7717/peerj.4375                  (DOI)
/works/pmid:29456894                            (PMID)
/works/https://doi.org/10.7717/peerj.4375      (full DOI URL)
Raw lines 27 to 40
41### 2. Search works
43```
44GET /works?search={query}&per_page={n}&page={n}
45```
47| Parameter | Default | Description |
48|-----------|---------|-------------|
49| `search` | -- | Full-text search (title, abstract, fulltext). Supports boolean: `AND`, `OR`, `NOT` (uppercase) |
50| `search.exact` | -- | No stemming |
51| `search.semantic` | -- | AI embedding search (beta, 1 req/s, max 50 results) |
52| `filter` | -- | Comma-separated `field:value` pairs |
53| `sort` | relevance | `cited_by_count:desc`, `publication_date:desc`, `relevance_score:desc` |
54| `per_page` | 25 | Results per page (max 100) |
55| `page` | 1 | Page number (max `page * per_page` = 10,000) |
56| `cursor` | -- | Use `*` for first page of deep pagination |
57| `select` | -- | Comma-separated fields to return |
58| `group_by` | -- | Aggregate by field |
60**Advanced search:** Supports wildcards (`machin*`), fuzzy (`machin~1`), proximity (`"climate change"~5`), boolean grouping.
62**Example:**
63```
64https://api.openalex.org/works?search=CRISPR+gene+therapy&filter=from_publication_date:2023-01-01&sort=cited_by_count:desc&per_page=10
65```

2. Search works

GET /works?search={query}&per_page={n}&page={n}
ParameterDefaultDescription
search--Full-text search (title, abstract, fulltext). Supports boolean: AND, OR, NOT (uppercase)
search.exact--No stemming
search.semantic--AI embedding search (beta, 1 req/s, max 50 results)
filter--Comma-separated field:value pairs
sortrelevancecited_by_count:desc, publication_date:desc, relevance_score:desc
per_page25Results per page (max 100)
page1Page number (max page * per_page = 10,000)
cursor--Use * for first page of deep pagination
select--Comma-separated fields to return
group_by--Aggregate by field

Advanced search: Supports wildcards (machin*), fuzzy (machin~1), proximity ("climate change"~5), boolean grouping.

Example:

https://api.openalex.org/works?search=CRISPR+gene+therapy&filter=from_publication_date:2023-01-01&sort=cited_by_count:desc&per_page=10
Raw lines 41 to 66
67### 3. Filter works
69```
70GET /works?filter={filters}
71```
73Key filter fields:
74| Filter | Example | Description |
75|--------|---------|-------------|
76| `from_publication_date` | `2023-01-01` | Published after date |
77| `to_publication_date` | `2024-12-31` | Published before date |
78| `publication_year` | `2024` | Exact year |
79| `type` | `article` | Work type |
80| `cited_by_count` | `>100` | Citation threshold |
81| `is_oa` | `true` | Open access only |
82| `has_abstract` | `true` | Has abstract |
83| `authorships.author.id` | `A5048491430` | By author ID |
84| `primary_location.source.id` | `S137773608` | By journal/source |
85| `institutions.country_code` | `us` | By country |
86| `topics.id` | `T10001` | By topic ID; legacy concepts are deprecated |
87| `doi` | `10.1038/nature12373` | By DOI |
89**Operators:** `>`, `<`, `!` (negation), `|` (OR within filter)
91**Example:**
92```
93https://api.openalex.org/works?filter=from_publication_date:2024-01-01,type:article,is_oa:true,cited_by_count:>50
94```

3. Filter works

GET /works?filter={filters}

Key filter fields:

FilterExampleDescription
from_publication_date2023-01-01Published after date
to_publication_date2024-12-31Published before date
publication_year2024Exact year
typearticleWork type
cited_by_count>100Citation threshold
is_oatrueOpen access only
has_abstracttrueHas abstract
authorships.author.idA5048491430By author ID
primary_location.source.idS137773608By journal/source
institutions.country_codeusBy country
topics.idT10001By topic ID; legacy concepts are deprecated
doi10.1038/nature12373By DOI

Operators: >, <, ! (negation), | (OR within filter)

Example:

https://api.openalex.org/works?filter=from_publication_date:2024-01-01,type:article,is_oa:true,cited_by_count:>50
Raw lines 67 to 95
96### 4. Other entities
98```
99GET /authors?search={name}
100GET /authors/{id}
101GET /sources?search={name} (journals, repositories)
102GET /sources/{id}
103GET /institutions?search={name}
104GET /institutions/{id}
105GET /topics/{id}
106```
108Authors and institutions accept similar filter/sort/pagination parameters.

4. Other entities

GET /authors?search={name}
GET /authors/{id}
GET /sources?search={name}          (journals, repositories)
GET /sources/{id}
GET /institutions?search={name}
GET /institutions/{id}
GET /topics/{id}

Authors and institutions accept similar filter/sort/pagination parameters.

Raw lines 96 to 109
110### 5. Cursor pagination (for >10,000 results)
112```
113GET /works?filter=publication_year:2024&cursor=*&per_page=100
114```
116Response includes `meta.next_cursor`. Pass it as `cursor={value}` in the next request. Stop when `next_cursor` is null and the results are exhausted. The supported page maximum is 100; 200 is deprecated legacy behavior.

5. Cursor pagination (for >10,000 results)

GET /works?filter=publication_year:2024&cursor=*&per_page=100

Response includes meta.next_cursor. Pass it as cursor={value} in the next request. Stop when next_cursor is null and the results are exhausted. The supported page maximum is 100; 200 is deprecated legacy behavior.

Raw lines 110 to 117
118## Response Format

Response Format

Raw lines 118 to 119
120### Work object (key fields)
122```json
124 "id": "https://openalex.org/W2741809807",
125 "doi": "https://doi.org/10.7717/peerj.4375",
126 "title": "The state of OA",
127 "publication_year": 2018,
128 "publication_date": "2018-02-13",
129 "type": "article",
130 "language": "en",
131 "is_retracted": false,
132 "cited_by_count": 1169,
133 "open_access": {
134 "is_oa": true,
135 "oa_status": "gold",
136 "oa_url": "https://doi.org/10.7717/peerj.4375"
137 },
138 "authorships": [{
139 "author": {"id": "https://openalex.org/A5048491430", "display_name": "Heather Piwowar"},
140 "institutions": [{"display_name": "Impactstory"}]
141 }],
142 "primary_location": {
143 "source": {"display_name": "PeerJ", "issn_l": "2167-8359"}
144 },
145 "abstract_inverted_index": {"Despite": [0], "growing": [1], "interest": [2], ...},
146 "referenced_works": ["https://openalex.org/W123...", ...],
147 "ids": {"openalex": "...", "doi": "...", "pmid": "..."}
149```

Work object (key fields)

{
  "id": "https://openalex.org/W2741809807",
  "doi": "https://doi.org/10.7717/peerj.4375",
  "title": "The state of OA",
  "publication_year": 2018,
  "publication_date": "2018-02-13",
  "type": "article",
  "language": "en",
  "is_retracted": false,
  "cited_by_count": 1169,
  "open_access": {
    "is_oa": true,
    "oa_status": "gold",
    "oa_url": "https://doi.org/10.7717/peerj.4375"
  },
  "authorships": [{
    "author": {"id": "https://openalex.org/A5048491430", "display_name": "Heather Piwowar"},
    "institutions": [{"display_name": "Impactstory"}]
  }],
  "primary_location": {
    "source": {"display_name": "PeerJ", "issn_l": "2167-8359"}
  },
  "abstract_inverted_index": {"Despite": [0], "growing": [1], "interest": [2], ...},
  "referenced_works": ["https://openalex.org/W123...", ...],
  "ids": {"openalex": "...", "doi": "...", "pmid": "..."}
}
Raw lines 120 to 150
151### Abstract inverted index
153Abstracts are stored as `{word: [positions]}`. Use the bundled parser:
154```bash
155python3 scripts/openalex_abstract.py work.json
156```
158It reports collisions and gaps instead of silently overwriting tokens. A null
159index means no abstract was supplied; `select` can also exclude the field.

Abstract inverted index

Abstracts are stored as {word: [positions]}. Use the bundled parser:

python3 scripts/openalex_abstract.py work.json

It reports collisions and gaps instead of silently overwriting tokens. A null index means no abstract was supplied; select can also exclude the field.

Raw lines 151 to 160
Runs code python3 scripts/openalex_abstract.py :155
161### List response
163```json
165 "meta": {"count": 3771834, "page": 1, "per_page": 10},
166 "results": [...]
168```

List response

{
  "meta": {"count": 3771834, "page": 1, "per_page": 10},
  "results": [...]
}
Raw lines 161 to 169
170## Error Format
172HTTP 403 for invalid API key, 429 for rate limit exceeded. Error responses include a message field.

Error Format

HTTP 403 for invalid API key, 429 for rate limit exceeded. Error responses include a message field.

Raw lines 170 to 173
174## Official sources reviewed 2026-09-30
176- https://help.openalex.org/api/authentication/
177- https://help.openalex.org/api/paging/
178- https://help.openalex.org/api/searching/
179- https://help.openalex.org/api/semantic-search/
180- https://help.openalex.org/api/endpoints/
181- https://help.openalex.org/access/example-costs/

Official sources reviewed 2026-09-30

  • https://help.openalex.org/api/authentication/
  • https://help.openalex.org/api/paging/
  • https://help.openalex.org/api/searching/
  • https://help.openalex.org/api/semantic-search/
  • https://help.openalex.org/api/endpoints/
  • https://help.openalex.org/access/example-costs/
Raw lines 174 to 181