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

zenodo.md

113 lines · skills/paper-lookup/references/zenodo.md at 5f2bc03

Open on GitHub

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

1# Zenodo
2
3CERN's general research repository: papers, preprints, software, datasets,
4presentations, and posters, each with a DataCite DOI (`10.5281/zenodo.…`).
5Use it when the user wants a deposited record or file, not a journal article
6index. For journal OA PDFs use Unpaywall. For biology datasets that live at
7EBI, try BioStudies first.
8
9All figures below verified 2026-09-10.

Zenodo

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.

Raw lines 1 to 10
11## Base URL
13```
14https://zenodo.org/api
15```
17Docs: https://developers.zenodo.org/

Base URL

https://zenodo.org/api

Docs: https://developers.zenodo.org/

Raw lines 11 to 18
19## Authentication
21**Published records are public.** `GET /api/records` works with no token.
23Deposit / publish (`/api/deposit/depositions`) requires a personal access
24token and is out of scope for this skill. Without a token that path returns
25HTTP **403** `Permission denied.` (not always 401). Do not start a deposit
26flow from a literature lookup.

Authentication

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.

Raw lines 19 to 27
28## Rate Limits
30Public search is limited to **30 requests/minute**. Guest global limits are 60/minute and 2,000/hour; authenticated global limits are 100/minute and 5,000/hour. Inspect `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset`; serialize long walks.

Rate Limits

Public search is limited to 30 requests/minute. Guest global limits are 60/minute and 2,000/hour; authenticated global limits are 100/minute and 5,000/hour. Inspect X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset; serialize long walks.

Raw lines 28 to 31
32## Key Endpoints

Key Endpoints

Raw lines 32 to 33
34### 1. Search published records
36```
37GET /api/records?q={elasticsearch}&type={type}&size={n}&page={n}
38```
40`q` is Elasticsearch syntax. `type` filters the Invenio resource type
41(`publication`, `software`, `dataset`, `image`, `poster`, `presentation`,
42`video`, `other`). Default search mixes all of them.
44```
45GET /api/records?q=CRISPR+organoid&size=2
46```
48Verified: HTTP 200, `hits.total` 3499, two hits. First hit was an SSRN
49*publication*, not a dataset. Always read `metadata.resource_type`.
51```
52GET /api/records?q=scanpy&type=software&size=2
53```
55Verified: `hits.total` 40; both hits `resource_type.type` is `software`.
57Response shape:
59```json
61 "hits": { "total": 3499, "hits": [ { "id": …, "doi": …, "metadata": {…}, "files": […], "links": {…} } ] },
62 "links": { "self": "…", "next": "…" }
64```
66Page with `page` (1-based) and `size`. Follow `links.next` when present. The documented `size` maximum is 25 anonymously or 100 authenticated. Use metadata exports/OAI-PMH for bulk retrieval rather than assuming unlimited search paging.

1. Search published records

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. The documented size maximum is 25 anonymously or 100 authenticated. Use metadata exports/OAI-PMH for bulk retrieval rather than assuming unlimited search paging.

Raw lines 34 to 67
68### 2. One record by id or DOI
70```
71GET /api/records/{id}
72GET /api/records?q=doi:%2210.5281/zenodo.{id}%22
73```
75**Follow redirects.** A concept (parent) record id 302s to the latest version:
77```
78GET /api/records/3246410
79 -> 302 Location: /api/records/3246411
80GET /api/records/3246411 (after curl -L)
81 -> 200 id=3246411
82 doi=10.5281/zenodo.3246411 # this version
83 conceptdoi=10.5281/zenodo.3246410 # all versions
84 conceptrecid=3246410
85```
87`curl` without `-L` returns HTML "Redirecting…" and JSON parse fails. Use
88`-L` and then report both DOIs: the version DOI is the file you fetched;
89the concept DOI is the stable cite-all-versions id.
91Files (when present) live on `files[]` with a download URL under `links`.
92A record can be published and still have no downloadable file.

2. One record by id or DOI

GET /api/records/{id}
GET /api/records?q=doi:%2210.5281/zenodo.{id}%22

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.

Raw lines 68 to 93
94## Typical Workflow
961. Search with `q` and a `type` if the user said software, data, or poster.
972. Take `id` / `doi` from `hits.hits[]`.
983. `GET /api/records/{id}` with `-L` for files and the concept/version pair.
994. If they wanted a journal PDF, stop and use Unpaywall on the paper DOI
100 instead of scraping a Zenodo landing page.

Typical Workflow

  1. Search with q and a type if the user said software, data, or poster.
  2. Take id / doi from hits.hits[].
  3. GET /api/records/{id} with -L for files and the concept/version pair.
  4. If they wanted a journal PDF, stop and use Unpaywall on the paper DOI instead of scraping a Zenodo landing page.
Raw lines 94 to 101
102## Failure Modes
104| What you did | What happens | What to do |
105|---|---|---|
106| Search without `type` | Software, data, and papers mixed | Filter `type=` or report the resource type |
107| `GET /records/{conceptrecid}` without `-L` | HTTP 302 + HTML | Follow redirects; record both DOIs |
108| Treated deposit docs as required auth | You ask the user for a token to *search* | Search is public |
109| Cited `10.5281/zenodo.{concept}` as the file you downloaded | Concept DOI is all versions | Use the version DOI in provenance |

Failure Modes

What you didWhat happensWhat to do
Search without typeSoftware, data, and papers mixedFilter type= or report the resource type
GET /records/{conceptrecid} without -LHTTP 302 + HTMLFollow redirects; record both DOIs
Treated deposit docs as required authYou ask the user for a token to searchSearch is public
Cited 10.5281/zenodo.{concept} as the file you downloadedConcept DOI is all versionsUse the version DOI in provenance
Raw lines 102 to 110
Involves a person ask the user :108
111## Official sources reviewed 2026-09-30
113- https://developers.zenodo.org/

Official sources reviewed 2026-09-30

  • https://developers.zenodo.org/
Raw lines 111 to 113