# Goodreads Review Scraper (`scraper-engine/goodreads-review-scraper`) Actor

📚 Goodreads Review Scraper pulls reviews from book & author pages — ratings, review text, dates, shelves, likes & reviewer info. ⚡ Export CSV/JSON/API for sentiment, market research & book marketing. 🚀 Perfect for publishers, authors & data teams.

- **URL**: https://apify.com/scraper-engine/goodreads-review-scraper.md
- **Developed by:** [Scraper Engine](https://apify.com/scraper-engine) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### Goodreads Review Scraper

Goodreads Review Scraper is a production-ready tool that collects public book reviews from Goodreads and saves them to your Apify dataset in real time. It solves the tedious problem of manually copy-pasting ratings and review text by automating discovery of Goodreads’ GraphQL endpoint and paging through results. Built for marketers, developers, data analysts, and researchers, this Goodreads reviews scraper lets you scrape Goodreads reviews at scale and turn them into a clean Goodreads review dataset you can analyze or export via CSV/JSON/API.

### What data / output can you get?

Below are the structured fields this Goodreads review extractor saves for each review. Values are flattened from Goodreads’ GraphQL “getReviews” response and streamed to the Dataset as individual rows.

| Data field | Description | Example value |
| --- | --- | --- |
| bookUrl | The Goodreads book URL this review belongs to | https://www.goodreads.com/book/show/26032825 |
| id | Review identifier | "1234567890" |
| rating | Star rating given by the reviewer | 4 |
| text | Full review text | "A timeless story with beautiful prose and complex characters..." |
| createdAt | Review creation timestamp (ms) | 1704067200000 |
| updatedAt | Last update timestamp (ms) | 1704153600000 |
| lastRevisionAt | Last revision timestamp (ms) | 1704157200000 |
| spoilerStatus | Spoiler status flag | null |
| likeCount | Number of likes | 12 |
| commentCount | Number of comments | 3 |
| viewerHasLiked | Whether the current viewer liked it | false |
| shelving | Reviewer’s shelf and tags metadata | {"shelf": {"name": "read", "webUrl": "https://www.goodreads.com/review/list/…", "__typename": "Shelf"}, "taggings": [{"tag": {"name": "classic", "webUrl": "https://www.goodreads.com/tag/classic", "__typename": "Tag"}, "__typename": "Tagging"}], "webUrl": "https://www.goodreads.com/review/show/…", "__typename": "Shelving"} |
| creator | Reviewer profile metadata | {"id": "987654321", "name": "Jane Doe", "webUrl": "https://www.goodreads.com/user/show/…", "followersCount": 250, "imageUrlSquare": "https://i.gr-assets.com/…jpg", "isAuthor": false, "textReviewsCount": 134, "viewerRelationshipStatus": {"isBlockedByViewer": false, "__typename": "ViewerRelationshipStatus"}, "contributor": {"id": "…", "works": {"totalCount": 0, "__typename": "WorksConnection"}, "__typename": "Contributor"}, "__typename": "User"} |
| __typename | GraphQL typename for the review node | "Review" |

Notes:
- Timestamps are integers in milliseconds.
- Some fields can be null depending on the review (e.g., spoilerStatus, shelving, certain creator subfields).
- You can download Goodreads reviews via the Apify Dataset in CSV or JSON, or access them through the Apify API for pipelines and automation.

### Key features

- ⚡ Robust connection handling & retries — Starts direct and automatically escalates to Apify datacenter, then RESIDENTIAL proxy (locked for the run) on failures, with up to 3× retries per step and backoff. Ideal for a reliable Goodreads review crawler at scale.
- 🧾 Batch input (URLs or IDs) — Paste full Goodreads book links or just the numeric ID (e.g., 26032825). The actor normalizes to book pages and processes multiple items in one run.
- 🎛️ Sorting, language, edition filters — Control results with sortBy (popular/newest/oldest), optional languageCode, and reviewEdition (ALL vs only_this_book), so you can extract Goodreads review text tailored to your needs.
- 📦 Streaming dataset output — Results are pushed to the Dataset as they’re found, creating a ready-to-use Goodreads review data export for analytics or dashboards.
- 🔑 GraphQL-powered extraction — Discovers the Goodreads GraphQL endpoint and apiKey from bundled JS and fetches reviews via getReviews with pagination for accuracy and consistency.
- 🐍 Developer-friendly (Python) — Built in Python and deployable on Apify for easy integration. Use the Apify API to consume your Goodreads review dataset programmatically.
- 🔁 API alternative to extensions — A dependable Goodreads reviews API alternative without fragile browser automation or a Goodreads review scraper Chrome extension.

### How to use Goodreads Review Scraper - step by step

1. Sign in to Apify and open the “Goodreads Review Scraper” actor.
2. Add input data under “📚 Book URLs”:
   - Paste one or more Goodreads book URLs, or just the numeric IDs from those URLs (e.g., 26032825).
3. Set “🔢 Max reviews per book” to control how many reviews to collect for each URL.
4. Expand “⚙️ Filters & sorting” (optional) to fine-tune:
   - sortBy: popular (default), newest, or oldest
   - languageCode: pick one language or use “all”
   - reviewEdition: ALL (work-wide) or only_this_book (edition-specific)
5. (Optional) Configure “🔒 Proxy” if you want to force Apify Proxy usage. The run will automatically try smarter routing if connectivity issues appear.
6. Click Start. The actor loads each book’s reviews page, discovers the GraphQL endpoint, and streams reviews into your Dataset as it paginates.
7. Watch “📋 Live results” in the Dataset. Rows appear in real time with rating, text, timestamps, likes/comments, shelving, and reviewer info.
8. Export your Goodreads review data to CSV or JSON from the Dataset, or fetch it via the Apify API for further processing.

Pro tip: Pipe the Dataset to your analytics stack via the Apify API to build automated sentiment analysis, trend tracking, or book marketing dashboards.

### Use cases

| Use case | Description |
| --- | --- |
| Publisher market research | Analyze ratings, review volume, and reader sentiment across titles to guide positioning, blurbs, or A/B testing of covers. |
| Author & book marketing | Track newest vs most popular reviews to inform messaging, outreach, and launch timing. Export data for campaigns. |
| Data analysis & sentiment | Build a Goodreads review dataset to run NLP, sentiment scoring, and topic modeling across thousands of reviews. |
| Competitive benchmarking | Compare likeCount, commentCount, and ratings across comparable works to identify market gaps and strengths. |
| Academic research | Collect structured, language-filtered review text for studies on readership, linguistics, or cultural trends. |
| Developer pipelines (API) | Use the Apify API to scrape Goodreads reviews and feed JSON directly into ETL, data lakes, or ML workflows. |

### Why choose Goodreads Review Scraper?

The tool is engineered for precision, automation, and reliability as a Goodreads review scraping tool.

- ✅ Accurate, structured output — Mirrors Goodreads’ GraphQL getReviews shape with flattened, clean fields.
- 🌍 Language-aware filtering — Optional languageCode filter to focus your analysis on the languages that matter.
- 📈 Scalable batch runs — Paste multiple URLs or IDs and download Goodreads reviews at volume without manual effort.
- 🧰 Developer access — Build integrations around the Apify API and consume the Goodreads review extractor output in your pipelines.
- 🛡️ Resilient by design — Automatic connection escalation (direct → datacenter → RESIDENTIAL) with retries reduces job failures.
- 💸 Cost-effective automation — Skip brittle browser add-ons and unstable scripts; run a consistent, repeatable Goodreads review crawler.

In short: a stable Goodreads reviews API alternative that turns public reviews into analysis-ready data.

### Is it legal / ethical to use Goodreads Review Scraper?

Yes—when used responsibly. This actor collects only publicly visible reviews and does not use authentication. You are responsible for:

- Scraping only public content and respecting Goodreads’ terms.
- Complying with data protection laws such as GDPR/CCPA where applicable.
- Using the data ethically (e.g., analytics, research) and avoiding misuse.
- Consulting your legal team for edge cases or jurisdiction-specific requirements.

### Input parameters & output format

Example JSON input
```json
{
  "urls": [
    "26032825",
    "https://www.goodreads.com/book/show/4671.The_Great_Gatsby"
  ],
  "maxItems": 50,
  "filtersAndOptions": {
    "sortBy": "newest",
    "languageCode": "en",
    "reviewEdition": "only_this_book"
  },
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
````

Parameter reference

- urls (array, required): Paste one or more Goodreads book links. Tip: you can paste just the number from the URL (e.g., 26032825) — the actor will fix the link for you. Default: none.
- maxItems (integer, optional): How many reviews to collect for each book. Minimum 1, maximum 10000. Default: 20.
- filtersAndOptions (object, optional): Optional filters and sorting.
  - sortBy (string, optional): popular | newest | oldest. Default: popular.
  - languageCode (string, optional): Choose a language or “all” for no filter. Default: all.
  - reviewEdition (string, optional): ALL (work-wide) or only\_this\_book (edition-specific). Default: ALL.
- proxyConfiguration (object, optional): Optional Apify Proxy configuration. If something blocks a run, the actor will try smarter routing automatically.

Example JSON output

```json
{
  "bookUrl": "https://www.goodreads.com/book/show/26032825",
  "__typename": "Review",
  "id": "1234567890",
  "creator": {
    "id": "987654321",
    "imageUrlSquare": "https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/users/…/12345.jpg",
    "isAuthor": false,
    "viewerRelationshipStatus": {
      "isBlockedByViewer": false,
      "__typename": "ViewerRelationshipStatus"
    },
    "followersCount": 250,
    "__typename": "User",
    "textReviewsCount": 134,
    "name": "Jane Doe",
    "webUrl": "https://www.goodreads.com/user/show/987654321-jane-doe",
    "contributor": {
      "id": "contrib_001",
      "works": {
        "totalCount": 0,
        "__typename": "WorksConnection"
      },
      "__typename": "Contributor"
    }
  },
  "recommendFor": null,
  "updatedAt": 1704153600000,
  "createdAt": 1704067200000,
  "spoilerStatus": null,
  "lastRevisionAt": 1704157200000,
  "text": "A timeless story with beautiful prose and complex characters...",
  "rating": 4,
  "shelving": {
    "shelf": {
      "name": "read",
      "webUrl": "https://www.goodreads.com/review/list/…",
      "__typename": "Shelf"
    },
    "taggings": [
      {
        "tag": {
          "name": "classic",
          "webUrl": "https://www.goodreads.com/tag/classic",
          "__typename": "Tag"
        },
        "__typename": "Tagging"
      }
    ],
    "webUrl": "https://www.goodreads.com/review/show/…",
    "__typename": "Shelving"
  },
  "likeCount": 12,
  "viewerHasLiked": false,
  "commentCount": 3
}
```

Notes:

- Fields like text, shelving, or certain creator subfields can be null depending on the review.
- Timestamps are numeric (milliseconds).

### FAQ

#### Do I need to log in or provide cookies to scrape Goodreads reviews?

No. The actor works with public Goodreads pages and does not require login or cookies. It discovers the GraphQL endpoint from the book’s reviews page and fetches public data.

#### How many reviews can I scrape per book?

You control this via maxItems. The input constraint allows up to 10,000 reviews per book. The actor paginates through results until the limit is reached or the list ends.

#### Can I sort and filter reviews?

Yes. You can sort by popular, newest, or oldest and optionally filter by languageCode. You can also choose whether to collect reviews for ALL editions (work-wide) or only\_this\_book (edition-specific).

#### Can I input just a Goodreads ID instead of a full URL?

Yes. Paste the numeric ID from a Goodreads book URL (e.g., 26032825). The actor will normalize it to a proper Goodreads book page automatically.

#### What formats can I export?

You can export your Goodreads review data from the Apify Dataset to CSV or JSON, or access it programmatically via the Apify API.

#### Is this an alternative to a Goodreads reviews API?

Yes. It’s a Goodreads reviews API alternative that discovers Goodreads’ GraphQL endpoint on the fly and fetches public review data without browser extensions.

#### How does the actor handle blocks or rate limits?

It starts with a direct connection and automatically escalates to Apify datacenter proxy, then RESIDENTIAL proxy (locked for the remainder of the run) if needed. Each request phase has up to 3 retries with backoff.

#### What review fields are included?

Each row includes bookUrl, id, text, rating, createdAt/updatedAt/lastRevisionAt, spoilerStatus, likeCount, commentCount, viewerHasLiked, shelving, creator, and \_\_typename—flattened for easy analysis.

### Final thoughts

Goodreads Review Scraper is built to reliably extract public Goodreads ratings and reviews at scale. With batch inputs, sorting/language filters, and resilient proxy handling, it helps publishers, authors, researchers, and data teams turn unstructured reviews into actionable datasets. Developers can consume results via the Apify API and integrate them into Python-based or ETL workflows. Start collecting a clean Goodreads review dataset and power your analytics, sentiment, and marketing insights today.

# Actor input Schema

## `urls` (type: `array`):

Paste one or more Goodreads book links. **Tip:** you can paste just the number from the URL (e.g. `26032825`) — we’ll fix the link for you. 🌟

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

How many reviews to collect **for each** book in your list. (Example: 50 here × 3 books = up to 150 rows.) 📊

## `filtersAndOptions` (type: `object`):

🎛️ **Optional:** open this section to change sort order, language, and which edition reviews come from. Leave defaults for a quick start! 👇

## `proxyConfiguration` (type: `object`):

🌐 **Optional.** Turn on Apify Proxy if you need extra reliability. If something blocks a run, we’ll try smarter routing automatically — you stay focused on the results. ✨

## Actor input object example

```json
{
  "urls": [
    "https://www.goodreads.com/book/show/26032825"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "urls": [
        "https://www.goodreads.com/book/show/26032825"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraper-engine/goodreads-review-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 = {
    "urls": ["https://www.goodreads.com/book/show/26032825"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("scraper-engine/goodreads-review-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 '{
  "urls": [
    "https://www.goodreads.com/book/show/26032825"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call scraper-engine/goodreads-review-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Goodreads Review Scraper",
        "description": "📚 Goodreads Review Scraper pulls reviews from book & author pages — ratings, review text, dates, shelves, likes & reviewer info. ⚡ Export CSV/JSON/API for sentiment, market research & book marketing. 🚀 Perfect for publishers, authors & data teams.",
        "version": "1.0",
        "x-build-id": "3zcExf70QKgKWcmei"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scraper-engine~goodreads-review-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scraper-engine-goodreads-review-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/scraper-engine~goodreads-review-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scraper-engine-goodreads-review-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/scraper-engine~goodreads-review-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scraper-engine-goodreads-review-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",
                "required": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "📚 Book URLs",
                        "type": "array",
                        "description": "Paste one or more Goodreads book links. **Tip:** you can paste just the number from the URL (e.g. `26032825`) — we’ll fix the link for you. 🌟",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "🔢 Max reviews per book",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "How many reviews to collect **for each** book in your list. (Example: 50 here × 3 books = up to 150 rows.) 📊",
                        "default": 20
                    },
                    "filtersAndOptions": {
                        "title": "⚙️ Filters & sorting",
                        "type": "object",
                        "description": "🎛️ **Optional:** open this section to change sort order, language, and which edition reviews come from. Leave defaults for a quick start! 👇",
                        "properties": {
                            "sortBy": {
                                "title": "📊 Sort reviews by",
                                "type": "string",
                                "description": "⭐ **Popular** — most helpful first · 🆕 **Newest** — newest first · 📜 **Oldest** — oldest first",
                                "editor": "select",
                                "enum": [
                                    "popular",
                                    "newest",
                                    "oldest"
                                ],
                                "default": "popular"
                            },
                            "languageCode": {
                                "title": "🌍 Review language",
                                "type": "string",
                                "description": "🌐 **All languages** — no filter · Or choose one language — reviews are filtered to match. 🗣️",
                                "editor": "select",
                                "enum": [
                                    "all",
                                    "en",
                                    "bn",
                                    "fr",
                                    "de",
                                    "es",
                                    "it",
                                    "pt",
                                    "ru",
                                    "ja",
                                    "ko",
                                    "zh",
                                    "ar",
                                    "hi",
                                    "nl",
                                    "pl",
                                    "tr",
                                    "vi",
                                    "id",
                                    "th"
                                ],
                                "enumTitles": [
                                    "All languages",
                                    "English",
                                    "Bengali",
                                    "French",
                                    "German",
                                    "Spanish",
                                    "Italian",
                                    "Portuguese",
                                    "Russian",
                                    "Japanese",
                                    "Korean",
                                    "Chinese",
                                    "Arabic",
                                    "Hindi",
                                    "Dutch",
                                    "Polish",
                                    "Turkish",
                                    "Vietnamese",
                                    "Indonesian",
                                    "Thai"
                                ],
                                "default": "all"
                            },
                            "reviewEdition": {
                                "title": "📖 Edition scope",
                                "type": "string",
                                "description": "📚 **All editions** — reviews for the whole work · 📕 **This book only** — reviews for this edition. 🎯",
                                "editor": "select",
                                "enum": [
                                    "ALL",
                                    "only_this_book"
                                ],
                                "default": "ALL"
                            }
                        }
                    },
                    "proxyConfiguration": {
                        "title": "🔒 Proxy (optional)",
                        "type": "object",
                        "description": "🌐 **Optional.** Turn on Apify Proxy if you need extra reliability. If something blocks a run, we’ll try smarter routing automatically — you stay focused on the results. ✨"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
