# YouTube Comments Scraper — Replies & Authors (`chronometrica/youtube-comments-scraper`) Actor

Collect clean YouTube comment and reply rows from public videos and Shorts. Get linked parent/reply IDs, text, authors, likes, pins, creator hearts, and CSV/JSON exports. No YouTube API key, account, cookies, or compute fees. Pay only for saved comments and replies.

- **URL**: https://apify.com/chronometrica/youtube-comments-scraper.md
- **Developed by:** [Chronometrica](https://apify.com/chronometrica) (community)
- **Categories:** Social media, Agents, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 youtube comment or replies

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

## 💬 YouTube Comments Scraper — Replies & Authors

### 💬 What does YouTube Comments Scraper do?

YouTube Comments Scraper collects public comments and replies from known
YouTube videos and Shorts. Add video URLs or IDs and get clean, linked rows
with comment text, stable IDs, author details, likes, pins, creator hearts, and
reply relationships.

Skip manual copy-and-paste. Add the video URLs you already have, choose a clear
comment limit, and export organized rows for analysis. Results are saved as
they are collected, so useful rows remain available if a later video cannot be
completed.

Use it for audience research, customer feedback, brand monitoring, creator
research, social listening, comment analysis, spreadsheets, and automated data
pipelines.

With YouTube Comments Scraper, you can:

- 💬 Collect public top-level comments from videos and Shorts.
- 🧵 Save public replies as separate rows linked to their parent comments.
- 🆔 Export stable video, comment, parent-comment, and author IDs.
- ❤️ Capture public likes, pins, creator hearts, and creator replies.
- 🔀 Choose Top comments, Newest comments, or a wider sample of both.
- 📦 Download results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.
- ⚙️ Run through the Apify API, SDKs, webhooks, schedules, and integrations.

Each paid result is one public comment or reply saved to the default dataset.
Inputs that are invalid, unavailable, comments-disabled, or return no public
comments do not create paid result rows.

This Actor uses logged-out public YouTube data. It does not need a YouTube API
key, account, cookies, or copied browser session from you. It does not access
private videos, private comments, YouTube Studio, live chat, or chat replay.

### ✨ What You Get

Each dataset row represents one public YouTube comment or reply.

| Data group         | Example fields                                                      |
| ------------------ | ------------------------------------------------------------------- |
| 🎬 Video identity  | `inputUrl`, `videoUrl`, `videoId`                                   |
| 💬 Comment content | `commentId`, `text`, `publishedTimeText`, `isEdited`                |
| 🧵 Thread links    | `parentCommentId`, `isReply`, `replyDepth`, `replyCount`            |
| 👤 Author details  | `authorChannelId`, `authorHandle`, `authorDisplayName`, `authorUrl` |
| ❤️ Public signals  | `likesCount`, `isPinned`, `isHeartedByCreator`, `isChannelOwner`    |
| 🧭 Row context     | `commentIndex`, `replyIndex`, `sortMode`, `status`, `scrapedAt`     |

Public values that YouTube does not expose stay `null`. They are not guessed
and they are not replaced with fake zeroes.

### ⚙️ Can I use this Actor through an API?

Yes. You can run YouTube Comments Scraper manually in Apify Console or use it
through:

- 🔌 Apify API
- 🐍 Python SDK
- 🟢 Node.js SDK
- 🪝 Webhooks
- ⏰ Scheduled runs
- 🧩 Apify integrations

This makes it easy to send comments into spreadsheets, databases, dashboards,
AI analysis tools, customer-feedback systems, and research pipelines.

### 🎯 Why collect YouTube comments?

YouTube comments contain direct public feedback from viewers. They can help
you understand what people like, dislike, ask for, repeat, or misunderstand.

| Use case                  | How comment data helps                                              |
| ------------------------- | ------------------------------------------------------------------- |
| 🔍 Audience research      | Find common questions, opinions, needs, and language.               |
| 📣 Brand monitoring       | Track public feedback around products, launches, and campaigns.     |
| 🧑‍🎨 Creator research       | Study audience response, creator replies, pins, and hearts.         |
| 💡 Content planning       | Find ideas, objections, follow-up topics, and recurring questions.  |
| 🤖 Sentiment and NLP      | Feed clean comment text into your own analysis workflow.            |
| 🧱 Data pipeline building | Load stable comment and reply rows into databases and applications. |

The Actor is focused on data collection. It gives you clean comment text and
thread links that you can send to your own sentiment, language, topic, or
question-analysis workflow.

### 💵 Pricing

YouTube Comments Scraper uses pay-per-result pricing. One result means one
public comment or reply saved to the default dataset. Platform usage is
included.

| Apify plan | Price per 1,000 saved rows |
| ---------- | -------------------------: |
| Free       |                      $0.50 |
| Starter    |                      $0.45 |
| Scale      |                      $0.40 |
| Business   |                      $0.35 |

Use `maxCommentsPerVideo`, `includeReplies`, and `maxRepliesPerComment` to
control result volume before a run. Replies are separate paid rows. Start with
10 to 25 top-level comments while testing a new video.

### 🚀 How do I use YouTube Comments Scraper?

1. Create or log in to your Apify account.
2. Open **YouTube Comments Scraper**.
3. Add one or more public YouTube video URLs, Shorts URLs, or video IDs.
4. Choose the maximum top-level comments to save from each video.
5. Choose Top, Newest, or Top + Newest comment order.
6. Turn on replies only when you need them.
7. Click **Start**.
8. Open the **Output** tab to inspect the dataset and run summary.
9. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

### ⬇️ Input

The main input is `startUrls`. Add between 1 and 100 known public YouTube
videos or Shorts.

```json
{
  "startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
  "maxCommentsPerVideo": 25,
  "commentSortMode": "top",
  "includeReplies": false
}
````

To collect replies too:

```json
{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://www.youtube.com/shorts/Q217U36FOUQ"
  ],
  "maxCommentsPerVideo": 100,
  "commentSortMode": "both",
  "includeReplies": true,
  "maxRepliesPerComment": 20
}
```

#### 🔗 Supported inputs

- 🎬 Regular watch URLs
- 📱 YouTube Shorts URLs
- 🔗 `youtu.be` share URLs
- 🖼️ Embed URLs
- 🔴 Live video URLs with public comments
- 🆔 Raw 11-character YouTube video IDs

Equivalent inputs for the same video are collected once in a run.

#### 🎛️ Settings

| Setting                | What it controls                                                                                                                            |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`            | One to 100 direct YouTube video or Shorts URLs, or 11-character video IDs.                                                                  |
| `maxCommentsPerVideo`  | Saves 1–1,000 unique top-level comments from each video. If blank, the Actor uses 100. Replies do not count toward this limit.              |
| `commentSortMode`      | `top` collects featured comments, `newest` collects recent comments, and `both` splits the cap across both lists and removes duplicate IDs. |
| `includeReplies`       | Saves public replies as separate rows. Off by default for a more predictable result count.                                                  |
| `maxRepliesPerComment` | Saves 1–100 replies under each saved top-level comment. If blank, the Actor uses 20. Used only when replies are on.                         |

