# YouTube Channel Videos API

Beta

Returns the public uploads of a YouTube channel a page at a time: its videos, shorts or live streams, each with its link, title, thumbnail, length, views and upload time, newest, oldest or most popular first. The newest uploads also carry exact times, view and like counts and descriptions. Accepts a handle, any channel link or a channel ID.

[Get 100 free credits](https://staging.socialtap.dev/signup/?next=%2Fplayground%2F%3Fendpoint%3Dyoutube.posts) · [API reference](https://staging.socialtap.dev/docs/reference/youtube/posts/index.md) · [Try it](https://staging.socialtap.dev/playground/?endpoint=youtube.posts)

- **Price**: From **1 credit** per page$0.75–$1.45 per 1,000 pages
- **Request**: `GET /v1/youtube/posts`One API key, one JSON schema
- **Input**: `handle`e.g. `@MrBeast`
- **Page size**: Up to 48 posts

Use cases

## What teams build with it. From one request.

- Monitor a channel for new uploads
- Export a creator's full video catalog
- Find a channel's most viewed videos or shorts
- Track live streams and premieres of channels you follow

What you get

## Posts in one schema. The same on every platform.

- **`platform`string**: Platform ID (tiktok, youtube, …).
- **`id`string**: Platform-native post ID (string; Instagram shortcode, Reddit without t3_).
- **`url`string**: Canonical post URL.
- **`type`string**: Normalized content shape. New values may be added; treat unknown values as other.
- **`platform_type`string**: The platform's own product label, lowercase (reel, short, story, live, tweet, …).
- **`title`string**: Headline (YouTube title, Reddit title); null on caption-only platforms.
- **`text`string**: Caption, description or body as plain text.
- **`language`string**: BCP-47 language of text, when the platform states it.

Every field, its type and when it is `null`: [the response reference](https://staging.socialtap.dev/docs/reference/youtube/posts/index.md#response) and the [post schema](https://staging.socialtap.dev/resources/post/index.md).

## Example request

cURL:

```shell
curl -G 'https://staging.socialtap.dev/v1/youtube/posts' \
  --data-urlencode 'handle=@jawed' \
  -H "x-api-key: $SOCIALTAP_API_KEY"
```

Node.js:

```javascript
const params = new URLSearchParams({
  handle: "@jawed",
});
const res = await fetch(`https://staging.socialtap.dev/v1/youtube/posts?${params}`, {
  headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, page, meta } = body;
console.log(data, meta.credits_charged);
```

Python:

```python
import os

import requests

res = requests.get(
    "https://staging.socialtap.dev/v1/youtube/posts",
    params={"handle": "@jawed"},
    headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
    raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, page, meta = body["data"], body["page"], body["meta"]
print(data, meta["credits_charged"])
```

Go:

```go
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"net/url"
	"os"
)

func main() {
	q := url.Values{}
	q.Set("handle", "@jawed")
	req, err := http.NewRequest("GET", "https://staging.socialtap.dev/v1/youtube/posts?"+q.Encode(), nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	var body struct {
		Data  json.RawMessage `json:"data"`
		Page  json.RawMessage `json:"page"`
		Meta  map[string]any  `json:"meta"`
		Error *struct {
			Code    string `json:"code"`
			Message string `json:"message"`
		} `json:"error"`
	}
	if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
		log.Fatal(err)
	}
	if body.Error != nil {
		log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
	}
	fmt.Println(string(body.Data), body.Meta["credits_charged"])
}
```

200 OK:

```json
{
  "data": [
    {
      "approximate_fields": [],
      "author": {
        "avatar_url": "https://yt3.googleusercontent.com/uI3VE4PVqvCy0xnWLqMJnEzyBUm3T8VHOCp4ee-1RxdHqKXCdUE_qXYQnpf9AfuEoIPactVyDhM=s900-c-k-c0x00ffffff-no-rj",
        "display_name": "jawed",
        "id": "UC4QobU6STFB0P71PMvOGN5A",
        "is_verified": null,
        "url": "https://www.youtube.com/channel/UC4QobU6STFB0P71PMvOGN5A",
        "username": "jawed"
      },
      "coauthors": [],
      "duration_ms": 19000,
      "hashtags": [],
      "id": "jNQXAC9IVRw",
      "is_nsfw": null,
      "is_pinned": null,
      "is_sponsored": null,
      "language": null,
      "media": [
        {
          "alt_text": null,
          "duration_ms": 19000,
          "expires_at": null,
          "height": 360,
          "thumbnail_url": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg",
          "type": "video",
          "url": null,
          "width": 480
        }
      ],
      "mentions": [],
      "metrics": {
        "comment_count": null,
        "like_count": 20117813,
        "quote_count": null,
        "repost_count": null,
        "save_count": null,
        "share_count": null,
        "view_count": 446865949
      },
      "platform": "youtube",
      "platform_specific": {
        "youtube": {
          "author_subscriber_count": null,
          "category": null,
          "chapters": [],
          "description_links": [
            "https://www.youtube.com/watch?v=0PT5c1z3LL8",
            "https://www.youtube.com/watch?v=RRBN_4L09Mg"
          ],
          "is_age_restricted": null,
          "is_live_now": null,
          "is_paywalled": null,
          "is_unlisted": null,
          "keywords": [],
          "live_ended_at": null,
          "live_started_at": null,
          "scheduled_start_at": null
        }
      },
      "platform_type": "video",
      "published_at": "2005-04-24T03:31:52Z",
      "text": "Microplastics are accumulating in human brains at an alarming rate\nhttps://www.youtube.com/watch?v=0PT5c1z3LL8\n\n“Nanoplastics and Human Health” with Matthew J Campen, PhD, MSPH\nhttps://www.youtube.com/watch?v=RRBN_4L09Mg\n\n00:00 Intro\n00:05 The cool thing\n00:17 End",
      "thumbnail_url": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg",
      "title": "Me at the zoo",
      "type": "video",
      "unknown_fields": [
        "coauthors",
        "platform_specific.youtube.keywords",
        "platform_specific.youtube.chapters"
      ],
      "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    }
  ],
  "page": {
    "has_more": false,
    "next_cursor": null,
    "next_cursor_expires_at": null,
    "end_reason": "end"
  },
  "meta": {
    "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
    "platform": "youtube",
    "source": "api",
    "is_cached": false,
    "credits_charged": 1,
    "latency_ms": 0,
    "fetched_at": "2026-10-25T12:00:00Z",
    "input": {
      "kind": "profile",
      "id": "UC4QobU6STFB0P71PMvOGN5A",
      "url": "https://www.youtube.com/@jawed"
    },
    "credits_remaining": 9999,
    "client_request_id": null,
    "warnings": [],
    "mode": "live"
  }
}
```

> [!NOTE]
>
> **Good to know**
>
> - Beyond each tab's newest uploads (up to 15, exact from YouTube's uploads feed), published_at comes from a relative label (the latest time it allows) and views are rounded, both in approximate_fields; text and metrics.like_count are null there, and a non-English title may be YouTube's English translation.
> - Shorts beyond the newest have no published_at or duration_ms, so since and until are refused with tab=shorts. Streams live now or scheduled have no view count.
> - A channel without the tab answers an empty page. A tab in a pasted link is ignored: set tab.

Pricing

## Pay per page. Only when it succeeds.

| Source | Price per successful page | Per 1,000 pages |
| --- | --- | --- |
| Any source | 1 credit | $0.75–$1.45 |

- Failed requests are free: errors cost 0 credits.
- Cache hits are free: responses served from the cache cost 0 credits.
- Credits never expire.
- One credit balance for every endpoint and platform.

[Credit packs](https://staging.socialtap.dev/pricing/index.md) · [How this endpoint is priced](https://staging.socialtap.dev/docs/reference/youtube/posts/index.md#pricing) · [How credits work](https://staging.socialtap.dev/docs/credits/index.md)

FAQ

## Questions, answered.

**How much does the YouTube Channel Videos API cost?**

1 credit per page of up to 48 items, charged for every successful page, empty pages included. SocialTap credits cost $0.75–$1.45 per 1,000 depending on the pack.

**How do I get the next page?**

Repeat the same request with cursor set to page.next_cursor from the previous response, keeping the other parameters. When page.has_more is false there are no more items. Cursors expire after 1 hour.

**Am I charged for failed requests?**

No. Requests that return an error cost 0 credits. Responses served from the cache are free too.

Same schema, other platforms

## Posts everywhere. One parser.

[Instagram Post APIBetaPost`GET /v1/instagram/post`1 credit](https://staging.socialtap.dev/apis/instagram/post/index.md) · [TikTok Post APIBetaPost`GET /v1/tiktok/post`1 credit](https://staging.socialtap.dev/apis/tiktok/post/index.md) · [TikTok Posts APIBetaPost`GET /v1/tiktok/posts`1 credit / page](https://staging.socialtap.dev/apis/tiktok/posts/index.md) · [YouTube Video APIBetaPost`GET /v1/youtube/post`1 credit](https://staging.socialtap.dev/apis/youtube/post/index.md)

More YouTube

## YouTube API. 5 endpoints, one key.

[YouTube Comments APIBetaComment`GET /v1/youtube/comments`1 credit / page](https://staging.socialtap.dev/apis/youtube/comments/index.md) · [YouTube Video APIBetaPost`GET /v1/youtube/post`1 credit](https://staging.socialtap.dev/apis/youtube/post/index.md) · [YouTube Channel APIBetaProfile`GET /v1/youtube/profile`1 credit](https://staging.socialtap.dev/apis/youtube/profile/index.md) · [YouTube Transcript APIBetaTranscript`GET /v1/youtube/transcript`From 1 credit](https://staging.socialtap.dev/apis/youtube/transcript/index.md)

## Start with 100 free credits. No card required.

Test keys answer every endpoint from recorded responses, free, so you can build before you spend. Failed requests are always free.

[Get your API key](https://staging.socialtap.dev/signup/?next=%2Fplayground%2F%3Fendpoint%3Dyoutube.posts) · [Read the API reference](https://staging.socialtap.dev/docs/reference/youtube/posts/index.md)

---

[HTML version](https://staging.socialtap.dev/apis/youtube/posts/) · [Docs index for AI agents](https://staging.socialtap.dev/llms.txt) · [All docs in one file](https://staging.socialtap.dev/llms-full.txt)
