OpenAlex

App · Research & Academia · 41 actions

Search the open catalogue of the world's research: hundreds of millions of papers, preprints, books and datasets, the researchers who wrote them, the journals that published them, and the institutions, funders and grants behind them. Follow citations both ways, read abstracts, download full text, and turn any query into counts by year, country or journal.

Actions

ActionWhat it does
Add entities to a collectionAdd entities to a saved collection in one call - the step that turns a search into a saved list.
AutocompleteTurn a half-typed name into an OpenAlex id, fast.
Check API usageCheck how much of today's OpenAlex budget is left: the daily credit limit, what has been spent, what remains, when it resets, and what each kind of call costs.
Create a saved collectionCreate a private, named list of OpenAlex entities of one type, holding up to 1,000 of them.
Delete a saved collectionDelete a saved collection and its membership list.
Download a work's full textDownload the cached full text of a work as a file, either the original PDF or machine-readable TEI XML.
Get a concept (legacy)Get one concept by OpenAlex id or Wikidata id: its description, its level, the concepts above and beside it, and its works and citation counts.
Get a domain, field or subfieldGet one level of the subject hierarchy by its number - domain 3, field 17, subfield 1702.
Get a funderGet one funder by OpenAlex id or ROR: its names, country, homepage and logo, how many grants it has made, and the works and citations that acknowledge it, year by year.
Get a grantGet one research grant by its OpenAlex id: its title and abstract, the funder and the funder's own grant number, the amount and currency, start and end dates, the principal investigator and co-investigators, the institutions that received it, and the works it paid for.
Get a journal or repositoryGet one source by OpenAlex id or ISSN: its titles and ISSNs, who publishes it, whether it is open access and whether DOAJ lists it, what it charges to publish, the topics it covers, and its works, citations and h-index over time.
Get a keywordGet one keyword by its slug - keywords are named 'machine-learning' rather than by a letter-and-number id.
Get a publisherGet one publisher by OpenAlex id or ROR: its names, where it sits in the publishing hierarchy, the countries it operates in, its logo, and its works and citation counts over time.
Get a saved collectionGet one saved collection: its name, description, what kind of entity it holds and how many.
Get a Sustainable Development GoalGet one UN goal by its number, 1 to 17: its name, the one-sentence statement of it, its official icon, and how many works and citations it accounts for.
Get a topicGet one topic by its OpenAlex id: what it covers, the keywords associated with it, its subfield, field and domain, its sibling topics, and how many works and citations it accounts for.
Get a vocabulary entryGet one entry from a controlled vocabulary by its code: the country US, the language fr, the licence cc-by, the work type preprint.
Get a workGet one work in full by its identifier: an OpenAlex id, a DOI, a PubMed id, a PMC id or a Microsoft Academic id.
Get an authorGet one researcher's profile by OpenAlex id or ORCID: their name and its variants, every affiliation with the years, their topics, how many works they have, how often they are cited, their h-index and i10-index, and citations per year for the last decade.
Get an institutionGet one organization by OpenAlex id or ROR: its names and acronyms, where it is, what kind of organization it is, the organizations above and below it, its repositories, the topics it publishes on, and its output and citation counts year by year.
List a collection's entitiesList the ids inside a saved collection, up to 200 at a time.
List a vocabularyList one of OpenAlex's eight fixed value sets: work types, source types, institution types, countries, continents, languages, licences or indexes.
List saved collectionsList the saved collections on this connection's OpenAlex account.
List subject levelsList the levels of OpenAlex's subject hierarchy above a topic: 4 domains, 26 fields or 252 subfields, whichever you pick.
List Sustainable Development GoalsList the United Nations' 17 Sustainable Development Goals as OpenAlex holds them, each with how many works a classifier has tagged to it and how often those works are cited.
List works a work citesList the works a given work cites - its bibliography, backwards in time.
List works citing a workList the works that cite a given work - its citations, forwards in time.
Remove entities from a collectionRemove entities from a saved collection in one call.
Run a query (OQL)Run a query written in OpenAlex Query Language, which reads like a sentence: 'works where year is (2020) and cited_by_count > (100) group by type'.
Search authorsFind researchers by name, ORCID, institution, subject or impact.
Search concepts (legacy)Search concepts, the six-level subject classification OpenAlex used before topics.
Search fundersFind the organizations that pay for research: national agencies, charities, foundations and corporate funders.
Search grantsSearch more than 17 million research grants: what was funded, by whom, for how much and over what period.
Search institutionsFind universities, hospitals, companies, government agencies and other research organizations.
Search journals and repositoriesFind the places works are published: journals, preprint servers, institutional repositories, conference proceedings and book series.
Search keywordsSearch the roughly 65,000 short phrases works are tagged with.
Search publishersFind publishing companies and the imprints beneath them, from Elsevier and Springer Nature down to a single university press.
Search topicsSearch the roughly 4,500 subjects OpenAlex classifies every work into.
Search worksSearch and filter OpenAlex's catalogue of scholarly works: journal articles, preprints, books, datasets, dissertations and more.
Translate and check a queryTranslate a query between the three ways OpenAlex spells one - readable OQL, a JSON query object, and a classic /works?filter=...
Update a saved collectionRename a saved collection, change its description, or change what kind of entity it holds.

Add entities to a collection

Add entities to a saved collection in one call - the step that turns a search into a saved list. Ids already in the collection are counted rather than duplicated, and an id of the wrong kind is refused outright naming the offender. A collection holds at most 1,000 entities. Needs an API key.

Inputs

Collection IDcollection_idtextRequired
The collection to add to.
Entity IDsentity_idslistRequired
The entities to add. Every id has to match the kind the collection holds.

Outputs

addednumber
already_presentnumber
collection_idtext
rejected_wrong_typenumber
requested_countnumber
Example output
{
  "added": 2,
  "already_present": 0,
  "collection_id": "col_beNWUTw6qY",
  "rejected_wrong_type": 0,
  "requested_count": 2
}

Autocomplete

Turn a half-typed name into an OpenAlex id, fast. This is the documented way to resolve a name before filtering by it - OpenAlex matches ids, never names, so 'works by MIT' means looking MIT up first. Each suggestion carries a hint that tells similar names apart: an author's institution, a work's authors, an institution's city. Leave the type empty to search everything at once, and paste an id, DOI or ORCID as the query to match it directly.

Inputs

What the user typedquerytextRequired
The partial name to complete. An OpenAlex id, DOI or ORCID pasted here is matched exactly.
Kind of thingentity_typetext
Which kind of entity to suggest. Leave empty to search every kind at once.One of: works, authors, sources, institutions, topics, keywords, concepts, publishers, funders.
Also matchingsearchtext
An extra full-text search the suggestions must also match, for narrowing a picker to one corner of the catalogue.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.

Outputs

entity_typetext
querytext
result_countnumber
resultslist
total_countnumber
Example output
{
  "entity_type": "institutions",
  "query": "flori",
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 31192599,
      "display_name": "University of Florida",
      "entity_type": "institution",
      "external_id": "https://ror.org/02y3ad647",
      "hint": "Gainesville, USA",
      "id": "https://openalex.org/I33213144",
      "works_count": 367380
    }
  ],
  "total_count": 212
}

Check API usage

Check how much of today's OpenAlex budget is left: the daily credit limit, what has been spent, what remains, when it resets, and what each kind of call costs. Worth reading at the top of a scheduled workflow that is about to make thousands of calls. Needs an API key on this connection - the figures are about the key.

Inputs

None.

Outputs

