Next free-source hunt
We check for new free data every weekday.
Datasets / Research & Grey Literature
developers.zenodo.org/

Zenodo REST API

Freeauth: none for public records search (guest limits); free account and access token for higher limits, authenticated and deposit operationsCC0-1.0#research-grey-literature#papers#datasets-discovery#historical-data✓ verified Nov 3, 2026

Zenodo REST API

Zenodo, the open repository hosted by CERN, has a REST API for searching its published records of any resource type, such as publications, reports, datasets and software, and returning their metadata and file links in JSON, plus OAI-PMH harvesting. Public records search works without a key under Zenodo's published guest limits (60 requests a minute and 2,000 an hour; search endpoints 30 a minute); a free Zenodo account and access token give higher limits and are needed for authenticated and deposit operations. Zenodo's developer docs also say broadly that "All API access requires an access token".

Coverage

Records deposited on Zenodo by its users, with metadata and files; users must specify a licence for all publicly available files. Publication delay: Not stated.

Verdict

Use it to find working papers, reports, datasets and code shared outside journals and to fetch their files. Zenodo says metadata is licensed under CC0 except for email addresses, while use and re-use of the files is subject to the licence each was deposited under, shown in the record metadata. Search endpoints allow 30 requests a minute, so read the X-RateLimit headers before paging.

Get the free weekly email

Free weekly email of newly verified free data. Unsubscribe by emailing us.

Use in your agent

Load Zenodo records for a search into pandas and Parquet. Checked against the provider's documentation on Nov 3, 2026.

Raw skill file (/skills/zenodo-rest-api.md)Also in our MCP server: call get_ingestion_skill with {"slug": "zenodo-rest-api"}.

Access

  • Public records search needs no key: Zenodo publishes guest limits (60 requests per minute, 2,000 per hour), and on 2026-11-04 a search of /api/records without a token returned HTTP 200 with records.
  • A free account and access token give higher limits (100 per minute, 5,000 per hour) and are needed for authenticated and deposit operations; set ZENODO_TOKEN and the snippet sends it as a Bearer header. Zenodo's developer docs also say broadly that all API access requires an access token.

Request

bash
curl 'https://zenodo.org/api/records?q=%22working%20paper%22%20AND%20economics&size=25&sort=mostrecent'

Format

JSON with hits.total and hits.hits; each record has id, doi, metadata (title, publication_date, resource_type, creators, license, description) and links (self_html, files).

Load into pandas and Parquet

Needs Python 3 with requests, pandas and pyarrow.

python
"""Zenodo published records -> pandas -> Parquet. Works without a key; sends ZENODO_TOKEN if set (optional, for higher rate limits)."""
import os
import requests
import pandas as pd

headers = {"Authorization": f"Bearer {os.environ['ZENODO_TOKEN']}"} if os.environ.get("ZENODO_TOKEN") else {}
params = {"q": "\"working paper\" AND economics", "size": 25, "sort": "mostrecent"}
r = requests.get("https://zenodo.org/api/records", params=params, headers=headers, timeout=60)
r.raise_for_status()
js = r.json()
rows = [{
    "record_id": h["id"],
    "doi": h.get("doi"),
    "title": h["metadata"].get("title"),
    "publication_date": h["metadata"].get("publication_date"),
    "resource_type": (h["metadata"].get("resource_type") or {}).get("type"),
    "license": (h["metadata"].get("license") or {}).get("id"),
    "url": h["links"].get("self_html"),
} for h in js["hits"]["hits"]]
df = pd.DataFrame(rows)
df.to_parquet("zenodo_records.parquet", index=False)
print(len(df), "records on this page of", js["hits"]["total"], "matches; X-RateLimit-Limit:", r.headers.get("X-RateLimit-Limit"))

Run by us on 2026-11-03 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 25 records on this page of 2460 matches; X-RateLimit-Limit: 30

Limits

  • Search REST endpoints: 30 requests per minute; global limit 60 per minute (guest) or 100 per minute (authenticated).
  • Check X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset on every response.

Quirks

  • description fields are HTML; strip tags before text processing.
  • license is per record and can be missing for closed-access records.

Terms and attribution

  • Metadata is CC0 except email addresses.
  • Files are used under the licence they were deposited with; check each record's license.

Sources

Information and education only. Not financial, investment, legal or tax advice. Listings can be inaccurate, incomplete or out of date and are provided "as is". Free tiers, limits and licenses belong to each provider and can change, so check the provider's own terms before you rely on them. Terms & Disclaimer