YouTube data, ready when you are.
Channels, videos and comments from YouTube.
- See the price before every call
- Pay only for records that come back
- No subscription. Your balance never expires
What you can get.
- $0.00045per recordTry it →
Channels
Channel cards for up to ten channels, by @handle, UC… id or pasted channel URL. `include.videos` adds each channel's recent videos to the same answer.
- $0.00045per recordTry it →
Videos
One channel's recent videos with views, likes and comments. Includes the channel card when held. A date floor always fetches fresh.
- $0.00045per recordTry it →
Comments
Top comments on up to ten VIDEOS, by watch/shorts URL or bare video id. Commenters are free text. Not corpus members.
What the data looks like.
| handle | name | description | country | isVerified | joinedOn | subscribers | totalVideos | totalViews | channelId | avatarUrl | bannerUrl | details |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @mirapilates | Mira Pilates | Short pilates classes you can do at home. | IN | true | 2019-03-11 | 412,000 | 318 | 52,100,000 | 495749829 | https://img.youtube.com/mira-pilates.jpg | https://img.youtube.com/mira-pilates.jpg |
|
| @northfoldhq | Northfold | Finance, made calmer. | GB | false | 2020-07-02 | 18,400 | 96 | 1,240,000 | 3181161809 | https://img.youtube.com/northfold.jpg | https://img.youtube.com/northfold.jpg |
|
| @cookwithkai | Cook with Kai | Weeknight recipes in under 30 minutes. | SG | true | 2016-11-20 | 905,000 | 512 | 210,400,000 | 2482421620 | https://img.youtube.com/cook-with-kai.jpg | https://img.youtube.com/cook-with-kai.jpg |
|
For developers
API reference.
One endpoint, POST /v1/youtube. Open an operation to see its fields.
Channelschannels
Channel cards for up to ten channels, by @handle, UC… id or pasted channel URL. `include.videos` adds each channel's recent videos to the same answer.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | @handles, UC… ids or channel URLs. |
| include | object | |
| include.videos | object | |
| include.videos.limit | integer · 1-50 | Recent videos to fetch per channel, newest first; 1-50. |
| include.videos.since | string · YYYY-MM-DD | Only videos published on or after this day (YYYY-MM-DD). |
Response fields, each row of data
| Field | Type |
|---|---|
| handle | string |
| channelId | string |
| name | string |
| description | string |
| avatarUrl | string |
| bannerUrl | string |
| country | string |
| isVerified | boolean |
| joinedOn | string |
| links | list of string |
| subscribers | integer |
| totalVideos | integer |
| totalViews | integer |
| channelUrl | string |
| canonicalHandle | string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/youtube \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"channels","subjects":["@mkbhd"]}'Example response rows
[
{
"handle": "@mirapilates",
"name": "Mira Pilates",
"description": "Short pilates classes you can do at home.",
"country": "IN",
"isVerified": true,
"joinedOn": "2019-03-11",
"subscribers": 412000,
"totalVideos": 318,
"totalViews": 52100000,
"channelId": "495749829",
"avatarUrl": "https://img.youtube.com/mira-pilates.jpg",
"bannerUrl": "https://img.youtube.com/mira-pilates.jpg",
"details": {}
},
{
"handle": "@northfoldhq",
"name": "Northfold",
"description": "Finance, made calmer.",
"country": "GB",
"isVerified": false,
"joinedOn": "2020-07-02",
"subscribers": 18400,
"totalVideos": 96,
"totalViews": 1240000,
"channelId": "3181161809",
"avatarUrl": "https://img.youtube.com/northfold.jpg",
"bannerUrl": "https://img.youtube.com/northfold.jpg",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Videosvideos
One channel's recent videos with views, likes and comments. Includes the channel card when held. A date floor always fetches fresh.
| Field | Type | Meaning |
|---|---|---|
| subject * | string · ≤400 chars | One @handle, UC… id or channel URL. |
| limit | integer · 1-50 | |
| since | string · YYYY-MM-DD |
Response fields, each row of data
| Field | Type |
|---|---|
| videoId | string |
| title | string |
| description | string |
| kind | string |
| publishedAt | string |
| durationS | integer |
| category | string |
| keywords | list of string |
| isLive | boolean |
| thumbnailUrl | string |
| permalink | string |
| views | integer |
| likes | integer |
| comments | integer |
| channelHandle | string |
| channelNativeId | string |
| channelName | string |
| channelUrl | string |
| channelSubscribers | string |
| channelBadges | list of string |
| captions | list of object |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/youtube \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"videos","subject":"@mkbhd","limit":10}'Example response rows
[
{
"channelHandle": "@cookwithkai",
"title": "One-pan laksa in 25 minutes",
"kind": "video",
"publishedAt": "2026-10-09",
"durationS": 902,
"category": "Howto & Style",
"views": 1210000,
"likes": 41200,
"comments": 1830,
"keywords": [
"laksa",
"one pan",
"weeknight"
],
"videoId": "2831094151",
"isLive": false,
"thumbnailUrl": "https://img.youtube.com/one-pan-laksa-in-25-minutes.jpg",
"permalink": "https://www.youtube.com/one-pan-laksa-in-25-minutes-1000",
"channelNativeId": "247899388",
"details": {}
},
{
"channelHandle": "@cookwithkai",
"title": "Crispy rice, 3 ways",
"kind": "short",
"publishedAt": "2026-10-06",
"durationS": 48,
"category": "Howto & Style",
"views": 2830000,
"likes": 120400,
"comments": 2210,
"keywords": [
"rice",
"shorts"
],
"videoId": "2788502292",
"isLive": false,
"thumbnailUrl": "https://img.youtube.com/crispy-rice-3-ways.jpg",
"permalink": "https://www.youtube.com/crispy-rice-3-ways-1001",
"channelNativeId": "3627234726",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Commentscomments
Top comments on up to ten VIDEOS, by watch/shorts URL or bare video id. Commenters are free text. Not corpus members.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Watch/shorts URLs or bare video ids. |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| commentId | string |
| author | string |
| authorChannelId | string |
| body | string |
| likes | integer |
| replies | integer |
| postedAt | string |
| isOwner | boolean |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/youtube \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"comments","subjects":["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"limit":50}'Example response rows
[
{
"author": "@ravi_k",
"body": "Made this last night, the whole family loved it.",
"likes": 812,
"replies": 14,
"postedAt": "2026-10-10",
"isOwner": false,
"commentId": "2563345527",
"authorChannelId": "2543720091",
"details": {}
},
{
"author": "@lena.m",
"body": "Can I use coconut cream instead of milk?",
"likes": 236,
"replies": 3,
"postedAt": "2026-10-10",
"isOwner": false,
"commentId": "1328958082",
"authorChannelId": "1219906403",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Historyhistoryfree
The stored time series. Free, reads only what captures already wrote.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | @handles, UC… ids or channel URLs. |
| metric | enum | subscribers · total_videos · total_views |
| days | integer · 1-730 |