MENU navbar-image

▶️ YouTube

YouTube API for public video, channel, and playlist metadata.

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.

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."
        ]
    }
}
 

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."
        ]
    }
}
 

Request      

GET v1/youtube/suggest

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
q required string

Partial search term. Example: laravel

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

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."
        ]
    }
}
 

Request      

GET v1/youtube/video

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Video id or URL. Required unless url is sent. Example: dQw4w9WgXcQ

url optional string

Video URL, as an alternative to id.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/video/comments

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Video id or URL. Required unless url is sent. Example: dQw4w9WgXcQ

url optional string

Video URL, as an alternative to id.

sort optional string

top (default) or new. Example: top

cursor optional string

Pagination cursor from the previous page.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/video/comment-replies

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
commentId required string

Comment id. Example: Ugzge340dBgB75hWBm54AaABAg

id required string

Video id or URL the comment belongs to. Example: dQw4w9WgXcQ

cursor optional string

Pagination cursor from the previous page.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/video/transcript

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Video id or URL. Required unless url is sent. Example: dQw4w9WgXcQ

url optional string

Video URL, as an alternative to id.

language optional string

Transcript language code, for example en or de-DE.

requires authentication

Videos YouTube recommends next to a video.

Example request:
import requests
import json

url = 'https://api.steadyapi.com/v1/youtube/video/related'
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/related';
$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/related"
);

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/related?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": {
        "items": [
            {
                "type": "video",
                "id": "09839DpTctU",
                "url": "https://www.youtube.com/watch?v=09839DpTctU",
                "title": "Eagles - Hotel California (Live 1977) (Official Video) [HD]",
                "description": null,
                "thumbnails": [
                    {
                        "url": "https://i.ytimg.com/vi/09839DpTctU/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLC8B66MwcHgCnn_NBtxYDwWzbWHbQ",
                        "width": 168,
                        "height": 94
                    },
                    {
                        "url": "https://i.ytimg.com/vi/09839DpTctU/hqdefault.jpg?sqp=-oaymwEnCNACELwBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLCpkzyhnXe2dIihEZuyu6rnwrVzCQ",
                        "width": 336,
                        "height": 188
                    }
                ],
                "publishedText": "3y ago",
                "viewCount": 929000000,
                "viewCountText": "929M",
                "duration": "6:45",
                "lengthSeconds": 405,
                "isShort": false,
                "isLive": false,
                "isUpcoming": false,
                "liveViewerCount": null,
                "channel": {
                    "id": "UCPTypnDNlOZVnD7MY30_YBw",
                    "handle": null,
                    "name": "Eagles"
                }
            },
            {
                "type": "video",
                "id": "qWnLamjA_Qk",
                "url": "https://www.youtube.com/watch?v=qWnLamjA_Qk",
                "title": "Eddie Murphy's Obama Impression Had Everyone Crying NONSTOP!",
                "description": null,
                "thumbnails": [
                    {
                        "url": "https://i.ytimg.com/vi/qWnLamjA_Qk/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCZ1FKRGnWFhS_lr5JZQsdep2AtqQ",
                        "width": 168,
                        "height": 94
                    },
                    {
                        "url": "https://i.ytimg.com/vi/qWnLamjA_Qk/hqdefault.jpg?sqp=-oaymwEnCNACELwBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLBk83unnGR05RiA9MesjIkyuSUbaw",
                        "width": 336,
                        "height": 188
                    }
                ],
                "publishedText": "2mo ago",
                "viewCount": 1500000,
                "viewCountText": "1.5M",
                "duration": "13:03",
                "lengthSeconds": 783,
                "isShort": false,
                "isLive": false,
                "isUpcoming": false,
                "liveViewerCount": null,
                "channel": {
                    "id": "UCzhao6cyISRAuxNjfxt1E7w",
                    "handle": "@CelebReplayTV",
                    "name": "Celeb Replay TV"
                }
            }
        ],
        "cursor": "CBoSDRILZFF3NHc5V2dYY1EYACqYD01nb0lzTy1LaE1xR3F1MEoyczZMNnd5ZkN3cWNDd29EOGo0QUNnN0NQZ3NJNDdTeGd1YmV5cF93QVFvTndqNEtDS3p6MXBqRHE5LWpiQW9Od2o0S0NJUGxqY0szeUxyc1JRb093ajRMQ0ozLXBxQ0J5NlhtLXdFS0RzSS1Dd2pp..."
    }
}
 

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."
        ]
    }
}
 

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."
        ]
    }
}
 

Request      

GET v1/youtube/video/batch

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
ids required string

Comma-separated video ids or URLs, up to 20. Example: dQw4w9WgXcQ,MOLZOXqaomM

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/channel

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Channel id, handle, or URL. One of id, handle, or url is required. Example: @YouTube

handle optional string

Channel handle.

url optional string

Channel URL.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/channel/videos

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Channel id, handle, or URL. Example: @YouTube

handle optional string

Channel handle.

cursor optional string

Pagination cursor from the previous page.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/channel/shorts

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Channel id, handle, or URL. Example: @YouTube

handle optional string

Channel handle.

cursor optional string

Pagination cursor from the previous page.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/channel/streams

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Channel id, handle, or URL. Example: @YouTube

handle optional string

Channel handle.

cursor optional string

Pagination cursor from the previous page.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/channel/playlists

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Channel id, handle, or URL. Example: @YouTube

handle optional string

Channel handle.

cursor optional string

Pagination cursor from the previous page.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

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."
        ]
    }
}
 

Request      

GET v1/youtube/playlist

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Playlist id or URL. Required unless url is sent. Example: PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt

url optional string

Playlist URL, as an alternative to id.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/playlist/videos

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
id optional string

Playlist id or URL. Required unless url is sent. Example: PLbpi6ZahtOH71mwANLzAlPX9cZafnzIqt

url optional string

Playlist URL, as an alternative to id.

cursor optional string

Pagination cursor from the previous page.

country optional string

Two-letter region code (default US).

language optional string

Interface language (default en).

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."
        ]
    }
}
 

Request      

GET v1/youtube/resolve

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
url required string

A YouTube link. Example: https://youtu.be/dQw4w9WgXcQ