# YouTube Transcript Scraper (`agilevendor/youtube-transcript-scraper`) Actor

Extract transcripts and subtitles from any public YouTube video, playlist, or channel. Get plain text, timestamped segments, and ready-to-use SRT and VTT files in one run — plus title, channel, and language. Bulk playlists and channels, language selection. You only pay for successful transcripts.

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

## Pricing

$1.00 / 1,000 transcript scrapeds

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

Learn more: https://docs.apify.com/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 Transcript Scraper

Extract transcripts and subtitles from any public YouTube video, playlist, or channel — full text, timestamped segments, plus ready-to-use **SRT** and **VTT** files, all in one run.

**Why this scraper**

- ✅ **All subtitle formats in one shot** — plain text, timestamped segments, SRT, and VTT returned together, no second run needed.
- ✅ **Playlists and channels expand automatically** — paste a single channel URL and get transcripts for every video in it. Each record carries a `playlist` field with the source playlist ID (empty for single videos), so you can tell which playlist a video came from.
- ✅ **You only pay for successful transcripts** — videos without captions, private videos, and age-restricted content are flagged and skipped; no charge for empty results.
- ✅ **Multi-language in one run** — list several languages and get a separate record for each one that exists on the video, or leave it empty to grab a single best track per video.
- ✅ **Metadata in every record** — title, channel name, language code, and whether captions are auto-generated or human-made, attached to each transcript.
- ✅ **Anti-bot protection handled** — residential proxies and PO-token bypass built in and on by default, no setup required.
- ✅ **Low price** — $1.00 per 1,000 videos, up to 10× cheaper than many alternatives.

### What it does

- **One record per video.** Each video in the dataset gets its own record with the full transcript text, time-aligned segments, SRT subtitles, VTT subtitles, and metadata — everything in a single dataset row.
- **Flexible input.** The `videoUrls` field accepts YouTube video URLs, playlist URLs, channel URLs, and bare video IDs — any mix in any order.
- **Bulk expansion.** Playlist and channel URLs are resolved to their full video lists automatically. Use `maxVideos` to cap the number of expanded videos and keep the cost predictable.
- **Multi-language.** Set `languages` to a list of ISO 639-1 codes (e.g. `["en", "de", "ru"]`). Every selected language that exists for a video is returned as its own record (and billed as one transcript), so you can grab several languages in one run. Leave it empty to get a single best track per video (a human-made track is preferred, otherwise the first available) — roughly one unit per video.
- **Honest status field.** Every record carries a `status` value: `ok` (transcript returned), `no_captions` (no captions exist for this video), `private`, `age_restricted`, or `unavailable`. This makes it easy to filter results downstream and understand exactly why a video was skipped.
- **Timestamps optional.** Set `includeTimestamps` to `false` to omit the `segments` array and get a leaner output when all you need is the plain text.

### How to scrape YouTube transcripts?

1. Open the YouTube video, playlist, or channel you want to scrape and copy the URL from the browser address bar. You can also copy a plain video ID (the part after `?v=`).
2. Paste one or more URLs or IDs into the **Video URLs** field. Mix and match — videos, playlists, and channels can go in the same list.
3. Optionally set `languages` to the caption languages you want (e.g. `["en", "ru"]`) — each one becomes its own record. Leave empty for a single best track per video.
4. Set `maxVideos` if you are expanding a large playlist or channel and want to control cost.
5. Click **Start** and wait for the run to finish.
6. Download the results from the **Output** tab in JSON, CSV, Excel, XML, or HTML.

### Input

| Field | Type | Description |
|---|---|---|
| `videoUrls` | array | YouTube video / playlist / channel URLs or bare video IDs (required). |
| `languages` | array | Caption languages to scrape (ISO 639-1). Each selected language that exists becomes its own record (billed as one transcript). Empty → a single best track per video (human-made preferred). |
| `maxVideos` | integer | Cap on the number of videos expanded from a playlist or channel (default: 50). Controls cost. |
| `includeTimestamps` | boolean | Include the `segments` array with per-segment timecodes (default: `true`). |
| `proxyConfiguration` | object | Proxy settings. Defaults to Apify Residential Proxies, which are required for reliable YouTube access. |

Example input:

