curl --request POST \
--url https://app.sideshift.app/api/v1/scrape/linkedin/post \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"url": "https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2"
}
'import requests
url = "https://app.sideshift.app/api/v1/scrape/linkedin/post"
payload = { "url": "https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2" }
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.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2'
})
};
fetch('https://app.sideshift.app/api/v1/scrape/linkedin/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/linkedin/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.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2'
]),
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/linkedin/post"
payload := strings.NewReader("{\n \"url\": \"https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2\"\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/linkedin/post")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/v1/scrape/linkedin/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.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"posts": [
{
"isRepost": true,
"repostedPost": {
"id": "7503580801335332865",
"postPage": "https://www.linkedin.com/feed/update/urn:li:activity:7503580801335332865",
"title": null,
"creator": "satyanadella",
"creatorName": "Satya Nadella",
"uploadedAt": 1788993072,
"likes": null,
"comments": null,
"shares": null,
"views": null
},
"id": "7503582702164574208",
"title": "With the National Football League (NFL) back tonight, love seeing Seattle Seahawks analyst Brian Eayrs and coaches across the league using new Copilot and Excel tools to help wi…",
"views": 0,
"likes": 2747,
"comments": 141,
"shares": 0,
"bookmarks": 0,
"uploadedAt": 1788993526,
"uploadedAtFormatted": "2026-09-09T22:38:46.000Z",
"postPage": "https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2",
"creator": "satyanadella",
"thumbnail": "https://media.licdn.com/…",
"videoUrl": "https://dms.licdn.com/…",
"platform": "linkedin",
"hashtags": [],
"region": null,
"repostedBy": {
"handle": "microsoft"
},
"transcript": null,
"topComments": null,
"pinnedComments": null
}
],
"profile_pictures": {}
},
"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 the linkedin.com/posts/{slug}-activity-{id}-{code} form and the linkedin.com/feed/update/urn:li:activity:{id} form.
curl --request POST \
--url https://app.sideshift.app/api/v1/scrape/linkedin/post \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"url": "https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2"
}
'import requests
url = "https://app.sideshift.app/api/v1/scrape/linkedin/post"
payload = { "url": "https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2" }
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.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2'
})
};
fetch('https://app.sideshift.app/api/v1/scrape/linkedin/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/linkedin/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.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2'
]),
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/linkedin/post"
payload := strings.NewReader("{\n \"url\": \"https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2\"\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/linkedin/post")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/v1/scrape/linkedin/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.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"posts": [
{
"isRepost": true,
"repostedPost": {
"id": "7503580801335332865",
"postPage": "https://www.linkedin.com/feed/update/urn:li:activity:7503580801335332865",
"title": null,
"creator": "satyanadella",
"creatorName": "Satya Nadella",
"uploadedAt": 1788993072,
"likes": null,
"comments": null,
"shares": null,
"views": null
},
"id": "7503582702164574208",
"title": "With the National Football League (NFL) back tonight, love seeing Seattle Seahawks analyst Brian Eayrs and coaches across the league using new Copilot and Excel tools to help wi…",
"views": 0,
"likes": 2747,
"comments": 141,
"shares": 0,
"bookmarks": 0,
"uploadedAt": 1788993526,
"uploadedAtFormatted": "2026-09-09T22:38:46.000Z",
"postPage": "https://www.linkedin.com/posts/microsoft_activity-7503582702164574208-jTf2",
"creator": "satyanadella",
"thumbnail": "https://media.licdn.com/…",
"videoUrl": "https://dms.licdn.com/…",
"platform": "linkedin",
"hashtags": [],
"region": null,
"repostedBy": {
"handle": "microsoft"
},
"transcript": null,
"topComments": null,
"pinnedComments": null
}
],
"profile_pictures": {}
},
"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.