credit_costsobject
credits_limitnumber
credits_remainingnumber
credits_usednumber
resets_attext
resets_in_secondsnumber
Example output
{
  "credit_costs": {
    "content": 100,
    "list": 1,
    "search": 10,
    "singleton": 0
  },
  "credits_limit": 100000,
  "credits_remaining": 98766,
  "credits_used": 1234,
  "resets_at": "2026-08-27T00:00:00.000Z",
  "resets_in_seconds": 43200
}

Create a saved collection

Create a private, named list of OpenAlex entities of one type, holding up to 1,000 of them. Once it exists, its id goes in the 'Saved collection' field of any search on that type, or into an id filter on a related type - a collection of journals filters works by where they were published. A collection holds one type only, so tracking works and their authors means two collections. Needs an API key.

Inputs

Namedisplay_nametextRequired
What to call it, up to 30 characters. Must be unique among your collections.
Kind of entityentity_typetextRequired
What the collection holds. It can only be changed later while the collection is still empty.One of: works, authors, sources, institutions, topics, sdgs, funders, publishers, keywords, concepts.
Descriptiondescriptiontext
Optional notes, up to 500 characters.
Entity IDsentity_idslist
The entities to start it with, up to 1,000. Every id has to match the kind chosen above. Can be left empty and filled in later.

Outputs

collectionobject
Example output
{
  "collection": {
    "created_at": "2026-05-26T14:00:00",
    "description": "Papers I'm tracking for the altmetrics review",
    "display_name": "My altmetrics papers",
    "entity_count": 2,
    "entity_type": "works",
    "id": "col_beNWUTw6qY",
    "updated_at": "2026-05-26T14:00:00",
    "user_id": "user-TSamuHxDbnhn"
  }
}

Delete a saved collection

Delete a saved collection and its membership list. The entities in it are untouched - only the list goes, and it cannot be undone. Needs an API key, and the collection has to belong to this connection's account.

Inputs

Collection IDcollection_idtextRequired
The collection to delete.

Outputs

collection_idtext
deletedtrue/false
Example output
{
  "collection_id": "col_beNWUTw6qY",
  "deleted": true
}

Download a work's full text

Download the cached full text of a work as a file, either the original PDF or machine-readable TEI XML. OpenAlex holds full text for more than 50 million works; check the work's has_content field, or filter on has_content.pdf, before asking. The file lands in document storage, so a later step can attach it to an email, put it in a folder or read it. Needs an API key, and each download costs a cent of your OpenAlex budget.

Inputs

Work IDwork_idtextRequired
The OpenAlex id of the work. The full-text archive is addressed by OpenAlex id only, so look the work up first if all you have is a DOI.
Formatcontent_formattext
Which copy to download. PDF is the original file; TEI XML is the same paper parsed into structured sections, which is easier for a later step to read.One of: pdf (PDF (the original file)), grobid_xml (TEI XML (machine-readable, parsed by Grobid)).

Outputs

byte_sizenumber
content_formattext
content_typetext
document_reftext
documentslist
filenametext
urltext
work_idtext
Example output
{
  "byte_size": 1048576,
  "content_format": "pdf",
  "content_type": "application/pdf",
  "document_ref": "doc_01J8Z5Q2N4V7K",
  "documents": [
    {
      "content_type": "application/pdf",
      "document_ref": "doc_01J8Z5Q2N4V7K",
      "filename": "W3038568908.pdf",
      "size_bytes": 1048576,
      "url": "/actions/core/serve-document/doc_01J8Z5Q2N4V7K"
    }
  ],
  "filename": "W3038568908.pdf",
  "url": "/actions/core/serve-document/doc_01J8Z5Q2N4V7K",
  "work_id": "W3038568908"
}

Get a concept (legacy)

Get one concept by OpenAlex id or Wikidata id: its description, its level, the concepts above and beside it, and its works and citation counts. Deprecated in favour of topics, and kept for continuity with older analyses. Free.

Inputs

Concept IDconcept_idtextRequired
The concept to fetch.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), wikidata, display_name, level, description, image_url, image_thumbnail_url, international (Name in other languages), ancestors, and 8 more.

Outputs

conceptobject
Example output
{
  "concept": {
    "cited_by_count": 933341750,
    "display_name": "Medicine",
    "id": "https://openalex.org/C71924100",
    "level": 0,
    "works_count": 86486082
  }
}

Get a domain, field or subfield

Get one level of the subject hierarchy by its number - domain 3, field 17, subfield 1702. Returns its description, the levels above and below it, its siblings, and how many works and citations sit under it. Free.

Inputs

LevelleveltextRequired
Which level the id belongs to.One of: domains (Domains (4: the top level)), fields (Fields (26)), subfields (Subfields (252)).
IDsubject_idtextRequired
The number identifying it. Domains are 1 to 4, fields are two digits, subfields are four.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, display_name_alternatives, description, fields, siblings, works_count, cited_by_count, works_api_url, and 6 more.

Outputs

leveltext
subjectobject
Example output
{
  "level": "fields",
  "subject": {
    "cited_by_count": 160069587,
    "description": "study of computation",
    "display_name": "Computer Science",
    "id": "https://openalex.org/fields/17",
    "works_count": 23408426
  }
}

Get a funder

Get one funder by OpenAlex id or ROR: its names, country, homepage and logo, how many grants it has made, and the works and citations that acknowledge it, year by year. Free.

Inputs

Funder ID or RORfunder_idtextRequired
The funder to fetch.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, alternate_titles, description, country_code, is_global_south, awards_count, homepage_url, image_url, and 8 more.

Outputs

funderobject
Example output
{
  "funder": {
    "awards_count": 2175047,
    "cited_by_count": 111490034,
    "country_code": "US",
    "display_name": "National Institutes of Health",
    "id": "https://openalex.org/F4320332161",
    "works_count": 1839960
  }
}

Get a grant

Get one research grant by its OpenAlex id: its title and abstract, the funder and the funder's own grant number, the amount and currency, start and end dates, the principal investigator and co-investigators, the institutions that received it, and the works it paid for. Free.

Inputs

Grant IDaward_idtextRequired
The grant to fetch, by OpenAlex id.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, display_name, description, funder, funder_award_id, funder_scheme, funding_type, amount, currency, start_date, and 17 more.

Outputs

awardobject
Example output
{
  "award": {
    "amount": 338786.0,
    "currency": "USD",
    "display_name": "Genetic analysis of dopaminergic neuron specification in C.elegans",
    "end_year": 2014,
    "funded_outputs_count": 0,
    "funder": {
      "display_name": "National Institutes of Health",
      "id": "https://openalex.org/F4320332161"
    },
    "funder_award_id": "2r01ns050266-06",
    "funder_scheme": "R01",
    "funding_type": "research",
    "id": "https://openalex.org/G5066037109",
    "start_date": "2004-09-15",
    "start_year": 2004
  }
}

Get a journal or repository

Get one source by OpenAlex id or ISSN: its titles and ISSNs, who publishes it, whether it is open access and whether DOAJ lists it, what it charges to publish, the topics it covers, and its works, citations and h-index over time. Free.

Inputs

Source ID or ISSNsource_idtextRequired
The journal or repository to fetch.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, issn_l, issn, host_organization, host_organization_name, host_organization_lineage, type, is_oa, and 26 more.

Outputs

sourceobject
Example output
{
  "source": {
    "cited_by_count": 448736,
    "display_name": "PeerJ",
    "id": "https://openalex.org/S1983995261",
    "is_in_doaj": true,
    "is_oa": true,
    "issn_l": "2167-8359",
    "type": "journal",
    "works_count": 21590
  }
}

Get a keyword

Get one keyword by its slug - keywords are named 'machine-learning' rather than by a letter-and-number id. Returns its label, how many works carry it, how often those works are cited, and a ready-made link to them. Free.

Inputs

