YouTube API endpoint
Retrieve YouTube videos by tag
Returns normalized videos from the public YouTube hashtag page for the supplied tag. Set `type=shorts` to use the Shorts tab, or pass `continuation_token` from a previous response to fetch the next page.
GETapiKey3 credits/requestyoutube.tagResponseDoc
/youtube/tag/{tag}Parameters
| Name | In | Type | Required | Enum | Example | Description |
|---|---|---|---|---|---|---|
| tag | path | string | Yes | Tag to filter videos | ||
| type | query | string | No | all, shorts | Result tab to load | |
| continuation_token | query | string | No | Continuation token for pagination, first page if empty | ||
| x-api-key | header | string | Yes | API key required |
Authentication
Send your scraping API key in the x-api-key header. Use the console API Keys page to rotate or select the active key.
Billing
Endpoint usage is metered in credits. The plan prices, included credits, limits, and overage rates below match the active backend billing configuration.
- Credit cost
- 3 credits/request
- Charged response
- Successful 2xx responses
| Plan | Price | Included credits | Daily cap | Rate limit | Overage |
|---|---|---|---|---|---|
| Free | $0/mo | 2,000 | 500 daily credits | 5/min | No overage |
| Starter | $9/mo | 20,000 | 5,000 daily credits | 15/min | $0.75/1,000 overage credits when enabled |
| Growth | $29/mo | 100,000 | 25,000 daily credits | 45/min | $0.45/1,000 overage credits when enabled |
| Pro | $79/mo | 400,000 | No daily cap | 120/min | $0.30/1,000 overage credits |
| Business | $199/mo | 1,200,000 | No daily cap | 300/min | $0.20/1,000 overage credits |
| Enterprise | $499/mo | 5,000,000 | No daily cap | 1,000/min | $0.12/1,000 overage credits |
Catalog quality warnings
- missing example for required path param: tag
Failure responses
| Status | Description | Schema |
|---|---|---|
| 400 | Missing or invalid parameters | #/definitions/app.Response |
| 404 | Tag page not found | #/definitions/app.Response |
| 429 | Rate limit exceeded | #/definitions/app.Response |
| 500 | Internal server error | #/definitions/app.Response |
Example response
{
"code": 200,
"msg": "OK",
"data": {
"videos": [
{
"id": "QpM5pr-jS9I",
"title": "OpenAI Playground Tutorial for Beginners",
"duration_seconds": 938,
"published_at": "2023-07-18T15:31:09Z",
"channel_title": "Jennifer Marie",
"channel_id": "UC-ooPg34j8PK3osA4l-726Q",
"views_count": 47545
}
],
"meta": {
"VideosCount": 123456,
"ChannelsCount": 1200
},
"continuation_token": "NEXT_TOKEN"
}
}Request schema
No body schema
Response schema
#/definitions/youtube.tagResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | youtube.TagResp | No | ||||
| data.continuation_token | string | No | ||||
| data.meta | youtube.tagMeta | No | ||||
| data.meta.channelsCount | integer · int64 | No | ||||
| data.meta.videosCount | integer · int64 | No | ||||
| data.videos | array | No | ||||
| data.videos[].channel_id | string | No | UCXZCJLdBC09xxGZ6gcdrc6A | |||
| data.videos[].channel_title | string | No | OpenAI | |||
| data.videos[].comments_count | integer | No | 1400 | |||
| data.videos[].description | string | No | On the first episode of the OpenAI Podcast... | |||
| data.videos[].dislikes_count | integer | No | 0 | may be hidden | ||
| data.videos[].duration_seconds | number | No | 2423 | length in seconds | ||
| data.videos[].id | string | No | YbJOTdZBX1g | |||
| data.videos[].likes_count | integer | No | 11000 | |||
| data.videos[].published_at | string | No | 2025-06-18T07:59:20-07:00 | |||
| data.videos[].title | string | No | Sam Altman on AGI, GPT-5, and what’s next — the OpenAI Podcast Ep. 1 | |||
| data.videos[].views_count | integer | No | 460176 | |||
| msg | string | No | OK |
Example request
curl -X GET "https://api.crawlora.net/api/v1/youtube/tag/%3Ctag%3E" -H "x-api-key: <api-key>"
TypeScript fetch
const url = new URL("https://api.crawlora.net/api/v1/youtube/tag/%3Ctag%3E");
const headers = new Headers();
headers.set("x-api-key", "<api-key>");
const response = await fetch(url, {
method: "GET",
headers,
});
const payload = await response.json();