CERN's general research repository: papers, preprints, software, datasets,
presentations, and posters, each with a DataCite DOI (10.5281/zenodo.…).
Use it when the user wants a deposited record or file, not a journal article
index. For journal OA PDFs use Unpaywall. For biology datasets that live at
EBI, try BioStudies first.
All figures below verified 2026-09-10.
https://zenodo.org/api
Docs: https://developers.zenodo.org/
Published records are public. GET /api/records works with no token.
Deposit / publish (/api/deposit/depositions) requires a personal access
token and is out of scope for this skill. Without a token that path returns
HTTP 403 Permission denied. (not always 401). Do not start a deposit
flow from a literature lookup.
No published per-second cap. Be polite; serialize long walks.
GET /api/records?q={elasticsearch}&type={type}&size={n}&page={n}
q is Elasticsearch syntax. type filters the Invenio resource type
(publication, software, dataset, image, poster, presentation,
video, other). Default search mixes all of them.
GET /api/records?q=CRISPR+organoid&size=2
Verified: HTTP 200, hits.total 3499, two hits. First hit was an SSRN
publication, not a dataset. Always read metadata.resource_type.
GET /api/records?q=scanpy&type=software&size=2
Verified: hits.total 40; both hits resource_type.type is software.
Response shape:
{
"hits": { "total": 3499, "hits": [ { "id": …, "doi": …, "metadata": {…}, "files": […], "links": {…} } ] },
"links": { "self": "…", "next": "…" }
}
Page with page (1-based) and size. Follow links.next when present.
GET /api/records/{id}
GET /api/records?q=doi:10.5281/zenodo.{id}
Follow redirects. A concept (parent) record id 302s to the latest version:
GET /api/records/3246410
-> 302 Location: /api/records/3246411
GET /api/records/3246411 (after curl -L)
-> 200 id=3246411
doi=10.5281/zenodo.3246411 # this version
conceptdoi=10.5281/zenodo.3246410 # all versions
conceptrecid=3246410
curl without -L returns HTML "Redirecting…" and JSON parse fails. Use
-L and then report both DOIs: the version DOI is the file you fetched;
the concept DOI is the stable cite-all-versions id.
Files (when present) live on files[] with a download URL under links.
A record can be published and still have no downloadable file.
q and a type if the user said software, data, or poster.id / doi from hits.hits[].GET /api/records/{id} with -L for files and the concept/version pair.| What you did | What happens | What to do |
|---|---|---|
Search without type |
Software, data, and papers mixed | Filter type= or report the resource type |
GET /records/{conceptrecid} without -L |
HTTP 302 + HTML | Follow redirects; record both DOIs |
| Treated deposit docs as required auth | You ask the user for a token to search | Search is public |
Cited 10.5281/zenodo.{concept} as the file you downloaded |
Concept DOI is all versions | Use the version DOI in provenance |