# YouTube Channel API

Beta

Returns a public YouTube channel: channel ID, handle, name, description, keywords, avatar, banner, verification badge, country, join date, the links on its About panel with their labels, and its subscriber count with exact video and lifetime view counts. Accepts a handle with or without the @, any channel link with any tab (@handle, /channel/UC…, the legacy /c/, /user/ and root vanity links), or a bare channel ID.

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

- **Price**: From **1 credit** per request$0.75–$1.45 per 1,000 requests
- **Request**: `GET /v1/youtube/profile`One API key, one JSON schema
- **Input**: `handle`e.g. `@NASA`
- **Failed requests**: Free: 0 credits

Use cases

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

- Track channel growth over time
- Vet creators before a sponsorship
- Enrich lead lists with a creator's other social links
- Resolve a video's channel ID to a full profile

What you get

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

- **`platform`string**: Platform ID (tiktok, youtube, …).
- **`id`string**: Platform-native account ID (string; YouTube UC…, Reddit without t2_).
- **`username`string**: Handle without the @; null when the account has none.
- **`display_name`string**: Display name, channel title or page name; null when empty or not exposed.
- **`url`string**: Canonical profile URL.
- **`type`string**: Coarse account kind, as the platform labels it; unknown when it does not (TikTok labels organizations only). New values may be added; treat unknown values as unknown.
- **`bio`string**: Profile bio, channel description or page about text; null when empty or not exposed.
- **`avatar_url`string**: Profile picture URL (largest available). Platform CDN URLs can expire within hours.

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

## Example request

cURL:

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

Node.js:

```javascript
const params = new URLSearchParams({
  handle: "@NASA",
});
const res = await fetch(`https://staging-fly.socialtap.dev/v1/youtube/profile?${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, meta } = body;
console.log(data, meta.credits_charged);
```

Python:

```python
import os

import requests

