# Project Gutenberg Books Scraper (`parseforge/project-gutenberg-books-scraper`) Actor

Search 75,000+ free public-domain books from Project Gutenberg. Returns title, author with birth/death years, cover image, plain-text and EPUB download URLs, Kindle and HTML formats, subjects, bookshelves, language, copyright status, summaries and download counts. Filter by author or language.

- **URL**: https://apify.com/parseforge/project-gutenberg-books-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Education, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $13.00 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 📚 Project Gutenberg Books Scraper

> 🚀 **Search 75,000+ free public-domain books from Project Gutenberg.**

> 🕒 **Last updated:** 2026-05-06 · **📊 28 fields** per record · **75,000+ books** · public-domain catalog · plain-text, EPUB, Kindle, HTML, PDF download URLs

The **Project Gutenberg Books Scraper** searches the Project Gutenberg catalog and returns structured records for any free public-domain ebook. Output includes title, author with birth/death years, cover image, plain-text and EPUB download URLs, Kindle and HTML formats, subjects, bookshelves, language, copyright status, summaries, and download counts.

Project Gutenberg has been digitizing public-domain texts since 1971 and now hosts **75,000+ books** across 60+ languages. Filters run server-side, so a single run can isolate every Shakespeare play, all 19th-century French novels, or the most-downloaded books of all time.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Researchers, NLP/ML teams, librarians, educators, content creators, ebook app developers | Building text corpora, NLP training datasets, public-domain ebook libraries, literary research, citation generation |

---

### 📋 What the Project Gutenberg Books Scraper does

Five filtering workflows in a single run:

- 🔍 **Free-text search.** Match by title, author, or general keywords.
- 👤 **Author filter.** Restrict to one author across all their works.
- 🏷️ **Topic filter.** Filter by subject (history, philosophy, science, fiction).
- 🌐 **Language filter.** ISO 639 language codes (en, fr, de, es, zh, ja).
- 📅 **Author year filter.** Filter authors by birth/death year for period studies.

> 💡 **Why it matters:** clean, server-side filtering removes the parser-and-pagination work from your team and keeps your dataset fresh on every run.

---

### 🎬 Full Demo

_🚧 Coming soon: a 3-minute walkthrough showing how to go from sign-up to a downloaded dataset._

---

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td><code>maxItems</code></td><td>integer</td><td><code>10</code></td><td>Records to return. Free plan caps at 10, paid plan up to 1,000,000.</td></tr>
<tr><td><code>query</code></td><td>string</td><td><code>"shakespeare"</code></td><td>Free-text keyword search.</td></tr>
<tr><td><code>language</code></td><td>string</td><td><code>""</code></td><td>ISO 639 language code.</td></tr>
<tr><td><code>topic</code></td><td>string</td><td><code>""</code></td><td>Subject filter.</td></tr>
<tr><td><code>authorYearStart</code></td><td>integer</td><td><code>null</code></td><td>Author born after this year.</td></tr>
<tr><td><code>authorYearEnd</code></td><td>integer</td><td><code>null</code></td><td>Author died before this year.</td></tr>
<tr><td><code>copyrightStatus</code></td><td>string</td><td><code>""</code></td><td>`true`=copyrighted, `false`=public domain, empty=any.</td></tr>
</tbody>
</table>

**Example: every Shakespeare work.**