Keywordkeyword_idtextRequired
The keyword's slug, or the full OpenAlex URL for it.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record.One or more of: id, display_name, works_count, cited_by_count, works_api_url, created_date, updated_date.

Outputs

keywordobject
Example output
{
  "keyword": {
    "cited_by_count": 47593799,
    "display_name": "Machine learning",
    "id": "https://openalex.org/keywords/machine-learning",
    "works_api_url": "https://api.openalex.org/works?filter=keywords.id:keywords/machine-learning",
    "works_count": 2030113
  }
}

Get a publisher

Get one publisher by OpenAlex id or ROR: its names, where it sits in the publishing hierarchy, the countries it operates in, its logo, and its works and citation counts over time. Free.

Inputs

Publisher ID or RORpublisher_idtextRequired
The publisher to fetch.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, alternate_titles, hierarchy_level, parent_publisher, lineage (Ids of this and its parent organizations), country_codes, homepage_url, image_url, and 9 more.

Outputs

publisherobject
Example output
{
  "publisher": {
    "cited_by_count": 649222945,
    "country_codes": [
      "NL"
    ],
    "display_name": "Elsevier BV",
    "hierarchy_level": 0,
    "id": "https://openalex.org/P4310320990",
    "works_count": 24213449
  }
}

Get a saved collection

Get one saved collection: its name, description, what kind of entity it holds and how many. The entities themselves are paged separately - use List a collection's entities for those. Needs an API key, and the collection has to belong to this connection's account.

Inputs

Collection IDcollection_idtextRequired
The collection to fetch.

Outputs

collectionobject
Example output
{
  "collection": {
    "created_at": "2026-05-26T14:00:00",
    "description": "Papers I'm tracking for the altmetrics review",
    "display_name": "My altmetrics papers",
    "entity_count": 2,
    "entity_type": "works",
    "id": "col_beNWUTw6qY",
    "updated_at": "2026-05-26T14:00:00",
    "user_id": "user-TSamuHxDbnhn"
  }
}

Get a Sustainable Development Goal

Get one UN goal by its number, 1 to 17: its name, the one-sentence statement of it, its official icon, and how many works and citations it accounts for. Free.

Inputs

Goal numbersdg_idtextRequired
The goal to fetch, 1 to 17.One of: 1 (1. No poverty), 2 (2. Zero hunger), 3 (3. Good health and well-being), 4 (4. Quality education), 5 (5. Gender equality), 6 (6. Clean water and sanitation), 7 (7. Affordable and clean energy), 8 (8. Decent work and economic growth), 9 (9. Industry, innovation and infrastructure), 10 (10. Reduced inequalities), and 7 more.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, description, image_url, image_thumbnail_url, works_count, cited_by_count, works_api_url, created_date, updated_date.

Outputs

sdgobject
Example output
{
  "sdg": {
    "cited_by_count": 508105277,
    "description": "Ensure healthy lives and promote well-being for all at all ages.",
    "display_name": "Good health and well-being",
    "id": "https://openalex.org/sdgs/3",
    "ids": {
      "openalex": "https://openalex.org/sdgs/3",
      "un": "https://metadata.un.org/sdg/3"
    },
    "works_count": 26198823
  }
}

Get a topic

Get one topic by its OpenAlex id: what it covers, the keywords associated with it, its subfield, field and domain, its sibling topics, and how many works and citations it accounts for. Free.

Inputs

Topic IDtopic_idtextRequired
The topic to fetch.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, description, keywords, subfield, field, domain, siblings, works_count, and 4 more.

Outputs

topicobject
Example output
{
  "topic": {
    "cited_by_count": 904306,
    "display_name": "scientometrics and bibliometrics research",
    "domain": {
      "display_name": "Social Sciences",
      "id": "https://openalex.org/domains/2"
    },
    "field": {
      "display_name": "Decision Sciences",
      "id": "https://openalex.org/fields/18"
    },
    "id": "https://openalex.org/T10102",
    "subfield": {
      "display_name": "Statistics, Probability and Uncertainty",
      "id": "https://openalex.org/subfields/1804"
    },
    "works_count": 101356
  }
}

Get a vocabulary entry

Get one entry from a controlled vocabulary by its code: the country US, the language fr, the licence cc-by, the work type preprint. Returns what the value means and how many works it covers, plus a ready-made link to them. Free.

Inputs

VocabularyvocabularytextRequired
Which value set the code belongs to.One of: work-types (Work types (article, dataset, preprint...)), source-types (Source types (journal, repository...)), institution-types (Institution types (education, company...)), countries, continents, languages, licenses (Licences), indexes (Indexes (Crossref, PubMed, DOAJ, arXiv...)).
Codeentry_idtextRequired
The entry's code, as it appears in a filter: US, fr, cc-by, preprint, Q46.

Outputs

entryobject
vocabularytext
Example output
{
  "entry": {
    "cited_by_count": 1056294537,
    "display_name": "United States",
    "id": "https://openalex.org/countries/US",
    "works_count": 37907393
  },
  "vocabulary": "countries"
}

Get a work

Get one work in full by its identifier: an OpenAlex id, a DOI, a PubMed id, a PMC id or a Microsoft Academic id. Returns everything OpenAlex holds about it, including the abstract rebuilt into readable text, every author with their affiliations, where free copies live, its topics, the works it cites and its citation counts. Single lookups are free, however many a workflow makes.

Inputs

Work ID or DOIwork_idtextRequired
The work to fetch. An OpenAlex id, a DOI, pmid:29456894 or pmcid:PMC5815332.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record, which for a heavily cited work can be hundreds of kilobytes. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), doi, title, display_name, type, language, publication_date, publication_year, biblio (Volume, issue and page numbers), and 39 more.

Outputs

workobject
Example output
{
  "work": {
    "abstract": "Despite growing interest in Open Access (OA) to scholarly literature, there is an unmet need for large-scale, up-to-date, and reproducible studies assessing the prevalence and characteristics of OA.",
    "cited_by_count": 1245,
    "display_name": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
    "doi": "https://doi.org/10.7717/peerj.4375",
    "id": "https://openalex.org/W2741809807",
    "language": "en",
    "open_access": {
      "any_repository_has_fulltext": true,
      "is_oa": true,
      "oa_status": "gold",
      "oa_url": "https://doi.org/10.7717/peerj.4375"
    },
    "primary_topic": {
      "display_name": "scientometrics and bibliometrics research",
      "id": "https://openalex.org/T10102"
    },
    "publication_date": "2018-02-13",
    "publication_year": 2018,
    "title": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
    "type": "article"
  }
}

Get an author

Get one researcher's profile by OpenAlex id or ORCID: their name and its variants, every affiliation with the years, their topics, how many works they have, how often they are cited, their h-index and i10-index, and citations per year for the last decade. Free.

Inputs

Author ID or ORCIDauthor_idtextRequired
The author to fetch.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole profile. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, display_name_alternatives, orcid, full_name, raw_author_names, affiliations, last_known_institutions (Current affiliations), topics (Topics (up to three, ranked)), and 8 more.

Outputs

authorobject
Example output
{
  "author": {
    "cited_by_count": 4476,
    "display_name": "Jason R Priem",
    "id": "https://openalex.org/A5023888391",
    "orcid": "https://orcid.org/0000-0001-6187-6610",
    "summary_stats": {
      "2yr_mean_citedness": 1.0,
      "h_index": 18,
      "i10_index": 21
    },
    "works_count": 65
  }
}

Get an institution

Get one organization by OpenAlex id or ROR: its names and acronyms, where it is, what kind of organization it is, the organizations above and below it, its repositories, the topics it publishes on, and its output and citation counts year by year. Free.

Inputs

