# Zenodo Scraper — Research Records, Datasets & Software (`openclawmara/zenodo-scraper`) Actor

Scrape Zenodo.org (CERN open research repository) for records, datasets, and software. Four modes: search with type/access filters, record details by DOI/ID, community browse, recent submissions. Extracts titles, authors, DOIs, files, stats. Uses official API. No auth, 60 req/min.

- **URL**: https://apify.com/openclawmara/zenodo-scraper.md
- **Developed by:** [OpenClaw Mara](https://apify.com/openclawmara) (community)
- **Categories:** AI, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 zenodo record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Zenodo Scraper — Research Records, Datasets & Software Metadata

**$0.005 per record** · Extract research outputs, datasets, software, and publications from **[Zenodo](https://zenodo.org)** — CERN's open research repository with **4M+ records**, permanent DOIs, and full community metadata. **No API key needed for public records.**

Built for **research intelligence**, **dataset discovery**, **open-science dashboards**, **DOI enrichment pipelines**, and **RAG/LLM corpora on academic research and data**.

***

### What You Get

- **Advanced search** — Zenodo's full query syntax (title/creators/keywords/DOI filters)
- **Record details** — full metadata by record ID or DOI (description, files, authors, license)
- **Community browsing** — list records inside a specific Zenodo community
- **Recent uploads** — latest research outputs (great for monitoring dashboards)
- **Resource type filter** — publication / dataset / software / poster / presentation / image / video
- **DOI-ready** — every record ships with a permanent `10.5281/zenodo.*` DOI
- **Structured JSON** — stable fields, ready for downstream pipelines
- **CC-licensed data** — reusable under open licenses

***

### 4 Use Cases (ready-to-run JSON inputs)

#### 1. Discover fresh datasets on a topic

```json
{
  "mode": "search",
  "searchQuery": "climate change temperature",
  "resourceType": "dataset",
  "maxResults": 50,
  "sort": "mostrecent"
}
```

Top 50 most-recent datasets about climate change — seed data for a research dashboard or a reading list.

#### 2. DOI enrichment for a reference list

```json
{
  "mode": "record_details",
  "recordIds": ["10.5281/zenodo.1234567", "10.5281/zenodo.7654321"]
}
```

Full metadata (title, authors, abstract, files, license) for specific DOIs. Use to enrich a bibliography CSV or citation manager export.

#### 3. Monitor a research community

```json
{
  "mode": "community",
  "communityId": "covid-19",
  "resourceType": "publication",
  "maxResults": 100,
  "sort": "mostrecent"
}
```

Latest 100 publications in the Zenodo COVID-19 community — perfect for weekly digest emails or Slack alerts.

#### 4. Daily "what's new on Zenodo" feed

```json
{
  "mode": "recent",
  "resourceType": "software",
  "maxResults": 25
}
```

25 newest software releases published to Zenodo — ideal for open-source release trackers.

***

### Input Schema

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | enum | `search` | `search` / `record_details` / `community` / `recent` |
| `searchQuery` | string | — | Query (supports `title:` / `creators.name:` / `keywords:`) |
| `resourceType` | enum | `""` | `publication` / `dataset` / `software` / `poster` / … |
| `recordIds` | string\[] | `[]` | Numeric IDs or `10.5281/zenodo.NNN` DOIs (`record_details`) |
| `communityId` | string | — | Zenodo community slug (`community` mode) |
| `maxResults` | integer | `50` | Max records per run |
| `sort` | enum | `bestmatch` | `bestmatch` / `mostrecent` / `mostviewed` |

### Output (sample — `record_details`)

```json
{
  "id": 1234567,
  "doi": "10.5281/zenodo.1234567",
  "title": "Global temperature anomalies 1880–2024",
  "resourceType": "dataset",
  "publicationDate": "2024-11-18",
  "creators": [
    {"name": "Smith, Jane", "affiliation": "MIT", "orcid": "0000-0002-1825-0097"}
  ],
  "description": "Monthly global temperature anomalies compiled from GISS, HadCRUT5 and Berkeley Earth...",
  "keywords": ["climate", "temperature", "anomaly", "reanalysis"],
  "license": "CC-BY-4.0",
  "files": [
    {"filename": "temps.csv", "size": 524288, "checksum": "md5:abcdef...", "downloadUrl": "https://zenodo.org/records/1234567/files/temps.csv"}
  ],
  "stats": {"views": 8420, "downloads": 2310, "uniqueDownloads": 1945},
  "zenodoUrl": "https://zenodo.org/records/1234567"
}
```

***

### Pricing & Performance

- **Pay-per-event:** $0.005 per Zenodo record
- **Typical cost:** $0.05 for 10 records, $0.50 for 100, $5 for 1,000
- **Speed:** ~10–15 records/second (rate-limit-safe against Zenodo API)
- **Free Apify tier:** $5/month credit = ~1,000 records/month

Zenodo itself is free and open — you pay only for structured extraction, DOI enrichment, and delivery into your pipelines.

***

### Integrations

- **Zapier / Make / n8n** — new record in a community → Airtable / Slack / Notion
- **LangChain / LlamaIndex** — RAG over abstracts, descriptions, and metadata
- **Vector DBs (Pinecone / Weaviate / Qdrant)** — embed titles/abstracts for semantic "similar research"
- **Neo4j / Graphiti** — researcher → record → community → keyword graph
- **Citation managers (Zotero / Mendeley)** — DOI resolver + metadata fetcher
- **Elasticsearch / Algolia / Meilisearch** — index research outputs for search UI
- **Python SDK**
  ```python
  from apify_client import ApifyClient
  client = ApifyClient("<APIFY_TOKEN>")
  run = client.actor("Helpermara/zenodo-scraper").call(
      run_input={"mode": "search", "searchQuery": "large language model", "resourceType": "dataset", "maxResults": 30}
  )
  for rec in client.dataset(run["defaultDatasetId"]).iterate_items():
      print(rec["doi"], rec["title"])
  ```

***

### FAQ

**Do I need a Zenodo API token?** No, public records are accessible without authentication. Zenodo applies generous rate limits for anonymous traffic.

**What about private / restricted records?** This actor only reads public content. Restricted records require a Zenodo personal token (not covered here).

**Which DOI format should I use?** Either full DOI (`10.5281/zenodo.1234567`) or just the numeric record ID — both work in `recordIds`.

**How do I find a community slug?** Visit `https://zenodo.org/communities/` and look at the URL — slugs like `covid-19`, `eosc`, `openaire` are the `communityId`.

**Advanced search syntax?** Zenodo supports Lucene-style queries: `title:"neural network" AND creators.name:"Hinton"`. Pass as-is into `searchQuery`.

**Can I get file contents?** No — the actor returns file metadata + download URLs. Fetch files yourself using the returned `downloadUrl`.

***

### Keywords

zenodo scraper, zenodo api, research data, research datasets, open science, doi metadata, cern zenodo, academic datasets, research outputs, fair data, open access, research software, scholarly communication, openaire, research discovery, dataset catalog, digital repository, preprint, citation enrichment, doi resolver

***

### Companions (cross-promo)

- **[crossref-scraper](https://apify.com/Helpermara/crossref-scraper)** — DOI metadata
- **[semantic-scholar-scraper](https://apify.com/Helpermara/semantic-scholar-scraper)** — academic papers
- **[arxiv-scraper](https://apify.com/Helpermara/arxiv-scraper)** — preprints
- **[orcid-scraper](https://apify.com/Helpermara/orcid-scraper)** — researcher profiles

***

### Changelog

- **2026-04-24** — Extended README with use cases, integrations, and FAQ
- **2026-03** — Initial release: 4 modes (search / record\_details / community / recent)

# Actor input Schema

## `mode` (type: `string`):

What to scrape: search records, get record details, browse by community, or list recent uploads.

## `searchQuery` (type: `string`):

Search query (search mode). Supports Zenodo advanced syntax like 'title:climate AND creators.name:smith'.

## `resourceType` (type: `string`):

Filter by resource type (search/community/recent modes). Leave empty for all.

## `recordIds` (type: `array`):

Zenodo record IDs (numeric) or DOIs (10.5281/zenodo.NNN) — record\_details mode.

## `communityId` (type: `string`):

Community identifier (community mode). Example: 'biodiversity\_literature\_repository', 'covid-19'.

## `maxResults` (type: `integer`):

Maximum number of records to return.

## `sortBy` (type: `string`):

Sort search results by (search/community/recent modes).

## `accessRight` (type: `string`):

Filter by access right.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "large language models",
  "resourceType": "",
  "recordIds": [
    "10.5281/zenodo.6050054"
  ],
  "communityId": "covid-19",
  "maxResults": 50,
  "sortBy": "bestmatch",
  "accessRight": ""
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "large language models",
    "recordIds": [
        "10.5281/zenodo.6050054"
    ],
    "communityId": "covid-19"
};

// Run the Actor and wait for it to finish
const run = await client.actor("openclawmara/zenodo-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "large language models",
    "recordIds": ["10.5281/zenodo.6050054"],
    "communityId": "covid-19",
}

# Run the Actor and wait for it to finish
run = client.actor("openclawmara/zenodo-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "large language models",
  "recordIds": [
    "10.5281/zenodo.6050054"
  ],
  "communityId": "covid-19"
}' |
apify call openclawmara/zenodo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,openclawmara/zenodo-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Rghgiw3kEymIrkBN8/builds/nZkhvxEwVSAbXxxp0/openapi.json