```json
{
    "maxItems": 100,
    "query": "shakespeare"
}
````

**Example: 19th-century French novels.**

```json
{
    "maxItems": 200,
    "language": "fr",
    "authorYearStart": 1800,
    "authorYearEnd": 1900
}
```

***

### 📊 Output

Each record contains **28 fields**. Download the dataset as CSV, Excel, JSON, or XML.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🖼️ `coverUrl` | string | null | `"https://www.gutenberg.org/cache/epub/100/pg100.cover.medium.jpg"` |
| 🆔 `gutenbergId` | string | `"100"` |
| 📛 `title` | string | `"The Complete Works of William Shakespeare"` |
| 👤 `authorsText` | string | `"Shakespeare, William"` |
| 👤 `authors` | array | `[ { name, birthYear, deathYear } ]` |
| 🏷️ `subjects` | array | `["Drama","English drama"]` |
| 📁 `bookshelves` | array | `["Plays"]` |
| 🌐 `languages` | array | `["en"]` |
| 📋 `copyright` | boolean | `false` |
| 📥 `downloadCount` | number | `45230` |
| 📄 `plainTextUrl` | string | `"https://www.gutenberg.org/files/100/100-0.txt"` |
| 📕 `epubUrl` | string | `"https://www.gutenberg.org/ebooks/100.epub3.images"` |
| 📖 `kindleUrl` | string | `"https://www.gutenberg.org/ebooks/100.kf8.images"` |
| 🌐 `htmlUrl` | string | `"https://www.gutenberg.org/files/100/100-h/100-h.htm"` |
| 🔗 `gutenbergUrl` | string | `"https://www.gutenberg.org/ebooks/100"` |

#### 📦 Sample records

<details>
<summary><strong>📜 Shakespeare</strong></summary>

```json
{"gutenbergId":"100","title":"The Complete Works of William Shakespeare","authorsText":"Shakespeare, William","languages":["en"],"copyright":false,"downloadCount":45230,"plainTextUrl":"https://www.gutenberg.org/files/100/100-0.txt"}
```

</details>

<details>
<summary><strong>📕 French novel</strong></summary>

```json
{"gutenbergId":"17489","title":"Madame Bovary","authorsText":"Flaubert, Gustave","languages":["fr"],"copyright":false,"downloadCount":8210}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 📚 | **75,000+ books.** Every public-domain text Project Gutenberg has digitized since 1971. |
| 🌐 | **60+ languages.** English dominates, but you can find French, German, Spanish, Chinese, and more. |
| 📄 | **Multi-format URLs.** Plain-text, EPUB, Kindle, HTML, and PDF when available. |
| 📥 | **Download counts.** Filter and rank by reader popularity. |
| ⚖️ | **Public domain.** Use commercially without restrictions in most jurisdictions. |

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| **⭐ This Actor** | $5 free credit | **75,000+** books | Live per run | query, author, lang, topic, year | ⚡ 2 min |
| Manual Gutenberg browsing | Free | Manual | Live | Web filters only | 🕒 Manual |
| Standard Ebooks | Free | Curated subset | Slow | Limited | 🐢 Account |
| Internet Archive Texts | Free | Massive | Variable | Bulk only | 🐢 ETL |

Pick this Actor when you want broad coverage, server-side filtering, and no pipeline maintenance.

***

### 🚀 How to use

1. 📝 **Sign up.** [Create a free account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp) (takes 2 minutes).
2. 🌐 **Open the Actor.** Go to the Project Gutenberg Books Scraper page on the Apify Store.
3. 🎯 **Set input.** Pick your filters and `maxItems`.
4. 🚀 **Run it.** Click **Start** and let the Actor collect your data.
5. 📥 **Download.** Grab your results in the **Dataset** tab as CSV, Excel, JSON, or XML.

> ⏱️ Total time from signup to downloaded dataset: **3-5 minutes.** No coding required.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%" valign="top">

#### 🤖 NLP & ML

- Build training corpora for language models
- Authorship-attribution datasets
- Style-transfer corpora
- Multilingual training data

</td>
<td width="50%" valign="top">

#### 📚 Libraries & Education

- Build classroom ebook collections
- Curriculum-aligned reading lists
- Free supplementary materials for K-12
- Library catalog enrichment

</td>
</tr>
<tr>
<td width="50%" valign="top">

#### 📰 Content & Publishing

- Republish public-domain works
- Generate audiobook scripts
- Create curated newsletters
- Build literary discovery apps

</td>
<td width="50%" valign="top">

#### 🔬 Research & Academia

- Citation generation
- Distant-reading studies
- Genre evolution analysis
- Translation corpora

</td>
</tr>
</table>

***