Institution ID or RORinstitution_idtextRequired
The organization to fetch.
Details to returnselect_fieldslist
Which fields to return. Leave empty for the whole record. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, display_name_acronyms, display_name_alternatives, ror, country_code, type, type_id, lineage (Ids of this and its parent organizations), and 19 more.

Outputs

institutionobject
Example output
{
  "institution": {
    "cited_by_count": 67679300,
    "country_code": "US",
    "display_name": "University of Michigan",
    "id": "https://openalex.org/I27837315",
    "ror": "https://ror.org/00jmfr291",
    "type": "education",
    "works_count": 992025
  }
}

List a collection's entities

List the ids inside a saved collection, up to 200 at a time. Paged separately from the collection itself so a 1,000-entity list does not arrive attached to every read of its name. Needs an API key.

Inputs

Collection IDcollection_idtextRequired
The collection whose contents to list.
Results per pageper_pagenumber
How many ids to return, up to 200. Defaults to 200.From 1 to 200.

Outputs

collection_idtext
entity_countnumber
entity_idslist
entity_typetext
total_entity_countnumber
Example output
{
  "collection_id": "col_beNWUTw6qY",
  "entity_count": 2,
  "entity_ids": [
    "https://openalex.org/W2755968057",
    "https://openalex.org/W2741809807"
  ],
  "entity_type": "works",
  "total_entity_count": 2
}

List a vocabulary

List one of OpenAlex's eight fixed value sets: work types, source types, institution types, countries, continents, languages, licences or indexes. These are the exact values filters are written against, each with how many works it covers - what a workflow reads to build a picker, or to check a code before filtering on it.

Inputs

VocabularyvocabularytextRequired
Which value set to list.One of: work-types (Work types (article, dataset, preprint...)), source-types (Source types (journal, repository...)), institution-types (Institution types (education, company...)), countries, continents, languages, licenses (Licences), indexes (Indexes (Crossref, PubMed, DOAJ, arXiv...)).
Search termsearchtext
Words to look for in an entry's name.
Sort bysort_bytext
Which field to order by - works_count, cited_by_count or display_name.
Sort directionsort_directiontext
Which way round to sort.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many entries to return, 1 to 100. Defaults to 25; most of these vocabularies fit in one page of 100.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. Only countries and languages run past one page.At least 1.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
vocabularytext
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "countries",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 1056294537,
      "display_name": "United States",
      "id": "https://openalex.org/countries/US",
      "works_count": 37907393
    }
  ],
  "total_count": 240,
  "vocabulary": "countries"
}

List saved collections

List the saved collections on this connection's OpenAlex account. A collection is a private, named list of entities of one type - the papers you are tracking for a grant, the journals in your library's subscription - and its id drops straight into a filter, so you name a thousand journals once instead of in every request. Needs an API key.

Inputs

Containing this entitycontains_entity_idtext
Only the collections that already hold this entity - the check before adding it again.
Results per pageper_pagenumber
How many collections to return, 1 to 100. Defaults to 25.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1.At least 1.

Outputs

collection_countnumber
collectionslist
pagenumber
per_pagenumber
total_countnumber
total_pagesnumber
Example output
{
  "collection_count": 1,
  "collections": [
    {
      "created_at": "2026-05-26T14:00:00",
      "description": "Papers I'm tracking for the altmetrics review",
      "display_name": "My altmetrics papers",
      "entity_count": 2,
      "entity_type": "works",
      "id": "col_beNWUTw6qY",
      "updated_at": "2026-05-26T14:00:00",
      "user_id": "user-TSamuHxDbnhn"
    }
  ],
  "page": 1,
  "per_page": 25,
  "total_count": 3,
  "total_pages": 1
}

List subject levels

List the levels of OpenAlex's subject hierarchy above a topic: 4 domains, 26 fields or 252 subfields, whichever you pick. Small enough to browse in one call, and the right handles for grouping a large result set - works per field, authors per domain. Each entry carries its parents, its children and its share of the literature.

Inputs

LevelleveltextRequired
Which level of the hierarchy to list.One of: domains (Domains (4: the top level)), fields (Fields (26)), subfields (Subfields (252)).
Search termsearchtext
Words to look for in the name and description.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
Parent IDsparent_idslist
Only entries under these parents: domain ids when listing fields, field ids when listing subfields. Domains are the top level and have no parent.
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, display_name_alternatives, description, fields, siblings, works_count, cited_by_count, works_api_url, and 6 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: domain.id, field.id, works_count, cited_by_count.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
leveltext
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "fields",
  "group_count": 0,
  "groups": [],
  "level": "fields",
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 160069587,
      "description": "study of computation",
      "display_name": "Computer Science",
      "id": "https://openalex.org/fields/17",
      "works_count": 23408426
    }
  ],
  "total_count": 26
}

List Sustainable Development Goals

List the United Nations' 17 Sustainable Development Goals as OpenAlex holds them, each with how many works a classifier has tagged to it and how often those works are cited. There are exactly 17, so one call returns them all. This is the vocabulary behind questions like 'how much of our research is about clean water'.

Inputs

Search termsearchtext
Words to look for in a goal's name or description.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, description, image_url, image_thumbnail_url, works_count, cited_by_count, works_api_url, created_date, updated_date.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: works_count, cited_by_count.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "sdgs",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 508105277,
      "description": "Ensure healthy lives and promote well-being for all at all ages.",
      "display_name": "Good health and well-being",
      "id": "https://openalex.org/sdgs/3",
      "ids": {
        "openalex": "https://openalex.org/sdgs/3",
        "un": "https://metadata.un.org/sdg/3"
      },
      "works_count": 26198823
    }
  ],
  "total_count": 17
}

List works a work cites

List the works a given work cites - its bibliography, backwards in time. The mirror of List works citing a work, and the way to pull a paper's reference list as full records rather than bare ids.

Inputs

Work ID or DOIwork_idtextRequired
The work whose reference list to fetch.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: relevance_score (Search relevance), cited_by_count (Citation count), publication_date (Publication date), publication_year (Publication year), display_name (Name (A-Z)), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), doi, title, display_name, type, language, publication_date, publication_year, biblio (Volume, issue and page numbers), and 39 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: publication_year, type, open_access.is_oa, open_access.oa_status, language, is_retracted, has_fulltext, indexed_in, authorships.author.id, authorships.institutions.id, and 20 more.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
work_idtext
Example output
{
  "applied_filter": "cited_by:W2741809807",
  "cost_usd": 0.0001,
  "entity": "works",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "abstract": "Despite growing interest in Open Access (OA) to scholarly literature, there is an unmet need for large-scale, up-to-date, and reproducible studies assessing the prevalence and characteristics of OA.",
      "cited_by_count": 1245,
      "display_name": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
      "doi": "https://doi.org/10.7717/peerj.4375",
      "id": "https://openalex.org/W2741809807",
      "language": "en",
      "open_access": {
        "any_repository_has_fulltext": true,
        "is_oa": true,
        "oa_status": "gold",
        "oa_url": "https://doi.org/10.7717/peerj.4375"
      },
      "primary_topic": {
        "display_name": "scientometrics and bibliometrics research",
        "id": "https://openalex.org/T10102"
      },
      "publication_date": "2018-02-13",
      "publication_year": 2018,
      "title": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
      "type": "article"
    }
  ],
  "total_count": 43,
  "work_id": "W2741809807"
}

List works citing a work

List the works that cite a given work - its citations, forwards in time. Use it to see who picked a paper up, to watch for new citations on a schedule, or to build a citation network one hop at a time. Sorts, filters and pages like any other work search.

Inputs

