literature-search-openalex
About literature-search-openalex
A skill for querying OpenAlex through a dedicated CLI, intended for literature research workflows. It supports resolving entities, retrieving metadata, filtering and searching records, and downloading PDFs.
Key features
- 01Resolve names to entity IDs
- 02Retrieve full entity metadata
- 03Search and filter OpenAlex records
- 04Sort, group, and sample results
- 05Download and validate PDFs
- 06Check API rate limits and budget
Use cases
- 01Find an author's works by citation count
- 02Look up works from a DOI
- 03Filter OpenAlex entities by fields
- 04Download a paper PDF for review
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ google-deepmind/ science-skills --skill literature-search-openalexAfter installing, type/literature-search-openalexin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/authors.mdcitation.bibgeo_and_language.mdinstitutions.mdpublishers_funders.mdsources.mdtaxonomy.mdtopics.mdtype_values.mdworks.mdscripts/openalex_cli.pyDetails
From the project READMEOpenAlex Skill
Prerequisites
uv: Read theuvskill and follow its Setup instructions to ensureuvis installed and on PATH.- User Notification: If .licenses/literature_search_openalex_LICENSE.txt does not already exist in the workspace root directory then (1) prominently notify the user to check the terms at https://help.openalex.org/ and to always check the license of the papers retrieved by the skill for any restrictions, then (2) create the file recording the notification text and timestamp.
.envfile: Make sure the.envfile exists in your home directory. Create one if it does not exist.OPENALEX_API_KEY(optional but recommended): The skill works without a key, but keyless requests share a $0.10/day budget per IP address. A free key has its own $1/day budget and higher rate limits, and is required to download full text from content.openalex.org (download-pdf). Addingmailto(the former "polite pool") no longer raises limits. You can obtain a free key at OpenAlex.org → account settings. Whenever checking for or requesting this key, you MUST use the safe credentials protocol in thecredentialsskill, without blocking keyless execution if it is unset.
Core Rules
- List Sources. If this skill is used, ensure this is mentioned in the output AND list the URLs of all papers that were used in producing the output.
- Resolve before filter. NEVER filter by name. Always
resolvea name to an ID first, then use that ID in--filter. - Use the CLI only. Never call the API via
curl/urllib. The CLI handles retries and rate limiting. - No fabrication. Never invent OpenAlex IDs or DOIs. Use
resolve/getto look them up. Report empty results accurately. - API key. If a command returns 401, returns 429 because of a rate limit
or exhausted daily budget, or you need high-volume queries, you MUST use
the safe credentials protocol in the
credentialsskill to check for and request theOPENALEX_API_KEYto help the user add it to their.envfile. A free key does not fix a 429Plan upgrade requirederror. - Keep output small. Always use
--selectand--per-page 5–10for overview queries. Pipefilteroutput to a file (> results.json), then slim withjqbefore reading into context.
Rate Limits
- Without key: 10 req/s; $0.10/day budget per IP address, shared by all keyless requests from that IP.
- With free key: 30 req/s; $1/day budget.
- Annual plan: 50 req/s.
| Operation | Cost |
|---|---|
Singleton get | Free |
filter | $0.0001 |
--search / resolve | $0.001 |
download-pdf | $0.01 |
CLI Reference
uv run scripts/openalex_cli.py [--api-key KEY] <command> [flags]
Entity types (shared across commands): works, authors, sources,
institutions, topics, domains, fields, subfields, sdgs, countries,
continents, languages, keywords, publishers, funders, work-types,
source-types, institution-types, licenses
Commands
resolve <entity> <query> — Name → ID candidates. Returns id,
display_name, hint. Use --per-page N for more candidates.
get <entity> <id> — Full metadata for one entity. Accepts short ID
(W2741809807), full URL, or DOI URL. Use --select to limit fields.
filter <entity> — Search/filter entities. Key flags are:
--search <query>: Full-text search (10× cost of--filter)--filter <expr>: Filter expressions. Use,for AND and|for OR.--sort <field:dir>: Sort results (e.g.,cited_by_count:desc)--select <fields>: Limit the fields returned in the output.--group-by <field>: Aggregate results by a specific field.--per-page <N>: Number of results per page (default 25, max 100).--page <N>: Specify the page number to retrieve.--sample <N>: Get a random sample of up to 10,000 results.--seed <N>: Seed for reproducible sampling.
download-pdf <work-id> <output-path> — Download PDF
(content.openalex.org requires OPENALEX_API_KEY; falls back to alternative
pdf_url locations from work metadata if unauthenticated or if the primary
server fails). Always run download-pdf and verify any downloaded PDF is
non-empty and not corrupted; if OPENALEX_API_KEY is missing, also refer to the
credentials skill to help the user add it.
rate-limit — Check current rate limit and daily credit status (reports
shared per-IP limits when keyless, or key-specific limits when
OPENALEX_API_KEY is set; if OPENALEX_API_KEY is not set, also refer to the
credentials skill to help the user add it).
Search Tips
- If
resolvereturns no matches, try alternate spellings or abbreviations. - If
--searchreturns 0 results, try broader terms (max 3 retries). - If
resolvereturns multiple candidates, present them to the user withdisplay_nameandhintfor manual selection.
Entity References
Consult references/ for valid filter, sort, and group-by fields per entity:
- Works — Authors — Sources
- Institutions — Topics — Taxonomy
- Geo & Language — Publishers & Funders
- Type Values
For anything not covered here, or if the API behaves differently from what this skill describes, check the official docs index at https://help.openalex.org/llms.txt.
Common Workflows
# Author's works (resolve → filter)
uv run scripts/openalex_cli.py resolve authors "Geoffrey Hinton"
uv run scripts/openalex_cli.py filter works \
--filter "authorships.author.id:A5108093963" \
--sort "cited_by_count:desc" --per-page 10 > papers.json
cat papers.json | jq '[.results[] | {id, title: .display_name, year: .publication_year, citations: .cited_by_count}]'
# DOI lookup
uv run scripts/openalex_cli.py get works "https://doi.org/10.1038/s41586-021-03819-2"
# Bulk DOI lookup (up to 100)
uv run scripts/openalex_cli.py filter works \
--filter "doi:10.1234/a|10.1234/b|10.1234/c" --per-page 100 > results.json
# Institutional impact by year
uv run scripts/openalex_cli.py resolve institutions "MIT"
uv run scripts/openalex_cli.py filter works \
--filter "authorships.institutions.id:I63966007" \
--group-by "publication_year" > mit_by_year.json
# Random sample
uv run scripts/openalex_cli.py filter works \
--filter "publication_year:2023,is_oa:true" \
--sample 100 --seed 42 > results.json
Error Handling
The CLI already retries 429s with backoff, except Plan upgrade required ones,
which fail immediately with an explanation. Don't blindly retry either kind; the
Server body in the error output tells them apart.
| Code | Meaning | Action |
|---|---|---|
| 401 | Unauthorized | You MUST use safe credentials protocol in credentials skill to help user add API key to .env |
| 404 | Not found | Verify ID; try resolve first |
| 429 | Body says Plan upgrade required | Paid-plan feature (e.g. a plan-gated filter). Do not retry; a free key won't help. Drop the filter or inform user; see https://openalex.org/pricing |
| 429 | Body says rate limit or budget exhausted | No key: you MUST use safe credentials protocol in credentials skill to help user add API key to .env. With key: wait and retry (rate limit) or tell user the daily budget is spent |
Known plan-gated filters: from_created_date, from_updated_date,
to_updated_date.
Never fabricate results on empty responses — report accurately and suggest alternate search terms.