### 🔌 Automating Project Gutenberg Books Scraper

Control the scraper programmatically for scheduled runs and pipeline integrations:

- 🟢 **Node.js.** Install the `apify-client` NPM package.
- 🐍 **Python.** Use the `apify-client` PyPI package.
- 📚 See the [Apify API documentation](https://docs.apify.com/api/v2) for full details.

The [Apify Schedules feature](https://docs.apify.com/platform/schedules) lets you trigger this Actor on any cron interval. Hourly, daily, or weekly refreshes keep downstream databases in sync automatically.

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Reproducible literary corpora
- Versioned text snapshots
- Computational linguistics studies
- Course material with primary sources

</td>
<td width="50%">

#### 🎨 Personal and creative

- Personal ebook collections
- Indie reading-app side projects
- Newsletter on classic literature
- Hobbyist literary databases

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Library digitization projects
- Reading-list contributions
- Cultural-preservation outreach
- Multilingual literacy programs

</td>
<td width="50%">

#### 🧪 Experimentation

- Train tokenizers on diverse text
- Test text-mining pipelines
- Prototype text-recommendation engines
- Build literary-analysis dashboards

</td>
</tr>
</table>

***

### 🤖 Ask an AI assistant about this scraper

Open a ready-to-send prompt about this ParseForge actor in the AI of your choice:

- 💬 [**ChatGPT**](https://chat.openai.com/?q=How%20do%20I%20use%20the%20Project%20Gutenberg%20Books%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🧠 [**Claude**](https://claude.ai/new?q=How%20do%20I%20use%20the%20Project%20Gutenberg%20Books%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🔍 [**Perplexity**](https://perplexity.ai/search?q=How%20do%20I%20use%20the%20Project%20Gutenberg%20Books%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🅒 [**Copilot**](https://copilot.microsoft.com/?q=How%20do%20I%20use%20the%20Project%20Gutenberg%20Books%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)

***

### ❓ Frequently Asked Questions

#### 🧩 How does it work?

Provide a query, author, language, or topic filter. The Actor queries the Project Gutenberg catalog and emits one record per book.

#### 📥 Can I download the actual book contents?

The Actor returns metadata and direct download URLs for plain-text, EPUB, Kindle, HTML, and PDF formats. Use those URLs to fetch the actual contents.

#### ⚖️ Is everything truly public domain?

Yes for the vast majority. The `copyright` field flags the rare exceptions still under copyright in some jurisdictions.

#### 📊 How many fields per record?

28, including title, authors with birth/death years, cover, all download URLs, subjects, bookshelves, language, and download counts.

#### 🔁 Can I schedule runs?

Yes. New books and translations are added regularly. Schedule weekly to capture additions.

#### 🌐 Which languages are supported?

60+, with strongest coverage in English, French, German, Spanish, Italian, Dutch, Portuguese, and Chinese.

#### 👤 Does it include author biographies?

No, but it returns author birth/death years for period research.

#### 💳 Do I need a paid Apify plan?

No. The free plan covers preview runs. A paid plan unlocks higher item counts and scheduling.

#### 🆘 What if a run fails?

Apify retries transient errors. Partial datasets are preserved.

#### 🎙️ Can I generate audiobooks from this?

Yes. Pull plain-text URLs and pipe through any text-to-speech engine.

***

### 🔌 Integrate with any app

Project Gutenberg Books Scraper connects to any cloud service via [Apify integrations](https://apify.com/integrations):

- [**Make**](https://docs.apify.com/platform/integrations/make) - Automate multi-step workflows
- [**Zapier**](https://docs.apify.com/platform/integrations/zapier) - Connect with 5,000+ apps
- [**Slack**](https://docs.apify.com/platform/integrations/slack) - Get run notifications in your channels
- [**Airbyte**](https://docs.apify.com/platform/integrations/airbyte) - Pipe data into your warehouse
- [**GitHub**](https://docs.apify.com/platform/integrations/github) - Trigger runs from commits and releases
- [**Google Drive**](https://docs.apify.com/platform/integrations/drive) - Export datasets straight to Sheets

You can also use webhooks to trigger downstream actions when a run finishes.

***

### 🔗 Recommended Actors

- [**📖 Open Library Books**](https://apify.com/parseforge/openlibrary-books-scraper) - 30M+ books and editions
- [**🌐 Wikidata Entity Search**](https://apify.com/parseforge/wikidata-entity-search-scraper) - 100M+ open knowledge-graph entities
- [**🎨 Openverse Media**](https://apify.com/parseforge/openverse-media-scraper) - 800M+ openly licensed images and audio
- [**🎓 arXiv Scraper**](https://apify.com/parseforge/arxiv-scraper) - Academic preprints
- [**🎬 TVMaze TV Shows**](https://apify.com/parseforge/tvmaze-shows-scraper) - TV show metadata

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more reference-data scrapers.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) to request a new scraper, propose a custom data project, or report an issue.

***

> **⚠️ Disclaimer:** this Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Project Gutenberg, the Gutendex project, or any contributing volunteers. All trademarks mentioned are the property of their respective owners. Only publicly available open data is collected.

# Actor input Schema

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `query` (type: `string`):

Search terms (matches title, author name, etc.). Empty = all books, ranked by popularity.

## `language` (type: `string`):

Filter by language code(s) — e.g. 'en' for English, 'es' for Spanish, 'fr' for French. Multiple: 'en,fr'.

## `topic` (type: `string`):

Filter by Library of Congress subject heading (substring match).

## `authorYearStart` (type: `integer`):

Filter by author birth year >= this.

## `authorYearEnd` (type: `integer`):

Filter by author birth year <= this.

## `copyrightStatus` (type: `string`):

Filter by copyright status.

## Actor input object example

```json
{
  "maxItems": 10,
  "query": "tolkien",
  "copyrightStatus": ""
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "maxItems": 10,
    "query": "tolkien",
    "language": "",
    "topic": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/project-gutenberg-books-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 = {
    "maxItems": 10,
    "query": "tolkien",
    "language": "",
    "topic": "",
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/project-gutenberg-books-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "query": "tolkien",
  "language": "",
  "topic": ""
}' |
apify call parseforge/project-gutenberg-books-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/project-gutenberg-books-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Project Gutenberg Books Scraper",
        "description": "Search 75,000+ free public-domain books from Project Gutenberg. Returns title, author with birth/death years, cover image, plain-text and EPUB download URLs, Kindle and HTML formats, subjects, bookshelves, language, copyright status, summaries and download counts. Filter by author or language.",
        "version": "1.0",
        "x-build-id": "4lKlXjkkKFtr0y30n"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~project-gutenberg-books-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-project-gutenberg-books-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~project-gutenberg-books-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-project-gutenberg-books-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~project-gutenberg-books-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-project-gutenberg-books-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "query": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Search terms (matches title, author name, etc.). Empty = all books, ranked by popularity."
                    },
                    "language": {
                        "title": "Language (ISO 639-1, comma-separated)",
                        "type": "string",
                        "description": "Filter by language code(s) — e.g. 'en' for English, 'es' for Spanish, 'fr' for French. Multiple: 'en,fr'."
                    },
                    "topic": {
                        "title": "Topic",
                        "type": "string",
                        "description": "Filter by Library of Congress subject heading (substring match)."
                    },
                    "authorYearStart": {
                        "title": "Author birth year (from)",
                        "minimum": -2000,
                        "maximum": 2024,
                        "type": "integer",
                        "description": "Filter by author birth year >= this."
                    },
                    "authorYearEnd": {
                        "title": "Author birth year (to)",
                        "minimum": -2000,
                        "maximum": 2024,
                        "type": "integer",
                        "description": "Filter by author birth year <= this."
                    },
                    "copyrightStatus": {
                        "title": "Copyright",
                        "enum": [
                            "",
                            "true",
                            "false"
                        ],
                        "type": "string",
                        "description": "Filter by copyright status.",
                        "default": ""
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