Work ID or DOIwork_idtextRequired
The work whose citations to list.
Cited on or afterfrom_publication_datedate
Only citing works published on or after this date - the filter for 'what cited this since last month'.
Cited on or beforeto_publication_datedate
Only citing works published on or before this date.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: relevance_score (Search relevance), cited_by_count (Citation count), publication_date (Publication date), publication_year (Publication year), display_name (Name (A-Z)), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), doi, title, display_name, type, language, publication_date, publication_year, biblio (Volume, issue and page numbers), and 39 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: publication_year, type, open_access.is_oa, open_access.oa_status, language, is_retracted, has_fulltext, indexed_in, authorships.author.id, authorships.institutions.id, and 20 more.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
work_idtext
Example output
{
  "applied_filter": "cites:W2741809807",
  "cost_usd": 0.0001,
  "entity": "works",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "abstract": "Despite growing interest in Open Access (OA) to scholarly literature, there is an unmet need for large-scale, up-to-date, and reproducible studies assessing the prevalence and characteristics of OA.",
      "cited_by_count": 1245,
      "display_name": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
      "doi": "https://doi.org/10.7717/peerj.4375",
      "id": "https://openalex.org/W2741809807",
      "language": "en",
      "open_access": {
        "any_repository_has_fulltext": true,
        "is_oa": true,
        "oa_status": "gold",
        "oa_url": "https://doi.org/10.7717/peerj.4375"
      },
      "primary_topic": {
        "display_name": "scientometrics and bibliometrics research",
        "id": "https://openalex.org/T10102"
      },
      "publication_date": "2018-02-13",
      "publication_year": 2018,
      "title": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
      "type": "article"
    }
  ],
  "total_count": 1230,
  "work_id": "W2741809807"
}

Remove entities from a collection

Remove entities from a saved collection in one call. The entities themselves are untouched; only their membership goes. Needs an API key.

Inputs

Collection IDcollection_idtextRequired
The collection to remove from.
Entity IDsentity_idslistRequired
The entities to remove.

Outputs

collection_idtext
entity_idslist
removed_countnumber
Example output
{
  "collection_id": "col_beNWUTw6qY",
  "entity_ids": [
    "W2755968057"
  ],
  "removed_count": 1
}

Run a query (OQL)

Run a query written in OpenAlex Query Language, which reads like a sentence: 'works where year is (2020) and cited_by_count > (100) group by type'. OQL reaches questions the filter fields cannot express - nested boolean logic, proximity search, grouping written into the query itself - and the query names its own entity, so one action covers every kind. The query object form takes the same query as JSON, which is easier to build from a program. Sent as a POST, so a systematic-review query too long for a URL still works. Every result echoes your query back in all three spellings.

Inputs

QueryquerytextRequired
The query to run. OQL text, or a JSON query object if you pick that format.
Query formatquery_formattext
How the query above is written. Defaults to OQL.One of: oql (OQL: works where year is (2020)), oqo (Query object (JSON): {"get_rows": "works", ...}).
Sort bysort_bytext
Which field to order results by. Sorting rides alongside the query rather than inside it.
Sort directionsort_directiontext
Which way round to sort.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. Reaches the first 10,000 records; past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in.
Details to returnselect_fieldslist
Which fields to return for each record, by name. Leave empty for the whole record.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
querytext
query_formattext
query_formsobject
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "query",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "query": "works where year is (2020)",
  "query_format": "oql",
  "query_forms": {
    "oql": "works where year is (2020)",
    "oxurl": "/works?filter=publication_year:2020"
  },
  "result_count": 1,
  "results": [
    {
      "abstract": "Despite growing interest in Open Access (OA) to scholarly literature, there is an unmet need for large-scale, up-to-date, and reproducible studies assessing the prevalence and characteristics of OA.",
      "cited_by_count": 1245,
      "display_name": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
      "doi": "https://doi.org/10.7717/peerj.4375",
      "id": "https://openalex.org/W2741809807",
      "language": "en",
      "open_access": {
        "any_repository_has_fulltext": true,
        "is_oa": true,
        "oa_status": "gold",
        "oa_url": "https://doi.org/10.7717/peerj.4375"
      },
      "primary_topic": {
        "display_name": "scientometrics and bibliometrics research",
        "id": "https://openalex.org/T10102"
      },
      "publication_date": "2018-02-13",
      "publication_year": 2018,
      "title": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
      "type": "article"
    }
  ],
  "total_count": 11437942
}

Search authors

Find researchers by name, ORCID, institution, subject or impact. Returns each profile with its ORCID, current affiliations, topics, works and citation counts and h-index. This is how you turn a person's name into the author id that Search works filters on. Profiles are assembled by matching the names printed on papers, so a common name can produce several candidates - match on ORCID whenever you have one.

Inputs

Namesearchtext
A researcher's name, or part of one. Matched against the display name and the other spellings OpenAlex has seen for them.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
ORCID iDsorcidslist
Only these authors, named by ORCID - the exact way to name a researcher.
Has an ORCIDhas_orcidtrue/false
Only authors with an ORCID on their profile. Fewer than you would expect: an ORCID only reaches OpenAlex attached to a paper's metadata.
Institution IDsinstitution_idslist
Only authors whose last known affiliation is one of these institutions. OpenAlex ids or ROR ids.
Institution typesinstitution_typeslist
Only authors whose last known affiliation is this kind of organization.One or more of: education, healthcare, company, archive, nonprofit, government, facility, other.
Countriescountry_codeslist
Only authors whose last known institution is in these countries.
Continentscontinentslist
Only entities on these continents. Choosing none means anywhere.One or more of: africa, antarctica, asia, europe, north_america (North America), oceania, south_america (South America).
Topic IDstopic_idslist
Only records on these topics. Topic ids look like T10017 - find them with Search topics or Autocomplete. Filtering by a subject's name never works; OpenAlex matches ids.
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Minimum citationsmin_cited_by_countnumber
Only records cited at least this many times.At least 0.
Minimum h-indexmin_h_indexnumber
Only authors with at least this h-index.At least 0.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed), summary_stats.h_index (h-index), summary_stats.i10_index (i10-index).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, display_name_alternatives, orcid, full_name, raw_author_names, affiliations, last_known_institutions (Current affiliations), topics (Topics (up to three, ranked)), and 8 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: has_orcid, last_known_institutions.id, last_known_institutions.country_code, last_known_institutions.continent, last_known_institutions.type, topics.id, topics.subfield.id, topics.field.id, topics.domain.id, works_count, cited_by_count, summary_stats.h_index.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "authors",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 4476,
      "display_name": "Jason R Priem",
      "id": "https://openalex.org/A5023888391",
      "orcid": "https://orcid.org/0000-0001-6187-6610",
      "summary_stats": {
        "2yr_mean_citedness": 1.0,
        "h_index": 18,
        "i10_index": 21
      },
      "works_count": 65
    }
  ],
  "total_count": 3
}

Search concepts (legacy)

Search concepts, the six-level subject classification OpenAlex used before topics. OpenAlex has deprecated them in favour of topics and no longer maintains them, but they are still attached to every work, so this is the way to reproduce or continue an analysis built on them. For anything new, use Search topics.

Inputs

Search termsearchtext
Words to look for in the concept's name and description.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
Levelslevelslist
Only concepts at these levels of the old hierarchy. 0 is broadest (Medicine, Physics); 5 is narrowest.
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), wikidata, display_name, level, description, image_url, image_thumbnail_url, international (Name in other languages), ancestors, and 8 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: level, works_count, cited_by_count.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "concepts",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 933341750,
      "display_name": "Medicine",
      "id": "https://openalex.org/C71924100",
      "level": 0,
      "works_count": 86486082
    }
  ],
  "total_count": 19
}

Search funders