res = requests.get(
    "https://staging-fly.socialtap.dev/v1/youtube/profile",
    params={"handle": "@NASA"},
    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, meta = body["data"], 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", "@NASA")
	req, err := http.NewRequest("GET", "https://staging-fly.socialtap.dev/v1/youtube/profile?"+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"`
		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": [
      "created_at",
      "metrics.follower_count"
    ],
    "avatar_url": "https://yt3.googleusercontent.com/eIf5fNPcIcj9ig-wZBeq4stFy1lgjWTW1nLT5dYlFkHZprZ03QBiMcbpwNMB6XSBjrSFGtAGQg=s900-c-k-c0x00ffffff-no-rj",
    "banner_url": "https://yt3.googleusercontent.com/y8Srh-oCcilLvBO8jAPI546m1bn0puA5DIvQiBZ1cSxc_rZfKxKSFlTCtoCQCtB6viUf1NGsaQ=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
    "bio": "NASA's mission is to pioneer the future in space exploration, scientific discovery, and aeronautics research.\n\nTo do that, we have worked around the world—and off it—for more than 60 years, searching for answers to fundamental questions about our place in the universe. We're expl…",
    "category": null,
    "country_code": null,
    "created_at": "2008-06-03T07:00:00Z",
    "display_name": "NASA",
    "external_links": [
      {
        "title": "nasa.gov",
        "url": "https://www.nasa.gov"
      },
      {
        "title": "X",
        "url": "https://x.com/nasa"
      },
      {
        "title": "Facebook",
        "url": "https://www.facebook.com/NASA"
      }
    ],
    "id": "UCLA_DiR1FfKNvjuUpBHmylQ",
    "is_private": false,
    "is_verified": true,
    "location": null,
    "metrics": {
      "follower_count": 15100000,
      "following_count": null,
      "post_count": 6194,
      "total_like_count": null,
      "total_view_count": 1132473139
    },
    "platform": "youtube",
    "platform_specific": {
      "youtube": {
        "is_business_email_listed": null,
        "is_official_artist_channel": false,
        "is_subscriber_count_hidden": false,
        "keywords": [
          "nasa",
          "space",
          "iss"
        ]
      }
    },
    "type": "unknown",
    "unknown_fields": [],
    "url": "https://www.youtube.com/@NASA",
    "username": "NASA"
  },
  "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": "UCLA_DiR1FfKNvjuUpBHmylQ",
      "url": "https://www.youtube.com/@NASA"
    },
    "credits_remaining": 9999,
    "client_request_id": null,
    "warnings": [],
    "mode": "live"
  }
}
```

Long arrays and strings are shortened for display; real responses are complete.

> [!NOTE]
>
> **Good to know**
>
> - metrics.follower_count is the subscriber count YouTube shows, rounded for display (listed in approximate_fields); null when the channel hides it. Video and view counts are exact; both are null for a channel without public videos.
> - created_at is the start of the US Pacific day YouTube shows as the join date, in UTC: the channel was created within the following day (listed in approximate_fields).
> - location is the country the owner set, as YouTube names it; country_code its ISO code.
> - is_verified is true for the check mark and for an Official Artist Channel's note badge. YouTube's built-in channels (Music, Sports, Gaming, News, Learning, Live, Fashion & Beauty, Shopping) have no badge or banner (null); all but Music have no About panel, so they answer what their header shows.
> - A bare string is a handle, even one shaped like a video ID: send a channel link or the UC… ID to be unambiguous. Links to youtube.com pages that are not channels answer not_found or invalid_input.
> - metrics.following_count and metrics.total_like_count are always null and type is unknown: YouTube does not show them. Business email addresses are behind a sign-in and are not returned.
> - Terminated and unknown channels answer not_found.

Pricing

## Pay per request. Only when it succeeds.

| Source | Price per successful request | Per 1,000 requests |
| --- | --- | --- |
| 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-fly.socialtap.dev/pricing/index.md) · [How this endpoint is priced](https://staging-fly.socialtap.dev/docs/reference/youtube/profile/index.md#pricing) · [How credits work](https://staging-fly.socialtap.dev/docs/credits/index.md)

FAQ

## Questions, answered.

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

1 credit, charged only for successful requests. SocialTap credits cost $0.75–$1.45 per 1,000 depending on the pack.

**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

## Profiles everywhere. One parser.

[Instagram Profile APIBetaProfile`GET /v1/instagram/profile`1 credit](https://staging-fly.socialtap.dev/apis/instagram/profile/index.md) · [Rumble Channel APIBetaProfile`GET /v1/rumble/profile`1 credit](https://staging-fly.socialtap.dev/apis/rumble/profile/index.md) · [Threads Profile APIBetaProfile`GET /v1/threads/profile`1 credit](https://staging-fly.socialtap.dev/apis/threads/profile/index.md) · [TikTok Profile APIBetaProfile`GET /v1/tiktok/profile`1 credit](https://staging-fly.socialtap.dev/apis/tiktok/profile/index.md)

More YouTube

## YouTube API. 5 endpoints, one key.

[YouTube Comments APIBetaComment`GET /v1/youtube/comments`1 credit / page](https://staging-fly.socialtap.dev/apis/youtube/comments/index.md) · [YouTube Video APIBetaPost`GET /v1/youtube/post`1 credit](https://staging-fly.socialtap.dev/apis/youtube/post/index.md) · [YouTube Channel Videos APIBetaPost`GET /v1/youtube/posts`1 credit / page](https://staging-fly.socialtap.dev/apis/youtube/posts/index.md) · [YouTube Transcript APIBetaTranscript`GET /v1/youtube/transcript`From 1 credit](https://staging-fly.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-fly.socialtap.dev/signup/?next=%2Fplayground%2F%3Fendpoint%3Dyoutube.profile) · [Read the API reference](https://staging-fly.socialtap.dev/docs/reference/youtube/profile/index.md)

---

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