Discover/Zenodo API
live

Zenodo APIzenodo.org

Search and retrieve records, files, versions, communities, and statistics from Zenodo's open science repository via 10 structured endpoints.

Endpoint health
verified 7d ago
get_record
get_record_files
get_record_versions
get_latest_record_version
get_community
10/10 passing latest checkself-healing
Endpoints
10
Updated
22d ago

What is the Zenodo 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.

Try it
Search query string.
Page number for pagination.
Number of results per page.
Sort order.
Filter by resource type (e.g., 'publication', 'software', 'dataset').
Filter by resource subtype (e.g., 'article', 'preprint').
Filter by community slug.
Filter by access right.
Filter by resource type (e.g., 'publication', 'dataset').
api.parse.bot/scraper/6d5c7106-d65c-4baf-8bb3-3f87a8a17925/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/6d5c7106-d65c-4baf-8bb3-3f87a8a17925/search_records?q=climate+change&page=1&size=5&sort=bestmatch' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

Typed, relational, agent-ready

A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.

  • Fully typed · autocompletes
  • Objects link to objects
  • Typed errors & pagination

Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:

uv add parse-sdk
uv run parse init
uv run parse add --marketplace zenodo-org-api

uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.

"""Walkthrough: Zenodo SDK — search records, explore communities, drill into files and stats."""
from parse_apis.zenodo_api import Zenodo, RecordSort, AccessRight, CommunitySort, RecordNotFound

zenodo = Zenodo()

# Search open-access records about climate, sorted by most recent
for record in zenodo.records.search(q="climate change", sort=RecordSort.MOST_RECENT, access_right=AccessRight.OPEN, limit=5):
    print(record.id, record.title, record.publication_date)

# Drill into one record's files, versions, and stats
record = zenodo.records.search(q="machine learning", limit=1).first()
if record:
    for f in record.files.list(limit=5):
        print(f.key, f.size, f.mimetype)
    for ver in record.versions.list(limit=3):
        print(ver.id, ver.created, ver.is_latest)
    st = record.stats()
    print(st.views, st.downloads, st.data_volume)

# Construct a community by slug and search its records
community = zenodo.community("climate_crices")
for rec in community.search_records(q="adaptation", sort=RecordSort.BEST_MATCH, limit=3):
    print(rec.id, rec.title)

# Search communities by keyword
for comm in zenodo.communities.search(q="climate", sort=CommunitySort.NEWEST, limit=3):
    print(comm.slug, comm.title)

# Typed error handling: catch a missing record
try:
    result = zenodo.records.search(q="nonexistent_xyz_impossible_query_12345", limit=1).first()
    if result:
        latest = result.latest_version()
        print(latest.id, latest.title)
except RecordNotFound as exc:
    print(f"Record not found: {exc.record_id}")

# Normalized publication search for simplified metadata
for pub in zenodo.extractedpublications.search(q="deep learning", limit=3):
    print(pub.title, pub.doi, pub.authors)

print("exercised: records.search / record.files.list / record.versions.list / record.stats / community.search_records / communities.search / record.latest_version / extractedpublications.search")
All endpoints · 10 totalmissing one? ·

Search Zenodo records with various filters and pagination. Returns paginated results with aggregations for faceted filtering. Supports query syntax, resource type/subtype filtering, community membership filtering, and access-right filtering. Results are ordered by sort parameter.

