# YouTube data in Python. Pay per record.

> Get YouTube channels, videos and comments into Python: one HTTPS call per operation, a free quote first, pay per record from $0.00045 per record.

Canonical: https://apiforagents.dev/integrations/python/youtube · Updated 2026-10-21

Call the YouTube API from Python with one HTTPS request per operation: channels, videos and comments. Every call can be quoted free first, and you pay per record that comes back, from $0.00045 per record, from a prepaid balance with $0.10 free to start.

- Works with: Python
- Operations: 3
- Price: From $0.00045 per record
- Free to start: $0.10

## Set it up in Python

1. pip install requests, and put your API key in the AFA_KEY environment variable.
2. Call the function below once per operation; quote first with estimate_only=True.

## Channels

python · YouTube channels:

```python
import os, requests

def youtube(op: str, params: dict, estimate_only: bool = False) -> dict:
    r = requests.post(
        "https://apiforagents.dev/v1/youtube",
        headers={"Authorization": f"Bearer {os.environ['AFA_KEY']}"},
        json={"op": op, **params, "estimateOnly": estimate_only},
        timeout=120,
    )
    body = r.json()
    if r.status_code != 200:
        raise RuntimeError(f"{body.get('error')}: {body.get('error_description')}")
    return body  # read body["coverage"] before body["data"]

quote = youtube("channels", {
    "subjects": ["@mkbhd"],
}, estimate_only=True)
print(quote["cost"]["wouldChargeUsd"])
```

## Videos

python · YouTube videos:

```python
import os, requests

def youtube(op: str, params: dict, estimate_only: bool = False) -> dict:
    r = requests.post(
        "https://apiforagents.dev/v1/youtube",
        headers={"Authorization": f"Bearer {os.environ['AFA_KEY']}"},
        json={"op": op, **params, "estimateOnly": estimate_only},
        timeout=120,
    )
    body = r.json()
    if r.status_code != 200:
        raise RuntimeError(f"{body.get('error')}: {body.get('error_description')}")
    return body  # read body["coverage"] before body["data"]

quote = youtube("videos", {
    "subject": "@mkbhd",
    "limit": 10,
}, estimate_only=True)
print(quote["cost"]["wouldChargeUsd"])
```

## Comments

python · YouTube comments:

```python
import os, requests

def youtube(op: str, params: dict, estimate_only: bool = False) -> dict:
    r = requests.post(
        "https://apiforagents.dev/v1/youtube",
        headers={"Authorization": f"Bearer {os.environ['AFA_KEY']}"},
        json={"op": op, **params, "estimateOnly": estimate_only},
        timeout=120,
    )
    body = r.json()
    if r.status_code != 200:
        raise RuntimeError(f"{body.get('error')}: {body.get('error_description')}")
    return body  # read body["coverage"] before body["data"]

quote = youtube("comments", {
    "subjects": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "limit": 50,
}, estimate_only=True)
print(quote["cost"]["wouldChargeUsd"])
```

## YouTube operations you can call

List prices per record. A call can carry a minimum, so quote first: the quote is free and is the most a call can cost.

| Operation | Price per record |
|---|---|
| Channels | $0.00045 |
| Videos | $0.00045 |
| Comments | $0.00045 |

## Each operation in detail

- [YouTube Channel API](https://apiforagents.dev/platforms/youtube/channel-api): inputs, fields, sample, price
- [YouTube Videos API](https://apiforagents.dev/platforms/youtube/videos-api): inputs, fields, sample, price
- [YouTube Comments API](https://apiforagents.dev/platforms/youtube/comments-api): inputs, fields, sample, price

## Questions

### Is there an SDK?

No SDK is needed: it is one HTTPS POST per call to https://apiforagents.dev/v1/youtube, so requests or httpx is enough.

### How do I handle errors?

A refusal answers with an error code and a plain description; a subject that did not come back is listed in coverage with the reason, and is not charged.

### What does YouTube data cost?

Pay as you go, from $0.00045 per record at the list price. Some calls carry a minimum, so quote first with "estimateOnly": true: it is free and is the most the call can cost. Records that do not come back are refunded.

## Why API for Agents

- One key for 26 platforms: social, commerce, jobs, places, search and contacts, with one request shape and one response shape.
- A free quote before any spend: add "estimateOnly": true to any call and see the most it can cost.
- Pay per record in US dollars. No subscription, nothing expires, top-ups from $5.
- $0.10 free to try, no card. An AI agent can sign itself up in one request; a person claims it later.
- Measured, not estimated: every answer says when each row was measured, whether it was fresh or a recent capture, and how sure to be of each field.
- Partial success is success: anything that could not be fetched is named with a reason, and the charge settles to what came back, never above the quote.
- Typed fields that keep their names whichever source answered, and a details object last with everything else the source sent, under our own field names.
- Try any endpoint in the playground and download the answer as CSV or JSON.

## Start

The playground runs any endpoint by hand: pick a platform and what you want from it, fill a short form named in plain words (or press Use sample input), see the free quote on the Run button, run it, then read the answer as a table or JSON and download it as CSV or JSON. The same call is written out as cURL, Python and Node while you type. Open it at https://apiforagents.dev/dashboard/run?platform=youtube (sign in first).

Agents register at https://apiforagents.dev/auth.md (one POST, $0.10 free). People: https://apiforagents.dev/docs#start. Prices: https://apiforagents.dev/pricing.md