Find the organizations that pay for research: national agencies, charities, foundations and corporate funders. Search by name or filter by country. Each result carries its ROR id, how many grants it has made and how many works acknowledge it - the id you then use to filter works or grants by who paid for them.

Inputs

Namesearchtext
A funder's name, or part of one.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
ROR IDsrorslist
Only these organizations, named by their ROR id - the global registry OpenAlex grounds organizations in. The exact way to name one.
Countriescountry_codeslist
Only funders based in these countries.
Continentscontinentslist
Only entities on these continents. Choosing none means anywhere.One or more of: africa, antarctica, asia, europe, north_america (North America), oceania, south_america (South America).
Global South onlyis_global_southtrue/false
Only funders based in the Global South.
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Minimum citationsmin_cited_by_countnumber
Only records cited at least this many times.At least 0.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed), summary_stats.h_index (h-index).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, alternate_titles, description, country_code, is_global_south, awards_count, homepage_url, image_url, and 8 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: country_code, continent, is_global_south, works_count, cited_by_count.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "funders",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "awards_count": 2175047,
      "cited_by_count": 111490034,
      "country_code": "US",
      "display_name": "National Institutes of Health",
      "id": "https://openalex.org/F4320332161",
      "works_count": 1839960
    }
  ],
  "total_count": 2
}

Search grants

Search more than 17 million research grants: what was funded, by whom, for how much and over what period. Filter by funder, grant number, funding type, recipient institution, country, start year or amount. Where a funder answers who paid, a grant answers which award - so this is the action behind 'what has this agency funded in our field since 2020'. Detail varies by source: a national grant database gives amounts, dates and a principal investigator, while a grant number lifted from a paper's funding note may give little more.

Inputs

Search termsearchtext
Words to look for in the grant's title and project description.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
Funder IDsfunder_idslist
Only grants from these funders. OpenAlex ids or ROR ids - find them with Search funders.
Grant numbersfunder_award_idslist
Only these grants, named by the funder's own grant number - the string that appears in a paper's funding note.
Funding typesfunding_typeslist
Only grants of these kinds, as the funder describes them - research, fellowship, and so on.
Recipient institution IDsinstitution_idslist
Only grants awarded to these institutions.
Recipient countriescountry_codeslist
Only grants whose recipient institution is in these countries.
Started in or aftermin_start_yearnumber
Only grants that started in this year or later.From 1900 to 2100.
Started in or beforemax_start_yearnumber
Only grants that started in this year or earlier.From 1900 to 2100.
Minimum amountmin_amountnumber
Only grants worth at least this much, in the funder's own currency. Amounts are not converted between currencies, so pair this with a currency.At least 0.
Currenciescurrencieslist
Only grants denominated in these currencies, as three-letter ISO codes.
Minimum funded worksmin_funded_outputsnumber
Only grants linked to at least this many works. Set it to 1 to skip the grants OpenAlex has not managed to match to any paper.At least 0.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), amount (Award amount), start_year (Award start year), end_year (Award end year), funded_outputs_count (Number of funded works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, display_name, description, funder, funder_award_id, funder_scheme, funding_type, amount, currency, start_date, and 17 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: funder.id, funding_type, provenance, currency, start_year, end_year, institution_awarded.id, institution_awarded.country_code, institution_awarded.type, primary_topic.field.id.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "awards",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "amount": 338786.0,
      "currency": "USD",
      "display_name": "Genetic analysis of dopaminergic neuron specification in C.elegans",
      "end_year": 2014,
      "funded_outputs_count": 0,
      "funder": {
        "display_name": "National Institutes of Health",
        "id": "https://openalex.org/F4320332161"
      },
      "funder_award_id": "2r01ns050266-06",
      "funder_scheme": "R01",
      "funding_type": "research",
      "id": "https://openalex.org/G5066037109",
      "start_date": "2004-09-15",
      "start_year": 2004
    }
  ],
  "total_count": 91
}

Search institutions

Find universities, hospitals, companies, government agencies and other research organizations. Search by name or acronym, or filter by country, continent, kind of organization or size. Each result carries its ROR id, location with coordinates, parent and child organizations, the topics it publishes on, and its works and citation counts - which is what you need to turn 'MIT' into the institution id that Search works filters on.

Inputs

Namesearchtext
An organization's name, part of one, or an acronym. Also matches alternative names.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
ROR IDsrorslist
Only these organizations, named by their ROR id - the global registry OpenAlex grounds organizations in. The exact way to name one.
Has a ROR idhas_rortrue/false
Only organizations registered in ROR, the global registry of research organizations.
Institution typesinstitution_typeslist
Only organizations of these kinds.One or more of: education, healthcare, company, archive, nonprofit, government, facility, other.
Countriescountry_codeslist
Only organizations in these countries.
Continentscontinentslist
Only entities on these continents. Choosing none means anywhere.One or more of: africa, antarctica, asia, europe, north_america (North America), oceania, south_america (South America).
Global South onlyis_global_southtrue/false
Only organizations in the Global South, as OpenAlex classifies countries.
Topic IDstopic_idslist
Only records on these topics. Topic ids look like T10017 - find them with Search topics or Autocomplete. Filtering by a subject's name never works; OpenAlex matches ids.
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Minimum citationsmin_cited_by_countnumber
Only records cited at least this many times.At least 0.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed), summary_stats.h_index (h-index).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, display_name_acronyms, display_name_alternatives, ror, country_code, type, type_id, lineage (Ids of this and its parent organizations), and 19 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: type, country_code, continent, is_global_south, has_ror, topics.id, topics.field.id, works_count, cited_by_count, summary_stats.h_index.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "institutions",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 67679300,
      "country_code": "US",
      "display_name": "University of Michigan",
      "id": "https://openalex.org/I27837315",
      "ror": "https://ror.org/00jmfr291",
      "type": "education",
      "works_count": 992025
    }
  ],
  "total_count": 8
}

Search journals and repositories

Find the places works are published: journals, preprint servers, institutional repositories, conference proceedings and book series. Search by title or ISSN, or filter to build a list - every fully open-access journal listed in DOAJ, every repository in a country, the journals a publisher owns. Each result carries its ISSN, publisher, open-access status, article processing charge and impact statistics.

Inputs

Titlesearchtext
A journal or repository name, or part of one. Also matches alternate titles and abbreviations.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
ISSNsissnslist
Only these sources, named by ISSN - the exact way to name a journal.
Source typessource_typeslist
Only sources of these kinds.One or more of: journal, repository, ebook platform, book series, conference, other.
Fully open accessis_oatrue/false
Only sources where every article is free to read.
Listed in DOAJis_in_doajtrue/false
Only journals in the Directory of Open Access Journals, the curated index of peer-reviewed open journals.
In the CWTS core collectionis_coretrue/false
Only sources in the vetted core collection, which is the set to use for like-for-like bibliometrics.
Countriescountry_codeslist
Only sources based in these countries.
Continentscontinentslist
Only entities on these continents. Choosing none means anywhere.One or more of: africa, antarctica, asia, europe, north_america (North America), oceania, south_america (South America).
Publisher or institution IDshost_organization_idslist
Only sources hosted by these organizations - a publisher id (P...) for a journal, an institution id (I...) for a repository.
Topic IDstopic_idslist
Only records on these topics. Topic ids look like T10017 - find them with Search topics or Autocomplete. Filtering by a subject's name never works; OpenAlex matches ids.
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Minimum citationsmin_cited_by_countnumber
Only records cited at least this many times.At least 0.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed), summary_stats.h_index (h-index).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, issn_l, issn, host_organization, host_organization_name, host_organization_lineage, type, is_oa, and 26 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: type, is_oa, is_in_doaj, is_core, country_code, continent, host_organization, topics.id, topics.field.id, works_count, cited_by_count, summary_stats.h_index.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "sources",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 448736,
      "display_name": "PeerJ",
      "id": "https://openalex.org/S1983995261",
      "is_in_doaj": true,
      "is_oa": true,
      "issn_l": "2167-8359",
      "type": "journal",
      "works_count": 21590
    }
  ],
  "total_count": 12
}

