# BoardGameGeek (BGG) Board Game Reviews Scraper (`maximedupre/boardgamegeek`) Actor

Find hot, top-ranked, or matching BoardGameGeek games and collect full game details. Export public written reviews, ratings, reviewer details, and collection context.

- **URL**: https://apify.com/maximedupre/boardgamegeek.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Games, Marketing, For creators
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 board games

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/platform/actors/running/actors-in-store#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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

### 🎲 Find BoardGameGeek games and reviews

Built for game shops, designers, researchers, and board game fans. Find hot or top-ranked games, search by keyword, look up exact games, and save game details or public reviews as structured data.

- Build a list of the **[best board games](https://apify.com/maximedupre/boardgamegeek/examples/best-board-games)** with titles, player counts, mechanics, and ratings.
- Export the **[best board games of all time](https://apify.com/maximedupre/boardgamegeek/examples/best-board-games-of-all-time)** for research or a guide.
- Save the **[BGG top 100](https://apify.com/maximedupre/boardgamegeek/examples/bgg-top-100)** as structured data.
- Track the **[BoardGameGeek ranking](https://apify.com/maximedupre/boardgamegeek/examples/boardgamegeek-ranking)** for top games.
- Compare the **[top 10 board games of all time](https://apify.com/maximedupre/boardgamegeek/examples/top-10-board-games-of-all-time)** by rating, complexity, and play time.

#### 📦 What data is returned?

Game rows can include titles, canonical pages, descriptions, images, player counts, play times, ages, categories, mechanics, credits, linked games, ratings, ranks, and popularity counts. Review rows can include public text, ratings, dates, reviewer profiles, collection details, game versions, and optional game details. A field is left out when BoardGameGeek does not provide it.

#### 🚀 How to run the Actor

1. Choose `hot`, `top`, `search`, `details`, or `reviews` as the target.
2. Add the fields used by that target.
3. Click **Start**.
4. Open the default dataset to view or export the rows.

#### 📥 Input

| Field | Type | What it does |
|---|---|---|
| `target` | string | Chooses hot games, top-ranked games, search, game details, or reviews. |
| `keywords` | string[] | Searches each word or phrase on its own. Used for `search`. |
| `reviewsPerGame` | integer | Stops after this many public written reviews for each game. Leave it empty to return all available public written reviews for each game until the source is exhausted. |
| `reviewOrder` | string | Returns the most recent or highest-rated reviews first. |
| `minimumRating` | number | Keeps reviews at or above this rating. Leave it empty to include every rating. |
| `includeGameMetadata` | boolean | Adds full game details to review rows with one extra lookup per game. |
| `games` | string[] | Accepts game names, numeric IDs, or BoardGameGeek game page URLs for `details` and `reviews`. |
| `nameMatch` | string | Uses the best title match or all title matches for names. IDs and URLs are exact. |
| `maxItems` | integer | Limits games for `hot`, `top`, and `search`. Leave it empty to return all available games until the source is exhausted. |

Default-input example from a successful run:

```json
{
  "target": "hot",
  "maxItems": 5,
  "reviewOrder": "recent",
  "includeGameMetadata": false,
  "nameMatch": "best"
}
````

Fields for other targets are ignored. If the same source game is found more than once, the Actor saves its first eligible match and ignores later matches.

#### 📤 Output

Each board game is one row.

| Field | Type | What it does |
|---|---|---|
| `recordType` | string | Is `game` for a board game row. |
| `gameId` | string | Stable BoardGameGeek game ID. |
| `gameTitle` | string | Main game title. |
| `gameUrl` | string | Canonical BoardGameGeek game page. |
| `yearPublished` | integer | First publication year. |
| `description` | string | BoardGameGeek game description. |
| `thumbnailUrl` | string | Small source image URL. |
| `imageUrl` | string | Main source image URL. |
| `minPlayers`, `maxPlayers` | integer | Stated player range. |
| `minPlayTimeMinutes`, `maxPlayTimeMinutes` | integer | Stated play-time range in minutes. |
| `minimumAge` | integer | Stated minimum age. |
| `alternateNames` | string\[] | Other names for the game. |
| `categories`, `mechanics`, `families` | string\[] | BoardGameGeek groups and features. |
| `designers`, `artists`, `publishers` | string\[] | Credited people and companies. |
| `expansions`, `expandsGames`, `reimplements`, `reimplementedBy` | object\[] | Linked games, each with `gameId`, `title`, and `url`. |
| `averageRating`, `bayesAverageRating` | number | Community and Bayesian ratings out of 10. |
| `complexityWeight` | number | Community complexity weight out of 5. |
| `overallRank` | integer | Overall BoardGameGeek rank. |
| `categoryRanks` | object\[] | Named group ranks with `name` and `rank`. |
| `ratingCount`, `ownerCount`, `commentCount` | integer | Community rating, owner, and comment counts. |
| `wisherCount`, `wanterCount` | integer | Wishlist and wanted counts. |

```json
{
  "recordType": "game",
  "gameId": "224517",
  "gameTitle": "Brass: Birmingham",
  "gameUrl": "https://boardgamegeek.com/boardgame/224517/brass-birmingham",
  "yearPublished": 2018,
  "description": "<p><em><strong>Brass: Birmingham</strong></em> is an economic strategy game sequel to Martin Wallace's 2007 masterpiece, <em>Brass</em>. <em>Brass: Birmingham</em> tells the story of competing entrepreneurs in Birmingham during the industrial revolution between the years of 1770 and 1870.</p>\n\n<p>It offers a very different story arc and experience from its predecessor. As in its predecessor, you must develop, build and establish your industries and network in an effort to exploit low or high market demands. The game is played over two halves: the canal era (years 1770-1830) and the rail era (years 1830-1870). To win the game, score the most VPs. VPs are counted at the end of each half for the canals, rails and established (flipped) industry tiles.</p>\n\n<p>Each round, players take turns according to the turn order track, receiving two actions to perform any of the following actions (found in the original game):</p>\n\n<p>1) <strong>Build</strong> - Pay required resources and place an industry tile.<br />\n2) <strong>Network</strong> - Add a rail / canal link, expanding your network.<br />\n3) <strong>Develop</strong> - Increase the VP value of an industry.<br />\n4) <strong>Sell</strong> - Sell your cotton, manufactured goods and pottery.<br />\n5) <strong>Loan</strong> - Take a &pound;30 loan and reduce your income.</p>\n\n<p><em>Brass: Birmingham</em> also features a new sixth action:</p>\n\n<p>6) <strong>Scout</strong> - Discard three cards and take a wild location and wild industry card. (This action replaces Double Action Build in original <em>Brass</em>.)</p>\n\n",
  "thumbnailUrl": "https://cf.geekdo-images.com/x3zxjr-Vw5iU4yDPg70Jgw__itemrep/img/giNUMut4HAl-zWyQkGG0YchmuLI=/fit-in/246x300/filters:strip_icc()/pic3490053.jpg",
  "imageUrl": "https://cf.geekdo-images.com/e2e0wdO8oVNzD0ZAhzi6MQ__itemheader/img/Zj1GBUN2m-z4zX2-QWn31fiKEE4=/800x450/filters:quality(30):strip_icc()/pic3509697.jpg",
  "minPlayers": 2,
  "maxPlayers": 4,
  "minPlayTimeMinutes": 60,
  "maxPlayTimeMinutes": 120,
  "minimumAge": 14,
  "alternateNames": [
    "Brass. Бирмингем",
    "Brass. Бірмінгем",
    "ブラス：バーミンガム",
    "工业革命：伯明翰(Chinese edition) (2018)",
    "工業革命：伯明翰",
    "브라스: 버밍엄"
  ],
  "categories": [
    "Age of Reason",
    "Economic",
    "Industry / Manufacturing",
    "Post-Napoleonic",
    "Trains",
    "Transportation"
  ],
  "mechanics": [
    "Chaining",
    "End Game Bonuses",
    "Hand Management",
    "Income",
    "Loans",
    "Market",
    "Multi-Use Cards",
    "Network and Route Building",
    "Ownership",
    "Tags",
    "Tech Trees / Tech Tracks",
    "Tile Placement",
    "Turn Order: Stat-Based",
    "Variable Set-up"
  ],
  "families": [
    "Cities: Birmingham (England)",
    "Components: Map (Regional scale)",
    "Components: Multi-Use Cards",
    "Country: England",
    "Country: United Kingdom",
    "Crowdfunding: Kickstarter",
    "Crowdfunding: Spieleschmiede",
    "Digital Implementations: Steam",
    "Digital Implementations: Tabletopia",
    "Digital Implementations: VASSAL",
    "Food & Drink: Beer",
    "Game: Brass",
    "History: Industrial Revolution",
    "Misc: LongPack Games",
    "Misc: Watch It Played How To Videos",
    "Occupation: Engineer",
    "Organizations: The Game Artisans of Canada",
    "Theme: Canals"
  ],
  "designers": [
    "Gavan Brown",
    "Matt Tolman",
    "Martin Wallace"
  ],
  "artists": [
    "Gavan Brown",
    "Lina Cossette",
    "David Forest",
    "Gui Landgraf",
    "Damien Mammoliti",
    "Mr. Cuddington",
    "Matt Tolman"
  ],
  "publishers": [
    "Roxley",
    "Arclight Games",
    "Board Game Rookie",
    "BoardM Factory",
    "CMON Global Limited",
    "Conclave Editora",
    "CoolPlay",
    "CrowD Games",
    "Dexker Games",
    "Funforge",
    "Gémklub",
    "Ghenos Games",
    "Giant Roc",
    "Lanlalen",
    "Lord of Boards",
    "Maldito Games",
    "PHALANX",
    "Rebel Sp. z o.o.",
    "TLAMA games",
    "White Goblin Games"
  ]
}
```

Each public review is one row.

| Field | Type | What it does |
|---|---|---|
| `recordType` | string | Is `review` for a review row. |
| `reviewId` | string | Stable BoardGameGeek review ID. |
| `reviewUrl` | string | Direct review link when available. |
| `gameId`, `gameTitle`, `gameUrl` | string | Identifies the reviewed game and its canonical page. |
| `text` | string | Public written review text. |
| `rating` | number | Reviewer's rating out of 10. |
| `date` | string | Review date when available. |
| `reviewer.username` | string | Public BoardGameGeek username. |
| `reviewer.profileUrl`, `reviewer.name`, `reviewer.location` | string | Public reviewer profile, name, and location when available. |
| `collection.owned` | boolean | Whether the reviewer marks the game as owned. |
| `collection.wishlistPriority` | integer | Public wishlist priority. |
| `gameVersion.versionId`, `gameVersion.name` | string | Linked game version details. |
| `gameMetadata.yearPublished` | integer | First publication year. |
| `gameMetadata.description`, `gameMetadata.imageUrl` | string | Added game description and image. |
| `gameMetadata.minPlayers`, `gameMetadata.maxPlayers` | integer | Added player range. |
| `gameMetadata.categories`, `gameMetadata.mechanics` | string\[] | Added categories and mechanics. |

```json
{
  "recordType": "review",
  "reviewId": "27457778",
  "gameId": "174430",
  "gameTitle": "Gloomhaven",
  "gameUrl": "https://boardgamegeek.com/boardgame/174430/gloomhaven",
  "text": "Kickstarter",
  "reviewer": {
    "username": "Garroc",
    "profileUrl": "https://boardgamegeek.com/user/Garroc",
    "location": "New Lenox, Illinois, United States"
  },
  "rating": 10,
  "date": "2017-04-24",
  "collection": {
    "owned": true,
    "wishlistPriority": 4
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged for each board game or public game review that is successfully saved. Failed lookups and runs with no saved rows are not described as charged events. See the live pricing panel for current prices.

#### 🔌 Integrations

Send dataset rows to Google Sheets, Slack, Zapier, Make, webhooks, or your own code through Apify integrations and API tools.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I get the BGG top 100?

Yes. Choose `top` and set `maxItems` to `100`. Leave it empty to return all available games until the source is exhausted.

##### Can I look up games without a BoardGameGeek ID?

Yes. Use names in `games`, or use `keywords` with the `search` target. IDs and full game URLs give an exact reference.

##### Can I collect reviews and game details together?

Yes. Choose `reviews` and turn on `includeGameMetadata`. This adds one game lookup for each reviewed game.

##### Does this need a BoardGameGeek login?

No. It reads publicly accessible game and review data. It does not access private account data or change collections.

##### Does it download game images?

No. It returns source image URLs when available.

### 📝 Changelog

#### 0.0: Initial release

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~boardgamegeek/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Goodreads Scraper](https://apify.com/maximedupre/goodreads-scraper) — collect book catalog details, lists, ratings, and public reviews for a nearby hobby dataset.
- [BoardGameGeek (BGG) Board Game Scraper](https://apify.com/jungle_synthesizer/boardgamegeek-bgg-game-rankings-reviews-scraper) — use a focused option for BoardGameGeek game metadata.
- [BoardGameGeek (BGG) Board Game Reviews Scraper](https://apify.com/thescrapelab/boardgamegeek-reviews-scraper) — collect BoardGameGeek review rows with another review-focused tool.
- [BoardGameGeek Scraper - Board Game Data & Ratings](https://apify.com/lulzasaur/boardgamegeek-scraper) — gather game details and ratings through an alternative Actor.
- [Trending Board Games Scraper](https://apify.com/louisdeconinck/trending-board-games) — follow changing board game trends with a focused tool.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose the BoardGameGeek data to collect.

## `keywords` (type: `array`):

Find BoardGameGeek games that match any of these words or phrases. Used only for Game search.

## `reviewsPerGame` (type: `integer`):

Stop after this many public written reviews for each game. Leave it empty to return all available public written reviews for each game until the source is exhausted.

## `reviewOrder` (type: `string`):

Choose which reviews are returned first.

## `minimumRating` (type: `number`):

Return only reviews with this rating or higher. Leave it empty to include every rating.

## `includeGameMetadata` (type: `boolean`):

Also collect full game details for each reviewed game. This needs an extra lookup for each game.

## `games` (type: `array`):

Enter BoardGameGeek game names, numeric IDs, or game page URLs. Used only for Game details and Game reviews.

## `nameMatch` (type: `string`):

For game names, use the best matching title or every matching BoardGameGeek title. IDs and URLs are exact.

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

Stop after this many games. Used only for Hot games, Top-ranked games, and Game search. Leave it empty to return all available games until the source is exhausted.

## Actor input object example

```json
{
  "target": "hot",
  "reviewOrder": "recent",
  "includeGameMetadata": false,
  "nameMatch": "best",
  "maxItems": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Open the board games and reviews in the default dataset.

# 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 = {
    "target": "hot",
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/boardgamegeek").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 = {
    "target": "hot",
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/boardgamegeek").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 '{
  "target": "hot",
  "maxItems": 5
}' |
apify call maximedupre/boardgamegeek --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "BoardGameGeek (BGG) Board Game Reviews Scraper",
        "description": "Find hot, top-ranked, or matching BoardGameGeek games and collect full game details. Export public written reviews, ratings, reviewer details, and collection context.",
        "version": "0.0",
        "x-build-id": "fbFApM8vZDtVtCwJK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~boardgamegeek/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-boardgamegeek",
                "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/maximedupre~boardgamegeek/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-boardgamegeek",
                "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/maximedupre~boardgamegeek/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-boardgamegeek",
                "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": [
                    "target"
                ],
                "properties": {
                    "target": {
                        "title": "Target",
                        "enum": [
                            "hot",
                            "top",
                            "search",
                            "details",
                            "reviews"
                        ],
                        "type": "string",
                        "description": "Choose the BoardGameGeek data to collect."
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Find BoardGameGeek games that match any of these words or phrases. Used only for Game search.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "reviewsPerGame": {
                        "title": "Reviews per game",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Stop after this many public written reviews for each game. Leave it empty to return all available public written reviews for each game until the source is exhausted."
                    },
                    "reviewOrder": {
                        "title": "Review order",
                        "enum": [
                            "recent",
                            "highestRated"
                        ],
                        "type": "string",
                        "description": "Choose which reviews are returned first.",
                        "default": "recent"
                    },
                    "minimumRating": {
                        "title": "Minimum rating",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "number",
                        "description": "Return only reviews with this rating or higher. Leave it empty to include every rating."
                    },
                    "includeGameMetadata": {
                        "title": "Add game details",
                        "type": "boolean",
                        "description": "Also collect full game details for each reviewed game. This needs an extra lookup for each game.",
                        "default": false
                    },
                    "games": {
                        "title": "Games",
                        "type": "array",
                        "description": "Enter BoardGameGeek game names, numeric IDs, or game page URLs. Used only for Game details and Game reviews.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "nameMatch": {
                        "title": "Name match",
                        "enum": [
                            "best",
                            "all"
                        ],
                        "type": "string",
                        "description": "For game names, use the best matching title or every matching BoardGameGeek title. IDs and URLs are exact.",
                        "default": "best"
                    },
                    "maxItems": {
                        "title": "Maximum games",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Stop after this many games. Used only for Hot games, Top-ranked games, and Game search. Leave it empty to return all available games until the source is exhausted."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
