YouTube Profile Full API
Returns a channel's profile, up to 30 recent videos, and computed metrics in one call: engagement rate by views and by followers, posting cadence, top post, and format mix.
GET /v1/youtube/profile/fullLast updated October 2026Maintained by the SocialCrawl team
When to use the YouTube Profile Full API
Use it instead of calling channel and channel/videos yourself; if the videos cannot be fetched you still get the profile with those metrics empty.
From the API reference
Fans out to the YouTube profile and recent-posts endpoints in parallel and returns the unified author, the recent-post list, and computed metrics: avg_engagement_rate, avg_engagement_rate_by_followers, posting cadence (with the window it was measured over), the top post, and the format mix. avg_engagement_rate is view-based: the mean of each post's (likes + comments + shares) / views, so only posts that carry a view count contribute, and it is null when none does. avg_engagement_rate_by_followers is the mean of likes + comments per post divided by the account's follower count, over every post that carries both, so it covers posts with no view count. One call reads one page of recent posts, which on YouTube is up to 30 videos, and computes the metrics over that page: posts can shorten the window but not lengthen it past one page, and _warnings says so when fewer posts came back than posts asked for. Pass posts_cursor back as cursor to read the next page, 5 credits a call. The profile leg is the only critical leg: if posts can't be fetched the call still returns the profile with post-dependent metrics null, and every leg's status is surfaced in legs[]. Flat 5 credits. The videos leg is fetched with includeExtras=true so like and comment counts populate on the same page as views.
Searching 69 platforms in parallel
What can you do with the Profile Full API?
The Profile Full endpoint gives you structured YouTube data with computed fields in a single request. No scraping infrastructure to build or maintain.
Example Request
# GET /v1/youtube/profile/full: 5 credits per call. Cache hits are free and failed calls are refunded.
# Check the price first for 0 credits: add dry_run=1 to the query. Nothing is fetched or charged.
# --max-time 24: this endpoint's measured p99 latency x 1.5.
# --retry 3: retries timeouts, 429 and 5xx, honoring Retry-After.
# -o response.json keeps only the final attempt's body.
# One Idempotency-Key per request, reused on every retry, so a retried call is never charged twice.
IDEMPOTENCY_KEY=$(od -An -N16 -tx1 /dev/urandom | tr -d ' \n')
curl -sS --max-time 24 --retry 3 -o response.json \
-H "x-api-key: YOUR_API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
"https://www.socialcrawl.dev/v1/youtube/profile/full?handle=mrbeast&posts=25" && cat response.json# GET /v1/youtube/profile/full: 5 credits per call. Cache hits are free and failed calls are refunded.
# Check the price first for 0 credits: add dry_run=1 to the query. Nothing is fetched or charged.
import os
import random
import time
import uuid
import requests
API_KEY = os.environ.get("SOCIALCRAWL_API_KEY", "YOUR_API_KEY")
TIMEOUT_S = 24 # this endpoint's measured p99 latency x 1.5.
MAX_RETRIES = 3
URL = "https://www.socialcrawl.dev/v1/youtube/profile/full"
def backoff(attempt):
# Exponential backoff with jitter: about 1 s, 2 s, then 4 s.
return 2 ** attempt * (0.5 + random.random() / 2)
def socialcrawl(params):
# One Idempotency-Key per request, reused on every retry, so a retried call is never charged twice.
idempotency_key = str(uuid.uuid4())
for attempt in range(MAX_RETRIES + 1):
try:
res = requests.get(
URL,
params=params,
headers={"x-api-key": API_KEY, "Idempotency-Key": idempotency_key},
timeout=TIMEOUT_S,
)
body = res.json()
except (requests.RequestException, ValueError):
# A timeout, a dropped connection or a non-JSON gateway page: retry with the same key.
if attempt == MAX_RETRIES:
raise
time.sleep(backoff(attempt))
continue
if body["success"]:
return body
error = body["error"]
# Branch on error["type"], never on the message text.
if error["type"] == "RESOURCE_NOT_FOUND":
return None # refunded: nothing to read
retry_after = res.headers.get("Retry-After")
# SERVICE_UNAVAILABLE without Retry-After is a withdrawn endpoint: permanent.
permanent = error["type"] == "SERVICE_UNAVAILABLE" and retry_after is None
if not error.get("retryable") or permanent or attempt == MAX_RETRIES:
raise RuntimeError(f"{error['type']}: {error['message']} (request_id {body['request_id']})")
# Retry-After (seconds) wins; otherwise back off.
time.sleep(float(retry_after) if retry_after else backoff(attempt))
params = {
"handle": "mrbeast",
"posts": "25",
}
body = socialcrawl(params)
if body is not None:
print(body["data"])// GET /v1/youtube/profile/full: 5 credits per call. Cache hits are free and failed calls are refunded.
// Check the price first for 0 credits: add dry_run=1 to the query. Nothing is fetched or charged.
const API_KEY = process.env.SOCIALCRAWL_API_KEY ?? "YOUR_API_KEY";
const TIMEOUT_MS = 24_000; // this endpoint's measured p99 latency x 1.5.
const MAX_RETRIES = 3;
type Page = { next_cursor: string | null; has_more: boolean };
type SocialCrawlResponse =
| { success: true; data: any; pagination?: Page; credits_used: number; request_id: string }
| { success: false; error: { type: string; message: string; retryable: boolean }; request_id: string };
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
// Exponential backoff with jitter: about 1 s, 2 s, then 4 s.
const backoffMs = (attempt: number) => 2 ** attempt * 1000 * (0.5 + Math.random() / 2);
async function socialcrawl(url: URL) {
// One Idempotency-Key per request, reused on every retry, so a retried call is never charged twice.
const idempotencyKey = crypto.randomUUID();
for (let attempt = 0; ; attempt++) {
let res: Response;
let body: SocialCrawlResponse;
try {
res = await fetch(url, {
headers: {
"x-api-key": API_KEY,
"Idempotency-Key": idempotencyKey,
},
signal: AbortSignal.timeout(TIMEOUT_MS),
});
body = (await res.json()) as SocialCrawlResponse;
} catch (error) {
// A timeout, a dropped connection or a non-JSON gateway page: retry with the same key.
if (attempt >= MAX_RETRIES) throw error;
await sleep(backoffMs(attempt));
continue;
}
if (body.success) return body;
// Branch on error.type, never on the message text.
if (body.error.type === "RESOURCE_NOT_FOUND") return null; // refunded: nothing to read
const retryAfter = res.headers.get("Retry-After");
// SERVICE_UNAVAILABLE without Retry-After is a withdrawn endpoint: permanent.
const permanent = body.error.type === "SERVICE_UNAVAILABLE" && retryAfter === null;
if (!body.error.retryable || permanent || attempt >= MAX_RETRIES) {
throw new Error(`${body.error.type}: ${body.error.message} (request_id ${body.request_id})`);
}
// Retry-After (seconds) wins; otherwise back off.
await sleep(retryAfter ? Number(retryAfter) * 1000 : backoffMs(attempt));
}
}
const url = new URL("https://www.socialcrawl.dev/v1/youtube/profile/full");
url.searchParams.set("handle", "mrbeast");
url.searchParams.set("posts", "25");
const body = await socialcrawl(url);
if (body) console.log(body.data);Parameters
| Parameter | Required | Description |
|---|---|---|
| handle | No | YouTube username or handle, with or without a leading @. One of the identity params is required. |
| channelId | No | YouTube channel id, the 24-character string starting with UC. One of the identity params is required. |
| url | No | Full YouTube profile or page URL. One of the identity params is required. |
| posts | No | How many of the fetched recent posts to return and compute the metrics over (1-100, default 25). One call reads one page, which on YouTube is up to 30 videos, so a larger value returns that page and a `_warnings` note; pass posts_cursor back as cursor for the next page. |
| cursor | No | Pass a prior response's posts_cursor to read the next page of posts. Each call is a separate 5-credit call whose metrics cover that page only. |
| include | No | CSV subset of posts,computed (default both). include=computed omits the raw posts[] array from the response to save payload. The metrics are computed from the same fetched posts either way, so they do not change. |
What does the YouTube Profile Full API return?
Every response follows one unified schema. Here is a real, unmodified response body, so you can see the exact fields you get back before spending a credit.
Example response
{
"success": true,
"platform": "youtube",
"endpoint": "/v1/youtube/profile/full",
"data": {
"profile": {
"id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"username": "@mrbeast",
"display_name": "MrBeast",
"avatar_url": "https://yt3.ggpht.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s800-c-k-c0x00ffffff-no-rj",
"bio": "SUBSCRIBE FOR A COOKIE!\nNew MrBeast or MrBeast Gaming video every single Saturday at noon eastern time!\nAccomplishments:\n- Raised $20,000,000 To Plant 20,000,000 Trees\n- Removed 30,000,000 pounds of trash from the ocean\n- Helped 2,000 people walk again\n- Helped 1,000 blind people see\n- Helped 1,000 deaf people hear\n- Built wells in Africa\n- Built and gave away 100 houses\n- Adopted every dog in a shelter (twice)\n- Given millions to charity\n- Started my own snack company Feastables\n- Started my own software company Viewstats\n- Gave away a private island (twice)\n- Gave away 1 million meals\n- I counted to 100k\n- Ran a marathon in the world's largest shoes\n- Survived 50 hours in Antarctica\n- Recreated Squid Game in real life\n- Created the largest competition show with 1000 people (Beast Games)\n- Gave $5,000,000 to one person\n- Raised $40,000,000 To Bring Clean Water To Millions Of People\n- Granted 100+ Dream Wishes for Kids Fighting Cancer\n- Gave Away Another $5,000,000 On Beast Games S2\n",
"verified": null,
"followers": 519000000,
"following": null,
"posts_count": 1004,
"likes_count": null,
"url": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA",
"private": null,
"joined_at": "2012-02-20",
"ext": {
"country": "US",
"public_email": null,
"followers_approximate": true,
"keywords": "mrbeast6000 beast mrbeast Mr.Beast mr",
"total_views": 141365659160,
"joined_at_timestamp": "2012-02-20T00:43:50Z",
"topicCategories": [
"https://en.wikipedia.org/wiki/Lifestyle_(sociology)",
"https://en.wikipedia.org/wiki/Entertainment"
],
"bannerExternalUrl": "https://yt3.googleusercontent.com/mHMO_eEMp0dPvh0ADwXhPXNYb_GnjSVsLI8biqF1CpxT8OPl7izhNQsDPD3JHhd5y5Mg9GrP",
"madeForKids": false,
"hiddenSubscriberCount": false,
"related_playlists": {
"likes": "",
"uploads": "UUX6OQ3DkcsbYNE6H8uQQuVA"
},
"topic_ids": [
"/m/019_rr",
"/m/02jjt"
],
"unsubscribed_trailer": "v9QtM6qnG50"
}
},
"posts": [
{
"post": {
"id": "v9QtM6qnG50",
"url": "https://www.youtube.com/watch?v=v9QtM6qnG50",
"content": {
"text": "I Built A City To Save Kids From Illegal Labor",
"media_urls": null,
"thumbnail_url": "https://i.ytimg.com/vi/v9QtM6qnG50/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLDHC3kCWybW0hDOotcH3B6Q1hT3wg",
"duration_seconds": 1143
},
"author": {
"username": "@MrBeast",
"display_name": "MrBeast",
"avatar_url": "https://example.com/redacted",
"verified": null
},
"engagement": {
"views": 86468274,
"likes": 2090602,
"comments": 97000,
"shares": null,
"saves": null
},
"flags": {
"nsfw": null,
"spoiler": null,
"pinned": null,
"deleted": false
},
"published_at": "2026-09-19T16:00:01.000Z",
"ext": {
"content_type": "video",
"categoryTitle": "Entertainment",
"description": "Huge thanks to the 1 Billion Followers Summit, Mohammed Bin Rashid Global Initiatives, and the Varkey Foundation; the partners who believed in this vision and helped make this village a reality.\n\nClick the link to claim your free Neuro Gum Pack, valued up to $24, at Costco or Walmart here: https://try.gotoaisle.com/neuro-beast\n\nWith gratitude to The Rockefeller Foundation for providing regenerative school meals for the next five years, and for helping build the farm that grows them. https://www.rockefellerfoundation.org\n\nThanks to our friends at Global Energy Alliance, this village now runs on solar — bringing light to every home, market and community space. https://energyalliance.org\n\n190 trees were cut down to bring this village to life. Now we're working with Arbor Day Foundation, our longtime partners, to plant 250 new ones where they'll do the most good.\n\nSUB TO ALL CHANNELS\n / @mrbeast \n / @mrbeast2 \n / @mrbeastgaming \n / @beastreacts \n / @beastphilanthropy \n / @beastanimations \n\nNew Merch - https://mrbeast.store\nCheck out Viewstats! - https://www.viewstats.com/\nFor any questions or inquiries regarding this video, please reach out to redacted@example.com\nMusic Provided by https://www.extrememusic.com\n----------------------------------------------------------------\nfollow all of these or i will kick you\n• Facebook - / mrbeast \n• Twitter - / mrbeast \n• Instagram - / mrbeast \n• Im Hiring! - https://www.mrbeastjobs.com/",
"channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"author_id": "UCX6OQ3DkcsbYNE6H8uQQuVA"
}
},
"computed": {
"engagement_rate": 0.025299,
"language": null,
"content_category": "other",
"estimated_reach": 103761929
}
},
{
"post": {
"id": "gTKS8SAwUzE",
"url": "https://www.youtube.com/watch?v=gTKS8SAwUzE",
"content": {
"text": "I Survived The Most Extreme Places On Earth",
"media_urls": null,
"thumbnail_url": "https://i.ytimg.com/vi/gTKS8SAwUzE/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLCinCS-72tR3BbuXhG-OTPNG2SLgw",
"duration_seconds": 1408
},
"author": {
"username": "@MrBeast",
"display_name": "MrBeast",
"avatar_url": "https://example.com/redacted",
"verified": null
},
"engagement": {
"views": 119053037,
"likes": 1480902,
"comments": 69000,
"shares": null,
"saves": null
},
"flags": {
"nsfw": null,
"spoiler": null,
"pinned": null,
"deleted": false
},
"published_at": "2026-09-05T16:00:01.000Z",
"ext": {
"content_type": "video",
"categoryTitle": "Entertainment",
"description": "We raced through some of the most extreme places on Earth to see who could make it to the finish line first!\n\nGemini helped us plan, problem-solve, and take on challenges along the way. Try Gemini here: https://gemini.google.com/app/downloa... GooglePartner\n\nPedialyte always comes in clutch when you need to rehydrate and feel better fast. Grab your favorite Pedialyte flavors on Amazon here https://www.amazon.com/stores/page/79... and use code BEAST40 for 40% off right now. PedialytlePartner\n\nFor anyone wondering about the backpacks we dropped at the end, don't worry! We only ditched them for a second so we could full-send it to the finish line! Our team went right back out and recovered every single piece of gear immediately after to ensure we left the environment as clean as when we got there! ❤️\n\nSUB TO ALL CHANNELS\n / @mrbeast \n / @mrbeast2 \n / @mrbeastgaming \n / @beastreacts \n / @beastphilanthropy \n / @beastanimations \n\nNew Merch - https://mrbeast.store\nCheck out Viewstats! - https://www.viewstats.com/\nFor any questions or inquiries regarding this video, please reach out to redacted@example.com\nMusic Provided by https://www.extrememusic.com\n----------------------------------------------------------------\nfollow all of these or i will kick you\n• Facebook - / mrbeast \n• Twitter - / mrbeast \n• Instagram - / mrbeast \n• Im Hiring! - https://www.mrbeastjobs.com/",
"channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"author_id": "UCX6OQ3DkcsbYNE6H8uQQuVA"
}
},
"computed": {
"engagement_rate": 0.013019,
"language": null,
"content_category": "other",
"estimated_reach": 142863644
}
}
],
"computed": {
"avg_engagement_rate": 0.02095544,
"avg_engagement_rate_by_followers": 0.00523,
"posts_per_week": 0.5,
"cadence_window_days": 350,
"top_post": {
"url": "https://www.youtube.com/watch?v=Oo9EbArcQ1c",
"engagement_total": 248785064
},
"format_mix": {
"video": 25
}
},
"posts_cursor": "4qmFsgLdCBIYVUNYNk9RM0RrY3NiWU5FNkg4dVFRdVZBGsAIOGdhbkJocWtCbnFoQmpxZUJnb2tObUkyTnpNMU9HUXRNREF3TUMweVl6QTJMVGd4TnpFdE0yTXlPRFprTXpneU1HUTJFdk1GUVdaelYydHNOVGhxTW1OdFdtOHdORVpwVjFFeGFqbHBXbHBOV1d4cldsaFRXQzF3VFZaSVFta3lZWGd0WjBsdk9XUkZVR2M1VFZwM1NETmhNbEJEWkdadFZsUkZhekJ4WTI1a2RrRmZURTE1VEVSb2JWQkRiV2RTV1VOUGNWOTNhbWxEUW5nMFJHNXZTRXRNYVRaeE0wMXBSSHBNWkcxdWJWTjVPR1V4UkhaRGFXbFVTamxtVkRaTU1IVmFObU01Y2xCVGMzcHpWMWRPU1ZKQlkwTndhVFEzVkdKRk5GWkhWR3BTUldKQ1JGbFlWMHRtVFRSdlZHUXpiVWhNY2taM1dscHhlVkpYUlRZMVQzaDBTbU5mVFRSeVFWOWZkWFZQY21ReWNrcDVNSEJIWlMxWGJsaHdiMFpSTVc0d05WQjJjWFJST0RWTWVFNUxkRFZSVWxWd2RrVkJaM0IwUjJGelZGUmZVbFJqZVhJMmFrSmlOMXBuZVZaS1ZsaHhZbXN6TVVRdFMwcExXVWxZVTJ4MGJXTkhaV1UyV0hwV1ozWmtabmc1WjFoRFVISm9TVGxhZDBkd016VnBUa054VGtOUFIyUnVRV053YVdFdFIya3RPRlZtYzNwb1dEZGpTWFo2TlVOa1pYZzNkMWRvT1hjNVJsVnphVEJNT0hNd1kzTk1hRUpEUW5aMloxcERRbE5UT0hWYVpWbEhUVFpMWlRFdFIyVXRPWGRuT1ZaaWJWUktPSEpsYUZsc1ZqVldabXAwYnpaMlJHcFlRV2xUUlhkQmVUaDBPRkJGZEZSUmVYSnBhRkEwUzBwQlJXZG5TblJ3UmtoS2EwWkZaa0Y2U2xwQ1RscG1jMkZ2UTNKRlNVeExSMlJqUWtzd01uVXRRVkJXYTA1a2RXTkJWR0UxUlVNd00xRm1aR3BvUmtoaloyNDJZMUJFVEZabVV6aG9jVUZZWjA4emMxQTVjMWd3VDNOaVFsbFZWbVJtUjBwMlVWUk5Ra2N6VWxoVlJsUXRTMDFXY0RSelZFYzVjbTEwVUcxMllsOUtVRzFVUTBOUVpTMDFVR3RSTkU5RVVuZHFMV1l6VjAxUVpsb3hlWE5WUVZoRVRFZEpiRWRVUjNGbmR6UkpPREo0YTBrMFIxaEpVMlIxVVRZMlVFTm9VekpmVlMxd1kwZDVVakZpVG1sSmVuRldNRjlYVG1kaVFrOTJiMTlSYnpaNE4ybDJTbEpJWjI5M1NUTkZRa2RpYUVVeFVWRm5abFZFUjJkNVNrTlBYMHhSUTJSQmFWWXdWMDV4TkVGRGFHYzJVR3ByUzJSclNqbEVZVFJwWmpsWlptMDBPVTBZQkElM0QlM0Q%3D",
"legs": [
{
"endpoint": "/v1/youtube/channel",
"status": 200,
"credits_used": 1,
"latency_ms": 167,
"error": null
},
{
"endpoint": "/v1/youtube/channel/user_26760e",
"status": 200,
"credits_used": 1,
"latency_ms": 5823,
"error": null
}
]
},
"credits_used": 5,
"request_id": "req_example000000",
"cached": false,
"credits_remaining": 9999,
"source": "captured",
"captured_at": "2026-10-02T12:41:27.248Z",
"redacted": true
}Live sample illustrating the unified response shape. Field values reflect the record you query.
How does the YouTube Profile Full API work?
Send a GET request with your API key and get back clean, structured JSON in our unified schema. Supported computed fields are populated when the source provides the required inputs.
Method
GET
Response
JSON
How do you scrape social media data in seconds?
The fastest social media scraping API for developers. Scrape profiles, posts, comments, and analytics from 69 platforms covering 10B+ monthly active users.
One schema, every platform
Query 69 platforms with identical response structures. Write your integration once.
Computed fields, not just scraped
When an endpoint supports these metrics and the source provides the required inputs, the normalized record includes engagement_rate, estimated_reach, content_category, and language. Ready to use.
See your data before you code
Visual Data Explorer. Paste any URL, get rich result cards, sortable tables, CSV export.
import requests
response = requests.get(
'https://www.socialcrawl.dev/v1/tiktok/profile',
params={'handle': 'charlidamelio'},
headers={'x-api-key': 'sc_YOUR_API_KEY'}
)
data = response.json(){
"success": true,
"platform": "tiktok",
"data": {
"author": {
"username": "charlidamelio",
"followers": 152400000
},
"engagement": {
"likes": 12400000000,
"engagement_rate": 0.087
},
"metadata": {
"language": "en",
"content_category": "lifestyle"
}
}
}Have a question? We got answers
Find answers to frequently asked questions about SocialCrawl's API, pricing, and capabilities.
Contact usWhat does the YouTube Analytics API return in one call?
How do I fetch a channel's channel, videos, and analytics together?
What analytics does the youtube analytics api compute?
How much does the youtube analytics api cost per call?
How many videos can I pull and can I page deeper?
What happens if a channel has no recent videos?
Ask AI about SocialCrawl
Ready to scrape YouTube Profile Full data?
Get your API key and start pulling YouTube data in under 60 seconds.