Top + Newest gives a wider sample. It does not guarantee every public comment
on the video.

### ⬆️ Output sample

Results are stored in the default dataset. The field order is stable for JSON,
CSV, spreadsheet, API, and database workflows.

```json
{
  "inputIndex": 0,
  "inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "platform": "youtube",
  "videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "videoId": "dQw4w9WgXcQ",
  "commentId": "UgxExamplePublicCommentId",
  "parentCommentId": null,
  "isReply": false,
  "replyDepth": 0,
  "commentIndex": 0,
  "replyIndex": null,
  "sortMode": "top",
  "text": "This video never gets old.",
  "publishedTimeText": "2 days ago",
  "publishedAt": null,
  "updatedAt": null,
  "likesCount": 12,
  "likesCountText": "12",
  "likesCountPrecision": "exact",
  "replyCount": 3,
  "authorChannelId": "UCExamplePublicChannelId",
  "authorHandle": "@examplecreator",
  "authorDisplayName": "Example Creator",
  "authorUrl": "https://www.youtube.com/@examplecreator",
  "authorThumbnailUrl": "https://yt3.ggpht.com/example",
  "isEdited": false,
  "isPinned": false,
  "isHeartedByCreator": true,
  "isChannelOwner": false,
  "status": "ok",
  "scrapedAt": "2026-07-12T00:00:00.000Z"
}
```