Search keywords

Search the roughly 65,000 short phrases works are tagged with. Keywords are finer-grained than topics - 'type-1 diabetes' rather than 'Diabetes and Metabolic Disease' - so they are the better handle on a narrow slice of the literature. Each comes back with how many works carry it.

Inputs

Search termsearchtext
Words to look for in the keyword's name.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, display_name, works_count, cited_by_count, works_api_url, created_date, updated_date.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: works_count, cited_by_count.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "keywords",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 47593799,
      "display_name": "Machine learning",
      "id": "https://openalex.org/keywords/machine-learning",
      "works_api_url": "https://api.openalex.org/works?filter=keywords.id:keywords/machine-learning",
      "works_count": 2030113
    }
  ],
  "total_count": 31
}

Search publishers

Find publishing companies and the imprints beneath them, from Elsevier and Springer Nature down to a single university press. Publishers nest: level 0 is a root company and each level below is a division or imprint, so filter by level to compare like with like. Each result carries its countries, its parent, and how many works and citations it accounts for.

Inputs

Namesearchtext
A publisher's name, or part of one.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
ROR IDsrorslist
Only these organizations, named by their ROR id - the global registry OpenAlex grounds organizations in. The exact way to name one.
Countriescountry_codeslist
Only publishers operating in these countries.
Hierarchy levelshierarchy_levelslist
Only publishers at these levels. 0 is a root company; 1 and below are its divisions and imprints.
Parent publisher IDsparent_publisher_idslist
Only publishers directly beneath these ones - the way to list a company's imprints.
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Minimum citationsmin_cited_by_countnumber
Only records cited at least this many times.At least 0.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, alternate_titles, hierarchy_level, parent_publisher, lineage (Ids of this and its parent organizations), country_codes, homepage_url, image_url, and 9 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: country_codes, hierarchy_level, parent_publisher, works_count, cited_by_count.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "publishers",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 649222945,
      "country_codes": [
        "NL"
      ],
      "display_name": "Elsevier BV",
      "hierarchy_level": 0,
      "id": "https://openalex.org/P4310320990",
      "works_count": 24213449
    }
  ],
  "total_count": 4
}

Search topics

Search the roughly 4,500 subjects OpenAlex classifies every work into. Topics sit at the bottom of a four-level hierarchy - domain, then field, then subfield, then topic - and each one comes back with its keywords, its place in that hierarchy and how many works carry it. Use this to turn a subject you can describe into the topic id that Search works filters on; filtering by a subject's name never works.

Inputs

Search termsearchtext
Words to look for in the topic's name and description.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
Domain IDsdomain_idslist
Only topics inside these domains, the four top-level branches. List them with List subject levels.
Field IDsfield_idslist
Only topics inside these fields, of which there are 26.
Subfield IDssubfield_idslist
Only topics inside these subfields, of which there are 252.
Minimum number of worksmin_works_countnumber
Only records with at least this many works to their name.At least 0.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: display_name (Name (A-Z)), cited_by_count (Citation count), works_count (Number of works), relevance_score (Search relevance), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), display_name, description, keywords, subfield, field, domain, siblings, works_count, and 4 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: domain.id, field.id, subfield.id, works_count, cited_by_count.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": null,
  "cost_usd": 0.0001,
  "entity": "topics",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "cited_by_count": 904306,
      "display_name": "scientometrics and bibliometrics research",
      "domain": {
        "display_name": "Social Sciences",
        "id": "https://openalex.org/domains/2"
      },
      "field": {
        "display_name": "Decision Sciences",
        "id": "https://openalex.org/fields/18"
      },
      "id": "https://openalex.org/T10102",
      "subfield": {
        "display_name": "Statistics, Probability and Uncertainty",
        "id": "https://openalex.org/subfields/1804"
      },
      "works_count": 101356
    }
  ],
  "total_count": 6
}

Search works

Search and filter OpenAlex's catalogue of scholarly works: journal articles, preprints, books, datasets, dissertations and more. Search the title, abstract and full text by keyword or by meaning, then narrow by publication date, work type, open-access status, language, author, institution, country, journal, topic, funder, UN Sustainable Development Goal, licence or citation count. Sort by citations or date, page through any number of results, take a random sample, or turn the whole thing into counts with 'Count by' - works per year, per country, per journal.

Inputs

