# YouTube Metrics Scraper - Videos, Shorts & Channels (`chronometrica/youtube-metrics-scraper`) Actor

Collect public metrics for YouTube videos, Shorts, live posts, and channel uploads. Get views, likes, comments, remixes, channel IDs, handles, publish dates, subscriber counts, and status fields.

- **URL**: https://apify.com/chronometrica/youtube-metrics-scraper.md
- **Developed by:** [Chronometrica](https://apify.com/chronometrica) (community)
- **Categories:** Social media, Videos
- **Stats:** 5 total users, 3 monthly users, 92.9% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 youtube post metrics

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 Metrics Scraper

### 📊 What does YouTube Metrics Scraper do?

YouTube Metrics Scraper collects public metrics for YouTube videos, Shorts, live
posts, and channel uploads. Paste known post URLs to measure them directly, or
paste channel URLs, channel IDs, and `@handles` to discover public uploads
first.

Use it when you need clean YouTube data for creator research, influencer
reporting, campaign tracking, competitor monitoring, social analytics,
dashboards, warehouse loads, and scheduled metric snapshots.

The Actor returns flat CSV/API-friendly rows with views, likes, comments, Shorts
remixes, subscriber counts, IDs, titles, descriptions, publish dates,
collaboration channels, row statuses, and per-metric quality labels.

This Actor does not log in, use cookies, scrape private YouTube content, collect
comment text, download videos, return dislikes, or access YouTube Studio
analytics. It only returns data that is publicly available at run time.

With YouTube Metrics Scraper, you can:

- 📈 Track public performance for known YouTube videos, Shorts, and live posts.
- 🎬 Measure videos and Shorts side by side in one normalized dataset.
- 👤 Discover public uploads from channel URLs, channel IDs, and `@handles`.
- 🔥 Sort discovered channel posts by newest, most popular, or oldest.
- 💬 Collect public views, likes, comments, and Shorts remix counts when
  available.
- 👥 Add public channel subscriber counts and channel identity fields.
- 🤝 Capture owner and collaborator channels when YouTube identifies them
  publicly.
- 🧭 Keep unavailable metrics as unavailable instead of turning them into fake
  zeroes.
- 📦 Export results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

### ✨ What You Get

Each dataset row represents one YouTube video, Short, live post, or discovered
channel post.

| Data group         | Example fields                                                              |
| ------------------ | --------------------------------------------------------------------------- |
| 🔗 URL identity    | `inputUrl`, `postUrl`                                                       |
| 🆔 YouTube IDs     | `postId`, `postType`, `isShort`, `channelId`, `channelHandle`, `channelUrl` |
| 🧾 Post details    | `title`, `description`, `publishedAt`, `isLive`                             |
| 📊 Post metrics    | `views`, `likes`, `comments`, `remixes`                                     |
| 👥 Channel metrics | `channelSubscribersCount`                                                   |
| 🎯 Metric quality  | `postMetricStatus`, `channelMetricStatus`                                   |
| 🤝 Collaborations  | `collaborationCount`, `collaborationChannels`                               |
| 🚦 Row status      | `status`, `scrapedAt`                                                       |

Metric availability depends on what YouTube exposes publicly for each post or
channel. Some public counters are exact, some are rounded, and some are hidden
or delayed. Missing counts stay missing; they are not guessed and they are not
replaced with `0`.

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

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

- Apify API
- Python SDK
- Node.js SDK
- Webhooks
- Scheduled runs
- Apify integrations

This makes it useful for social media dashboards, influencer lists, competitive
intelligence, creator databases, campaign reporting, content audits, data
warehouses, and automated market research workflows.

### 🎯 Why scrape YouTube video, Shorts, and channel metrics?

YouTube public metrics help you understand which creators, channels, videos,
Shorts, campaigns, and competitors are gaining traction.

| Use case                     | How YouTube metric data helps                                                        |
| ---------------------------- | ------------------------------------------------------------------------------------ |
| 📈 Track creator performance | Monitor public views, likes, comments, and subscriber context over time.             |
| 🎬 Compare content formats   | Compare videos, Shorts, and live posts in one flat export.                           |
| 📣 Measure campaigns         | Collect repeatable snapshots for sponsored videos, creator deliverables, and drops.  |
| 🕵️ Monitor competitors       | Track known competitor videos or discover channel uploads before collecting metrics. |
| 🔥 Research top content      | Pull popular channel posts and compare the strongest public performers.              |
| 🧱 Build reporting workflows | Feed normalized YouTube rows into dashboards, spreadsheets, and BI tools.            |
| 🔎 Audit metric availability | Separate available, rounded, unavailable, and failed rows cleanly.                   |

### 💵 Pricing Event

YouTube Metrics Scraper uses pay-per-result pricing. One result means one
YouTube video, Short, live post, or discovered channel post metric row written
to the default dataset.

Use `maxItems` and `maxItemsPerChannel` to control result volume before a run.
Start with a small batch of 3 to 10 URLs when testing. The run summary and row
statuses show which URLs resolved, which returned public metrics, and whether
any inputs failed or were unsupported.

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

1. Create or log in to your Apify account.
2. Open **YouTube Metrics Scraper**.
3. Paste YouTube video URLs, Shorts URLs, channel URLs, channel IDs, `@handles`,
   or a mix of them.
4. Set the maximum number of rows to collect.
5. Choose the channel post order if you are using channel discovery.
6. Leave the default settings for your first run.
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`. Paste at least one YouTube post URL, channel URL,
channel ID, raw video ID, or `@handle`. Direct posts and channel inputs can be
mixed in the same run.

```json
{
    "startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "maxItems": 1,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
}
````

#### 🔗 YouTube URLs and handles

Supported input shapes include:

```text
https://www.youtube.com/watch?v=VIDEO_ID
https://youtu.be/VIDEO_ID
https://www.youtube.com/shorts/VIDEO_ID
https://www.youtube.com/embed/VIDEO_ID
VIDEO_ID
https://www.youtube.com/@handle
https://www.youtube.com/@handle/videos
https://www.youtube.com/@handle/shorts
@handle
https://www.youtube.com/channel/UC...
UC...
```

Best results usually come from public post URLs and public channel pages that
open in a logged-out browser.

#### 📺 Channel discovery

Use channel discovery when you want the Actor to find public posts from a
YouTube channel before collecting metrics.

```json
{
    "startUrls": ["@MrBeast"],
    "channelSort": "popular",
    "maxItems": 100,
    "maxItemsPerChannel": 25
}
```

Channel inputs discover public videos, Shorts, and live replays, then return the
same row shape as direct post URLs.

#### 🎛️ Settings

| Option               | What it does                                                                              |
| -------------------- | ----------------------------------------------------------------------------------------- |
| `startUrls`          | YouTube post URLs, raw video IDs, channel URLs, channel IDs, `@handles`, or mixed inputs. |
| `maxItems`           | Maximum metric rows to save across the whole run.                                         |
| `maxItemsPerChannel` | Maximum public posts to discover from each channel input.                                 |
| `channelSort`        | `recent`, `popular`, or `oldest` channel discovery order.                                 |
| `publishedAfter`     | Only keep discovered channel posts published on or after a `YYYY-MM-DD` date.             |
| `publishedBefore`    | Only keep discovered channel posts published on or before a `YYYY-MM-DD` date.            |
| `maxAgeDays`         | Only keep discovered channel posts from the last N days.                                  |
| `titleIncludes`      | Only keep discovered channel posts whose public title contains one of these phrases.      |
| `titleExcludes`      | Skip discovered channel posts whose public title contains any of these phrases.           |
| `maxConcurrency`     | Controls how many YouTube posts are resolved at the same time.                            |
| `requestTimeoutSecs` | Maximum wait time for each public YouTube request.                                        |
| `failOnNoMetrics`    | Fails the run if none of the input URLs expose public metrics.                            |

### ⬆️ Output sample

Results are stored in the default dataset. Each result is one YouTube metric
row.

```json
{
    "inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "postUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "postId": "dQw4w9WgXcQ",
    "postType": "video",
    "isShort": false,
    "title": "Example YouTube video title",
    "description": "Example public description",
    "publishedAt": "2009-10-25",
    "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
    "channelHandle": "@Example",
    "channelUrl": "https://www.youtube.com/@Example",
    "views": 123456789,
    "likes": 1234567,
    "comments": 12345,
    "remixes": null,
    "postMetricStatus": [
        {
            "metric": "views",
            "value": 123456789,
            "status": "present",
            "precision": "exact"
        },
        {
            "metric": "likes",
            "value": 1234567,
            "status": "present",
            "precision": "exact"
        },
        {
            "metric": "comments",
            "value": 12345,
            "status": "present",
            "precision": "display_rounded"
        }
    ],
    "collaborationCount": 1,
    "collaborationChannels": [
        {
            "id": "UCuAXFkgsw1L7xaCfnd5JJOw",
            "handle": "@Example",
            "url": "https://www.youtube.com/@Example",
            "role": "owner"
        }
    ],
    "channelSubscribersCount": 4510000,
    "channelMetricStatus": [
        {
            "metric": "channelSubscribersCount",
            "value": 4510000,
            "status": "present",
            "precision": "display_rounded"
        }
    ],
    "status": "ok",
    "scrapedAt": "2026-06-24T00:00:00.000Z",
    "isLive": false
}
```

`inputUrl` preserves the input that produced the row. `postUrl` is the resolved
public YouTube post URL. For Shorts, `postUrl` uses the public Shorts URL shape.

### 🎯 Metric status

YouTube can expose exact, rounded, delayed, or unavailable counters depending on
the post type, channel settings, geography, and current public page state.

The status fields help you separate:

- `present` metrics that were found,
- `unavailable` metrics that YouTube did not expose publicly,
- `not_attempted` metrics that do not apply to that row,
- `exact` values that appeared as full public integers,
- `display_rounded` or `likely_rounded` values that appeared as rounded public
  display counts.

Missing counts stay missing. This lets you filter rows without guessing whether
a blank value means zero.

### 🚦 Status values

Rows use explicit statuses so partial, unavailable, or failed inputs are still
auditable.

| Status                       | Meaning                                                                                             |
| ---------------------------- | --------------------------------------------------------------------------------------------------- |
| `ok`                         | The public YouTube post resolved and at least one useful public metric or metadata field was found. |
| `resolved_no_public_metrics` | The input resolved, but public metric fields were not exposed for that item.                        |
| `invalid_input`              | The input was not a valid YouTube URL, video ID, channel ID, or `@handle`.                          |
| `unsupported_url`            | The URL is a YouTube surface this Actor does not support.                                           |
| `blocked_or_challenged`      | YouTube returned a challenge, unavailable page, or blocked response.                                |
| `failed`                     | The input could not be resolved after retry.                                                        |

### 🧾 Output summary

The `OUTPUT` record contains a compact run summary with input counts, discovered
URL counts, status counts, metric coverage counts, skipped-input counts, and
post-type counts.

Use it to audit a run quickly before downloading the full dataset.

### ⚠️ Notes and limitations

- Public pages can hide, round, delay, or omit metrics.
- Comment bodies are not collected. The Actor only returns public comment
  counts when available.
- Search result scraping, playlist scraping, hashtag discovery, transcripts,
  subtitles, and media downloads are not part of this Actor.
- Dislikes are not public and are not returned.
- Channel discovery is best-effort and depends on public channel pages.
- Apify Proxy is enabled by default because direct cloud requests to YouTube are
  commonly challenged.

# Actor input Schema

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

Paste YouTube video URLs, Shorts URLs, video IDs, channel URLs, channel IDs, or @handles. Direct posts become metric rows. Channel inputs discover public posts first, then collect the same metrics.

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

Maximum metric rows across direct post URLs and posts discovered from channels.

## `maxItemsPerChannel` (type: `integer`):

Maximum public posts to discover from each channel input before collecting metrics. The total row cap still applies across all inputs.

## `channelSort` (type: `string`):

Choose the public channel discovery order.

## `publishedAfter` (type: `string`):

Only keep discovered channel posts published on or after this YYYY-MM-DD date.

## `publishedBefore` (type: `string`):

Only keep discovered channel posts published on or before this YYYY-MM-DD date.

## `maxAgeDays` (type: `integer`):

Only keep discovered channel posts from the last N days. This combines with Published on or after by using the newer lower-bound date.

## `titleIncludes` (type: `array`):

Only keep discovered channel posts whose public title contains at least one of these phrases.

## `titleExcludes` (type: `array`):

Skip discovered channel posts whose public title contains any of these phrases.

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

Use Apify Proxy for public YouTube requests. The default is enabled because direct cloud requests are commonly challenged by YouTube.

## `requestTimeoutSecs` (type: `integer`):

Maximum seconds to wait for each public YouTube request.

## `maxConcurrency` (type: `integer`):

Maximum number of YouTube requests to resolve at the same time.

## `failOnNoMetrics` (type: `boolean`):

Fail the run if none of the input URLs expose public metrics. Individual URLs without metrics still emit rows with structured statuses.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "maxItems": 100,
  "maxItemsPerChannel": 25,
  "channelSort": "recent",
  "publishedAfter": "",
  "publishedBefore": "",
  "titleIncludes": [],
  "titleExcludes": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestTimeoutSecs": 20,
  "maxConcurrency": 8,
  "failOnNoMetrics": false
}
```

# 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-metrics-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-metrics-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-metrics-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Metrics Scraper - Videos, Shorts & Channels",
        "description": "Collect public metrics for YouTube videos, Shorts, live posts, and channel uploads. Get views, likes, comments, remixes, channel IDs, handles, publish dates, subscriber counts, and status fields.",
        "version": "1.0",
        "x-build-id": "1lxNU76WV5TXwkmUi"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/chronometrica~youtube-metrics-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-chronometrica-youtube-metrics-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-metrics-scraper/runs": {
            "post": {
                "operationId": "runs-sync-chronometrica-youtube-metrics-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-metrics-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-chronometrica-youtube-metrics-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "YouTube post or channel URLs",
                        "minItems": 0,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Paste YouTube video URLs, Shorts URLs, video IDs, channel URLs, channel IDs, or @handles. Direct posts become metric rows. Channel inputs discover public posts first, then collect the same metrics.",
                        "items": {
                            "type": "string",
                            "pattern": "^\\s*\\S[\\s\\S]*$"
                        },
                        "default": []
                    },
                    "maxItems": {
                        "title": "Rows to collect",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum metric rows across direct post URLs and posts discovered from channels.",
                        "default": 100
                    },
                    "maxItemsPerChannel": {
                        "title": "Posts per channel",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum public posts to discover from each channel input before collecting metrics. The total row cap still applies across all inputs.",
                        "default": 25
                    },
                    "channelSort": {
                        "title": "Channel post order",
                        "enum": [
                            "recent",
                            "popular",
                            "oldest"
                        ],
                        "type": "string",
                        "description": "Choose the public channel discovery order.",
                        "default": "recent"
                    },
                    "publishedAfter": {
                        "title": "Published on or after",
                        "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only keep discovered channel posts published on or after this YYYY-MM-DD date.",
                        "default": ""
                    },
                    "publishedBefore": {
                        "title": "Published on or before",
                        "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only keep discovered channel posts published on or before this YYYY-MM-DD date.",
                        "default": ""
                    },
                    "maxAgeDays": {
                        "title": "Only last N days",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Only keep discovered channel posts from the last N days. This combines with Published on or after by using the newer lower-bound date."
                    },
                    "titleIncludes": {
                        "title": "Title contains",
                        "type": "array",
                        "description": "Only keep discovered channel posts whose public title contains at least one of these phrases.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "titleExcludes": {
                        "title": "Title does not contain",
                        "type": "array",
                        "description": "Skip discovered channel posts whose public title contains any of these phrases.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Use Apify Proxy for public YouTube requests. The default is enabled because direct cloud requests are commonly challenged by YouTube.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout",
                        "minimum": 5,
                        "type": "integer",
                        "description": "Maximum seconds to wait for each public YouTube request.",
                        "default": 20
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of YouTube requests to resolve at the same time.",
                        "default": 8
                    },
                    "failOnNoMetrics": {
                        "title": "Fail when no metrics are exposed",
                        "type": "boolean",
                        "description": "Fail the run if none of the input URLs expose public metrics. Individual URLs without metrics still emit rows with structured statuses.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
