▶️ YouTube
YouTube API for public video, channel, and playlist metadata.
- Search and suggestions
- Trending
- Video details, statistics, comments, and transcripts
- Related videos and batch lookups
- Channels, Shorts, streams, and playlists
Only public metadata is returned. There are no media, audio, or stream URLs.
language and country choose the YouTube interface language and region (default en and US). Lists return items and a cursor. Pass the cursor back to get the next page.
Search & Discovery
Search, suggestions, and trending videos.
GET /v1/search
requires authentication
Search YouTube for videos, channels, and playlists. Each item has a type of video, channel, or playlist.
An empty result returns items: [] with a null cursor.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/search'
params = {
'q': 'laravel',
'type': 'all',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/search';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'q' => 'laravel',
'type' => 'all',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/search"
);
const params = {
"q": "laravel",
"type": "all",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/search?q=laravel&type=all" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"q": "laravel"
},
"body": {
"items": [
{
"type": "channel",
"id": "UCfO2GiQwb-cwJTb1CuRSkwg",
"url": "https://www.youtube.com/@LaravelPHP",
"title": "Laravel",
"description": "The official YouTube channel of Laravel, the clean stack for Artisans and agents. We will update you on what's new in the world of ...",
"thumbnails": [
{
"url": "https://yt3.ggpht.com/PTfpt7NG6STitdtR43_rNZJfT1hvUiAjYeJbGgC6ucaKSwbYOrsRqDOhfgeiibYE13diVOYE6g=s88-c-k-c0x00ffffff-no-rj-mo",
"width": 88,
"height": 88
},
{
"url": "https://yt3.ggpht.com/PTfpt7NG6STitdtR43_rNZJfT1hvUiAjYeJbGgC6ucaKSwbYOrsRqDOhfgeiibYE13diVOYE6g=s176-c-k-c0x00ffffff-no-rj-mo",
"width": 176,
"height": 176
}
],
"handle": "@LaravelPHP",
"subscriberCount": 79700,
"videoCount": null,
"isVerified": false
},
{
"type": "video",
"id": "P1ksWONe-Tc",
"url": "https://www.youtube.com/watch?v=P1ksWONe-Tc",
"title": "Laravel Worldwide Meetup - I'm a Marketer. Wait, I Can Build This?",
"description": "This month we are joined by Samantha Sappenfield from the Laravel marketing team. Sam didn't set out to become a builder.",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/P1ksWONe-Tc/hq720.jpg?sqp=-oaymwErCOgCEMoBSFryq4qpAx0IARUAAIhCGAHYAQHiAQoIGBACGAY4AUABuALzGA==&rs=AOn4CLAZH7JeXfOvD1fIyKWaN80ucq9KIg",
"width": 360,
"height": 202
},
{
"url": "https://i.ytimg.com/vi/P1ksWONe-Tc/hq720.jpg?sqp=-oaymwErCNAFEJQDSFryq4qpAx0IARUAAIhCGAHYAQHiAQoIGBACGAY4AUABuALzGA==&rs=AOn4CLDbQkbJ0xWKsjL43vVV-HeniPHPHA",
"width": 720,
"height": 404
}
],
"publishedText": "Streamed 2 days ago",
"viewCount": 2228,
"viewCountText": "2,228 views",
"duration": "56:43",
"lengthSeconds": 3403,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCfO2GiQwb-cwJTb1CuRSkwg",
"handle": "@LaravelPHP",
"name": "Laravel"
}
},
{
"type": "video",
"id": "IzcpPZqz2Nw",
"url": "https://www.youtube.com/watch?v=IzcpPZqz2Nw",
"title": "Your AI Agent Wants to Refund €48,000. Now What? (Laravel AI SDK 1.0)",
"description": "Laravel AI SDK 1.0 is out, and in this video I show you my three favorite new features by building them into a small space-tourism ...",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/IzcpPZqz2Nw/hq720.jpg?sqp=-oaymwErCOgCEMoBSFryq4qpAx0IARUAAIhCGAHYAQHiAQoIGBACGAY4AUABuALzGA==&rs=AOn4CLC9zQZZw1bISTrkI2Dq0J9AcDEq2Q",
"width": 360,
"height": 202
},
{
"url": "https://i.ytimg.com/vi/IzcpPZqz2Nw/hq720.jpg?sqp=-oaymwErCNAFEJQDSFryq4qpAx0IARUAAIhCGAHYAQHiAQoIGBACGAY4AUABuALzGA==&rs=AOn4CLDDtFjMfrOV_a4ysxL4V4KQdah_lg",
"width": 720,
"height": 404
}
],
"publishedText": "7 days ago",
"viewCount": 6416,
"viewCountText": "6,416 views",
"duration": "28:51",
"lengthSeconds": 1731,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCfO2GiQwb-cwJTb1CuRSkwg",
"handle": "@LaravelPHP",
"name": "Laravel"
}
}
],
"cursor": "EqwEEgdsYXJhdmVsGqAEU0JTQ0FSaFZRMlpQTWtkcFVYZGlMV04zU2xSaU1VTjFVbE5yZDJlQ0FRdHlTV1prWjE5UGRDMU1TWUlCQzAxUFRGcFBXSEZoYjIxTmdnRUxZMFJGVmxkaWVqSlFjRkdDQVF0TldYbEtORkIxVERSd1dZSUJJbEJNTUdWNWNscG5lR1IzYUhr..."
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/suggest
requires authentication
Search suggestions for a partial query, as YouTube shows them while typing.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/suggest'
params = {
'q': 'laravel',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/suggest';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'q' => 'laravel',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/suggest"
);
const params = {
"q": "laravel",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/suggest?q=laravel" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"q": "laravel"
},
"body": [
"laravel",
"laravel tutorial",
"laravel boost",
"laravel tutorial for beginners",
"laravel 13",
"laravel 12"
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/trending
requires authentication
Popular videos right now. YouTube retired its Trending page in 2025, so all returns the Hype leaderboard
(fast-rising videos) and each category returns that category's Explore page. Cached for 10 minutes.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/trending'
params = {
'category': 'all',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/trending';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'category' => 'all',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/trending"
);
const params = {
"category": "all",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/trending?category=all" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"category": "music"
},
"body": [
{
"type": "video",
"id": "9UQGXUlMYFU",
"url": "https://www.youtube.com/watch?v=9UQGXUlMYFU",
"title": "comehelpglo - onsra (official music video)",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/9UQGXUlMYFU/hq720.jpg?sqp=-oaymwFBCOgCEMoBSFryq4qpAzMIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB8AEB-AH-CYAC0AWKAgwIABABGDwgSihyMA8=&rs=AOn4CLAKVds_VIeVNhp9koQc0nGONsgsUg",
"width": 360,
"height": 202
},
{
"url": "https://i.ytimg.com/vi/9UQGXUlMYFU/hq720.jpg?sqp=-oaymwFBCNAFEJQDSFryq4qpAzMIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB8AEB-AH-CYAC0AWKAgwIABABGDwgSihyMA8=&rs=AOn4CLAmmczDUCRarydH75-lD1ArT6o_Kw",
"width": 720,
"height": 404
}
],
"publishedText": "3 weeks ago",
"viewCount": 236000,
"viewCountText": "236K views",
"duration": "2:12",
"lengthSeconds": 132,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCHGhHAyC4z9kU5v_P7s9w0Q",
"handle": null,
"name": "comehelpglo"
}
},
{
"type": "video",
"id": "TNjRdugYuy8",
"url": "https://www.youtube.com/watch?v=TNjRdugYuy8",
"title": "pupsies- misery. (Official Visualizer)",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/TNjRdugYuy8/hq720.jpg?sqp=-oaymwFBCOgCEMoBSFryq4qpAzMIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB8AEB-AG-B4AC0AWKAgwIABABGE8gYihlMA8=&rs=AOn4CLDV08oAUm132ztdLgGw73T0jBN3Ww",
"width": 360,
"height": 202
},
{
"url": "https://i.ytimg.com/vi/TNjRdugYuy8/hq720.jpg?sqp=-oaymwFBCNAFEJQDSFryq4qpAzMIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB8AEB-AG-B4AC0AWKAgwIABABGE8gYihlMA8=&rs=AOn4CLAloeGeyaSWnSXrOJGHDzblrPrQPQ",
"width": 720,
"height": 404
}
],
"publishedText": "1 month ago",
"viewCount": 1700000,
"viewCountText": "1.7M views",
"duration": "2:47",
"lengthSeconds": 167,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCYGulySmT33UgSLcPBr756Q",
"handle": null,
"name": "pupsies"
}
}
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Video
Video details, comments, transcripts, and related videos. id accepts a video id or any public link (watch?v=, youtu.be/, /shorts/, /embed/, /live/).
GET /v1/video
requires authentication
Video details and statistics: title, description, publish date, length, views, likes, comment count, category, tags, thumbnails, live status, channel, chapters, and the transcript languages available. Cached for 10 minutes.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/video'
params = {
'id': 'dQw4w9WgXcQ',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/video';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => 'dQw4w9WgXcQ',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/video"
);
const params = {
"id": "dQw4w9WgXcQ",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/video?id=dQw4w9WgXcQ" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"url": "https://www.youtube.com/watch?v=MOLZOXqaomM&t=10s"
},
"body": {
"id": "MOLZOXqaomM",
"url": "https://www.youtube.com/watch?v=MOLZOXqaomM",
"title": "Learn Laravel from Scratch [FULL BOOTCAMP COURSE]",
"description": "Welcome to the official Getting Started with Laravel course. In this bootcamp, we will learn how to build your first full-stack application with Laravel from start to finish, from `laravel new` to a d...",
"publishedAt": "2025-09-16T09:00:06-07:00",
"lengthSeconds": 7395,
"viewCount": 105869,
"likeCount": 2237,
"commentCount": 129,
"commentsTurnedOff": false,
"category": "Science & Technology",
"tags": [],
"language": "en",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/MOLZOXqaomM/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCulQSCBHgg7d9mv7JuHLcXbyfoIg",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/MOLZOXqaomM/hqdefault.jpg?sqp=-oaymwEmCMQBEG5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCjEZUbps4-MHeDAxGglYw0tpMwww",
"width": 196,
"height": 110
},
{
"url": "https://i.ytimg.com/vi/MOLZOXqaomM/hqdefault.jpg?sqp=-oaymwEnCPYBEIoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLB6WAVyCuBdfZULlfavhaJVWAp2Lg",
"width": 246,
"height": 138
}
],
"isShort": false,
"isLive": false,
"isUpcoming": false,
"isUnlisted": false,
"isFamilySafe": true,
"liveViewerCount": null,
"channel": {
"id": "UCfO2GiQwb-cwJTb1CuRSkwg",
"handle": "@LaravelPHP",
"name": "Laravel",
"url": "https://www.youtube.com/@LaravelPHP",
"avatar": "https://yt3.ggpht.com/PTfpt7NG6STitdtR43_rNZJfT1hvUiAjYeJbGgC6ucaKSwbYOrsRqDOhfgeiibYE13diVOYE6g=s88-c-k-c0x00ffffff-no-rj",
"subscriberCount": 79700
},
"chapters": [
{
"title": "What are we building?",
"startSeconds": 0
},
{
"title": "Setting up your Laravel project",
"startSeconds": 89
},
{
"title": "Your first route",
"startSeconds": 463
}
],
"availableTranscriptLanguages": [
{
"languageCode": "en",
"name": "English (auto-generated)",
"autoGenerated": true
}
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/video/comments
requires authentication
Top-level comments on a video. commentsTurnedOff is true when the uploader disabled comments; items is then empty.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/video/comments'
params = {
'id': 'dQw4w9WgXcQ',
'sort': 'top',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/video/comments';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => 'dQw4w9WgXcQ',
'sort' => 'top',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/video/comments"
);
const params = {
"id": "dQw4w9WgXcQ",
"sort": "top",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/video/comments?id=dQw4w9WgXcQ&sort=top" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "dQw4w9WgXcQ"
},
"body": {
"items": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg",
"text": "can confirm: he never gave us up",
"publishedText": "1 year ago",
"likeCount": 322000,
"replyCount": 962,
"isReply": false,
"author": {
"name": "@YouTube",
"channelId": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"avatar": "https://yt3.ggpht.com/3s6evpqAiDU9tQR4sC2siJippbH2RWVPnwHgyl4V0th2iuQz0VDQZbUhQBGmsxLYo-mjG6TqZQ=s88-c-k-c0x00ffffff-no-rj",
"isVerified": true,
"isCreator": false
}
},
{
"id": "UgxCxpKgbZ6a9lRi5np4AaABAg",
"text": "Today it's the day, we Rickroll ourselves.",
"publishedText": "5 years ago",
"likeCount": 1500,
"replyCount": 17,
"isReply": false,
"author": {
"name": "@Yundoxcloud27",
"channelId": "UC1NmXyk_lAHN4Efaaiyikfg",
"handle": "@Yundoxcloud27",
"avatar": "https://yt3.ggpht.com/b9BzhSp1hy1sQHN9Ag1vc9Ykvx--SlN2G1cZbIleSZr4Ecypi4XRSFs3EJ2CpKFKVG3-akntpFc=s88-c-k-c0x00ffffff-no-rj",
"isVerified": false,
"isCreator": false
}
}
],
"cursor": "Eg0SC2RRdzR3OVdnWGNRGAYyggMK2AJnZXRfcmFua2VkX3N0cmVhbXMtLUNxY0JDSUFFRlJlMzBUZ2FuQUVLbHdFSTJGOFFnQVFZQnlLTUFmdHRqWWhReTZmV3VYNW5xZ1NreXhGN0tyVDJFU0JJckkwQUZQVkNPb2I0SkEtcXJ2eXVxc0MyaGVMQXN2a01VQVFLbXhq...",
"commentsTurnedOff": false
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/video/comment-replies
requires authentication
Replies to one comment. Use a comment id from /video/comments.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/video/comment-replies'
params = {
'commentId': 'Ugzge340dBgB75hWBm54AaABAg',
'id': 'dQw4w9WgXcQ',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/video/comment-replies';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'commentId' => 'Ugzge340dBgB75hWBm54AaABAg',
'id' => 'dQw4w9WgXcQ',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/video/comment-replies"
);
const params = {
"commentId": "Ugzge340dBgB75hWBm54AaABAg",
"id": "dQw4w9WgXcQ",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/video/comment-replies?commentId=Ugzge340dBgB75hWBm54AaABAg&id=dQw4w9WgXcQ" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "dQw4w9WgXcQ",
"commentId": "Ugzge340dBgB75hWBm54AaABAg"
},
"body": {
"items": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHE9eIiztxR",
"text": "YOUTUBE AND ONE LIKE WOOHAAAAH",
"publishedText": "1 year ago",
"likeCount": 7500,
"replyCount": 0,
"isReply": true,
"author": {
"name": "@linganguliguliwatcha",
"channelId": "UCjFRISlX-LPxiqViJAE3h6Q",
"handle": "@linganguliguliwatcha",
"avatar": "https://yt3.ggpht.com/AbGqKNjK9k5tyOqdV7cdXx-GgnGuuGQ5wj8RN42U5YCDvYHT0vaOKXGFahR36iaDPseGN08DjQ=s88-c-k-c0x00ffffff-no-rj",
"isVerified": false,
"isCreator": false
}
},
{
"id": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAB_-JmDA",
"text": "HEY YOUTUBE",
"publishedText": "1 year ago",
"likeCount": 3100,
"replyCount": 0,
"isReply": true,
"author": {
"name": "@_bugrabilgin",
"channelId": "UCg9tPtxMOieUEyhSv63uJ4g",
"handle": "@_bugrabilgin",
"avatar": "https://yt3.ggpht.com/LvMpN24GYYr8w43sGoMeYZYejDPJz_skehI6jm_XGGhfM5YeRa9OOsaplj60LnFNehE79ZxImg=s88-c-k-c0x00ffffff-no-rj",
"isVerified": false,
"isCreator": false
}
}
],
"cursor": "Eg0SC2RRdzR3OVdnWGNRGAYy2AEKUWdldF9jb21tZW50X3dpdGhfcmVwbGllc19zdHJlYW0tLUNnZ0lnQVFWRjdmUk9CSUZDS0FnR0FFaURRb0xDSWpnbjhBR0VKaVYxUmhRQUZnQhpQEhpVZ3pnZTM0MGRCZ0I3NWhXQm01NEFhQUJBZyICCAAqGFVDdUFYRmtnc3cx..."
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/video/transcript
requires authentication
Captions as timed text cues. Without language, the video's default track is used, then English.
availableTranscriptLanguages is always included. A video without captions returns empty cues.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/video/transcript'
params = {
'id': 'dQw4w9WgXcQ',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/video/transcript';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => 'dQw4w9WgXcQ',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/video/transcript"
);
const params = {
"id": "dQw4w9WgXcQ",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/video/transcript?id=dQw4w9WgXcQ" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "dQw4w9WgXcQ"
},
"body": {
"id": "dQw4w9WgXcQ",
"languageCode": "en",
"autoGenerated": false,
"availableTranscriptLanguages": [
{
"languageCode": "en",
"name": "English",
"autoGenerated": false
},
{
"languageCode": "en",
"name": "English (auto-generated)",
"autoGenerated": true
},
{
"languageCode": "de-DE",
"name": "German (Germany)",
"autoGenerated": false
},
{
"languageCode": "ja",
"name": "Japanese",
"autoGenerated": false
},
{
"languageCode": "pt-BR",
"name": "Portuguese (Brazil)",
"autoGenerated": false
},
{
"languageCode": "es-419",
"name": "Spanish (Latin America)",
"autoGenerated": false
}
],
"cues": [
{
"text": "[♪♪♪]",
"startSeconds": 1.36,
"durationSeconds": 1.68
},
{
"text": "♪ We're no strangers to love ♪",
"startSeconds": 18.64,
"durationSeconds": 3.24
},
{
"text": "♪ You know the rules and so do I ♪",
"startSeconds": 22.64,
"durationSeconds": 4.32
},
{
"text": "♪ A full commitment's what I'm thinking of ♪",
"startSeconds": 27.04,
"durationSeconds": 4
}
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/video/related
requires authentication
Videos YouTube recommends next to a video.
GET /v1/video/batch
requires authentication
Details for up to 20 videos in one call, in the same shape as /video. An id that could not be resolved
is returned with an error field instead of failing the whole request.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/video/batch'
params = {
'ids': 'dQw4w9WgXcQ,MOLZOXqaomM',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/video/batch';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'ids' => 'dQw4w9WgXcQ,MOLZOXqaomM',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/video/batch"
);
const params = {
"ids": "dQw4w9WgXcQ,MOLZOXqaomM",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/video/batch?ids=dQw4w9WgXcQ%2CMOLZOXqaomM" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"ids": "dQw4w9WgXcQ,aaaaaaaaaaa,not-an-id"
},
"body": [
{
"id": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"description": "The official video for “Never Gonna Give You Up” by Rick Astley. \n\nNever: The Autobiography 📚 OUT NOW! \nFollow this link to get your copy and listen to Rick’s ‘Never’ playlist ❤️ #RickAstleyNever\nhttp...",
"publishedAt": "2009-10-24T23:57:33-07:00",
"lengthSeconds": 213,
"viewCount": 1822102729,
"likeCount": 19453281,
"commentCount": 2400000,
"commentsTurnedOff": false,
"category": "Music",
"tags": [
"rick astley",
"Never Gonna Give You Up",
"nggyu",
"never gonna give you up lyrics",
"rick rolled"
],
"language": "en",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLBnMMOHLLLps0tlvAfAK0OZIjH0ag",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEmCMQBEG5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLAUiD0XY5TvJ1WbvTR4qqR4YbczDA",
"width": 196,
"height": 110
},
{
"url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEnCPYBEIoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLCRUSG-V-rRLr-poV94Wno2jn4e5w",
"width": 246,
"height": 138
}
],
"isShort": false,
"isLive": false,
"isUpcoming": false,
"isUnlisted": false,
"isFamilySafe": true,
"liveViewerCount": null,
"channel": {
"id": "UCuAXFkgsw1L7xaCfnd5JJOw",
"handle": "@RickAstleyYT",
"name": "Rick Astley",
"url": "https://www.youtube.com/@RickAstleyYT",
"avatar": "https://yt3.ggpht.com/_ShEGOdg-t5YGJse14Ooq6FYBZqX_QSlhaTNjG06miYusm5lWm1UroLyVxnYtahADfRTVLtuVQ=s176-c-k-c0x00ffffff-no-rj",
"subscriberCount": 4550000
},
"chapters": [],
"availableTranscriptLanguages": [
{
"languageCode": "en",
"name": "English",
"autoGenerated": false
},
{
"languageCode": "en",
"name": "English (auto-generated)",
"autoGenerated": true
},
{
"languageCode": "de-DE",
"name": "German (Germany)",
"autoGenerated": false
}
]
},
{
"id": "aaaaaaaaaaa",
"url": "https://www.youtube.com/watch?v=aaaaaaaaaaa",
"error": "Video not found, private, or not available to the public client"
},
{
"id": "not-an-id",
"url": null,
"error": "Not a video id or public YouTube video URL"
}
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Channel
Channel profile, uploads, Shorts, live streams, playlists, and search within a channel. Identify the channel with a channel id (UC...), a handle (@name), or a channel URL.
GET /v1/channel
requires authentication
Channel profile: title, handle, description, country, join date, subscriber, video, and view counts, keywords, avatar, banner, and links. Cached for 10 minutes.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/channel'
params = {
'id': '@YouTube',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/channel';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => '@YouTube',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/channel"
);
const params = {
"id": "@YouTube",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/channel?id=%40YouTube" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "@YouTube"
},
"body": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"url": "https://www.youtube.com/@YouTube",
"title": "YouTube",
"description": "YouTube's official YouTube channel",
"country": "United States",
"joinedDate": null,
"subscriberCount": 46400000,
"videoCount": 1625,
"viewCount": 1333857466,
"keywords": [
"youtube",
"official",
"channel"
],
"avatar": [
{
"url": "https://yt3.googleusercontent.com/3s6evpqAiDU9tQR4sC2siJippbH2RWVPnwHgyl4V0th2iuQz0VDQZbUhQBGmsxLYo-mjG6TqZQ=s900-c-k-c0x00ffffff-no-rj",
"width": 900,
"height": 900
}
],
"banner": [
{
"url": "https://yt3.googleusercontent.com/vwF2rAyBbG2VK0i1HIs2MqRgFwQKI9x54GKpHUzo_2R6jTc4q6NnOv45QsFUHpADsThGJR-1cw=w1060-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
"width": 1060,
"height": 175
},
{
"url": "https://yt3.googleusercontent.com/vwF2rAyBbG2VK0i1HIs2MqRgFwQKI9x54GKpHUzo_2R6jTc4q6NnOv45QsFUHpADsThGJR-1cw=w1138-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
"width": 1138,
"height": 188
}
],
"isFamilySafe": true,
"links": [
{
"title": "Subscribe",
"url": "https://youtube.com/user/youtube?sub_confirmation=1"
},
{
"title": "Instagram",
"url": "https://instagram.com/youtube"
},
{
"title": "TikTok",
"url": "https://www.tiktok.com/@youtube"
}
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/channel/videos
requires authentication
A channel's uploads, newest first. publishedAt is estimated from YouTube's relative text ("3 days ago").
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/channel/videos'
params = {
'id': '@YouTube',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/channel/videos';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => '@YouTube',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/channel/videos"
);
const params = {
"id": "@YouTube",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/channel/videos?id=%40YouTube" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "@YouTube"
},
"body": {
"items": [
{
"type": "video",
"id": "pRrmQUm6Zvg",
"url": "https://www.youtube.com/watch?v=pRrmQUm6Zvg",
"title": "Turning the YouTube Logo Into a Monster",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/pRrmQUm6Zvg/hq720.jpg?sqp=-oaymwEnCOgCEMoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLBfz05b-Wk-3NYA3fq-Ghz-BtbXtQ",
"width": 360,
"height": 202
},
{
"url": "https://i.ytimg.com/vi/pRrmQUm6Zvg/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLDd_EnORq8MoepXnLWtzZsqYt0P3Q",
"width": 720,
"height": 404
}
],
"publishedText": "1 day ago",
"viewCount": 1200000,
"viewCountText": "1.2M views",
"duration": "10:06",
"lengthSeconds": 606,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
},
"publishedAt": "2026-09-30T19:48:44+00:00"
},
{
"type": "video",
"id": "wGA27zJEnaU",
"url": "https://www.youtube.com/watch?v=wGA27zJEnaU",
"title": "Keira Riff reacts to her Watch History",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/wGA27zJEnaU/hq720.jpg?sqp=-oaymwEnCOgCEMoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLA0eoQGlheLvs9D1ccKYV4DwM9B5g",
"width": 360,
"height": 202
},
{
"url": "https://i.ytimg.com/vi/wGA27zJEnaU/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLAldmSwLHt319Oe4BpTcwxuPguMkA",
"width": 720,
"height": 404
}
],
"publishedText": "1 month ago",
"viewCount": 2200000,
"viewCountText": "2.2M views",
"duration": "6:27",
"lengthSeconds": 387,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
},
"publishedAt": "2026-09-01T19:48:44+00:00"
}
],
"cursor": "4qmFsgLZCRIYVUNCUjgtNjAtQjI4aHAyQm1EUGRudGNRGrwJOGdhRUJ4cUJCM3ItQmpyN0Jnb2tObUl4WVdZeU5tSXRNREF3TUMweU5qZG1MV0kwTVdRdE1UUmpNVFJsWmpVd1lqaGpFdEFHUVdaelYydHNORU5OYlZsNlZYTjRVRGhKVEhjMFQyRnBkWGhtZWt0eGFF..."
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/channel/shorts
requires authentication
A channel's Shorts, newest first.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/channel/shorts'
params = {
'id': '@YouTube',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/channel/shorts';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => '@YouTube',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/channel/shorts"
);
const params = {
"id": "@YouTube",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/channel/shorts?id=%40YouTube" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "@YouTube"
},
"body": {
"items": [
{
"type": "video",
"id": "_wogmiwYknY",
"url": "https://www.youtube.com/shorts/_wogmiwYknY",
"title": "I’m cooked chat 💙 #YoutubePartner",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/_wogmiwYknY/oar2.jpg?sqp=-oaymwEoCJUDENAFSFqQAgHyq4qpAxcIARUAAIhC2AEB4gEKCBgQAhgGOAFAAQ==&rs=AOn4CLDadwQ3jkUSXLazrqRtw3_Tc647ZQ&usqp=CCk",
"width": 405,
"height": 720
},
{
"url": "https://i.ytimg.com/vi/_wogmiwYknY/oar2.jpg?sqp=-oaymwErCJUDEOAESFqQAgHyq4qpAxoIARUAAIhCyAEB2AEB4gEKCBgQAhgGOAFAAQ==&rs=AOn4CLBKVo2b2GVP1e098oLNhXaAfWBFYA&usqp=CCk",
"width": 405,
"height": 608
}
],
"publishedText": null,
"viewCount": 515,
"viewCountText": "515 views",
"duration": null,
"lengthSeconds": null,
"isShort": true,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
}
},
{
"type": "video",
"id": "NeohC9u-Yx0",
"url": "https://www.youtube.com/shorts/NeohC9u-Yx0",
"title": "and so it begins watch @Brooklyn Nine-Nine on @Peacock with YouTube Primetime Channels",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/NeohC9u-Yx0/oar2.jpg?sqp=-oaymwEoCJUDENAFSFqQAgHyq4qpAxcIARUAAIhC2AEB4gEKCBgQAhgGOAFAAQ==&rs=AOn4CLAXSx1Bx1s3SCniK-YjwA2M_570Ww&usqp=CCk",
"width": 405,
"height": 720
},
{
"url": "https://i.ytimg.com/vi/NeohC9u-Yx0/oar2.jpg?sqp=-oaymwErCJUDEOAESFqQAgHyq4qpAxoIARUAAIhCyAEB2AEB4gEKCBgQAhgGOAFAAQ==&rs=AOn4CLAqNlYCPpkqToNGWrJtIfD7Cdh57w&usqp=CCk",
"width": 405,
"height": 608
}
],
"publishedText": null,
"viewCount": 19000,
"viewCountText": "19K views",
"duration": null,
"lengthSeconds": null,
"isShort": true,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
}
}
],
"cursor": "4qmFsgLBDBIYVUNCUjgtNjAtQjI4aHAyQm1EUGRudGNRGqQMOGdhU0NScVBDVktNQ1RLSkNRb2tObUl3TmpZME1EQXRNREF3TUMweVpUYzJMVGxpT1dZdE5UZ3lOREk1WVdVM1pXUXdFdDRJUVdaelYydHNOVUV4TmpoRVJrRjRaRmhhTFRsT01YWm9URlV3ZWs1cU5X..."
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/channel/streams
requires authentication
A channel's live, upcoming, and past streams. isLive and liveViewerCount are set for streams that are live now.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/channel/streams'
params = {
'id': '@YouTube',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/channel/streams';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => '@YouTube',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/channel/streams"
);
const params = {
"id": "@YouTube",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/channel/streams?id=%40YouTube" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "@YouTube"
},
"body": {
"items": [
{
"type": "video",
"id": "kIaRERgMqSY",
"url": "https://www.youtube.com/watch?v=kIaRERgMqSY",
"title": "Team J Balvin vs. Team Druski: YouTube SBLX Flag Football Game",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/kIaRERgMqSY/hq720.jpg?sqp=-oaymwEnCOgCEMoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLCmyxIyw4V8rY6YnZp3Vsg1rgJKvQ",
"width": 360,
"height": 202
},
{
"url": "https://i.ytimg.com/vi/kIaRERgMqSY/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLDbbBf4wUjBoGIPfGmy6_vJYcAliA",
"width": 720,
"height": 404
}
],
"publishedText": "Streamed 7 months ago",
"viewCount": null,
"viewCountText": null,
"duration": "1:46:40",
"lengthSeconds": 6400,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
}
},
{
"type": "video",
"id": "XZiJMU7aDYo",
"url": "https://www.youtube.com/watch?v=XZiJMU7aDYo",
"title": "The NFL's Flag Football Game on YouTube: London Edition",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/XZiJMU7aDYo/hq720.jpg?sqp=-oaymwEnCOgCEMoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLDBexe9yOnaOcPIoi2JZWnhFFY1OQ",
"width": 360,
"height": 202
},
{
"url": "https://i.ytimg.com/vi/XZiJMU7aDYo/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLASstttbTJ8FuKg4hoJQTwyPfh-pg",
"width": 720,
"height": 404
}
],
"publishedText": "Streamed 11 months ago",
"viewCount": null,
"viewCountText": null,
"duration": "1:57:41",
"lengthSeconds": 7061,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
}
}
],
"cursor": null
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/channel/playlists
requires authentication
Playlists created by a channel.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/channel/playlists'
params = {
'id': '@YouTube',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/channel/playlists';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => '@YouTube',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/channel/playlists"
);
const params = {
"id": "@YouTube",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/channel/playlists?id=%40YouTube" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "@YouTube"
},
"body": {
"items": [
{
"type": "playlist",
"id": "PLKDZ1ig0uz-U",
"url": "https://www.youtube.com/playlist?list=PLKDZ1ig0uz-U",
"title": "Deep clean dreams",
"videoCount": 13,
"thumbnail": [
{
"url": "https://i.ytimg.com/pl_c/PLKDZ1ig0uz-U/studio_square_thumbnail.jpg?sqp=CIy3-tUG-oaymwEICKoDEPABSFqi85f_AwYI-_ru0wY=&rs=AOn4CLDwjxixzPTX0nF0fTGM3NPL0XXXMA",
"width": 426,
"height": 240
},
{
"url": "https://i.ytimg.com/pl_c/PLKDZ1ig0uz-U/studio_square_thumbnail.jpg?sqp=CPDw-tUG-oaymwEICNYGEOADSFqi85f_AwYI-_ru0wY=&rs=AOn4CLBNbZewuaQD5uhAkIphiSj_eQcxlg",
"width": 854,
"height": 480
},
{
"url": "https://i.ytimg.com/pl_c/PLKDZ1ig0uz-U/studio_square_thumbnail.jpg?sqp=CN_D-tUG-oaymwEICIAKENAFSFqi85f_AwYI-_ru0wY=&rs=AOn4CLBHfU1fgCQLzDQPuUBJUO2nQ0hlHg",
"width": 1280,
"height": 720
}
],
"updatedText": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
}
},
{
"type": "playlist",
"id": "PLCYvO0_kPn2g",
"url": "https://www.youtube.com/playlist?list=PLCYvO0_kPn2g",
"title": "Thinking inside the box",
"videoCount": 15,
"thumbnail": [
{
"url": "https://i.ytimg.com/pl_c/PLCYvO0_kPn2g/studio_square_thumbnail.jpg?sqp=CM7e-tUG-oaymwEICKoDEPABSFqi85f_AwYIpYHr0wY=&rs=AOn4CLDb4fPV_6_zp2pRk9WUnxeYFlbJfw",
"width": 426,
"height": 240
},
{
"url": "https://i.ytimg.com/pl_c/PLCYvO0_kPn2g/studio_square_thumbnail.jpg?sqp=CLrW-tUG-oaymwEICNYGEOADSFqi85f_AwYIpYHr0wY=&rs=AOn4CLB8O6mA0crDwPHVXEGx_Znlo1my5g",
"width": 854,
"height": 480
},
{
"url": "https://i.ytimg.com/pl_c/PLCYvO0_kPn2g/studio_square_thumbnail.jpg?sqp=CKDI-tUG-oaymwEICIAKENAFSFqi85f_AwYIpYHr0wY=&rs=AOn4CLA-gEptuUEC7pvIRdSwy4VEK_I6UA",
"width": 1280,
"height": 720
}
],
"updatedText": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
}
}
],
"cursor": "4qmFsgJ4EhhVQ0JSOC02MC1CMjhocDJCbURQZG50Y1EaKkVnbHdiR0Y1YkdsemRITVlBeUFBTUFFNEFlb0RCME5uVGtSUmFsRSUzRJoCL2Jyb3dzZS1mZWVkVUNCUjgtNjAtQjI4aHAyQm1EUGRudGNRcGxheWxpc3RzMTA0"
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/channel/search
requires authentication
Search the videos of one channel.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/channel/search'
params = {
'id': '@YouTube',
'q': 'music',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/channel/search';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => '@YouTube',
'q' => 'music',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/channel/search"
);
const params = {
"id": "@YouTube",
"q": "music",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/channel/search?id=%40YouTube&q=music" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"q": "music"
},
"body": {
"items": [
{
"type": "video",
"id": "FwWtK5c7iCE",
"url": "https://www.youtube.com/watch?v=FwWtK5c7iCE",
"title": "#FIFAWorldCup Final Halftime Show hallelujah 🙌",
"description": "watch @justinbieber's performance now, only on FIFA's YouTube channel",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/FwWtK5c7iCE/hq2.jpg?sqp=-oaymwFACKgBEF5IWvKriqkDMwgBFQAAiEIYANgBAeIBCggYEAIYBjgBQAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBNKEcwDw==&rs=AOn4CLCEHfK5_RSooKLcV7QtzmqwtrhT0g",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/FwWtK5c7iCE/hq2.jpg?sqp=-oaymwFACMQBEG5IWvKriqkDMwgBFQAAiEIYANgBAeIBCggYEAIYBjgBQAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBNKEcwDw==&rs=AOn4CLD_gKrdf7NveuyiMXmaNccta7Etgg",
"width": 196,
"height": 110
},
{
"url": "https://i.ytimg.com/vi/FwWtK5c7iCE/hq2.jpg?sqp=-oaymwFBCPYBEIoBSFryq4qpAzMIARUAAIhCGADYAQHiAQoIGBACGAY4AUAB8AEB-AG2CIACgA-KAgwIABABGGUgTShHMA8=&rs=AOn4CLDmswe73Stu7rUYHQLmRfg9BmXLLQ",
"width": 246,
"height": 138
}
],
"publishedText": "2 months ago",
"viewCount": 135544,
"viewCountText": "135,544 views",
"duration": "0:26",
"lengthSeconds": 26,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
}
},
{
"type": "video",
"id": "yahGkJP8FkQ",
"url": "https://www.youtube.com/watch?v=yahGkJP8FkQ",
"title": "iconic 🍍 @KarolG",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/yahGkJP8FkQ/hqdefault.jpg?sqp=-oaymwFACKgBEF5IWvKriqkDMwgBFQAAiEIYANgBAeIBCggYEAIYBjgBQAHwAQH4Ac4FgAKACooCDAgAEAEYRiBRKGUwDw==&rs=AOn4CLAsln77Lg3f9kIx6VlI0ief8q0ixw",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/yahGkJP8FkQ/hqdefault.jpg?sqp=-oaymwFACMQBEG5IWvKriqkDMwgBFQAAiEIYANgBAeIBCggYEAIYBjgBQAHwAQH4Ac4FgAKACooCDAgAEAEYRiBRKGUwDw==&rs=AOn4CLCOLQ2zuHAWF8oGLe8OZu3DtSPg-g",
"width": 196,
"height": 110
},
{
"url": "https://i.ytimg.com/vi/yahGkJP8FkQ/hqdefault.jpg?sqp=-oaymwFBCPYBEIoBSFryq4qpAzMIARUAAIhCGADYAQHiAQoIGBACGAY4AUAB8AEB-AHOBYACgAqKAgwIABABGEYgUShlMA8=&rs=AOn4CLBfjr0MeJdxzHsmbPLn1pApibYj-g",
"width": 246,
"height": 138
}
],
"publishedText": "1 year ago",
"viewCount": 50324477,
"viewCountText": "50,324,477 views",
"duration": "0:07",
"lengthSeconds": 7,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube"
}
}
],
"cursor": "4qmFsgJ1EhhVQ0JSOC02MC1CMjhocDJCbURQZG50Y1EaJkNCNFNCbk5sWVhKamFEQUJPQUZnQVdvQWVnTkhRalM0QVFBJTNEWgVtdXNpY5oCKWJyb3dzZS1mZWVkVUNCUjgtNjAtQjI4aHAyQm1EUGRudGNRc2VhcmNo"
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Playlist
Public playlists. id accepts a playlist id or any URL with list=.
GET /v1/playlist
requires authentication
Playlist details: title, description, video count, thumbnail, and owner channel.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/playlist'
params = {
'id': 'PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/playlist';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => 'PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/playlist"
);
const params = {
"id": "PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/playlist?id=PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "PLKDZ1ig0uz-U"
},
"body": {
"id": "PLKDZ1ig0uz-U",
"url": "https://www.youtube.com/playlist?list=PLKDZ1ig0uz-U",
"title": "Deep clean dreams",
"description": "Every scratch, stain, and dent has a story. See how master detailers bring cars back to life.",
"videoCount": 13,
"viewCount": 74628,
"updatedText": "Last updated on Sep 2, 2026",
"thumbnail": [
{
"url": "https://i.ytimg.com/pl_c/PLKDZ1ig0uz-U/studio_square_thumbnail.jpg?sqp=CMvM-tUG-oaymwEICKoDEPABSFqi85f_AwYI-_ru0wY=&rs=AOn4CLCodvNb08TzEG5JaGRZ_HQG1OyB_w&days_since_epoch=20727",
"width": 426,
"height": 240
},
{
"url": "https://i.ytimg.com/pl_c/PLKDZ1ig0uz-U/studio_square_thumbnail.jpg?sqp=CPKu-tUG-oaymwEICNYGEOADSFqi85f_AwYI-_ru0wY=&rs=AOn4CLAdnykfTAslIRD_wiBc3jXlJ3L-Wg&days_since_epoch=20727",
"width": 854,
"height": 480
},
{
"url": "https://i.ytimg.com/pl_c/PLKDZ1ig0uz-U/studio_square_thumbnail.jpg?sqp=CPDm-tUG-oaymwEICIAKENAFSFqi85f_AwYI-_ru0wY=&rs=AOn4CLAto6MjB7ScLgYuAuRYN3CnMW1fJg&days_since_epoch=20727",
"width": 1280,
"height": 720
}
],
"channel": {
"id": "UCBR8-60-B28hp2BmDPdntcQ",
"handle": "@YouTube",
"name": "YouTube",
"url": "https://www.youtube.com/@YouTube"
}
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/playlist/videos
requires authentication
Videos in a playlist, in playlist order, with their position.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/playlist/videos'
params = {
'id': 'PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/playlist/videos';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'id' => 'PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/playlist/videos"
);
const params = {
"id": "PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/playlist/videos?id=PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"id": "PLKDZ1ig0uz-U"
},
"body": {
"items": [
{
"position": 1,
"type": "video",
"id": "9rqQgOERpDo",
"url": "https://www.youtube.com/watch?v=9rqQgOERpDo",
"title": "Restoring an ABANDONED 1963 Split Window Corvette!",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/9rqQgOERpDo/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLDPqFjeRI6yknhsPXzfZQLFrsbEFQ",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/9rqQgOERpDo/hqdefault.jpg?sqp=-oaymwEmCMQBEG5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLDIWPM0j9P2FvH0Uao3hxSncUtMtg",
"width": 196,
"height": 110
},
{
"url": "https://i.ytimg.com/vi/9rqQgOERpDo/hqdefault.jpg?sqp=-oaymwEnCPYBEIoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLCMuuNEvINBKB2Jl9QqqEzNI3O4XQ",
"width": 246,
"height": 138
}
],
"publishedText": "1 month ago",
"viewCount": 776000,
"viewCountText": "776K views",
"duration": "31:57",
"lengthSeconds": 1917,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCfP224f7wOyuEtoTh80cNkQ",
"handle": "@WDDetailing",
"name": "WD Detailing"
}
},
{
"position": 2,
"type": "video",
"id": "F_AuYfa2whs",
"url": "https://www.youtube.com/watch?v=F_AuYfa2whs",
"title": "Can This ABANDONED $250 Mustang Be Saved?!",
"description": null,
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/F_AuYfa2whs/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLDhcwAqedJre-lgDOKH3wQoj_7zLw",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/F_AuYfa2whs/hqdefault.jpg?sqp=-oaymwEmCMQBEG5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLAYEJxmv245-4x0ESWW71U1JkLQAw",
"width": 196,
"height": 110
},
{
"url": "https://i.ytimg.com/vi/F_AuYfa2whs/hqdefault.jpg?sqp=-oaymwEnCPYBEIoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLDrLjaf8laat-ZpBAFOPz_DfaRu0Q",
"width": 246,
"height": 138
}
],
"publishedText": "2 months ago",
"viewCount": 148000,
"viewCountText": "148K views",
"duration": "26:06",
"lengthSeconds": 1566,
"isShort": false,
"isLive": false,
"isUpcoming": false,
"liveViewerCount": null,
"channel": {
"id": "UCAQHQEO4QpI5dXtr3vLoFCg",
"handle": "@TheDetailGeek",
"name": "The Detail Geek"
}
}
],
"cursor": null
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resolve
Turn any public YouTube link into an id.
GET /v1/resolve
requires authentication
Identify a YouTube link. Returns its type (video, short, channel, or playlist), the id, and the canonical URL.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/youtube/resolve'
params = {
'url': 'https://youtu.be/dQw4w9WgXcQ',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/youtube/resolve';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'url' => 'https://youtu.be/dQw4w9WgXcQ',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/youtube/resolve"
);
const params = {
"url": "https://youtu.be/dQw4w9WgXcQ",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/youtube/resolve?url=https%3A%2F%2Fyoutu.be%2FdQw4w9WgXcQ" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"url": "https://youtu.be/dQw4w9WgXcQ"
},
"body": {
"type": "video",
"id": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.