# YouTube Video API

Beta

Returns a public YouTube video, short or live stream: title, description with its hashtags and links, the exact publish time, duration, thumbnail, the channel and any collaborating channels, exact view, like and comment counts, and YouTube's category, tags, chapters and live stream times. Accepts every YouTube video URL form or a bare video ID.

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

- **Price**: From **1 credit** per request$0.75–$1.45 per 1,000 requests
- **Request**: `GET /v1/youtube/post`One API key, one JSON schema
- **Input**: `url`e.g. `https://www.youtube.com/watch?v=dQw4w9WgXcQ`
- **Failed requests**: Free: 0 credits

Use cases

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

- Track views, likes and comments on videos and shorts over time
- Enrich video links with titles, channels and thumbnails
- Monitor competitors' uploads and launches
- Collect tags, chapters and descriptions for content research

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/post/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/post' \
  --data-urlencode 'url=https://youtube.com/shorts/3cWm9B_0_kI?feature=share' \
  -H "x-api-key: $SOCIALTAP_API_KEY"
```

Node.js:

```javascript
const params = new URLSearchParams({
  url: "https://youtube.com/shorts/3cWm9B_0_kI?feature=share",
});
const res = await fetch(`https://staging.socialtap.dev/v1/youtube/post?${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.socialtap.dev/v1/youtube/post",
    params={"url": "https://youtube.com/shorts/3cWm9B_0_kI?feature=share"},
    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("url", "https://youtube.com/shorts/3cWm9B_0_kI?feature=share")
	req, err := http.NewRequest("GET", "https://staging.socialtap.dev/v1/youtube/post?"+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": [
      "platform_specific.youtube.author_subscriber_count"
    ],
    "author": {
      "avatar_url": "https://yt3.ggpht.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s176-c-k-c0x00ffffff-no-rj",
      "display_name": "MrBeast",
      "id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
      "is_verified": true,
      "url": "https://www.youtube.com/@MrBeast",
      "username": "MrBeast"
    },
    "coauthors": [],
    "duration_ms": 20000,
    "hashtags": [],
    "id": "3cWm9B_0_kI",
    "is_nsfw": false,
    "is_pinned": null,
    "is_sponsored": null,
    "language": null,
    "media": [
      {
        "alt_text": null,
        "duration_ms": 20000,
        "expires_at": null,
        "height": null,
        "thumbnail_url": "https://i.ytimg.com/vi/3cWm9B_0_kI/maxresdefault.jpg?sqp=-oaymwEoCIAKENAF8quKqQMcGADwAQH4AbYIgAKAD4oCDAgAEAEYRiBlKA8wDw==&rs=AOn4CLD2HeSN5ZikYi7hBi3SC7913d9CWQ",
        "type": "video",
        "url": null,
        "width": null
      }
    ],
    "mentions": [],
    "metrics": {
      "comment_count": 37974,
      "like_count": 13520602,
      "quote_count": null,
      "repost_count": null,
      "save_count": null,
      "share_count": null,
      "view_count": 731918538
    },
    "platform": "youtube",
    "platform_specific": {
      "youtube": {
        "author_subscriber_count": 524000000,
        "category": "Entertainment",
        "chapters": [],
        "description_links": [],
        "is_age_restricted": false,
        "is_live_now": false,
        "is_paywalled": false,
        "is_unlisted": false,
        "keywords": [],
        "live_ended_at": null,
        "live_started_at": null,
        "scheduled_start_at": null
      }
    },
    "platform_type": "short",
    "published_at": "2024-12-27T19:00:00Z",
    "text": null,
    "thumbnail_url": "https://i.ytimg.com/vi/3cWm9B_0_kI/maxresdefault.jpg?sqp=-oaymwEoCIAKENAF8quKqQMcGADwAQH4AbYIgAKAD4oCDAgAEAEYRiBlKA8wDw==&rs=AOn4CLD2HeSN5ZikYi7hBi3SC7913d9CWQ",
    "title": "How Many People To Stop Ronaldo?",
    "type": "video",
    "unknown_fields": [],
    "url": "https://www.youtube.com/shorts/3cWm9B_0_kI"
  },
  "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": "video",
      "id": "3cWm9B_0_kI",
      "url": "https://www.youtube.com/shorts/3cWm9B_0_kI"
    },
    "credits_remaining": 9999,
    "client_request_id": null,
    "warnings": [],
    "mode": "live"
  }
}
```

> [!NOTE]
>
> **Good to know**
>
> - platform_type is short, live (streams and premieres) or video.
> - Age-restricted and paid videos are returned with their public details.
> - media\[0\].url is null: YouTube's stream links only work from the IP that requested them.

Pricing

## Pay per request. Only when it succeeds.

| Source | Price per successful request | Per 1,000 requests |
| --- | --- | --- |
| Platform API `api` | 1 credit | $0.75–$1.45 |
| Public page `page` | 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/post/index.md#pricing) · [How credits work](https://staging.socialtap.dev/docs/credits/index.md)

FAQ

## Questions, answered.

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

1 credit for platform api results (meta.source = api) and 1 credit for public page results (meta.source = page), 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

## 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 Channel Videos APIBetaPost`GET /v1/youtube/posts`1 credit / page](https://staging.socialtap.dev/apis/youtube/posts/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 Channel Videos APIBetaPost`GET /v1/youtube/posts`1 credit / page](https://staging.socialtap.dev/apis/youtube/posts/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.post) · [Read the API reference](https://staging.socialtap.dev/docs/reference/youtube/post/index.md)

---

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