Input
ParamTypeDescription
qrequiredstringSearch query string.
pageintegerPage number for pagination.
sizeintegerNumber of results per page.
sortstringSort order.
typestringFilter by resource type (e.g., 'publication', 'software', 'dataset').
subtypestringFilter by resource subtype (e.g., 'article', 'preprint').
communitiesstringFilter by community slug.
access_rightstringFilter by access right.
resource_typestringFilter by resource type (e.g., 'publication', 'dataset').
Response
{
  "type": "object",
  "fields": {
    "links": "object with pagination links (self, next)",
    "total": "integer total number of matching records",
    "sortBy": "string indicating the current sort order",
    "results": "array of record objects",
    "aggregations": "object with faceted filter buckets"
  },
  "sample": {
    "data": {
      "links": {
        "self": "https://zenodo.org/api/records?page=1&q=climate+change&size=5&sort=bestmatch"
      },
      "total": 203523,
      "sortBy": "bestmatch",
      "results": [
        {
          "id": "14612905",
          "links": {
            "self_html": "https://zenodo.org/records/14612905"
          },
          "metadata": {
            "title": "climatechange-ai-tutorials/camels-hydrological-modeling",
            "publication_date": "2025-01-08"
          }
        }
      ],
      "aggregations": {
        "access_status": {
          "buckets": [
            {
              "key": "open",
              "doc_count": 191569
            }
          ]
        }
      }
    },
    "status": "success"
  }
}

About the Zenodo API

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.

Reliability & maintenanceVerified

The Zenodo API is a managed, monitored endpoint for zenodo.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when zenodo.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.

This isn't an official zenodo.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.

Last verified
7d ago
Latest check
10/10 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Building a literature discovery tool that filters Zenodo records by resource_type, access_right, and keyword using search_records aggregations
  • Tracking dataset download popularity by polling get_record_stats for version_downloads and unique_downloads across a set of record IDs
  • Resolving the latest DOI for a versioned dataset using get_latest_record_version before citing or referencing it programmatically
  • Listing all files attached to a software deposit with get_record_files to surface mimetype, size, and direct download links
  • Monitoring community growth by paginating list_communities and filtering aggregations by funder or organization
  • Extracting structured author and abstract data from open-access publications using search_and_extract_results without parsing nested metadata
  • Auditing all versions of a dataset record with get_record_versions to detect when new files or updated metadata were published
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 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.

Frequently asked questions
Does Zenodo have an official developer API?+
Yes. Zenodo provides an official REST API documented at https://developers.zenodo.org. It supports read and write operations for authenticated users, including record deposit and community management.
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?+
Not currently. It returns aggregate totals — 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?+
The API returns records according to their 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?+
The closest option is 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.
Page content last updated . Spec covers 10 endpoints from zenodo.org.
Related APIs in EducationSee all →
physionet.org API
Search and access biomedical research datasets from PhysioNet, including detailed dataset information, file listings, and content retrieval for medical data analysis. Stay updated with the latest news and manage your account through secure login.
openalex.org API
Search and retrieve millions of academic papers, articles, and books from OpenAlex's comprehensive global research catalog to find scholarly works by topic, author, or citation. Discover detailed information about research publications including metadata, abstracts, and citation counts to stay current with academic literature in your field.
springer.com API
Search and retrieve metadata for millions of articles, books, and journals from Springer Nature's research library using DOI or ISBN lookups, with powerful filtering and pagination options. Get detailed information about academic publications including journal details, article metadata, and book information to power your research tools and discovery applications.
jstor.org API
Search and browse millions of academic articles, journals, and research issues from JSTOR's library, or retrieve specific articles and journal details to explore scholarly content by subject. Access peer-reviewed research across multiple disciplines to find the academic sources you need.
arxiv.org API
Search and discover academic research papers on arXiv using keywords, authors, titles, categories, and dates, then access detailed metadata for any paper. Browse the complete arXiv category taxonomy to explore research across different scientific disciplines.
egyankosh.ac.in API
Search and browse educational materials from IGNOU's digital repository, retrieve course unit details, and access PDFs directly. Navigate through communities and collections to find study resources organized by subject and course structure.
github.com API
Look up GitHub repositories and users: search repositories, fetch repository metadata, releases, issues and issue threads, browse repository files/trees, and retrieve user profiles and starred repositories.
discovery.nationalarchives.gov.uk API
Search and browse The National Archives Discovery catalogue to find historical records, discover their creators, and explore archived collections. Get detailed information about specific records and navigate through the archive's organizational structure to uncover primary sources and historical documents.