Search termsearchtext
Words to look for in the title, abstract and full text. Supports quoted phrases and uppercase AND, OR and NOT. Leave empty to filter without searching, which is also ten times cheaper.
Search modesearch_modetext
How the search term is matched. Keywords is the default and the one to use unless you need something else. Only one mode applies per request.One of: smart (Keywords (matches word stems; supports AND/OR/NOT)), exact (Exact words (no stemming; the only mode wildcards work in)), semantic (By meaning (AI; best for a paragraph-long description)).
Published on or afterfrom_publication_datedate
Only works published on or after this date.
Published on or beforeto_publication_datedate
Only works published on or before this date.
Work typeswork_typeslist
Only works of these types. Choosing none means every type, which includes paratext such as covers and tables of contents.One or more of: article, book, book-chapter, book-review, conference-abstract, conference-paper, data-paper, dataset, dissertation, editorial, and 15 more.
Open access onlyis_open_accesstrue/false
Only works with a free-to-read copy somewhere. Tick for open access, untick for paywalled, leave empty for both.
Open access typesoa_statuseslist
Only works whose openness is one of these. More precise than the open-access checkbox: gold is published open in a fully open journal, green is a free copy in a repository.One or more of: diamond (Diamond: free to read, free to publish), gold (Gold: published open in a fully open journal), green (Green: free in a repository), hybrid (Hybrid: open in a subscription journal), bronze (Bronze: free to read, no open licence), closed (Closed: no free copy).
Languageslanguageslist
Only works whose title and abstract are in these languages.
Author countriescountry_codeslist
Only works with an author affiliated in these countries.
Continentscontinentslist
Only entities on these continents. Choosing none means anywhere.One or more of: africa, antarctica, asia, europe, north_america (North America), oceania, south_america (South America).
Institution IDsinstitution_idslist
Only works with an author at these institutions. OpenAlex ids (I27837315) or ROR ids both work - find them with Search institutions or Autocomplete.
Institution typesinstitution_typeslist
Only works with an author at an institution of these kinds - universities, hospitals, companies and so on.One or more of: education, healthcare, company, archive, nonprofit, government, facility, other.
Author IDsauthor_idslist
Only works by these authors. OpenAlex ids (A5023888391) or ORCID iDs both work. Look the author up first: filtering by a name never works, because names are ambiguous.
Journal / repository IDssource_idslist
Only works whose main copy sits in these sources. OpenAlex ids (S1983995261) or an ISSN both work.
Source typessource_typeslist
Only works published in this kind of venue - a journal, a repository, a conference.One or more of: journal, repository, ebook platform, book series, conference, other.
Topic IDstopic_idslist
Only records on these topics. Topic ids look like T10017 - find them with Search topics or Autocomplete. Filtering by a subject's name never works; OpenAlex matches ids.
Funder IDsfunder_idslist
Only works acknowledging these funders. OpenAlex ids (F4320332161) or ROR ids both work.
Sustainable Development Goalssdgslist
Only works a classifier tagged as relevant to these UN goals.One or more of: 1 (1. No poverty), 2 (2. Zero hunger), 3 (3. Good health and well-being), 4 (4. Quality education), 5 (5. Gender equality), 6 (6. Clean water and sanitation), 7 (7. Affordable and clean energy), 8 (8. Decent work and economic growth), 9 (9. Industry, innovation and infrastructure), 10 (10. Reduced inequalities), and 7 more.
Licenceslicenseslist
Only works with a copy under one of these licences, anywhere. The filter to use when you need works you are allowed to reuse.One or more of: cc-by, cc-by-sa, cc-by-nd, cc-by-nc, cc-by-nc-sa, cc-by-nc-nd, public-domain, mit, apache-2-0, gpl-v2, and 4 more.
Indexed inindexed_inlist
Only works listed in these bibliographic indexes.One or more of: crossref, pubmed, datacite, doaj, arxiv.
Minimum citationsmin_cited_by_countnumber
Only records cited at least this many times.At least 0.
Full text searchedhas_fulltexttrue/false
Only works whose full text OpenAlex has indexed, so the search term is matched against the whole paper rather than the title and abstract.
Has an abstracthas_abstracttrue/false
Only works that carry an abstract. Worth ticking when a later step summarises or classifies what comes back.
Retractedis_retractedtrue/false
Tick for retracted works only, untick to exclude them, leave empty for both.
Saved collectioncollection_idtext
Narrow the results to the entities in one of your saved OpenAlex collections. Needs an API key on this connection: without one OpenAlex answers with no results rather than an error, so an empty result here usually means the key is missing. The collection also has to hold this kind of entity.
Which corpuscorpustext
Which body of works to search. The curated core is the default and is what published counts refer to; the expansion corpus adds roughly 190 million lower-confidence records, mostly datasets and single-repository entries.One of: core (Curated core only (the default)), all (Core plus the expansion corpus), expansion (The expansion corpus only).
Extra filters (advanced)filterstext
Any OpenAlex filter this action does not already offer a field for, written the API's way: field:value, several separated by commas, | between values for 'any of', ! in front for 'not'. Merged with whatever the fields above set. The full filter list is in OpenAlex's docs.
Sort bysort_bytext
How to order the results. Leave empty for OpenAlex's own default, which is search relevance when there is a search term and id order otherwise.One of: relevance_score (Search relevance), cited_by_count (Citation count), publication_date (Publication date), publication_year (Publication year), display_name (Name (A-Z)), created_date (Date added to OpenAlex), updated_date (Date last changed).
Sort directionsort_directiontext
Which way round to sort. OpenAlex sorts ascending unless told otherwise, so pick highest/newest first for a top-of-the-list query.One of: desc (Highest / newest first), asc (Lowest / oldest first).
Results per pageper_pagenumber
How many records to return, 1 to 100. Defaults to 25. Asking for 100 is the cheapest way to read a lot: every page costs the same.From 1 to 100.
Pagepagenumber
Which page to return, counting from 1. This way of paging reaches the first 10,000 records only (page times page size); past that, use the cursor.At least 1.
Cursorcursortext
Pages past the 10,000-record limit. Send * on the first step, then feed the previous step's next_cursor back in. next_cursor comes back empty on the last page. Use this or Page, not both.
Random sample sizesamplenumber
Return this many records drawn at random from everything that matches, instead of the first page. Up to 10,000.From 1 to 10000.
Random seedseednumber
Makes a random sample repeatable: the same seed returns the same records. Only used alongside Random sample size.At least 0.
Details to returnselect_fieldslist
Which fields to return for each record. Leave empty for the whole record, which can be very large. The id is always included.One or more of: id, ids (External ids (DOI, PubMed, MAG...)), doi, title, display_name, type, language, publication_date, publication_year, biblio (Volume, issue and page numbers), and 39 more.
Count by (instead of listing)group_bytext
Return counts instead of records: how many match, broken down by this field. Pick one from the list, or type any other field OpenAlex can group by.One of: publication_year, type, open_access.is_oa, open_access.oa_status, language, is_retracted, has_fulltext, indexed_in, authorships.author.id, authorships.institutions.id, and 20 more.
Include records with no valueinclude_unknowntrue/false
When grouping, also count the records that have no value for the field. Left out by default.

Outputs

applied_filtertext
cost_usdnumber
entitytext
group_countnumber
groupslist
next_cursortext
pagenumber
per_pagenumber
result_countnumber
resultslist
total_countnumber
Example output
{
  "applied_filter": "is_oa:true",
  "cost_usd": 0.0001,
  "entity": "works",
  "group_count": 0,
  "groups": [],
  "next_cursor": null,
  "page": 1,
  "per_page": 25,
  "result_count": 1,
  "results": [
    {
      "abstract": "Despite growing interest in Open Access (OA) to scholarly literature, there is an unmet need for large-scale, up-to-date, and reproducible studies assessing the prevalence and characteristics of OA.",
      "cited_by_count": 1245,
      "display_name": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
      "doi": "https://doi.org/10.7717/peerj.4375",
      "id": "https://openalex.org/W2741809807",
      "language": "en",
      "open_access": {
        "any_repository_has_fulltext": true,
        "is_oa": true,
        "oa_status": "gold",
        "oa_url": "https://doi.org/10.7717/peerj.4375"
      },
      "primary_topic": {
        "display_name": "scientometrics and bibliometrics research",
        "id": "https://openalex.org/T10102"
      },
      "publication_date": "2018-02-13",
      "publication_year": 2018,
      "title": "The state of OA: a large-scale analysis of the prevalence and impact of Open Access articles",
      "type": "article"
    }
  ],
  "total_count": 32540
}

Translate and check a query

Translate a query between the three ways OpenAlex spells one - readable OQL, a JSON query object, and a classic /works?filter=... URL - and validate it, without running it. An invalid query comes back with the character position and a suggested fix rather than a silent empty result. Costs nothing at all, so it is the cheap check before spending credits, and the way to turn a URL somebody sent you into something readable.

Inputs

QueryquerytextRequired
The query to translate and check.
Query formatquery_formattext
How the query above is written. Defaults to OQL. The result carries all three spellings whichever you send.One of: oql (OQL: works where year is (2020)), oqo (Query object (JSON): {"get_rows": "works", ...}), oxurl (Classic URL: /works?filter=publication_year:2020).

Outputs

errorslist
is_validtrue/false
oqltext
oqoobject
oxurltext
warningslist
Example output
{
  "errors": [],
  "is_valid": true,
  "oql": "works where year is (2020)",
  "oqo": {
    "filter_rows": [
      {
        "column_id": "publication_year",
        "value": 2020
      }
    ],
    "get_rows": "works"
  },
  "oxurl": "/works?filter=publication_year:2020",
  "warnings": []
}

Update a saved collection

Rename a saved collection, change its description, or change what kind of entity it holds. Only the fields you fill in change. The entity type can only be changed while the collection is empty. Needs an API key.

Inputs

Collection IDcollection_idtextRequired
The collection to update.
New namedisplay_nametext
A new name, up to 30 characters. Leave empty to keep it.
New descriptiondescriptiontext
New notes, up to 500 characters. Leave empty to keep what is there.
New kind of entityentity_typetext
Change what the collection holds. Only possible while it is empty.One of: works, authors, sources, institutions, topics, sdgs, funders, publishers, keywords, concepts.

Outputs

collectionobject
Example output
{
  "collection": {
    "created_at": "2026-05-26T14:00:00",
    "description": "Papers I'm tracking for the altmetrics review",
    "display_name": "My altmetrics papers",
    "entity_count": 2,
    "entity_type": "works",
    "id": "col_beNWUTw6qY",
    "updated_at": "2026-05-26T14:00:00",
    "user_id": "user-TSamuHxDbnhn"
  }
}

On this page