curl --request POST \
--url https://app.sideshift.app/api/v1/scrape/twitter/post \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://x.com/elonmusk/status/2086128419369042103"
}
'import requests
url = "https://app.sideshift.app/api/v1/scrape/twitter/post"
payload = { "url": "https://x.com/elonmusk/status/2086128419369042103" }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({url: 'https://x.com/elonmusk/status/2086128419369042103'})
};
fetch('https://app.sideshift.app/api/v1/scrape/twitter/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/twitter/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://x.com/elonmusk/status/2086128419369042103'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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/twitter/post"
payload := strings.NewReader("{\n \"url\": \"https://x.com/elonmusk/status/2086128419369042103\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/twitter/post")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://x.com/elonmusk/status/2086128419369042103\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/v1/scrape/twitter/post")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://x.com/elonmusk/status/2086128419369042103\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"posts": [
{
"contentType": "video",
"id": "2086128419369042103",
"title": "ELON MUSK: “In order to ascend the Kardashev scale, in order to get to any meaningful percentage of the sun's energy harness, you have to go to space. If you want to get to, say…",
"views": 534928,
"likes": 2244,
"comments": 294,
"shares": 356,
"bookmarks": 149,
"uploadedAt": 1786206748,
"uploadedAtFormatted": "2026-08-08T16:32:28.000Z",
"postPage": "https://x.com/elonmusk/status/2086128419369042103",
"creator": "elonmusk",
"thumbnail": "https://pbs.twimg.com/…",
"videoUrl": "https://video.twimg.com/…",
"platform": "twitter",
"hashtags": [],
"region": null,
"transcript": null,
"topComments": null
}
],
"profile_pictures": {
"elonmusk": "https://pbs.twimg.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"
}Accepts both x.com and twitter.com status URLs; the scheme is optional and query parameters are tolerated. 1 credit.
curl --request POST \
--url https://app.sideshift.app/api/v1/scrape/twitter/post \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://x.com/elonmusk/status/2086128419369042103"
}
'import requests
url = "https://app.sideshift.app/api/v1/scrape/twitter/post"
payload = { "url": "https://x.com/elonmusk/status/2086128419369042103" }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({url: 'https://x.com/elonmusk/status/2086128419369042103'})
};
fetch('https://app.sideshift.app/api/v1/scrape/twitter/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/twitter/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://x.com/elonmusk/status/2086128419369042103'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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/twitter/post"
payload := strings.NewReader("{\n \"url\": \"https://x.com/elonmusk/status/2086128419369042103\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/twitter/post")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://x.com/elonmusk/status/2086128419369042103\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/v1/scrape/twitter/post")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://x.com/elonmusk/status/2086128419369042103\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"posts": [
{
"contentType": "video",
"id": "2086128419369042103",
"title": "ELON MUSK: “In order to ascend the Kardashev scale, in order to get to any meaningful percentage of the sun's energy harness, you have to go to space. If you want to get to, say…",
"views": 534928,
"likes": 2244,
"comments": 294,
"shares": 356,
"bookmarks": 149,
"uploadedAt": 1786206748,
"uploadedAtFormatted": "2026-08-08T16:32:28.000Z",
"postPage": "https://x.com/elonmusk/status/2086128419369042103",
"creator": "elonmusk",
"thumbnail": "https://pbs.twimg.com/…",
"videoUrl": "https://video.twimg.com/…",
"platform": "twitter",
"hashtags": [],
"region": null,
"transcript": null,
"topComments": null
}
],
"profile_pictures": {
"elonmusk": "https://pbs.twimg.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"
}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 single-post details endpoints that support one (TikTok, YouTube, Facebook). Instagram, Snapchat, X and LinkedIn do not support transcript retrieval and always return transcript: null, even when the flag is supplied. 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. Supported on TikTok, YouTube, and Facebook. Instagram, Snapchat, X, and LinkedIn do not support comment retrieval and always return topComments: null, even when the flag is supplied. This returns a top-weighted SAMPLE capped per platform (YouTube 20, Facebook 10, TikTok up to 50), in the platform's own feed order rather than sorted by likeCount, and never the full thread — see the topComments field for details. Costs no extra credits.