curl --request POST \
--url https://app.sideshift.app/api/v1/scrape/youtube/post \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"include_transcript": true,
"include_comments": true
}
'import requests
url = "https://app.sideshift.app/api/v1/scrape/youtube/post"
payload = {
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"include_transcript": True,
"include_comments": True
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
include_transcript: true,
include_comments: true
})
};
fetch('https://app.sideshift.app/api/v1/scrape/youtube/post', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.sideshift.app/api/v1/scrape/youtube/post",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'include_transcript' => true,
'include_comments' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.sideshift.app/api/v1/scrape/youtube/post"
payload := strings.NewReader("{\n \"url\": \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"include_transcript\": true,\n \"include_comments\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.sideshift.app/api/v1/scrape/youtube/post")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"include_transcript\": true,\n \"include_comments\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/v1/scrape/youtube/post")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"include_transcript\": true,\n \"include_comments\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"posts": [
{
"id": "dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)\n\nThe official video for “Never Gonna Give You Up” by Rick Astley.\n\nNever: The Autobiography 📚 OUT NOW!\nFoll…",
"views": 1814545474,
"likes": 19384206,
"comments": 2457612,
"shares": 0,
"bookmarks": 0,
"uploadedAt": 1256453853,
"uploadedAtFormatted": "2009-10-25T06:57:33.000Z",
"postPage": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"creator": "Rick Astley",
"thumbnail": "https://i.ytimg.com/…",
"videoUrl": "https://rr5---sn-jvoxmvo-w5mz.googlevideo.com/…",
"platform": "youtube",
"hashtags": [
"rickastleynever",
"rickastley"
],
"region": null,
"transcript": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ♪ A full commitment's what I'm thinking of ♪ ♪ You wouldn't get this from any other guy ♪ ♪ I just wanna …",
"topComments": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg",
"author": "YouTube",
"text": "can confirm: he never gave us up",
"likeCount": 314000,
"replyCount": 963,
"timestamp": 1757624744,
"isPinned": true
},
{
"id": "Ugw_ueQKh1eJhMfZF6B4AaABAg",
"author": "dmprod06",
"text": "They found a new way to Rick Roll in 2026 😭😭😭",
"likeCount": 14000,
"replyCount": 99,
"timestamp": 1786568744,
"isPinned": false
}
],
"pinnedComments": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg",
"author": "YouTube",
"text": "can confirm: he never gave us up",
"likeCount": 314000,
"replyCount": 963,
"timestamp": 1757624744,
"isPinned": true
}
]
}
],
"profile_pictures": {
"Rick Astley": "https://yt3.ggpht.com/…"
}
},
"request_id": "req_8f3c9a2b1d4e6f70",
"upstream_calls": 1,
"meta": {
"credits_charged": 1,
"credits_remaining": 9998
}
}{
"error": "INVALID_INPUT",
"message": "Invalid username: must match @?[a-zA-Z0-9._-]{1,100}",
"field": "username",
"reason": "must match @?[a-zA-Z0-9._-]{1,100}",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "UNAUTHORIZED",
"message": "Scraper routes require an independent scraper key from the Scraper API dashboard.",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "INSUFFICIENT_SCRAPER_CREDITS",
"message": "Insufficient scraper credits",
"platform": "tiktok",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "POST_NOT_FOUND",
"message": "Post not found or unavailable.",
"platform": "instagram",
"identifier": "https://instagram.com/reel/XXXX/",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "PAYLOAD_TOO_LARGE",
"message": "Request body must be 32KB or smaller",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "SCRAPER_RATE_LIMITED",
"message": "Scraper API rate limit exceeded",
"platform": "tiktok",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "SCRAPER_USAGE_FINALIZE_FAILED",
"message": "Request could not be finalized. Your credits were refunded.",
"platform": "tiktok",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "UPSTREAM_ERROR",
"message": "Data source failed. Your credits were refunded.",
"platform": "youtube",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "UPSTREAM_TIMEOUT",
"message": "Data source timed out. Your credits were refunded.",
"platform": "facebook",
"request_id": "req_8f3c9a2b1d4e6f70"
}Returns full detail, including the short-lived googlevideo.com videoUrl that listings never carry and a comments count where the listing returned 0.
curl --request POST \
--url https://app.sideshift.app/api/v1/scrape/youtube/post \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"include_transcript": true,
"include_comments": true
}
'import requests
url = "https://app.sideshift.app/api/v1/scrape/youtube/post"
payload = {
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"include_transcript": True,
"include_comments": True
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
include_transcript: true,
include_comments: true
})
};
fetch('https://app.sideshift.app/api/v1/scrape/youtube/post', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.sideshift.app/api/v1/scrape/youtube/post",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
'include_transcript' => true,
'include_comments' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.sideshift.app/api/v1/scrape/youtube/post"
payload := strings.NewReader("{\n \"url\": \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"include_transcript\": true,\n \"include_comments\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.sideshift.app/api/v1/scrape/youtube/post")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"include_transcript\": true,\n \"include_comments\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/v1/scrape/youtube/post")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"include_transcript\": true,\n \"include_comments\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"posts": [
{
"id": "dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)\n\nThe official video for “Never Gonna Give You Up” by Rick Astley.\n\nNever: The Autobiography 📚 OUT NOW!\nFoll…",
"views": 1814545474,
"likes": 19384206,
"comments": 2457612,
"shares": 0,
"bookmarks": 0,
"uploadedAt": 1256453853,
"uploadedAtFormatted": "2009-10-25T06:57:33.000Z",
"postPage": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"creator": "Rick Astley",
"thumbnail": "https://i.ytimg.com/…",
"videoUrl": "https://rr5---sn-jvoxmvo-w5mz.googlevideo.com/…",
"platform": "youtube",
"hashtags": [
"rickastleynever",
"rickastley"
],
"region": null,
"transcript": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ♪ A full commitment's what I'm thinking of ♪ ♪ You wouldn't get this from any other guy ♪ ♪ I just wanna …",
"topComments": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg",
"author": "YouTube",
"text": "can confirm: he never gave us up",
"likeCount": 314000,
"replyCount": 963,
"timestamp": 1757624744,
"isPinned": true
},
{
"id": "Ugw_ueQKh1eJhMfZF6B4AaABAg",
"author": "dmprod06",
"text": "They found a new way to Rick Roll in 2026 😭😭😭",
"likeCount": 14000,
"replyCount": 99,
"timestamp": 1786568744,
"isPinned": false
}
],
"pinnedComments": [
{
"id": "Ugzge340dBgB75hWBm54AaABAg",
"author": "YouTube",
"text": "can confirm: he never gave us up",
"likeCount": 314000,
"replyCount": 963,
"timestamp": 1757624744,
"isPinned": true
}
]
}
],
"profile_pictures": {
"Rick Astley": "https://yt3.ggpht.com/…"
}
},
"request_id": "req_8f3c9a2b1d4e6f70",
"upstream_calls": 1,
"meta": {
"credits_charged": 1,
"credits_remaining": 9998
}
}{
"error": "INVALID_INPUT",
"message": "Invalid username: must match @?[a-zA-Z0-9._-]{1,100}",
"field": "username",
"reason": "must match @?[a-zA-Z0-9._-]{1,100}",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "UNAUTHORIZED",
"message": "Scraper routes require an independent scraper key from the Scraper API dashboard.",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "INSUFFICIENT_SCRAPER_CREDITS",
"message": "Insufficient scraper credits",
"platform": "tiktok",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "POST_NOT_FOUND",
"message": "Post not found or unavailable.",
"platform": "instagram",
"identifier": "https://instagram.com/reel/XXXX/",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "PAYLOAD_TOO_LARGE",
"message": "Request body must be 32KB or smaller",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "SCRAPER_RATE_LIMITED",
"message": "Scraper API rate limit exceeded",
"platform": "tiktok",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "SCRAPER_USAGE_FINALIZE_FAILED",
"message": "Request could not be finalized. Your credits were refunded.",
"platform": "tiktok",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "UPSTREAM_ERROR",
"message": "Data source failed. Your credits were refunded.",
"platform": "youtube",
"request_id": "req_8f3c9a2b1d4e6f70"
}{
"error": "UPSTREAM_TIMEOUT",
"message": "Data source timed out. Your credits were refunded.",
"platform": "facebook",
"request_id": "req_8f3c9a2b1d4e6f70"
}Authorizations
Independent Scraper API key (scrape_live_*). Generate one in the Scraper dashboard.
Body
URL of the post on the platform. The canonical form is recommended but not required: query strings and a missing scheme are accepted, as is twitter.com for an X post. Whatever you send is echoed back verbatim in postPage, so normalise it yourself if you key on that field.
"https://www.tiktok.com/@mrbeast/video/7651447222449556767"
Set true to request a transcript from the normalized single-post details endpoints that support one (TikTok, YouTube, Facebook). The Instagram normalized endpoint always returns transcript: null; use the separate /api/v1/scrape/instagram/transcript platform operation when spoken content is needed. That request is slower and costs one additional platform-operation credit. Snapchat, X and LinkedIn do not support transcript retrieval. The response field is null when a transcript is unavailable or not requested.
Set true to request a sample of the post's comments in topComments, plus its pinned comments in pinnedComments. Supported on TikTok, YouTube, Facebook, and Instagram. Snapchat, X, and LinkedIn do not support comment retrieval and always return topComments: null, even when the flag is supplied. This returns a SAMPLE capped per platform (YouTube 20, Facebook 10, TikTok up to 50, Instagram one page of about 12-15 newest-first), in the platform's own feed order rather than sorted by likeCount, and never the full thread — see the topComments field for details. Pin state is resolved on YouTube only. Costs no extra credits.