```json
{
  "videoUrls": [
    { "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw" }
  ],
  "languages": ["en", "ru"],
  "maxVideos": 50,
  "includeTimestamps": true
}
````

To scrape a full playlist, replace the video URL with a playlist URL:

```json
{
  "videoUrls": [
    { "url": "https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxxx" }
  ],
  "maxVideos": 100
}
```

### Output format

Each output record is one video and includes the plain `text`, timestamped `segments`, source `playlist`, and metadata (title, channel, language). It also includes `srt` and `vtt` fields with properly formatted **SRT / VTT subtitle** files — ready to drop into a video editor, subtitle tool, or upload to a platform. No conversion needed.

Output (one record per video):

![YouTube transcript scraper output table](https://i.imgur.com/fx99lQp.png)

```json
{
  "videoId": "jNQXAC9IVRw",
  "videoUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
  "playlist": null,
  "title": "Me at the zoo",
  "channelName": "jawed",
  "language": "en",
  "isAutoGenerated": false,
  "status": "ok",
  "text": "All right, so here we are, in front of the elephants, and the cool thing about these guys is that they have really, really, really long trunks.",
  "segments": [
    { "start": 1.2, "dur": 2.16, "text": "All right, so here we are," },
    { "start": 3.36, "dur": 2.4, "text": "in front of the elephants," },
    { "start": 5.76, "dur": 5.04, "text": "and the cool thing about these guys is that they have really, really, really long trunks." }
  ],
  "srt": "1\n00:00:01,200 --> 00:00:03,360\nAll right, so here we are,\n\n2\n00:00:03,360 --> 00:00:05,760\nin front of the elephants,\n",
  "vtt": "WEBVTT\n\n00:00:01.200 --> 00:00:03.360\nAll right, so here we are,\n\n00:00:03.360 --> 00:00:05.760\nin front of the elephants,\n"
}
```

Videos without available captions return a record with `"status": "no_captions"` and empty transcript fields — so you can see exactly which videos were skipped.

### Proxy and cost

YouTube requires a non-datacenter IP for reliable access. This scraper uses **Apify Residential Proxies** by default, which rotate automatically and handle YouTube's bot detection together with PO-token support baked into the scraper.

When someone else runs your Actor on Apify, proxy traffic is billed to their account, not yours. The same applies here — proxy consumption charges go to whoever runs the scraper.

**Pricing: $1.00 per 1,000 successfully extracted transcripts.** You are only charged for records with `"status": "ok"`. Videos that turn out to have no captions, are private, age-restricted, or unavailable do not count toward the bill.

### Is it legal to scrape YouTube transcripts?

YouTube transcripts and subtitles are publicly accessible without logging in — the same content any visitor can read or download in their browser. Scraping publicly available data without bypassing authentication or access controls has generally been found permissible under US law (see *hiQ Labs v. LinkedIn*, 2022), though terms of service may still apply.

This scraper does not log into YouTube, does not access private or members-only content, and does not bypass any access controls — it only retrieves captions that are already publicly available.

Note that transcript text may be subject to copyright (belonging to the video creator), and names or usernames attached to content may qualify as personal data under GDPR or CCPA. You are responsible for how you use the extracted data and for ensuring your use complies with applicable laws and platform terms in your jurisdiction.

**This is not legal advice.** If you have questions about your specific use case, consult a qualified attorney.

### Your feedback

Found a bug or have a feature request? Open an issue here:
https://console.apify.com/actors/5LUyoa5qazqEd6R9A/issues

# Actor input Schema

## `videoUrls` (type: `array`):

YouTube video URLs, video IDs, playlist URLs, or channel URLs. Formats: video — https://www.youtube.com/watch?v=VIDEO\_ID ; playlist — https://www.youtube.com/playlist?list=PLAYLIST\_ID (use this clean /playlist? form to scrape a whole playlist; a watch?v=...\&list=... link is treated as a single video) ; channel — https://www.youtube.com/@handle

## `languages` (type: `array`):

Caption languages to scrape (defaults to English). Each selected language that exists for a video is returned as a separate record (and billed as one transcript). Add more languages only when you need several — each adds one billed transcript per video. Leave the list empty to instead get a single best track per video (prefers a human-made track, otherwise the first available).

## `maxVideos` (type: `integer`):

Maximum number of videos to process. Useful for capping costs when scraping playlists or channels.

## `includeTimestamps` (type: `boolean`):

When enabled, each transcript item also contains a segments array with word/phrase-level timestamps.

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

YouTube blocks datacenter IPs, so residential proxies are recommended. Proxy traffic is billed to the account that runs the Actor.

## Actor input object example

```json
{
  "videoUrls": [
    {
      "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    }
  ],
  "languages": [
    "en"
  ],
  "maxVideos": 50,
  "includeTimestamps": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `transcripts` (type: `string`):

Collected video transcripts 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 = {
    "videoUrls": [
        {
            "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
        }
    ],
    "languages": [
        "en"
    ],
    "maxVideos": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("agilevendor/youtube-transcript-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 = {
    "videoUrls": [{ "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw" }],
    "languages": ["en"],
    "maxVideos": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("agilevendor/youtube-transcript-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 '{
  "videoUrls": [
    {
      "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    }
  ],
  "languages": [
    "en"
  ],
  "maxVideos": 50
}' |
apify call agilevendor/youtube-transcript-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Transcript Scraper",
        "description": "Extract transcripts and subtitles from any public YouTube video, playlist, or channel. Get plain text, timestamped segments, and ready-to-use SRT and VTT files in one run — plus title, channel, and language. Bulk playlists and channels, language selection. You only pay for successful transcripts.",
        "version": "0.1",
        "x-build-id": "VAFhPrYQabjSHMduC"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/agilevendor~youtube-transcript-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-agilevendor-youtube-transcript-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/agilevendor~youtube-transcript-scraper/runs": {
            "post": {
                "operationId": "runs-sync-agilevendor-youtube-transcript-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/agilevendor~youtube-transcript-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-agilevendor-youtube-transcript-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": [
                    "videoUrls"
                ],
                "properties": {
                    "videoUrls": {
                        "title": "YouTube URLs",
                        "type": "array",
                        "description": "YouTube video URLs, video IDs, playlist URLs, or channel URLs. Formats: video — https://www.youtube.com/watch?v=VIDEO_ID ; playlist — https://www.youtube.com/playlist?list=PLAYLIST_ID (use this clean /playlist? form to scrape a whole playlist; a watch?v=...&list=... link is treated as a single video) ; channel — https://www.youtube.com/@handle",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "languages": {
                        "title": "Languages",
                        "type": "array",
                        "description": "Caption languages to scrape (defaults to English). Each selected language that exists for a video is returned as a separate record (and billed as one transcript). Add more languages only when you need several — each adds one billed transcript per video. Leave the list empty to instead get a single best track per video (prefers a human-made track, otherwise the first available).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ar",
                                "hy",
                                "bg",
                                "my",
                                "ca",
                                "ckb",
                                "zh-CN",
                                "zh-TW",
                                "hr",
                                "cs",
                                "da",
                                "nl",
                                "en",
                                "et",
                                "fi",
                                "fr",
                                "fr-CA",
                                "gl",
                                "de",
                                "el",
                                "iw",
                                "hi",
                                "hu",
                                "id",
                                "it",
                                "ja",
                                "ko",
                                "ku",
                                "lv",
                                "lt",
                                "mr",
                                "mn",
                                "ne",
                                "fa",
                                "pl",
                                "pt-BR",
                                "pt-PT",
                                "ro",
                                "ru",
                                "sr",
                                "sl",
                                "es",
                                "sv",
                                "th",
                                "tr",
                                "uk",
                                "ur",
                                "uz",
                                "vi"
                            ],
                            "enumTitles": [
                                "Arabic",
                                "Armenian",
                                "Bulgarian",
                                "Burmese",
                                "Catalan",
                                "Central Kurdish",
                                "Chinese (China)",
                                "Chinese (Taiwan)",
                                "Croatian",
                                "Czech",
                                "Danish",
                                "Dutch",
                                "English",
                                "Estonian",
                                "Finnish",
                                "French",
                                "French (Canada)",
                                "Galician",
                                "German",
                                "Greek",
                                "Hebrew",
                                "Hindi",
                                "Hungarian",
                                "Indonesian",
                                "Italian",
                                "Japanese",
                                "Korean",
                                "Kurdish",
                                "Latvian",
                                "Lithuanian",
                                "Marathi",
                                "Mongolian",
                                "Nepali",
                                "Persian",
                                "Polish",
                                "Portuguese (Brazil)",
                                "Portuguese (Portugal)",
                                "Romanian",
                                "Russian",
                                "Serbian",
                                "Slovenian",
                                "Spanish",
                                "Swedish",
                                "Thai",
                                "Turkish",
                                "Ukrainian",
                                "Urdu",
                                "Uzbek",
                                "Vietnamese"
                            ]
                        },
                        "default": [
                            "en"
                        ]
                    },
                    "maxVideos": {
                        "title": "Max videos",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of videos to process. Useful for capping costs when scraping playlists or channels.",
                        "default": 50
                    },
                    "includeTimestamps": {
                        "title": "Include timestamps",
                        "type": "boolean",
                        "description": "When enabled, each transcript item also contains a segments array with word/phrase-level timestamps.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "YouTube blocks datacenter IPs, so residential proxies are recommended. Proxy traffic is billed to the account that runs the Actor.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
