Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Academic Papers API page →
Media, Film & Knowledge

Academic Papers API & Scraper

The Academic Papers API returns scholarly-paper search and metadata as clean JSON.

12 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary search endpoint returns papers with title, DOI, authors, venue, year, citation count, abstract and open-access PDF from merged sources, and you can pull a paper_detail, citations, references, related papers, an author, an institution, a venue and a concept. It is built for research tools, literature reviews and academic apps that need scholarly data without juggling multiple APIs. One ReefAPI key, one shared credit pool, the standard { ok, data, meta, error } envelope.

Reference

Identifiers, sources and the values each one really returns

Three backends sit behind this engine and they do not share an id scheme, a record granularity or a notion of what counts as a paper. Everything below came from live calls, mostly on the AlphaFold paper (OpenAlex W3177828909, DOI 10.1038/s41586-021-03819-2) and a 40-row CRISPR search.

Input or fieldMeasured valueWhat it means
id on paper_detail, citations, referencesW3177828909, 10.1038/s41586-021-03819-2, pmid:34265844OpenAlex W id, DOI, prefixed PMID or arXiv id. All three of those returned the same AlphaFold record
a bare PubMed number34265844rejected with NOT_FOUND. The pmid: prefix is required. arXiv ids keep their arXiv: prefix and resolved to OpenAlex W4298187611
ids object on the resultopenalex, doi, pmid, magmag is the retired Microsoft Academic id, still carried where OpenAlex has one. There is no PMCID field
authors[].orcidan https://orcid.org/ URL, when the author registered onea full URL, not a bare ORCID. 28 of the paper's 34 authors had one; 33 of 34 had an OpenAlex author id
authors[].affiliations[].rorhttps://ror.org/00971b260ROR URL, plus the institution's OpenAlex id, country code and type such as company or education
oa_statusgold, hybrid, bronze, green, closedacross 40 CRISPR hits: 13 gold, 11 closed, 9 bronze, 5 green, 2 hybrid. is_oa was true on 29 of the 40
oa_url and pdf_urlhttps://www.nature.com/articles/s41586-021-03819-2.pdfdirect file link where one is known. 11 of the same 40 rows had no pdf_url
source=arxiv row idsarXiv:2209.15001arXiv preprints have no DOI on this path, and venue reads arXiv
source=crossref row ids10.7717/peerj-cs.3254/fig-10Crossref registers component DOIs, so individual figures and tables come back as rows next to real articles
cursorsend * on the first pagenext_cursor stays null unless you pass cursor. Without it you get one page and no way forward
venue profile extrasNature: issn_l 0028-0836, h_index 1853, apc_usd 12690venue also reports is_oa, is_in_doaj, publisher, country_code and works_count