#### 🧵 Comment and reply relationships

Top-level comments have `isReply: false` and `parentCommentId: null`.

Replies have `isReply: true` and a `parentCommentId` that points to their
saved top-level comment. Replies are only saved when their parent comment is
also in the dataset.

`commentIndex` and `replyIndex` show collection order. They are not permanent
YouTube ranks.

`commentId` is the stable ID for the saved comment or reply.
`parentCommentId` is the stable ID of the top-level comment above a reply. Use
both fields to rebuild the comment threads saved in your dataset.

#### 📊 Run summary

The `OUTPUT` record includes:

- 🎯 Inputs received and unique videos attempted;
- 🪞 Duplicate video inputs skipped;
- 🎬 Videos that produced rows;
- 💬 Top-level comments and replies saved;
- 🚦 Input status and stop-reason counts;
- 🧯 Safe details for inputs that did not produce rows;
- 🔄 Request, retry, and recovery totals.

Comments-disabled, unavailable, login-required, invalid, and
no-public-comment inputs do not create dataset rows. The run summary explains
their status.

### 🎯 Comment order, status, and precision

`sortMode` records whether a row came from the public Top or Newest comment
order. YouTube can change either order between runs.

Every saved row has `status: "ok"`. Input-level problems are reported in the
run summary because they do not create paid rows.

`likesCountPrecision` explains whether the public like count is exact,
display-rounded, or unavailable. Use `likesCountText` when you also want the
public display value.

### 🔒 Source boundary

YouTube Comments Scraper uses logged-out public YouTube data only.

It does not use:

- a YouTube API key supplied by you;
- user cookies or copied sessions;
- logged-in account automation;
- private videos or private comments;
- YouTube Studio analytics;
- challenge solving;
- live chat or chat replay;
- video or audio downloads.

### ⚠️ Limits and interpretation

- Top and Newest are public comment samples, not a promise of every comment.
- YouTube can delete, hide, hold, reorder, or limit comments at any time.
- Comment availability can differ by region and logged-out viewer state.
- Likes, reply counts, pins, hearts, author details, and visible replies can
  change between runs.
- Exact publish timestamps are not always public. In those cases,
  `publishedAt` stays `null` and `publishedTimeText` keeps the visible label.
- A requested cap is a maximum, not a guarantee. The public comment list can
  run out first.
- This Actor collects comments from known videos. It does not search channels,
  playlists, or keywords for videos.

### ❓ FAQ

#### Does this Actor need a YouTube API key, account, or cookies?

No. You do not need to provide a YouTube API key, account, cookies, or browser
session.

#### Does this Actor collect every comment on a video?

No. It collects from the public Top, Newest, or combined comment samples that
YouTube makes available during the run. Deleted, hidden, held, regional, and
account-only comments may not be available.

#### Are replies separate results?

Yes. Each saved reply is its own dataset row and its own paid result. Use
`includeReplies` and `maxRepliesPerComment` to control reply volume.

#### How are duplicates handled?

Equivalent video inputs are collected once. Comment and reply rows are
deduplicated by stable `commentId` within the run.

#### Why did I receive fewer rows than requested?

The video may expose fewer public comments, comments may be disabled, the
video may be unavailable, or the selected public order may end before the cap.
Check the `OUTPUT` record for the input status and stop reason.

#### How long does a run take?

