zenodo.org APIzenodo.org ↗
Search and retrieve records, files, versions, communities, and statistics from Zenodo's open science repository via 10 structured endpoints.
curl -X GET 'https://api.parse.bot/scraper/6d5c7106-d65c-4baf-8bb3-3f87a8a17925/search_records?q=climate+change&size=5' \ -H 'X-API-Key: $PARSE_API_KEY'
Search Zenodo records with various filters and pagination. Returns paginated results with aggregations for faceted filtering.
| Param | Type | Description |
|---|---|---|
| qrequired | string | Search query string. |
| page | integer | Page number for pagination. |
| size | integer | Number of results per page. |
| sort | string | Sort order. Accepted values: 'bestmatch', 'mostrecent'. |
| type | string | Filter by resource type (e.g., 'publication', 'software'). |
| subtype | string | Filter by resource subtype (e.g., 'article', 'preprint'). |
| communities | string | Filter by community slug. |
| access_right | string | Filter by access right. Accepted values: 'open', 'embargoed', 'restricted', 'closed'. |
| resource_type | string | Filter by resource type (e.g., 'publication', 'dataset'). |
{
"type": "object",
"fields": {
"hits": "object containing 'hits' array of record objects and 'total' count",
"links": "object with pagination links (self, next)",
"aggregations": "object with faceted filter buckets (publication_date, access_status, resource_type, subject, file_type)"
},
"sample": {
"data": {
"hits": {
"hits": [
{
"id": 14611580,
"doi": "10.5281/zenodo.14611580",
"links": {
"self_html": "https://zenodo.org/records/14611580"
},
"stats": {
"views": 136,
"downloads": 12
},
"metadata": {
"title": "climatechange-ai-tutorials/commonpower-safe-rl",
"creators": [
{
"name": "Climate Change AI"
}
],
"resource_type": {
"type": "software",
"title": "Software"
},
"publication_date": "2025-01-07"
}
}
],
"total": 194374
},
"links": {
"next": "https://zenodo.org/api/records?page=2&q=climate+change&size=5&sort=bestmatch",
"self": "https://zenodo.org/api/records?page=1&q=climate+change&size=5&sort=bestmatch"
}
},
"status": "success"
}
}About the zenodo.org API
This API exposes 10 endpoints covering Zenodo's open science repository, letting you search across millions of research records, retrieve full metadata and file listings, inspect version histories, and pull per-record download and view statistics. The search_and_extract_results endpoint returns a normalized flat list — including stripped abstracts, author arrays, DOIs, and direct download links — without any post-processing on your end.
Search and Record Retrieval
The search_records endpoint accepts a free-text q parameter alongside filters for type (e.g., publication, software), subtype, access_right, and communities. Results come back as a paginated hits object with a total count, plus an aggregations object containing facet buckets for publication_date, access_status, resource_type, subject, and file_type — ready for building faceted search UIs. The get_record endpoint retrieves a single record by numeric ID and returns the full metadata object (title, DOI, publication date, creators, description), a files array with checksums and sizes, and a stats object with download and view counts.
Files, Versions, and Statistics
get_record_files returns an entries array per record with each file's key, size, mimetype, checksum, and a links object containing direct download URLs. get_record_versions lists all versions of a record as a paginated hits array, and get_latest_record_version resolves any record ID to its most current version — useful when working with non-canonical version IDs. get_record_stats gives both per-version and all-version aggregate counts: views, downloads, unique_views, unique_downloads, and their version_* counterparts.
Communities
list_communities supports q, sort (bestmatch or newest), and pagination, and returns an aggregations object with type, funder, and organization facets. get_community accepts either a community slug or UUID and returns the community's access settings (visibility, member policy) and metadata (title, curation policy). search_records_in_community scopes a full record search to a specific community, accepting the same q, sort, and pagination parameters as the global search.
Normalized Extraction
search_and_extract_results provides a simplified alternative to search_records: instead of deeply nested metadata objects, it returns a flat list where each item includes doi, url, date, lang, title, source, authors (array of name strings), abstract (HTML stripped), keywords, and download_link. This is the fastest path when you only need publication-level fields without traversing nested structures.
- Building a literature discovery tool that filters Zenodo records by
resource_type,access_right, and keyword usingsearch_recordsaggregations - Tracking dataset download popularity by polling
get_record_statsforversion_downloadsandunique_downloadsacross a set of record IDs - Resolving the latest DOI for a versioned dataset using
get_latest_record_versionbefore citing or referencing it programmatically - Listing all files attached to a software deposit with
get_record_filesto surfacemimetype,size, and direct download links - Monitoring community growth by paginating
list_communitiesand filtering aggregations byfunderororganization - Extracting structured author and abstract data from open-access publications using
search_and_extract_resultswithout parsing nested metadata - Auditing all versions of a dataset record with
get_record_versionsto detect when new files or updated metadata were published
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 250 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Zenodo have an official developer API?+
What does `search_and_extract_results` return that `search_records` does not?+
search_and_extract_results returns a flat list with fields like abstract (HTML stripped), authors as a plain string array, download_link as a direct URL, and lang — all pre-extracted so you don't need to traverse the nested metadata and files structures that search_records returns.Does `get_record_stats` include time-series or historical view/download data?+
views, downloads, unique_views, unique_downloads, and their version_* equivalents — but no breakdown by date or time period. You can fork this API on Parse and revise it to add a time-windowed statistics endpoint if Zenodo's stats surface supports it.Can I retrieve records that require authentication or are under restricted access?+
access_right field; you can filter by open, embargoed, restricted, or closed using the access_right parameter in search_records. Metadata for restricted or closed records may be limited or absent. The API currently covers publicly accessible data. You can fork it on Parse and revise to add authenticated access for restricted record content.Is there a way to retrieve all records belonging to a specific community without searching?+
search_records_in_community, which scopes results to a community slug and returns a paginated hits array. It requires a community_id and optionally accepts q, sort, and pagination parameters. A full unfiltered dump of all community records is not a separate endpoint currently. You can fork this API on Parse and revise to add a dedicated listing endpoint.