Citation totals do not agree with themselves, and that is expected. The AlphaFold paper reported cited_by_count 46,735 on its own record while the citations action reported total 45,854 rows for the same work. The first is OpenAlex's denormalized counter, the second is a live count of the citing-works index. Pick one and stay with it rather than reconciling the two.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/academic/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "covid"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "academic",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1322.4,
    "record_count": 25,
    "bytes": 826211,
    "cache_hit": false,
    "completeness_pct": 100,
    "requests": 1,
    "total": 3843849,
    "next_cursor": null
  },
  "data": {
    "results": [
      {
        "id": "W[redacted-phone]",
        "doi": "10.1016/s[redacted-phone]",
        "title": "Clinical course and risk factors for mortality of adult inpatients with COVID-19 in Wuhan, China: a retrospective cohort study",
        "abstract": null,
        "authors": [
          {
            "name": "[trimmed-depth]",
            "id": "[trimmed-depth]",
            "orcid": "[trimmed-depth]",
            "position": "[trimmed-depth]",
            "is_corresponding": "[trimmed-depth]",
            "affiliations": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "id": "[trimmed-depth]",
            "orcid": "[trimmed-depth]",
            "position": "[trimmed-depth]",
            "is_corresponding": "[trimmed-depth]",
            "affiliations": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "id": "[trimmed-depth]",
            "orcid": "[trimmed-depth]",
            "position": "[trimmed-depth]",
            "is_corresponding": "[trimmed-depth]",
            "affiliations": "[trimmed-depth]"
          }
        ],
        "author_count": 19,
        "venue": {
          "name": "[redacted-name]",
          "id": "S49861241",
          "issn_l": "[redacted-phone]",
          "type": "journal",
          "publisher": "Elsevier BV",
          "is_oa": false,
          "is_in_doaj": false
        },
        "year": 2020,
        "publication_date": "[redacted-phone]",
        "type": "article",
        "language": "en",
        "is_oa": true,
        "oa_status": "bronze",
        "oa_url": "http://www.thelancet.com/article/S[redacted-phone]/pdf",
        "pdf_url": "http://www.thelancet.com/article/S[redacted-phone]/pdf",
        "cited_by_count": 29160,
        "reference_count": 45,
        "fields_of_study": [
          "COVID-19 Clinical Research Studies",
          "COVID-19 and healthcare impacts",
          "Long-Term Effects of COVID-19"
        ],
        "biblio": {
          "volume": "395",
          "issue": "10229",
          "first_page": "1054",
          "last_page": "1062"
        },
        "is_retracted": false,
        "ids": {
          "openalex": "W[redacted-phone]",
          "doi": "10.1016/s[redacted-phone]",
          "pmid": "32171076",
          "mag": "[redacted-phone]"
        },
        "source": "openalex",
        "sources_merged": [
          "openalex"
        ]
      },
      {
        "id": "W[redacted-phone]",
        "doi": "10.1056/nejmoa2034577",
        "title": "Safety and Efficacy of the BNT162b2 mRNA Covid-19 Vaccine",
        "abstract": "BACKGROUND: Severe acute respiratory syndrome coronavirus 2 (SARS-CoV-2) infection and the resulting coronavirus disease 2019 (Covid-19) have afflicted tens of millions of people in a worldwide pandemic. Safe and effective vaccines are needed urgently. METHODS: In an ongoing multinational, placebo-controlled, observer-blinded, pivotal efficacy trial, we randomly assigned persons 16 years of age or older in a 1:1 ratio to receive two doses, 21 days apart, of either placebo or the BNT162b2 vaccine candidate (30 μg per dose). BNT162b2 is a lipid nanoparticle-formulated, nucleoside-modified RNA va",
        "authors": [
          {
            "name": "[trimmed-depth]",
            "id": "[trimmed-depth]",
            "orcid": "[trimmed-depth]",
            "position": "[trimmed-depth]",
            "is_corresponding": "[trimmed-depth]",
            "affiliations": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "id": "[trimmed-depth]",
            "orcid": "[trimmed-depth]",
            "position": "[trimmed-depth]",
            "is_corresponding": "[trimmed-depth]",
            "affiliations": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "id": "[trimmed-depth]",
            "orcid": "[trimmed-depth]",
            "position": "[trimmed-depth]",
            "is_corresponding": "[trimmed-depth]",
            "affiliations": "[trimmed-depth]"
          }
        ],
        "author_count": 29,
        "venue": {
          "name": "[redacted-name]",
          "id": "S62468778",
          "issn_l": "[redacted-phone]",
          "type": "journal",
          "publisher": "Massachusetts Medical Society",
          "is_oa": false,
          "is_in_doaj": false
        },
        "year": 2020,
        "publication_date": "[redacted-phone]",
        "type": "article",
        "language": "en",
        "is_oa": true,
        "oa_status": "green",
        "oa_url": "https://arca.fiocruz.br/handle/icict/46039",
        "pdf_url": "https://arca.fiocruz.br/handle/icict/46039",
        "cited_by_count": 15601,
        "reference_count": 8,
        "fields_of_study": [
          "SARS-CoV-2 and COVID-19 Research",
          "COVID-19 Clinical Research Studies",
          "RNA Interference and Gene Delivery"
        ],
        "biblio": {
          "volume": "383",
          "issue": "27",
          "first_page": "2603",
          "last_page": "2615"
        },
        "is_retracted": false,
        "ids": {
          "openalex": "W[redacted-phone]",
          "doi": "10.1056/nejmoa2034577",
          "pmid": "33301246",
          "mag": "[redacted-phone]"
        },
        "source": "openalex",
        "sources_merged": [
          "openalex"
        ]
      },
      {
        "id": "W[redacted-phone]",
        "doi": "10.1001/jama.[redacted-phone]",
        "title": "Characteristics of and Important Lessons From the Coronavirus Disease 2019 (COVID-19) Outbreak in China",
        "abstract": "This Viewpoint summarizes key epidemiologic and clinical findings from all cases of coronavirus disease 2019 (COVID-19) reported through February 11, 2020, in mainland China, and case trends in response to government attempts to control and contain the infection.",
        "authors": [
          {
            "name": "[trimmed-depth]",
            "id": "[trimmed-depth]",
            "orcid": "[trimmed-depth]",
            "position": "[trimmed-depth]",
            "is_corresponding": "[trimmed-depth]",
            "affiliations": "[trimmed-depth]"
          },
          {
            "name": "[trimmed-depth]",
            "id": "[trimmed-depth]",
            "orcid": "[trimmed-depth]",
            "position": "[trimmed-depth]",
            "is_corresponding": "[trimmed-depth]",
            "affiliations": "[trimmed-depth]"
          }
        ],
        "author_count": 2,
        "venue": {
          "name": "JAMA",
          "id": "S[redacted-phone]",
          "issn_l": "[redacted-phone]",
          "type": "journal",
          "publisher": "American Medical Association",
          "is_oa": false,
          "is_in_doaj": false
        },
        "year": 2020,
        "publication_date": "[redacted-phone]",
        "type": "article",
        "language": "en",
        "is_oa": true,
        "oa_status": "bronze",
        "oa_url": "https://jamanetwork.com/journals/jama/articlepdf/2762130/jama_wu_2020_vp_200028.pdf",
        "pdf_url": "https://jamanetwork.com/journals/jama/articlepdf/2762130/jama_wu_2020_vp_200028.pdf",
        "cited_by_count": 18027,
        "reference_count": 13,
        "fields_of_study": [
          "COVID-19 Clinical Research Studies",
          "COVID-19 epidemiological studies",
          "COVID-19 and Mental Health"
        ],
        "biblio": {
          "volume": "323",
          "issue": "13",
          "first_page": "1239",
          "last_page": "1239"
        },
        "is_retracted": false,
        "ids": {
          "openalex": "W[redacted-phone]",
          "doi": "10.1001/jama.[redacted-phone]",
          "pmid": "32091533",
          "mag": "[redacted-phone]"
        },
        "source": "openalex",
        "sources_merged": [
          "openalex"
        ]
      }
    ],
    "count": 3843849,
    "next_cursor": null,
    "source": "openalex"
  }
}
Actions