Runtime grows with the number of videos, the top-level comment limit, replies,
and the selected comment order. Replies and Top + Newest require more work than
top-level Top comments alone. Start with 10 to 25 comments while testing a new
video. Rows are saved as they are collected.

#### What do `commentId` and `parentCommentId` mean?

`commentId` identifies the saved comment or reply. For a reply,
`parentCommentId` identifies its saved top-level comment. Use these IDs to
rebuild the thread without guessing from names or text.

#### Does this Actor collect live chat or chat replay?

No. Live chat and chat replay are outside this Actor's scope.

### 🛟 Support

For help, include the run ID, one input URL or video ID, the result you
expected, and the observed dataset or `OUTPUT` status. Do not send cookies,
account data, or private YouTube links.

# Actor input Schema

## `startUrls` (type: `array`):

Add direct watch, Shorts, live, embed, youtu.be URLs, or 11-character video IDs.

## `maxCommentsPerVideo` (type: `integer`):

Save up to this many unique top-level comments from each video (1-1,000). If left blank, the Actor uses 100. Replies do not count toward this limit.

## `commentSortMode` (type: `string`):

Top follows featured comments. Newest follows recent comments. Top + Newest splits the row cap between both lists and removes duplicate comment IDs. It does not guarantee every comment.

## `includeReplies` (type: `boolean`):

Save public replies as separate rows. Leave this off for the most predictable result size.

## `maxRepliesPerComment` (type: `integer`):

Save up to this many replies under each top-level comment (1-100). If left blank, the Actor uses 20. Used only when Include replies is on.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxCommentsPerVideo": 100,
  "commentSortMode": "top",
  "includeReplies": false,
  "maxRepliesPerComment": 20
}
```

# Actor output Schema

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

No description

## `output` (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 = {
    "startUrls": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chronometrica/youtube-comments-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 = { "startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] }

# Run the Actor and wait for it to finish
run = client.actor("chronometrica/youtube-comments-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 '{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ]
}' |
apify call chronometrica/youtube-comments-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Comments Scraper — Replies & Authors",
        "description": "Collect clean YouTube comment and reply rows from public videos and Shorts. Get linked parent/reply IDs, text, authors, likes, pins, creator hearts, and CSV/JSON exports. No YouTube API key, account, cookies, or compute fees. Pay only for saved comments and replies.",
        "version": "1.0",
        "x-build-id": "IYdXNYvqcPUnJ2W6L"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/chronometrica~youtube-comments-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-chronometrica-youtube-comments-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/chronometrica~youtube-comments-scraper/runs": {
            "post": {
                "operationId": "runs-sync-chronometrica-youtube-comments-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/chronometrica~youtube-comments-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-chronometrica-youtube-comments-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": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "YouTube video URLs or IDs",
                        "minItems": 1,
                        "maxItems": 100,
                        "type": "array",
                        "description": "Add direct watch, Shorts, live, embed, youtu.be URLs, or 11-character video IDs.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "maxCommentsPerVideo": {
                        "title": "Max top-level comments per video",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Save up to this many unique top-level comments from each video (1-1,000). If left blank, the Actor uses 100. Replies do not count toward this limit.",
                        "default": 100
                    },
                    "commentSortMode": {
                        "title": "Comment order",
                        "enum": [
                            "top",
                            "newest",
                            "both"
                        ],
                        "type": "string",
                        "description": "Top follows featured comments. Newest follows recent comments. Top + Newest splits the row cap between both lists and removes duplicate comment IDs. It does not guarantee every comment.",
                        "default": "top"
                    },
                    "includeReplies": {
                        "title": "Include replies",
                        "type": "boolean",
                        "description": "Save public replies as separate rows. Leave this off for the most predictable result size.",
                        "default": false
                    },
                    "maxRepliesPerComment": {
                        "title": "Max replies per top-level comment",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Save up to this many replies under each top-level comment (1-100). If left blank, the Actor uses 20. Used only when Include replies is on.",
                        "default": 20
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