What the Academic Papers API does

ActionDescriptionConcrete use caseKey params
searchsearch papers (source=openalex|arxiv|crossref|all; cursor pagination, year/OA/type filters, match=title, fulltext=; first-class author_id/venue_id/institution_id/concept_id/topic_id filters for papers BY an entity)Content platforms call search to search papers (source=openalex|arxiv|crossref|all; cursor pagination, year/OA/type filters, m….query, source, per_page, cursor, filter, ...
paper_detailfull paper (abstract/authors/affiliations/venue/year/DOI/OA-PDF/fields); id=OpenAlex|DOI|arXiv|PMID; cross-source abstract gap-fillResearch tools call paper_detail to get full paper (abstract/authors/affiliations/venue/year/DOI/OA-PDF/fields); id=OpenAlex|DOI|arXi….id, enrich, raw, fill_abstract
citationspapers that cite this work (cursor-paginated)Community analysts call citations to get papers that cite this work (cursor-paginated).id, per_page, cursor
referencesworks this paper references (hydrated)Media monitors call references to get works this paper references (hydrated).id, limit
relatedOpenAlex-curated related works for a paper (co-cited / topically-adjacent), hydratedContent platforms call related to get openAlex-curated related works for a paper (co-cited / topically-adjacent), hydrated.id, limit
authorauthor search (query) or profile (id): works_count, h-index, affiliations; include_works for top papersResearch tools call author to get author search (query) or profile (id).id, query, include_works, works_limit, per_page
institutioninstitution search/profile: ROR, country, geo, works/citation counts, h-index; include_works for the org's papersCommunity analysts call institution to get institution search/profile.id, query, per_page, include_works, works_limit
venuejournal/venue search/profile: ISSN, publisher, OA/DOAJ, h-index, works/citation counts; include_works for the venue's papersMedia monitors call venue to get journal/venue search/profile.id, query, per_page, include_works, works_limit
conceptconcept search (query) or profile (id): level, works/citation counts, description; include_works for papers. NOTE: OpenAlex froze the Concepts dataset (ancestors/related now empty) — use `topic` for the live subject hierarchyContent platforms call concept to get concept search (query) or profile (id).id, query, per_page, include_works, works_limit
topictopic search (query) or profile (id): domain>field>subfield hierarchy, keywords, siblings, works/citation counts; include_works for papers (the live replacement for Concepts)Research tools call topic to get topic search (query) or profile (id).id, query, per_page, include_works, works_limit
autocompletefast typeahead suggestions (works/authors/sources/institutions)Community analysts call autocomplete to get fast typeahead suggestions (works/authors/sources/institutions).q, entity
batchhydrate up to 200 papers by id/DOI in one call (RAG/ETL)Media monitors call batch to get hydrate up to 200 papers by id/DOI in one call (RAG/ETL).ids, include_abstract, limit
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/academic/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"covid"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.academic.search with {"query":"covid"}.
Use cases

Who uses this API and why

  • Research tools call search then citations to map the literature around a topic.
  • Literature-review products use references and related to trace a paper's intellectual lineage.
  • Academic apps use author and institution to build researcher and organization profiles.
FAQ

Questions developers ask before integrating

Which identifier formats can I pass as id?

An OpenAlex work id starting with W, a DOI starting with 10., a prefixed arXiv id, or a PubMed id written as pmid:34265844. The prefix on the last two is not optional: W3177828909, the DOI and pmid:34265844 all returned the same AlphaFold record, while the bare number 34265844 was rejected with NOT_FOUND. arXiv:2209.15001 resolved through to OpenAlex W4298187611. The response echoes every id it knows in an ids object, so you only have to do this once per paper.

Why do cited_by_count and the citations total disagree?

They are two different measurements of the same thing. cited_by_count is a stored counter on the work record and read 46,735. The citations action filters the works index for papers citing that id and reported total 45,854. OpenAlex refreshes the counter and the index on different schedules, so a gap of a percent or two is normal. Use cited_by_count when you want a number to display and the citations total when you are about to page through the actual citing papers, because that is the number of rows you will get.

Do I get ORCIDs, and how good is author disambiguation?

You get an ORCID when OpenAlex has one, as a full https://orcid.org/ URL. On a 34-author paper, 28 authors carried one and 33 carried an OpenAlex author id, leaving one author who is a name string with id null and orcid null. That is what an unresolved author looks like, and it means you cannot key on authors[].id without a null check. Author profiles also return an affiliations list with a years array per institution, which is a clustering result rather than a verified employment record, so check the years before you treat an entry as current.

Why is abstract null on so many results?

OpenAlex stores abstracts as an inverted index and only for records where a publisher allowed it, so a large share simply have none. In a 40-row CRISPR search, 18 rows had no abstract while all 40 had a DOI. paper_detail can close some of that gap: fill_abstract is on by default and pulls the missing text from arXiv or Crossref, which is why the AlphaFold record returned a 1,701-character abstract and reported sources_merged as openalex plus crossref. Search results do not get that treatment, so hydrate the ones you care about.

What do the oa_status values mean, and where is the file?

gold means the venue itself is fully open, hybrid means an open article inside a paywalled journal, green means a repository copy exists, bronze means free to read on the publisher site with no open license, and closed means no free copy is known. The measured spread over 40 rows was 13 gold, 11 closed, 9 bronze, 5 green and 2 hybrid. When a file is known, oa_url and pdf_url carry the direct link, and license is returned separately: the AlphaFold record listed a CC BY 4.0 URL. bronze in particular tends to have a readable URL and no reusable license, so read license before you redistribute anything.

Why did a Crossref search return something called Figure 10?

Because Crossref registers DOIs for components of an article, not only for the article, and those component records are indexed alongside everything else. A live search with source crossref returned 10.7717/peerj-cs.3254/fig-10 and 10.7717/peerj-cs.3655/fig-2 in the top rows, with venue null on both. The tell is the trailing path segment on the DOI and the missing venue. If you want papers only, use source openalex, which returned real articles with a venue object on every row.

What does source=all actually give me?

One deduplicated page assembled from all three backends, not a merged corpus. A call with per_page 3 and source all returned 9 rows and reported count 9, because it fetched a page from each backend and DOI-deduplicated the union. That count is the size of what you got, unlike the single-source paths where count is the corpus total, 257,382 for the same query on arXiv and 315,449 on Crossref. Each row carries sources_merged so you can see which backend it came from.

How do I page past the first screen of results?

Pass cursor with the literal value * on the first call, then feed the returned next_cursor back in. Without a cursor, next_cursor comes back null and there is no continuation token, which is the usual reason a scripted crawl stops after one page. per_page goes up to 200. The offset-style parameters are backend-specific and cap at 10,000: start applies to arXiv and offset to Crossref, and neither has any effect on the OpenAlex path.

What is the Academic Papers API?

Academic Papers API is a ReefAPI endpoint group for search scholarly papers, authors, citations and abstracts. It returns live JSON through POST requests under /academic/v1.

Is the Academic Papers API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Academic Papers calls use the same shared credit balance as every other ReefAPI engine.

Do I need an Academic Papers login or account?

No login to Academic Papers is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Academic Papers data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Academic Papers API use?

Academic Papers actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Academic Papers from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call academic actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / academic

Academic Papers

Search scholarly papers, authors, citations and abstracts.

base /academic/v112 endpoints
post/academic/v1/paper_detail1 credit

full paper (abstract/authors/affiliations/venue/year/DOI/OA-PDF/fields); id=OpenAlex|DOI|arXiv|PMID; cross-source abstract gap-fill

ParameterAllowed / rangeDescription
idrequiredPaper id — OpenAlex id (W…), OR DOI (10.…), OR arXiv id, OR PMID.
enrich = falseoptionalPull extra Crossref metadata (funders/license/references flag) for the paper.
raw = falseoptionalAttach the raw OpenAlex record under paper._raw_openalex.
fill_abstract = trueoptionalGap-fill a missing OpenAlex abstract from arXiv/Crossref (default true).
Try in playground →
post/academic/v1/citations1 credit

papers that cite this work (cursor-paginated)

ParameterAllowed / rangeDescription
idrequiredPaper id — OpenAlex id (W…), OR DOI (10.…), OR arXiv id, OR PMID.
per_page = 25optional1–200Results per page (1-200, default 25); clamped.
cursoroptionalOpenAlex cursor for deep pagination (use '*' for the first page, then meta.next_cursor).
Try in playground →
post/academic/v1/references1 credit

works this paper references (hydrated)

ParameterAllowed / rangeDescription
idrequiredPaper id — OpenAlex id (W…), OR DOI (10.…), OR arXiv id, OR PMID.
limit = 50optional1–200Max records (1-200, default 50); clamped.
Try in playground →
post/academic/v1/author1 credit

author search (query) or profile (id): works_count, h-index, affiliations; include_works for top papers

ParameterAllowed / rangeDescription
idoptionalOpenAlex author id for a profile. Supply `id` OR a `query`/`name`.
queryoptionalSearch text → ranked list. Supply this OR `id`.
include_works = falseoptionalProfile only: also return the author's top works (highest-cited first).
works_limit = 25optional1–200Max top works when include_works=true (1-200).
per_page = 10optional1–200Results per page (1-200, default 10); clamped.
Try in playground →
post/academic/v1/institution1 credit

institution search/profile: ROR, country, geo, works/citation counts, h-index; include_works for the org's papers

ParameterAllowed / rangeDescription
idoptionalOpenAlex institution id for a profile. Supply `id` OR a `query`/`name`.
queryoptionalSearch text → ranked list. Supply this OR `id`.
per_page = 10optional1–200Results per page (1-200, default 10); clamped.
include_works = falseoptionalProfile only: also return the institution's top works (highest-cited first).
works_limit = 25optional1–200Max top works when include_works=true (1-200).
Try in playground →
post/academic/v1/venue1 credit

journal/venue search/profile: ISSN, publisher, OA/DOAJ, h-index, works/citation counts; include_works for the venue's papers

ParameterAllowed / rangeDescription
idoptionalOpenAlex venue/source id for a profile. Supply `id` OR a `query`/`name`.
queryoptionalSearch text → ranked list. Supply this OR `id`.
per_page = 10optional1–200Results per page (1-200, default 10); clamped.
include_works = falseoptionalProfile only: also return the venue's top works (highest-cited first).
works_limit = 25optional1–200Max top works when include_works=true (1-200).
Try in playground →
post/academic/v1/concept1 credit

concept search (query) or profile (id): level, works/citation counts, description; include_works for papers. NOTE: OpenAlex froze the Concepts dataset (ancestors/related now empty) — use `topic` for the live subject hierarchy

ParameterAllowed / rangeDescription
idoptionalOpenAlex concept id for a profile. Supply `id` OR a `query`/`name`.
queryoptionalSearch text → ranked list. Supply this OR `id`.
per_page = 10optional1–200Results per page (1-200, default 10); clamped.
include_works = falseoptionalProfile only: also return the concept's top works (highest-cited first).
works_limit = 25optional1–200Max top works when include_works=true (1-200).
Try in playground →
post/academic/v1/topic1 credit

topic search (query) or profile (id): domain>field>subfield hierarchy, keywords, siblings, works/citation counts; include_works for papers (the live replacement for Concepts)

ParameterAllowed / rangeDescription
idoptionalOpenAlex topic id for a profile. Supply `id` OR a `query`/`name`.
queryoptionalSearch text → ranked list. Supply this OR `id`.
per_page = 10optional1–200Results per page (1-200, default 10); clamped.
include_works = falseoptionalProfile only: also return the topic's top works (highest-cited first).
works_limit = 25optional1–200Max top works when include_works=true (1-200).
Try in playground →
post/academic/v1/autocomplete1 credit

fast typeahead suggestions (works/authors/sources/institutions)

ParameterAllowed / rangeDescription
qrequiredTypeahead prefix.
entity = worksoptionalworks · authors · sources · institutions · concepts · topicsWhich entity type to autocomplete. An unknown value falls back to 'works'.
Try in playground →
post/academic/v1/batch2 credits

hydrate up to 200 papers by id/DOI in one call (RAG/ETL)

ParameterAllowed / rangeDescription
idsrequiredUp to 200 paper ids/DOIs to hydrate (list or comma-separated).
include_abstract = falseoptionalInclude reconstructed abstracts in the hydrated rows (default false for batch).
limit = 100optional1–200Max records (1-200, default 100); clamped.
Try in playground →