profile, posts, post, and TikTok audience resources.
Start with a normalized endpoint when it covers your use case. It
gives you the same response schema across platforms. Choose an operation on this page
when you need a platform-only resource or the platform’s full field structure.
Choose an operation
| Need | Use |
|---|---|
| Comparable profiles or posts across platforms | Normalized endpoints |
| TikTok favorites, reposts, stories, social graph, sounds, hashtags, playlists, search, trends, comments, transcripts, or ads | A TikTok operation below |
| Instagram timeline, reels, full post details, comments, search, audio, or highlights | An Instagram operation below |
| Exact request and response schemas | The API reference or an endpoint in the left navigation |
POST https://app.sideshift.app/api/v1/scrape/{platform}/{resource}
/tiktok/audience route because its response remains wire-compatible.
The field examples below are based on verified 200 responses. SideShift applies the
same authentication, billing, error, and outer response envelope to every operation.
Quick example
Send a SideShift scraper key (scrape_live_*) in the x-api-key header and a JSON
request body. See the quickstart for complete setup examples.
export SIDESHIFT_SCRAPER_KEY="scrape_live_YOUR_KEY"
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/profile-details \
-H "x-api-key: $SIDESHIFT_SCRAPER_KEY" \
-H "Content-Type: application/json" \
-d '{"handle":"tiktok"}'
Response shape
The operation examples below document the contents ofdata. The outer envelope is
consistent across the entire Scraper API:
{
"data": { "user": {}, "stats": {}, "itemList": [] },
"request_id": "req_8f3c9a2b1d4e6f70",
"upstream_calls": 1,
"meta": { "credits_charged": 1, "credits_remaining": 9999 }
}
data are intentionally preserved. Keep the
capitalization shown in the schemas, including uniqueId, UserStoryStatus,
strong_id__, and AIGCDescription. A missing count can be null; numeric 0
means the platform returned a real zero. Read Responses and data for
the envelope, identifier, media URL, and nullability rules.
Billing, pagination, and failures
- Every completed platform operation or page costs 1 SideShift credit.
- Confirmed not-found responses are billed.
- Requests rejected before work starts (
400,401,402,413,429) are free. - SideShift/data-source failures and timeouts (
500,502,504) are refunded.
has_more flag is
false. TikTok follower/following lists use min_time; collection posts use
max_cursor; Instagram timeline uses next_max_id; Instagram reels use max_id;
and Instagram hashtag/profile search uses page numbers capped at 10. Single-shot
operations return no cursor.
Read meta.credits_charged on success and X-Scraper-Credits-Charged on errors. Retry
refunded 500/502/504 failures with backoff, do not loop on billed 404
responses, and honor Retry-After on 429. See Billing, errors, and limits
for the complete policy and a copyable retry wrapper.
API reference
The operation sections below include copyable requests, parameter tables, pagination rules, and response-field tables. The left navigation also exposes a generated interactive reference for every endpoint.TikTok — 27 platform operations
Posts come back as TikTok’saweme object: aweme_id (the numeric id in a
permalink), desc, statistics (play_count, digg_count, comment_count,
share_count, collect_count), video (play_addr, cover, duration — each
URL field is a {uri, url_list} wrapper, read url_list[0]), author, music,
create_time and url.
Creators come back as uid / unique_id / nickname / sec_uid /
avatar_medium / follower_count / following_count.
TikTok · Creator
POST /api/v1/scrape/tiktok/profile-details
Profile header for one creator — identity, counts, links.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle (or unique_id) | str | no | null | Creator’s username/handle (with or without @). |
user_id | str | no | null | Numeric TikTok user id — an alternative to unique_id |
cache_max_age | str | no | null | Accepted and ignored — every response is a live read. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/profile-details \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "tiktok"}'
ReturnsResponse — theuserandstatsin TikTok’s own web shape.itemListis present and empty; use the post endpoints for a feed.
data object:
| Key | Type | |
|---|---|---|
user | object | |
stats | object | |
itemList | array |
{
"user": {
"id": "107955",
"uniqueId": "tiktok",
"nickname": "TikTok",
"avatarThumb": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/ba6…",
"avatarMedium": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/ba6…",
"avatarLarger": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/ba6…",
"signature": "One TikTok can make a big impact",
"verified": true,
"secUid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
"secret": false,
"ftc": false,
"relation": 0,
"openFavorite": false,
"commentSetting": null,
"duetSetting": null,
"stitchSetting": null,
"privateAccount": false,
"isADVirtual": false,
"isUnderAge18": false,
"ins_id": "",
"twitter_id": "",
"youtube_channel_title": "",
"youtube_channel_id": "",
"UserStoryStatus": 0,
"createTime": 1425144149,
"bioLink": {
"link": "linktr.ee/tiktok"
}
},
"stats": {
"followingCount": 0,
"followerCount": 95148223,
"heartCount": 462523908,
"videoCount": 1570,
"diggCount": null,
"heart": 462523908
},
"itemList": []
…
user fields:
| Field | Type | Example |
|---|---|---|
id | string | "107955" |
uniqueId | string | "tiktok" |
nickname | string | "TikTok" |
avatarThumb | string | "https://p16-common-sign.tiktokcdn-us.… |
avatarMedium | string | "https://p16-common-sign.tiktokcdn-us.… |
avatarLarger | string | "https://p19-common-sign.tiktokcdn-us.… |
signature | string | "One TikTok can make a big impact" |
verified | boolean | true |
secUid | string | "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZY… |
secret | boolean | false |
ftc | boolean | false |
relation | number | 0 |
openFavorite | boolean | false |
commentSetting | null | |
duetSetting | null | |
stitchSetting | null | |
privateAccount | boolean | false |
isADVirtual | boolean | false |
isUnderAge18 | boolean | false |
ins_id | string | |
twitter_id | string | |
youtube_channel_title | string | |
youtube_channel_id | string | |
UserStoryStatus | number | 0 |
createTime | number | 1425144149 |
bioLink | object | nested: link |
stats fields:
| Field | Type | Example |
|---|---|---|
followingCount | number | 0 |
followerCount | number | 95148223 |
heartCount | number | 462523908 |
videoCount | number | 1570 |
diggCount | null | |
heart | number | 462523908 |
POST /api/v1/scrape/tiktok/favorites
Videos a creator publicly liked.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle (or unique_id) | str | no | null | Creator’s username/handle (with or without @). |
user_id | str | no | null | Numeric TikTok user id — an alternative to unique_id |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/favorites \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "ramiryatebyalybly", "cursor": "0"}'
Most accounts hide their Liked tab, so an empty page is normal rather than an error.Response — the
data object:
| Key | Type | |
|---|---|---|
aweme_list | array of post | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
unique_id | string | Echo of what you queried. |
user_id | null | Echo of what you queried. |
{
"aweme_list": [
"<post object — see Response objects>"
],
"cursor": "1781353841000000",
"has_more": true,
"unique_id": "ramiryatebyalybly",
"user_id": null
}
POST /api/v1/scrape/tiktok/reposts
Posts a creator reposted.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle (or unique_id) | str | no | null | Creator’s username/handle (with or without @). |
user_id | str | no | null | Numeric TikTok user id — an alternative to unique_id |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/reposts \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "tiktok", "cursor": "0"}'
Each item is the ORIGINAL author’s post, so author.unique_id is that author, not the account queried.
Response — the data object:
| Key | Type | |
|---|---|---|
aweme_list | array of post | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
unique_id | string | Echo of what you queried. |
user_id | null | Echo of what you queried. |
{
"aweme_list": [
"<post object — see Response objects>"
],
"cursor": "30",
"has_more": true,
"unique_id": "tiktok",
"user_id": null
}
POST /api/v1/scrape/tiktok/stories
A creator’s currently-live stories (they expire after 24h).
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle (or unique_id) | str | no | null | Creator’s username/handle — resolved to a user id for you. Pass user_id directly when you have it to skip the lookup. |
user_id | str | no | null | Numeric TikTok user id |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page.. Creators with many live stories span several pages. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/stories \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"user_id": "107955", "cursor": "0"}'
Stories expire after 24 hours and most creators do not post them, so an empty aweme_list is the normal answer and means “no live story right now” — not an error, and not an empty account.
Response — the data object:
| Key | Type | |
|---|---|---|
aweme_list | array of post | |
cursor | null | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
unique_id | null | Echo of what you queried. |
user_id | string | Echo of what you queried. |
{
"aweme_list": [],
"cursor": null,
"has_more": false,
"unique_id": null,
"user_id": "107955"
}
POST /api/v1/scrape/tiktok/followers
Accounts following a creator.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle (or unique_id) | str | no | null | Creator’s username/handle — resolved to a user id for you. Pass user_id directly when you have it to skip the lookup. |
user_id | str | no | null | Numeric TikTok user id |
min_time (or cursor) | str | no | '0' | Pagination cursor — echo back the min_time from the previous response. |
trim | bool | no | False | Accepted and ignored — the full object is always returned. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/followers \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "tiktok"}'
Pages onResponse — themin_time, notcursor.totalcarries the real follower count, so the gap between it and what pagination reaches is always visible.
data object:
| Key | Type | |
|---|---|---|
followers | array of creator | |
min_time | string | Pagination cursor for this surface. null once exhausted. |
has_more | boolean | Whether another page exists. |
total | number | Total across the whole list, not just this page. |
unique_id | string | Echo of what you queried. |
user_id | string | Echo of what you queried. |
{
"followers": [
"<creator object — see Response objects>"
],
"min_time": "1786127778",
"has_more": true,
"total": 95150085,
"unique_id": "tiktok",
"user_id": "107955"
}
POST /api/v1/scrape/tiktok/following
Accounts a creator follows.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle (or unique_id) | str | no | null | Creator’s username/handle — resolved to a user id for you. Pass user_id directly when you have it to skip the lookup. |
user_id | str | no | null | Numeric TikTok user id |
min_time (or cursor) | str | no | '0' | Pagination cursor — echo back the min_time from the previous response. |
trim | bool | no | False | Accepted and ignored — the full object is always returned. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/following \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "tiktok"}'
Pages on min_time. Empty for accounts that hide the list.
Response — the data object:
| Key | Type | |
|---|---|---|
followings | array of creator | |
min_time | null | Pagination cursor for this surface. null once exhausted. |
has_more | boolean | Whether another page exists. |
total | number | Total across the whole list, not just this page. |
unique_id | string | Echo of what you queried. |
user_id | string | Echo of what you queried. |
{
"followings": [
"<creator object — see Response objects>"
],
"min_time": null,
"has_more": false,
"total": 2,
"unique_id": "tiktok",
"user_id": "107955"
}
POST /api/v1/scrape/tiktok/sound
One sound’s metadata — title, artist, artwork, duration, usage count.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
clipId (or music) | str | yes | — | Sound id, or a full tiktok.com/music/… URL. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/sound \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"clipId": "7002634556977908485"}'
data object:
| Key | Type | |
|---|---|---|
music_info | object | |
rec_list | array | |
similar_music | array | |
similar_music_ids | array | |
status_code | number | Platform status code. 0 is success. |
status_msg | string | Platform status message. |
{
"music_info": {
"id": "7002634556977908485",
"id_str": "7002634556977908485",
"mid": "7002634556977908485",
"title": "original sound - duyoungin",
"author": "🇺🇸",
"owner_nickname": "🇺🇸",
"album": null,
"duration": 6,
"is_original": true,
"is_original_sound": true,
"play_url": {
"uri": "https://v16-ies-music.tiktokcdn.com/80d6047cdb592f1a21edfa331b1a85d2…",
"url_list": [
"https://v16-ies-music.tiktokcdn.com/80d6047cdb592f1a21edfa331b1a85d2…"
],
"width": null,
"height": null,
"url_prefix": null
},
"cover_thumb": {
"uri": "https://p19-common-sign.tiktokcdn.com/tos-maliva-avt-0068/7350346788…",
"url_list": [
"https://p19-common-sign.tiktokcdn.com/tos-maliva-avt-0068/7350346788…"
],
"width": null,
"height": null,
"url_prefix": null
},
"cover_medium": {
"uri": "https://p19-common-sign.tiktokcdn.com/tos-maliva-avt-0068/7350346788…",
"url_list": [
"https://p19-common-sign.tiktokcdn.com/tos-maliva-avt-0068/7350346788…"
],
"width": null,
"height": null,
"url_prefix": null
},
"cover_large": {
…
music_info fields:
| Field | Type | Example |
|---|---|---|
id | string | "7002634556977908485" |
id_str | string | "7002634556977908485" |
mid | string | "7002634556977908485" |
title | string | "original sound - duyoungin" |
author | string | "🇺🇸" |
owner_nickname | string | "🇺🇸" |
album | null | |
duration | number | 6 |
is_original | boolean | true |
is_original_sound | boolean | true |
play_url | object | nested: uri, url_list, width, height |
cover_thumb | object | nested: uri, url_list, width, height |
cover_medium | object | nested: uri, url_list, width, height |
cover_large | object | nested: uri, url_list, width, height |
user_count | number | 982 |
POST /api/v1/scrape/tiktok/sound-posts
The videos using a sound.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
clipId (or music) | str | yes | — | Sound id, or a full tiktok.com/music/… URL. |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/sound-posts \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"clipId": "7002634556977908485", "cursor": "0"}'
data object:
| Key | Type | |
|---|---|---|
aweme_list | array of post | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
status_code | number | Platform status code. 0 is success. |
status_msg | string | Platform status message. |
extra | null | Platform tracing block. Always null here. |
log_pb | null | Platform tracing block. Always null here. |
can_pin_video | boolean | |
need_lazy_loading | boolean | |
music_id | string | Echo of what you queried. |
{
"aweme_list": [
"<post object — see Response objects>"
],
"cursor": "12",
"has_more": true,
"status_code": 0,
"status_msg": "",
"extra": null,
"log_pb": null,
"can_pin_video": false,
"need_lazy_loading": false,
"music_id": "7002634556977908485"
}
TikTok · Hashtag
POST /api/v1/scrape/tiktok/hashtag
Hashtag header — description, post count and lifetime views.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
challenge_id | str | no | null | Numeric hashtag (challenge) id |
hashtag (or challenge_name) | str | no | null | Hashtag name, also accepted as hashtag, with or without ’#’, or a /tag/ URL |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/hashtag \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"hashtag": "fyp"}'
AcceptsResponse — thehashtag(the name) orchallenge_id(e.g. “229207”).
data object:
| Key | Type | |
|---|---|---|
hashtag | object |
{
"hashtag": {
"hashtag_id": "229207",
"name": "fyp",
"description": null,
"post_count": 534395710,
"view_count": 125407420251356,
"cover_url": null,
"is_commerce": false,
"is_pgc_show": false,
"is_challenge": false,
"is_strong_music": false,
"type": 2,
"hashtag_link": "https://www.tiktok.com/tag/fyp"
}
}
hashtag fields:
| Field | Type | Example |
|---|---|---|
hashtag_id | string | "229207" |
name | string | "fyp" |
description | null | |
post_count | number | 534395710 |
view_count | number | 125407420251356 |
cover_url | null | |
is_commerce | boolean | false |
is_pgc_show | boolean | false |
is_challenge | boolean | false |
is_strong_music | boolean | false |
type | number | 2 |
hashtag_link | string | "https://www.tiktok.com/tag/fyp" |
POST /api/v1/scrape/tiktok/hashtag-posts
Posts carrying a hashtag.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
challenge_id | str | no | null | Numeric hashtag (challenge) id |
hashtag (or challenge_name) | str | no | null | Hashtag name, with or without ’#’, or a /tag/ URL |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
region | str | no | null | ISO-2 region code to bias the feed (e.g. ‘US’); see /api/v1/scrape/tiktok/regions for the accepted list |
trim | bool | no | False | Accepted and ignored — the full object is always returned. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/hashtag-posts \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"hashtag": "fyp", "cursor": "0"}'
Passing challenge_id instead of the name is slightly faster; the name form returns the hashtag object alongside the posts for free.
Response — the data object:
| Key | Type | |
|---|---|---|
aweme_list | array of post | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
hashtag_id | string | Echo of what you queried. |
hashtag | object |
{
"aweme_list": [
"<post object — see Response objects>"
],
"cursor": "20",
"has_more": true,
"hashtag_id": "229207",
"hashtag": {
"hashtag_id": "229207",
"name": "fyp",
"description": null,
"post_count": 534395718,
"view_count": 125407420827330,
"cover_url": null,
"is_commerce": false,
"is_pgc_show": false,
"is_challenge": false,
"is_strong_music": false,
"type": 2,
"hashtag_link": "https://www.tiktok.com/tag/fyp"
}
}
hashtag fields:
| Field | Type | Example |
|---|---|---|
hashtag_id | string | "229207" |
name | string | "fyp" |
description | null | |
post_count | number | 534395718 |
view_count | number | 125407420827330 |
cover_url | null | |
is_commerce | boolean | false |
is_pgc_show | boolean | false |
is_challenge | boolean | false |
is_strong_music | boolean | false |
type | number | 2 |
hashtag_link | string | "https://www.tiktok.com/tag/fyp" |
POST /api/v1/scrape/tiktok/hashtag-search
Keyword search over hashtags, with each one’s post and view totals.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query (or keywords) | str | yes | — | Search keyword / phrase. |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/hashtag-search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "travel", "cursor": "0"}'
data object:
| Key | Type | |
|---|---|---|
hashtags | array | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
keywords | string | Echo of what you queried. |
{
"hashtags": [
{
"hashtag_id": "7884",
"name": "Travel",
"description": "🌟The world is a book and those who don't travel read only one page 🏄…",
"post_count": 91198705,
"view_count": 747384842508,
"cover_url": "https://p16-amd-va.tiktokcdn.com/obj/musically-maliva-obj/6cd3395377…",
"is_commerce": false,
"is_pgc_show": false,
"is_challenge": false,
"is_strong_music": false,
"type": 2,
"hashtag_link": "https://www.tiktok.com/tag/Travel"
},
"… 29 more"
],
"cursor": "30",
"has_more": true,
"keywords": "travel"
}
TikTok · Playlist
POST /api/v1/scrape/tiktok/playlist
Playlist header — name, owner and video count.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
playlist | str | yes | — | Playlist (mix) id, or a full /@user/playlist/… URL |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/playlist \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"playlist": "7659874208872221471"}'
data object:
| Key | Type | |
|---|---|---|
playlist | object |
{
"playlist": {
"playlist_id": "7659874208872221471",
"name": "Behind The Breakthrough",
"type": 1,
"video_count": 3,
"creator_id": null,
"creator_username": "tiktok",
"creator_name": null,
"playlist_link": "https://www.tiktok.com/@tiktok/playlist/behind-the-breakthrough-7659…"
}
}
playlist fields:
| Field | Type | Example |
|---|---|---|
playlist_id | string | "7659874208872221471" |
name | string | "Behind The Breakthrough" |
type | number | 1 |
video_count | number | 3 |
creator_id | null | |
creator_username | string | "tiktok" |
creator_name | null | |
playlist_link | string | "https://www.tiktok.com/@tiktok/playli… |
TikTok · Collection
POST /api/v1/scrape/tiktok/collection
Collection header — name, owner and video count.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
url (or collection) | str | yes | — | Collection id, or a full tiktok.com/collection/… URL. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/collection \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"url": "7394627756635573022"}'
data object:
| Key | Type | |
|---|---|---|
collection | object |
{
"collection": {
"collection_id": "7394627756635573022",
"name": "Summer of Sports",
"video_count": 139,
"state": 3,
"creator_id": "107955",
"creator_username": null,
"creator_name": "TikTok"
}
}
collection fields:
| Field | Type | Example |
|---|---|---|
collection_id | string | "7394627756635573022" |
name | string | "Summer of Sports" |
video_count | number | 139 |
state | number | 3 |
creator_id | string | "107955" |
creator_username | null | |
creator_name | string | "TikTok" |
POST /api/v1/scrape/tiktok/collection-posts
Videos saved inside a public collection.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
url (or collection) | str | yes | — | Collection id, or a full tiktok.com/collection/… URL. |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/collection-posts \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"url": "7394627756635573022", "cursor": "0"}'
This surface answers in TikTok’s WEB shape (Response — theid/desc/stats/createTime) and pages onmax_cursor.
data object:
| Key | Type | |
|---|---|---|
collection_id | string | Echo of what you queried. |
videos | array of collection post | |
has_more | boolean | Whether another page exists. |
max_cursor | string | Pagination cursor for this surface. null once exhausted. |
status_code | number | Platform status code. 0 is success. |
status_msg | string | Platform status message. |
{
"collection_id": "7394627756635573022",
"videos": [
"<collection post object — see Response objects>"
],
"has_more": true,
"max_cursor": "30",
"status_code": 0,
"status_msg": ""
}
POST /api/v1/scrape/tiktok/collections
Every public collection a creator has published.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle (or unique_id) | str | no | null | Creator’s username/handle (with or without @). |
user_id | str | no | null | Numeric TikTok user id — an alternative to unique_id |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/collections \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "tiktok", "cursor": "0"}'
data object:
| Key | Type | |
|---|---|---|
collections | array | |
cursor | null | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
unique_id | string | Echo of what you queried. |
user_id | null | Echo of what you queried. |
{
"collections": [
{
"collection_id": "7394627756635573022",
"name": "Summer of Sports",
"video_count": 139,
"state": 3,
"creator_id": null,
"creator_username": null,
"creator_name": null
}
],
"cursor": null,
"has_more": false,
"unique_id": "tiktok",
"user_id": null
}
POST /api/v1/scrape/tiktok/playlists
Every playlist a creator has published.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle (or unique_id) | str | no | null | Creator’s username/handle (with or without @). |
user_id | str | no | null | Numeric TikTok user id — an alternative to unique_id |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/playlists \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "tiktok", "cursor": "0"}'
data object:
| Key | Type | |
|---|---|---|
playlists | array | |
cursor | null | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
unique_id | string | Echo of what you queried. |
user_id | null | Echo of what you queried. |
{
"playlists": [
{
"playlist_id": "7659874208872221471",
"name": "Behind The Breakthrough",
"type": 1,
"video_count": null,
"creator_id": null,
"creator_username": "tiktok",
"creator_name": null,
"playlist_link": "https://www.tiktok.com/@tiktok/playlist/behind-the-breakthrough-7659…"
},
"… 3 more"
],
"cursor": null,
"has_more": false,
"unique_id": "tiktok",
"user_id": null
}
TikTok · Discovery
POST /api/v1/scrape/tiktok/search
Keyword search over videos, with recency and sort filters.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query (or keywords) | str | yes | — | Search keyword / phrase. |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
region | str | no | null | ISO-2 region code to search from (e.g. ‘US’); see /api/v1/scrape/tiktok/regions |
publish_time | int | no | 0 | Recency filter in days: 0 all-time (default), 1 past 24 h, 7 this week, 30 this month, 90 last 3 months, 180 last 6 months |
sort_type | int | no | 0 | Sort order: 0 relevance (default), 1 most-liked, 3 most recent |
trim | bool | no | False | Accepted and ignored — the full object is always returned. |
date_posted | str | no | null | Named recency window: all-time, yesterday, this-week, this-month, last-3-months, last-6-months. Supersedes publish_time when both are sent. |
sort_by | str | no | null | Named ranking: relevance, most-liked, date-posted. Supersedes sort_type when both are sent. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "cooking", "cursor": "0"}'
Response — thedate_posted: all-time · yesterday · this-week · this-month · last-3-months · last-6-months.sort_by: relevance · most-liked · date-posted.
data object:
| Key | Type | |
|---|---|---|
search_item_list | array of post | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
keywords | string | Echo of what you queried. |
{
"search_item_list": [
"<post object — see Response objects>"
],
"cursor": "30",
"has_more": true,
"keywords": "cooking"
}
POST /api/v1/scrape/tiktok/photo-search
Keyword search restricted to photo (slideshow) posts.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query (or keywords) | str | yes | — | Search keyword / phrase. |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
region | str | no | null | ISO-2 region code to search from (e.g. ‘US’); see /api/v1/scrape/tiktok/regions |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/photo-search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "cooking", "cursor": "0"}'
data object:
| Key | Type | |
|---|---|---|
search_item_list | array of post | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
keywords | string | Echo of what you queried. |
{
"search_item_list": [
"<post object — see Response objects>"
],
"cursor": "30",
"has_more": true,
"keywords": "cooking"
}
POST /api/v1/scrape/tiktok/profile-search
Keyword search over creators, with follower-band and verified filters.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query (or keywords) | str | yes | — | Search keyword / phrase. |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
follower_count | str | no | null | Follower band: ‘0’ no limit, ‘1’ 0–1K, ‘2’ 1K–10K, ‘3’ 10K–100K, ‘4’ 100K+ |
profile_type | str | no | null | ’0’ all profiles (default), ‘1’ verified only |
other_pref | str | no | null | Search emphasis: ‘0’ all (default), ‘1’ match on username |
trim | bool | no | False | Accepted and ignored — the full object is always returned. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/profile-search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "cooking", "cursor": "0"}'
data object:
| Key | Type | |
|---|---|---|
users | array of creator | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
keywords | string | Echo of what you queried. |
{
"users": [
"<creator object — see Response objects>"
],
"cursor": "30",
"has_more": true,
"keywords": "cooking"
}
POST /api/v1/scrape/tiktok/top-search
TikTok’s Top tab — best-matching videos, plus the creators and hashtags ranked beside them.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | str | yes | — | Search term |
cursor | str | no | '0' | Pagination cursor |
region | str | no | null | ISO-2 region code to search from |
date_posted | str | no | null | Recency window: all-time, yesterday, this-week, this-month, last-3-months, last-6-months |
sort_by | str | no | null | Ranking: relevance, most-liked, date-posted |
publish_time | int | no | 0 | Numeric recency code — superseded by date_posted when both are sent |
sort_type | int | no | 0 | Numeric sort code — superseded by sort_by when both are sent |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/top-search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "cooking", "cursor": "0"}'
data object:
| Key | Type | |
|---|---|---|
items | array of post | |
users | array of creator | |
hashtags | array | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
query | string | Echo of what you queried. |
publish_time | number | |
sort_type | number |
{
"items": [
"<post object — see Response objects>"
],
"users": [
"<creator object — see Response objects>"
],
"hashtags": [
{
"hashtag_id": "18973",
"name": "cooking",
"description": null,
"post_count": 18631243,
"view_count": 537294140693,
"cover_url": "https://p16-amd-va.tiktokcdn.com/obj/musically-maliva-obj/bbbcb935f0…",
"is_commerce": false,
"is_pgc_show": false,
"is_challenge": false,
"is_strong_music": false,
"type": 2,
"hashtag_link": "https://www.tiktok.com/tag/cooking"
},
"… 9 more"
],
"cursor": "20",
"has_more": true,
"query": "cooking",
"publish_time": 0,
"sort_type": 0
}
POST /api/v1/scrape/tiktok/search-suggestions
The autocomplete terms TikTok offers for a partial query.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | str | yes | — | Partial or full search term |
region | str | no | null | ISO-2 region code — suggestions are region-ranked |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/search-suggestions \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "coff"}'
data object:
| Key | Type | |
|---|---|---|
suggestions | array | |
query | string | Echo of what you queried. |
region | null | Echo of what you queried. |
{
"suggestions": [
{
"text": "coffee",
"position": 0,
"language": "en",
"score": 0.025472913,
"group_id": "4928213053111302118"
},
"… 9 more"
],
"query": "coff",
"region": null
}
POST /api/v1/scrape/tiktok/trending
The trending / For You feed for a region.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
region | str | no | 'US' | ISO-2 region code (e.g. ‘US’); see /api/v1/scrape/tiktok/regions for the accepted list |
trim | bool | no | False | Accepted and ignored — the full object is always returned. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/trending \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"region": "US"}'
Single-shot: this feed carries no cursor, so each call returns a fresh sample rather than a page in a series.Response — the
data object:
| Key | Type | |
|---|---|---|
aweme_list | array of post | |
region | string | Echo of what you queried. |
cursor | null | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
{
"aweme_list": [
"<post object — see Response objects>"
],
"region": "US",
"cursor": null,
"has_more": false
}
POST /api/v1/scrape/tiktok/regions
The region codes accepted by the region-scoped endpoints.
Takes no parameters.
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/regions \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{}'
A static list — cache it rather than fetching it per request.Response — the
data object:
| Key | Type | |
|---|---|---|
regions | array | |
total | number | Total across the whole list, not just this page. |
{
"regions": [
{
"code": "AD",
"name": "Andorra"
},
"… 241 more"
],
"total": 242
}
TikTok · Comments
POST /api/v1/scrape/tiktok/comment-replies
The reply thread under one comment.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
url (or video_id) | str | yes | — | Numeric video id, or any full TikTok video/photo URL. |
comment_id | str | yes | — | Numeric id of the comment whose replies to fetch |
cursor | str | no | '0' | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/comment-replies \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"url": "7612965843596479751", "comment_id": "7612966844110914334"}'
TikTok nests exactly one level, so replies never have replies. TikTok’s own reply cursor is off by one — page 2 repeats page 1’s last reply — so de-duplicate onResponse — thecid, and usetotalfor the real thread size. Requesting a thread in a single page avoids it entirely.
data object:
| Key | Type | |
|---|---|---|
comments | array of comment | |
cursor | null | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
status_code | number | Platform status code. 0 is success. |
status_msg | string | Platform status message. |
extra | null | Platform tracing block. Always null here. |
log_pb | null | Platform tracing block. Always null here. |
total | number | Total across the whole list, not just this page. |
aweme_id | string | Echo of what you queried. |
comment_id | string | Echo of what you queried. |
{
"comments": [
"<comment object — see Response objects>"
],
"cursor": null,
"has_more": false,
"status_code": 0,
"status_msg": "",
"extra": null,
"log_pb": null,
"total": 4,
"aweme_id": "7612965843596479751",
"comment_id": "7612966844110914334"
}
TikTok · Media
POST /api/v1/scrape/tiktok/transcript
A video’s caption track, as plain text and raw WEBVTT.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
url | str | yes | — | TikTok video URL, or a bare numeric video id |
language | str | no | null | Pick a specific track by language code (e.g. ‘en’). Omit to prefer a creator-authored track, then English. |
use_ai_as_fallback | bool | no | False | Applies only to videos with no caption track, which would require speech-to-text. Speech-to-text fallback is not enabled, so such videos report a clear 501 rather than silently returning nothing. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/transcript \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"url": "https://www.tiktok.com/@tiktok/video/7612965843596479751"}'
A genuine caption track, not speech recognition. Short share links (vm.tiktok.com) are rejected with a 400 — expand them first, or pass the bare numeric id.
Response — the data object:
| Key | Type | |
|---|---|---|
id | string | |
url | string | |
transcript | null | |
transcript_vtt | null | |
language | null | |
is_auto_generated | null | |
available_tracks | array |
{
"id": "7612965843596479751",
"url": "https://www.tiktok.com/@tiktok/video/7612965843596479751",
"transcript": null,
"transcript_vtt": null,
"language": null,
"is_auto_generated": null,
"available_tracks": []
}
TikTok · Ads
POST /api/v1/scrape/tiktok/ads
TikTok’s Top Ads library — the best-performing public ads.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
page | int | no | 1 | 1-indexed result page |
cursor | str | no | null | Pagination cursor — echo back the cursor from the previous response. Omit it for the first page.. Equivalent to page (this library pages by number); when both are sent, cursor wins. |
limit | int | no | 20 | Ads per page (max 20; higher values are silently clamped) |
period | int | no | null | Look-back window in days: 7, 30 or 180 |
country_code | str | no | null | Comma-separated ISO-2 markets (e.g. ‘US,CA’) |
ad_language | str | no | null | Comma-separated language codes (e.g. ‘en,de’) |
order_by | str | no | null | Ranking metric: ‘impression’ (reach), ‘ctr’, ‘like’, ‘cvr’, ‘play_6s_rate’, ‘play_2s_rate’ |
industry | str | no | null | Comma-separated industry codes (e.g. ‘28000000000,24000000000’) |
ad_format | str | no | null | ’1’ Spark Ads, ‘2’ non-Spark Ads |
objective | str | no | null | Comma-separated campaign objectives: 1 traffic, 2 app installs, 3 conversions, 4 video views, 5 reach, 8 lead generation, 15 product sales |
like | str | no | null | Like percentile band: ‘1’ top 1–20%, ‘2’ 21–40%, ‘3’ 41–60%, ‘4’ 61–80%, ‘5’ 81–100% |
keyword | str | no | null | Free-text keyword to search the ads library |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/ads \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"country_code": "US", "period": 7}'
Spend is not published for any ad, soResponse — thecostis a band rather than a figure.ctrandlikeare the library’s real metrics.
data object:
| Key | Type | |
|---|---|---|
ads | array | |
cursor | null | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
page | number | |
page_size | number | |
total | number | Total across the whole list, not just this page. |
{
"ads": [
{
"ad_id": "7668163246391033864",
"title": "Yas Nomura | My Ultimate Live Guitar | Donner Live Asia Tour 🎸Learn …",
"brand_name": null,
"industry_key": "label_23116000000",
"objective_key": "campaign_objective_reach",
"objectives": null,
"ctr": 0.93,
"like_count": 978,
"comment_count": null,
"share_count": null,
"cost_level": 0,
"is_search_ad": true,
"countries": null,
"landing_page": null,
"keywords": null,
"highlight_text": null,
"source": null,
"source_key": null,
"has_voice_over": null,
"has_summary": null,
"video": {
"video_id": "v12025gd0000d9lb757og65pl1ih8m20",
"duration_seconds": 93.376,
"cover_url": "https://p16-common-sign.tiktokcdn.com/tos-alisg-p-37c799-sg/ocxiAUIW…",
"video_link": "https://v16m-default.tiktokcdn.com/ceb48c62f3a6c30c9b8c857cf8375a41/…",
"video_links_by_quality": {
"720p": "https://v16m-default.tiktokcdn.com/ceb48c62f3a6c30c9b8c857cf8375a41/…"
},
"width": 576,
"height": 1024
}
},
"… 19 more"
],
"cursor": null,
"has_more": false,
"page": 1,
…
POST /api/v1/scrape/tiktok/ad
The full record for one ad from the Top Ads library.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
ad_id (or material_id) | str | yes | — | Ad (material) id, as returned by /api/v1/scrape/tiktok/ads. |
curl -X POST https://app.sideshift.app/api/v1/scrape/tiktok/ad \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"ad_id": "7667849995747770388"}'
data object:
| Key | Type | |
|---|---|---|
ad_title | string | |
brand_name | string | |
comment | number | |
cost | number | |
country_code | array | |
ctr | number | |
favorite | boolean | |
has_summary | boolean | |
highlight_text | string | |
id | string | |
industry_key | string | |
is_search | boolean | |
keyword_list | null | |
landing_page | string | |
like | number | |
objective_key | string | |
objectives | array | |
pattern_label | array | |
share | number | |
source | string | |
source_key | number | |
video_info | object | |
voice_over | boolean | |
creative_center_url | string | |
detail_analysis | null | |
interactive_time_analysis | null | |
recommended_for_you | null |
{
"ad_title": "[Asia’s 50 Best Bars 2026: Another Toast to Hong Kong’s Bar Scene👏] …",
"brand_name": "",
"comment": 58,
"cost": 2,
"country_code": [
"PH",
"… 8 more"
],
"ctr": 0.42,
"favorite": false,
"has_summary": false,
"highlight_text": "",
"id": "7667849995747770388",
"industry_key": "label_23133000000",
"is_search": false,
"keyword_list": null,
"landing_page": "https://www.discoverhongkong.com/eng/food-and-drink.html?utm_campaig…",
"like": 18090,
"objective_key": "campaign_objective_reach",
"objectives": [
{
"label": "campaign_objective_reach",
"value": 5
}
],
"pattern_label": [],
"share": 77,
"source": "Others",
"source_key": 73,
"video_info": {
"vid": "v1c044g50000d9kcmuvog65kr88cgdng",
"duration": 35.293,
"cover": "https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0037/o0NAvAiG4RBDI…",
"video_url": {
"720p": "https://v16m-default.tiktokcdn.com/1cb73d2e8c22a30d4b76ad5eb935a7ea/…"
},
"width": 576,
"height": 1024
},
…
video_info fields:
| Field | Type | Example |
|---|---|---|
vid | string | "v1c044g50000d9kcmuvog65kr88cgdng" |
duration | number | 35.293 |
cover | string | "https://p16-common-sign.tiktokcdn.com… |
video_url | object | nested: 720p |
width | number | 576 |
height | number | 1024 |
Instagram — 15 platform operations
Instagram’s own payloads are passed through under the keys Instagram uses, so field names and nesting match what you would get from Instagram directly.Instagram · Profile
POST /api/v1/scrape/instagram/profile-details
Full public profile: identity, counts, bio links, recent posts, related accounts.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
cache_max_age | str | no | null | Accepted and ignored — every response is a live read. |
handle | str | yes | — | Instagram handle (with or without @) |
trim | bool | no | False | Return only the core identity/count fields |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/profile-details \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "nasa"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
data | object |
{
"success": true,
"data": {
"user": {
"ai_agent_owner_username": null,
"ai_agent_type": null,
"biography": "Making the seemingly impossible, possible. ✨",
"bio_links": [
{
"title": "NASA.gov Homepage",
"lynx_url": "https://l.instagram.com/?u=https%3A%2F%2Fwww.nasa.gov%2F&e=AUB_spemu…",
"url": "https://www.nasa.gov",
"link_type": "external"
},
"… 4 more"
],
"fb_profile_biolink": null,
"biography_with_entities": {
"raw_text": "Making the seemingly impossible, possible. ✨",
"entities": []
},
"blocked_by_viewer": false,
"restricted_by_viewer": null,
"country_block": false,
"eimu_id": "118750106179205",
"external_url": "https://www.nasa.gov/",
"external_url_linkshimmed": "https://l.instagram.com/?u=https%3A%2F%2Fwww.nasa.gov%2F&e=AUAs9ferS…",
"edge_followed_by": {
"count": 104251113
},
"fbid": "17841401474538262",
"followed_by_viewer": false,
"edge_follow": {
"count": 92
},
"follows_viewer": false,
"full_name": "NASA",
"group_metadata": null,
"has_ar_effects": false,
"has_clips": true,
…
data fields:
| Field | Type | Example |
|---|---|---|
user | object | nested: ai_agent_owner_username, ai_agent_type, biography, bio_links |
POST /api/v1/scrape/instagram/profile-summary
Profile summary keyed by numeric user id.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
userId | str | yes | — | Numeric Instagram user id |
cache_max_age | str | no | null | Accepted and ignored — every response is a live read. |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/profile-summary \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"userId": "528817151"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
pk | string | |
id | string | |
username | string | |
full_name | string | |
biography | string | |
biography_with_entities | object | |
profile_pic_url | string | |
hd_profile_pic_url_info | object | |
is_verified | boolean | |
is_private | boolean | |
is_business | boolean | |
is_professional_account | boolean | |
account_type | string | |
follower_count | number | |
following_count | number | |
media_count | number | |
category | null | |
external_url | string | |
bio_links | array | |
pronouns | array | |
fbid_v2 | string | |
is_embeds_disabled | boolean | |
show_account_transparency_details | boolean | |
transparency_label | null | |
transparency_product | null | |
address_street | string | |
city_name | null | |
zip | null | |
is_regulated_c18 | boolean | |
has_chaining | boolean | |
total_clips_count | number |
{
"success": true,
"pk": "528817151",
"id": "528817151",
"username": "nasa",
"full_name": "NASA",
"biography": "Making the seemingly impossible, possible. ✨",
"biography_with_entities": {
"raw_text": "Making the seemingly impossible, possible. ✨",
"entities": []
},
"profile_pic_url": "https://scontent-mia5-2.cdninstagram.com/v/t51.2885-19/29090066_1592…",
"hd_profile_pic_url_info": {
"url": "https://scontent-mia5-2.cdninstagram.com/v/t51.2885-19/29090066_1592…"
},
"is_verified": true,
"is_private": false,
"is_business": true,
"is_professional_account": true,
"account_type": "business",
"follower_count": 104251113,
"following_count": 92,
"media_count": 4872,
"category": null,
"external_url": "https://www.nasa.gov/",
"bio_links": [
{
"title": "NASA.gov Homepage",
"lynx_url": "https://l.instagram.com/?u=https%3A%2F%2Fwww.nasa.gov%2F&e=AUBOlx2cD…",
"url": "https://www.nasa.gov",
"link_type": "external"
},
"… 4 more"
],
"pronouns": [],
"fbid_v2": "17841401474538262",
"is_embeds_disabled": false,
"show_account_transparency_details": true,
"transparency_label": null,
"transparency_product": null,
…
biography_with_entities fields:
| Field | Type | Example |
|---|---|---|
raw_text | string | "Making the seemingly impossible, poss… |
entities | array | array |
hd_profile_pic_url_info fields:
| Field | Type | Example |
|---|---|---|
url | string | "https://scontent-mia5-2.cdninstagram.… |
POST /api/v1/scrape/instagram/profile-embed
The profile embed HTML, plus an account summary and recent posts.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle | str | yes | — | Instagram handle |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/profile-embed \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "nasa"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
html | string | |
profile | object | |
recent_posts | array |
{
"success": true,
"html": "<!DOCTYPE html>\n<html lang=\"en\" id=\"facebook\" class=\"no_js\">\n<head><…",
"profile": {
"username": "nasa",
"full_name": "NASA",
"is_verified": true,
"profile_pic_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/29090066_1592…",
"follower_count": 104243371,
"media_count": 4872,
"has_public_story": true,
"pronouns": [],
"user_id": "528817151",
"url": "https://www.instagram.com/nasa/"
},
"recent_posts": [
{
"id": "3958525640957958023",
"__typename": "GraphImage",
"shortcode": "DbvghjnkxeH",
"url": "https://www.instagram.com/p/DbvghjnkxeH/",
"caption": "A beautiful, complex ending\n\nPlanetary nebulae, like this one only …",
"thumbnail_src": null,
"display_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.82787-15/765817784_18…",
"video_url": null,
"has_audio": null,
"accessibility_caption": null,
"video_view_count": null,
"video_play_count": null,
"product_type": null,
"video_duration": null,
"clips_music_attribution_info": null,
"is_video": false,
"owner": {
"id": "528817151",
"profile_pic_url": "https://scontent-atl3-2.cdninstagram.com/v/t51.2885-19/29090066_1592…",
"username": "nasa",
"followed_by_viewer": false,
"has_public_story": true,
"is_private": false,
…
profile fields:
| Field | Type | Example |
|---|---|---|
username | string | "nasa" |
full_name | string | "NASA" |
is_verified | boolean | true |
profile_pic_url | string | "https://scontent-atl3-2.cdninstagram.… |
follower_count | number | 104243371 |
media_count | number | 4872 |
has_public_story | boolean | true |
pronouns | array | array |
user_id | string | "528817151" |
url | string | "https://www.instagram.com/nasa/" |
Instagram · Posts
POST /api/v1/scrape/instagram/timeline
A page of a profile’s timeline — reels, photos, videos and carousels.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
handle | str | yes | — | Instagram handle |
next_max_id | str | no | null | Cursor from the previous response |
trim | bool | no | False | Return a reduced post object |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/timeline \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"handle": "nasa"}'
Pages on next_max_id.
Response — the data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
items | array of post | |
num_results | number | |
more_available | boolean | |
has_more | boolean | Whether another page exists. |
next_max_id | string | Pass back on the next call. |
user | object |
{
"success": true,
"items": [
"<post object — see Response objects>"
],
"num_results": 12,
"more_available": true,
"has_more": true,
"next_max_id": "3952023811948503235_528817151",
"user": {
"pk": "528817151",
"pk_id": "528817151",
"profile_grid_display_type": "default",
"strong_id__": "528817151",
"id": "528817151",
"full_name": "NASA",
"is_active_on_text_post_app": true,
"is_private": false,
"is_verified": true,
"profile_pic_id": "1735715738009579084_528817151",
"profile_pic_url": "https://scontent-sea5-1.cdninstagram.com/v/t51.2885-19/29090066_1592…",
"username": "nasa"
}
}
user fields:
| Field | Type | Example |
|---|---|---|
pk | string | "528817151" |
pk_id | string | "528817151" |
profile_grid_display_type | string | "default" |
strong_id__ | string | "528817151" |
id | string | "528817151" |
full_name | string | "NASA" |
is_active_on_text_post_app | boolean | true |
is_private | boolean | false |
is_verified | boolean | true |
profile_pic_id | string | "1735715738009579084_528817151" |
profile_pic_url | string | "https://scontent-sea5-1.cdninstagram.… |
username | string | "nasa" |
POST /api/v1/scrape/instagram/reels
A page of a profile’s reels, including the play counts the timeline omits.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
user_id | str | no | null | Numeric user id — the fastest form |
handle | str | no | null | Instagram handle; costs one extra resolve |
max_id | str | no | null | Cursor from the previous response |
trim | bool | no | False | Return a reduced post object |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/reels \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"user_id": "528817151"}'
Pages onResponse — themax_id. Passinguser_idinstead ofhandleis slightly faster.
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
items | array of post | |
num_results | number | |
more_available | boolean | |
has_more | boolean | Whether another page exists. |
max_id | string | Pass back on the next call. |
user_id | string | Echo of what you queried. |
username | null |
{
"success": true,
"items": [
"<post object — see Response objects>"
],
"num_results": 12,
"more_available": true,
"has_more": true,
"max_id": "QVFBQU1JYnF1WFVjSEw5WERMRnpoZkN4aWZIbGNkdFJpQlhPT2lxVzNQb243emw0eXBs…",
"user_id": "528817151",
"username": null
}
POST /api/v1/scrape/instagram/post-details
One post or reel in full detail, as Instagram’s own post object.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
cache_max_age | str | no | null | Accepted and ignored — every response is a live read. |
url | str | yes | — | Instagram post or reel URL (or bare shortcode) |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/post-details \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"url": "https://www.instagram.com/p/DXuVyDtDyVH/"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
data | object |
{
"success": true,
"data": {
"xdt_shortcode_media": {
"__typename": "XDTGraphImage",
"__isXDTGraphMediaInterface": "XDTGraphImage",
"id": "3886139327395079495",
"shortcode": "DXuVyDtDyVH",
"thumbnail_src": "https://scontent-lga3-3.cdninstagram.com/v/t51.82787-15/682828177_18…",
"dimensions": {
"height": 1080,
"width": 1080
},
"gating_info": null,
"fact_check_overall_rating": null,
"fact_check_information": null,
"sensitivity_friction_info": null,
"sharing_friction_info": {
"should_have_sharing_friction": false,
"bloks_app_url": null
},
"media_overlay_info": null,
"media_preview": "ACoq5mitCKOIqNw5I9TTHjjLEKOOMf1qmramamm7WZSorRSBGcDHBz3NTTW0aqxC4IBx…",
"display_url": "https://scontent-lga3-3.cdninstagram.com/v/t51.82787-15/682828177_18…",
"display_resources": [
{
"src": "https://scontent-lga3-3.cdninstagram.com/v/t51.82787-15/682828177_18…",
"config_width": 640,
"config_height": 640
},
"… 2 more"
],
"accessibility_caption": null,
"is_video": false,
"tracking_token": "eyJ2ZXJzaW9uIjo1LCJwYXlsb2FkIjp7ImlzX2FuYWx5dGljc190cmFja2VkIjp0cnVl…",
"upcoming_event": null,
"edge_media_to_tagged_user": {
"edges": []
},
"owner": {
…
data fields:
| Field | Type | Example |
|---|---|---|
xdt_shortcode_media | object | nested: __typename, __isXDTGraphMediaInterface, id, shortcode |
Instagram · Comments
POST /api/v1/scrape/instagram/post-comments
Top-level comments on a post or reel.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
url | str | yes | — | Instagram post or reel URL |
cursor | str | no | null | Cursor from the previous response |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/post-comments \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"url": "https://www.instagram.com/p/DXuVyDtDyVH/"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
comments | array of comment | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
total_count | null |
{
"success": true,
"comments": [
"<comment object — see Response objects>"
],
"cursor": "{\"is_server_cursor_inverse\":true,\"server_cursor\":\"AQHSBtV5DO65TZqG_z…",
"has_more": true,
"total_count": null
}
Instagram · Discovery
POST /api/v1/scrape/instagram/search
Ranked accounts, hashtags and suggested terms for a keyword.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | str | yes | — | Keyword, hashtag or account to search for |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "cars"}'
Instagram ranks results only for topics it curates; a topic it does not curate returns a clean 404.Response — the
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
data | object |
{
"success": true,
"data": {
"query": "cars",
"users": [
{
"pk": "17841459401872912",
"username": "desharpen",
"full_name": null,
"is_verified": true,
"is_private": null,
"profile_pic_url": "https://scontent-atl3-3.cdninstagram.com/v/t51.82787-19/626667495_17…",
"url": "https://www.instagram.com/desharpen/"
},
"… 21 more"
],
"hashtags": [
{
"name": "cars",
"url": "https://www.instagram.com/explore/tags/cars/",
"post_matches": 16
},
"… 102 more"
],
"places": [],
"keywords": [
"cars memes pixar",
"… 9 more"
],
"rank_token": null
}
}
data fields:
| Field | Type | Example |
|---|---|---|
query | string | "cars" |
users | array | array |
hashtags | array | array |
places | array | array |
keywords | array | array |
rank_token | null |
POST /api/v1/scrape/instagram/popular-search
Instagram’s curated topic page and its posts.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | str | yes | — | Topic to look up |
cursor | str | no | null | Opaque cursor from the previous response |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/popular-search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "cars"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
query | string | Echo of what you queried. |
posts | array | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
title | string | |
total_media_count | number | |
total_media_count_is_approximate | boolean | |
description | string | |
description_sources | array | |
suggested_terms | array |
{
"success": true,
"query": "cars",
"posts": [
{
"id": "POLARIS_3837645634371701475",
"code": "DVCDl8qjcrj",
"shortcode": "DVCDl8qjcrj",
"url": "https://www.instagram.com/reel/DVCDl8qjcrj/",
"caption": "The most iconic BMW spec in the world ♦️ \n.\n#ruby #diamond #luxury #…",
"display_uri": "https://scontent-phl2-1.cdninstagram.com/v/t51.82787-15/640785301_17…",
"is_video": true,
"video_url": "https://scontent-phl2-1.cdninstagram.com/o1/v/t16/f2/m69/AQNgQLtffln…",
"video_versions": [
{
"url": "https://scontent-phl2-1.cdninstagram.com/o1/v/t16/f2/m69/AQNgQLtffln…"
},
"… 2 more"
],
"play_count": 234303633,
"user": {
"is_verified": true,
"profile_pic_url": "https://scontent-phl2-1.cdninstagram.com/v/t51.82787-19/626667495_17…",
"username": "desharpen",
"id": "17841459401872912"
}
},
"… 11 more"
],
"cursor": "AQHSalwPujAUe4ikvXqVXpT7uyOab360cwTb8N86pAVWCyF0OPy8V_iCHQJMGjbLC1CC",
"has_more": true,
"title": "Cars",
"total_media_count": 572000000,
"total_media_count_is_approximate": true,
"description": "ET Auto reports popular 2026 models in India include the Mahindra Bo…",
"description_sources": [
"https://auto.economictimes.indiatimes.com/cars",
"… 2 more"
],
"suggested_terms": [
…
POST /api/v1/scrape/instagram/hashtag-search
Public posts carrying an exact hashtag.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
hashtag | str | yes | — | Hashtag to search for, with or without the # |
date_posted | str | no | null | Restrict to a recency window: last-hour, last-day, last-week, last-month, last-year |
media_type | str | no | 'all' | ’all’ for posts and reels, or ‘reels’ |
cursor | str | no | null | Page number from the previous response (max 10) |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/hashtag-search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"hashtag": "sunset"}'
Paginates by cursor up to page 10; beyond that there is no page to return and the request is rejected rather than silently clamped.
Response — the data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
hashtag | string | |
media_type | string | |
posts | array | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
{
"success": true,
"hashtag": "sunset",
"media_type": "all",
"posts": [
{
"id": "3938263670771180972",
"__typename": "XDTGraphVideo",
"shortcode": "DanhfFYJGWs",
"url": "https://www.instagram.com/reel/DanhfFYJGWs/",
"caption": "Beautiful sunset view 🌼😍🧿🧡✨🕊️\n.\n.\n.\n.\n.\n#reels #instagood #trending …",
"thumbnail_src": "https://scontent-dfw5-2.cdninstagram.com/v/t51.71878-15/743933431_18…",
"display_url": "https://scontent-dfw5-2.cdninstagram.com/v/t51.71878-15/743933431_18…",
"video_url": "https://scontent-dfw5-2.cdninstagram.com/o1/v/t2/f2/m86/AQOjs3ok6euq…",
"has_audio": true,
"accessibility_caption": null,
"video_view_count": 95,
"video_play_count": 33277,
"product_type": "clips",
"video_duration": 17.996,
"clips_music_attribution_info": {
"artist_name": "Lata Mangeshkar, Udit Narayan",
"song_name": "Ho Gaya Hai Tujhko To Pyar Sajna",
"uses_original_audio": false,
"should_mute_audio": false,
"should_mute_audio_reason": "",
"audio_id": "224024948705759"
},
"is_video": true,
"owner": {
"id": "66534483157",
"username": "sapna_krraj",
"is_verified": false,
"profile_pic_url": "https://scontent-dfw6-1.cdninstagram.com/v/t51.82787-19/669946888_17…",
"blocked_by_viewer": false,
"restricted_by_viewer": null,
"followed_by_viewer": false,
"full_name": "",
"has_blocked_viewer": false,
"is_embeds_disabled": false,
…
POST /api/v1/scrape/instagram/profile-search
Creator discovery from bio and caption keywords.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | str | yes | — | Bio or caption keyword/phrase |
cursor | str | no | null | Page number from the previous response (max 10) |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/profile-search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "travel blogger"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
query | string | Echo of what you queried. |
profiles | array | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
{
"success": true,
"query": "travel blogger",
"profiles": [
{
"id": null,
"username": "travelnowbloggers",
"full_name": null,
"biography": null,
"bio_links": [],
"external_url": null,
"is_private": null,
"is_verified": null,
"is_business_account": null,
"is_professional_account": null,
"category_name": null,
"profile_pic_url": null,
"follower_count": null,
"following_count": null,
"media_count": null,
"url": "https://www.instagram.com/travelnowbloggers/",
"matched_from": "profile",
"google_title": "PASSIONATE TRAVELLERS ⭐️ (@travelnowbloggers) - Instagram",
"google_description": "1M Followers, 8,617 Following, 203 Posts - See Instagram photos and …",
"enriched": false
},
"… 9 more"
],
"cursor": "2",
"has_more": true
}
POST /api/v1/scrape/instagram/reels-search
Keyword reel search.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | str | yes | — | Keyword or phrase to search for |
date_posted | str | no | null | Restrict to a recency window: last-hour, last-day, last-week, last-month, last-year |
page | int | no | 1 | Result page, 1-10 |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/reels-search \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"query": "coffee"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
query | string | Echo of what you queried. |
reels | array | |
page | number | |
has_more | boolean | Whether another page exists. |
{
"success": true,
"query": "coffee",
"reels": [
{
"id": "3917981479610046083",
"__typename": "XDTGraphVideo",
"shortcode": "DZfd2W4t1aD",
"url": "https://www.instagram.com/reel/DZfd2W4t1aD/",
"caption": "Salty Canadian: Worth every calorie! 👀\n\nRecipe:\n-prepare your coffee…",
"thumbnail_src": "https://scontent-dfw6-2.cdninstagram.com/v/t51.82787-15/723918380_18…",
"display_url": "https://scontent-dfw6-2.cdninstagram.com/v/t51.82787-15/723918380_18…",
"video_url": "https://scontent-dfw6-1.cdninstagram.com/o1/v/t2/f2/m367/AQNXHJdg4Ei…",
"has_audio": true,
"accessibility_caption": null,
"video_view_count": 1459911,
"video_play_count": 3012295,
"product_type": "clips",
"video_duration": 17.367,
"clips_music_attribution_info": {
"artist_name": "yourcoffeedude",
"song_name": "Original audio",
"uses_original_audio": true,
"should_mute_audio": false,
"should_mute_audio_reason": "",
"audio_id": "27477343098569153"
},
"is_video": true,
"owner": {
"id": "43028282520",
"username": "yourcoffeedude",
"is_verified": true,
"profile_pic_url": "https://scontent-dfw6-2.cdninstagram.com/v/t51.2885-19/323028415_608…",
"blocked_by_viewer": false,
"restricted_by_viewer": null,
"followed_by_viewer": false,
"full_name": "Coffee Recipes & more",
"has_blocked_viewer": false,
"is_embeds_disabled": false,
"is_private": false,
…
POST /api/v1/scrape/instagram/trending-reels
The reels Instagram is currently featuring.
Takes no parameters.
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/trending-reels \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
data | object |
{
"success": true,
"data": {
"reels": [
{
"id": "3947638930116993179",
"__typename": "XDTGraphVideo",
"shortcode": "DbI1LEDIGCb",
"url": "https://www.instagram.com/reel/DbI1LEDIGCb/",
"caption": "🟢 AURA. 🟢\n@adidasfootball | @adidas_es",
"thumbnail_src": "https://instagram.fmsn1-1.fna.fbcdn.net/v/t51.82787-15/754015408_186…",
"display_url": "https://instagram.fmsn1-1.fna.fbcdn.net/v/t51.82787-15/754015408_186…",
"video_url": "https://instagram.fmsn1-1.fna.fbcdn.net/o1/v/t2/f2/m86/AQNi76IqdstBv…",
"has_audio": true,
"accessibility_caption": null,
"video_view_count": 243421,
"video_play_count": 17695460,
"product_type": "clips",
"video_duration": 16.416,
"clips_music_attribution_info": {
"artist_name": "realmadrid",
"song_name": "Original audio",
"uses_original_audio": true,
"should_mute_audio": false,
"should_mute_audio_reason": "",
"audio_id": "27299637836384828"
},
"is_video": true,
"owner": {
"id": "290023231",
"username": "realmadrid",
"is_verified": true,
"profile_pic_url": "https://instagram.fmsn1-1.fna.fbcdn.net/v/t51.82787-19/624543809_185…",
"blocked_by_viewer": false,
"restricted_by_viewer": null,
"followed_by_viewer": false,
"full_name": "Real Madrid C.F.",
"has_blocked_viewer": false,
"is_embeds_disabled": false,
"is_private": false,
…
data fields:
| Field | Type | Example |
|---|---|---|
reels | array | array |
returned | number | 12 |
available_in_batch | number | 72 |
Instagram · Audio
POST /api/v1/scrape/instagram/audio-reels
The reels using one audio track.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
audio_id | str | yes | — | Audio id, or an instagram.com/reels/audio// URL |
cursor | str | no | null | Cursor from the previous response |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/audio-reels \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"audio_id": "2237221136433210"}'
data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
reels | array | |
cursor | string | Pass back on the next call. null once the list is exhausted. |
has_more | boolean | Whether another page exists. |
audio_id | string | |
audio | object |
{
"success": true,
"reels": [
{
"gen_ai_chat_with_ai_cta_info": null,
"collaborator_edit_eligibility": false,
"number_of_qualities": 1,
"related_ads_pivots_media_info": "USER_NOT_IN_TEST_GROUP",
"translated_langs_for_autodub": [],
"subtype_name_for_REST__": "XDTClipsMedia",
"is_eligible_for_poe": false,
"original_lang_for_translations": "en",
"eligible_insights_entrypoints": "NONE",
"igbio_product": null,
"hidden_likes_string_variant": -1,
"is_social_ufi_disabled": false,
"boost_unavailable_reason": null,
"boost_unavailable_identifier": null,
"boost_unavailable_reason_v2": [],
"client_cache_key": "Mzg2MjU4MjQwMzA5MzQ0NDkxNQ==.3",
"can_reply": false,
"photo_of_you": false,
"media_attributions_data": [],
"media_ui_attributions_data": [],
"media_ui_attributions_data_v2": [],
"can_view_more_preview_comments": false,
"mezql_token": "",
"has_tagged_users": false,
"is_eligible_content_for_post_roll_ad": false,
"is_cutout_sticker_allowed": false,
"is_photo_comments_composer_enabled_for_author": true,
"hide_view_all_comment_entrypoint": false,
"has_liked": false,
"is_organic_product_tagging_eligible": false,
"view_state_item_type": 128,
"video_sticker_locales": [],
"is_paid_partnership": false,
"is_in_profile_grid": false,
"is_tagged_media_shared_to_viewer_profile_grid": false,
"should_show_author_pog_for_tagged_media_shared_to_profile_grid": false,
…
audio fields:
| Field | Type | Example |
|---|---|---|
music_info | null | |
original_sound_info | null | |
formatted_media_count | null | |
music_canonical_id | string | "18302835427054839" |
Instagram · Stories
POST /api/v1/scrape/instagram/highlight
Every story inside one highlight album.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
id | str | yes | — | Highlight album id (numeric, or ‘highlight:’) |
curl -X POST https://app.sideshift.app/api/v1/scrape/instagram/highlight \
-H 'x-api-key: $SIDESHIFT_SCRAPER_KEY' -H 'Content-Type: application/json' \
-d '{"id": "18067016518767507"}'
The album id is the last path segment of a highlight’s public URL — instagram.com/stories/highlights/{id}/.
Response — the data object:
| Key | Type | |
|---|---|---|
success | boolean | Always true on a 200. |
id | string | |
strong_id__ | string | |
latest_reel_media | number | |
seen | null | |
can_reply | boolean | |
can_gif_quick_reply | boolean | |
can_reshare | boolean | |
reel_type | string | |
ad_expiry_timestamp_in_millis | null | |
is_cta_sticker_available | null | |
should_treat_link_sticker_as_cta | null | |
pool_refresh_ttl_in_sec | null | |
can_react_with_avatar | boolean | |
prefetch_count | number | |
cover_media | object | |
user | object | |
items | array of post | |
is_nux | boolean | |
title | string | |
created_at | number | |
is_pinned_highlight | boolean | |
media_count | number | |
media_ids | array | |
is_cacheable | boolean | |
is_converted_to_clips | boolean | |
disabled_reply_types | array | |
highlight_reel_type | string | |
is_added_to_main_grid | boolean | |
is_archived | boolean | |
show_expiration_tray_signal | boolean | |
is_fit_green | boolean |
{
"success": true,
"id": "highlight:18067016518767507",
"strong_id__": "highlight:18067016518767507",
"latest_reel_media": 1752681624,
"seen": null,
"can_reply": false,
"can_gif_quick_reply": true,
"can_reshare": true,
"reel_type": "highlight_reel",
"ad_expiry_timestamp_in_millis": null,
"is_cta_sticker_available": null,
"should_treat_link_sticker_as_cta": null,
"pool_refresh_ttl_in_sec": null,
"can_react_with_avatar": false,
"prefetch_count": 0,
"cover_media": {
"cropped_image_version": {
"width": 150,
"height": 150,
"url": "https://scontent-lax3-2.cdninstagram.com/v/t51.71878-15/479737232_14…",
"scans_profile": ""
},
"crop_rect": [
0,
"… 3 more"
],
"media_id": "3574665805209826888_21393171",
"full_image_version": null,
"upload_id": null
},
"user": {
"fifa_country_code": "US",
"pk": "21393171",
"pk_id": "21393171",
"strong_id__": "21393171",
"id": "21393171",
"account_badges": [],
"full_name": "Jane Williamson",
"interop_messaging_user_fbid": 119713162748634,
…
cover_media fields:
| Field | Type | Example |
|---|---|---|
cropped_image_version | object | nested: width, height, url, scans_profile |
crop_rect | array | array |
media_id | string | "3574665805209826888_21393171" |
full_image_version | null | |
upload_id | null |
user fields:
| Field | Type | Example |
|---|---|---|
fifa_country_code | string | "US" |
pk | string | "21393171" |
pk_id | string | "21393171" |
strong_id__ | string | "21393171" |
id | string | "21393171" |
account_badges | array | array |
full_name | string | "Jane Williamson" |
interop_messaging_user_fbid | number | 119713162748634 |
is_private | boolean | false |
is_screenshot_blocking_enabled | boolean | false |
is_verified | boolean | true |
profile_pic_id | string | "3828172883697465264_21393171" |
profile_pic_url | string | "https://scontent-lax3-1.cdninstagram.… |
transparency_product_enabled | boolean | false |
username | string | "jane" |
Response objects
These shapes repeat across many endpoints. Each endpoint’s Response table names which one its items use.post
The video or photo object, used wherever a list of posts is returned (aweme_list, search_item_list, items).
| Field | Type | |
|---|---|---|
aweme_id | string | |
desc | string | |
desc_language | null | |
region | string | |
create_time | number | |
create_time_utc | string | |
is_ad | boolean | |
is_top | number | |
is_eligible_for_commission | null | |
is_paid_partnership | null | |
aweme_type | number | |
statistics | object | Nested — aweme_id, play_count, digg_count, comment_count, share_count, download_count, … |
video | object | Nested — play_addr, download_addr, cover, origin_cover, dynamic_cover, duration, … |
image_post_info | null | |
author | object | Nested — uid, short_id, unique_id, nickname, signature, avatar_thumb, … |
author_user_id | string | |
music | object | Nested — id, id_str, mid, title, author, owner_nickname, … |
item_comment_settings | number | |
is_nff_or_nr | boolean | |
commerce_info | object | Nested — adv_promotable, auction_ad_invited, branded_content_type, is_diversion_ad, organic_log_extra, with_comment_filter_words |
anchors | null | |
url | string | |
shop_product_url | null | |
media_id | string |
{
"aweme_id": "7309503813562453280",
"desc": "#fyp #foryou #fypシ #viral #foryoupage 😂😂😂😂",
"desc_language": null,
"region": "GB",
"create_time": 1701876482,
"create_time_utc": "2023-12-06T15:28:02.000Z",
"is_ad": false,
"is_top": 0,
"is_eligible_for_commission": null,
"is_paid_partnership": null,
"aweme_type": 0,
"statistics": {
"aweme_id": "7309503813562453280",
"play_count": 89580,
"digg_count": 1293,
"comment_count": 25,
"share_count": 71,
"download_count": 5,
"collect_count": 261,
"forward_count": null,
"lose_count": null,
"lose_comment_count": null,
"whatsapp_share_count": null,
"repost_count": null
},
"video": {
"play_addr": {
"uri": "https://v45.tiktokcdn-us.com/f299baa76de2dcfd24bb0b0543f0440d/6a767a…",
"url_list": [
"https://v45.tiktokcdn-us.com/f299baa76de2dcfd24bb0b0543f0440d/6a767a…"
],
"width": null,
"height": null,
"url_prefix": null
},
"download_addr": {
"uri": "https://v45.tiktokcdn-us.com/c23ca1667bbb82da546274965fc00c41/6a767a…",
"url_list": [
"https://v45.tiktokcdn-us.com/c23ca1667bbb82da546274965fc00c41/6a767a…"
],
"width": null,
"height": null,
"url_prefix": null
},
"cover": {
"uri": "https://p19-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/o…",
"url_list": [
"https://p19-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/o…"
],
"width": null,
"height": null,
"url_prefix": null
},
"origin_cover": {
"uri": "https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/0…",
"url_list": [
"https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/0…"
],
"width": null,
"height": null,
"url_prefix": null
},
"dynamic_cover": {
"uri": "https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/3…",
"url_list": [
"https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/3…"
],
"width": null,
"height": null,
"url_prefix": null
},
"duration": 93,
"width": null,
"height": null,
"data_size": 11856870,
"watermark_data_size": 12000119
},
"image_post_info": null,
"author": {
"uid": "7164667182319076358",
"short_id": null,
"unique_id": "vkvsrvq",
"nickname": "user63284236732678",
"signature": null,
"avatar_thumb": {
"uri": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/ffe55ee…",
"url_list": [
"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/ffe55ee…"
],
"width": null,
"height": null,
"url_prefix": null
},
"avatar_medium": {
"uri": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/ffe55ee…",
"url_list": [
"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/ffe55ee…"
],
"width": null,
"height": null,
"url_prefix": null
},
"avatar_larger": {
"uri": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/ffe55ee…",
"url_list": [
"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/ffe55ee…"
],
"width": null,
"height": null,
"url_prefix": null
},
"region": "GB",
"language": null,
"sec_uid": null,
"social_info": null,
"events": null
},
"author_user_id": "7164667182319076358",
"music": {
"id": "7043672073613936641",
"id_str": "7043672073613936641",
"mid": "7043672073613936641",
"title": "snowfall",
"author": "Øneheart & reidenshi",
"owner_nickname": "Øneheart & reidenshi",
"album": "snowfall",
"duration": 60,
"is_original": false,
"is_original_sound": false,
"play_url": {
"uri": "https://sf19.tiktokcdn-us.com/obj/tos-alisg-ve-2774/osIlcoxtOBD1ZgZb…",
"url_list": [
"https://sf19.tiktokcdn-us.com/obj/tos-alisg-ve-2774/osIlcoxtOBD1ZgZb…"
],
"width": null,
"height": null,
"url_prefix": null
},
"cover_thumb": {
"uri": "https://p16-common.tiktokcdn-us.com/tos-alisg-v-2774/owIAoUbakCMAeAz…",
"url_list": [
"https://p16-common.tiktokcdn-us.com/tos-alisg-v-2774/owIAoUbakCMAeAz…"
],
"width": null,
"height": null,
"url_prefix": null
},
"cover_medium": {
"uri": "https://p16-common.tiktokcdn-us.com/tos-alisg-v-2774/owIAoUbakCMAeAz…",
"url_list": [
"https://p16-common.tiktokcdn-us.com/tos-alisg-v-2774/owIAoUbakCMAeAz…"
],
"width": null,
"height": null,
"url_prefix": null
},
"cover_large": {
"uri": "https://p16-common.tiktokcdn-us.com/tos-alisg-v-2774/owIAoUbakCMAeAz…",
"url_list": [
"https://p16-common.tiktokcdn-us.com/tos-alisg-v-2774/owIAoUbakCMAeAz…"
],
"width": null,
"height": null,
"url_prefix": null
},
"user_count": null
},
"item_comment_settings": 0,
"is_nff_or_nr": false,
"commerce_info": {
"adv_promotable": false,
"auction_ad_invited": false,
"branded_content_type": 0,
"is_diversion_ad": 0,
"organic_log_extra": "{\"req_id\":\"20260807183740146F5CAA318E6831E2A5\"}",
"with_comment_filter_words": false
},
"anchors": null,
"url": "https://www.tiktok.com/@vkvsrvq/video/7309503813562453280",
"shop_product_url": null,
"media_id": "v0f044gc0000clo94i7og65le2e6jgmg"
}
creator
The account object, used by the follower, following and creator-search lists.
| Field | Type | |
|---|---|---|
uid | string | |
unique_id | string | |
nickname | string | |
signature | null | |
sec_uid | string | |
avatar_thumb | object | Nested — uri, url_list, width, height, url_prefix |
avatar_medium | object | Nested — uri, url_list, width, height, url_prefix |
avatar_larger | object | Nested — uri, url_list, width, height, url_prefix |
region | string | |
language | null | |
create_time | null | |
follower_count | number | |
following_count | number | |
aweme_count | number | |
favoriting_count | number | |
total_favorited | number | |
verified | boolean | |
secret | boolean |
{
"uid": "7434173029016077328",
"unique_id": "la.lalalalisa_6",
"nickname": "Медина",
"signature": null,
"sec_uid": "MS4wLjABAAAA4FFw3fafPXKtTTNwUBx7VhEKkaTUunfPjGfNpHhUX1kRt0oWY94pjLqe…",
"avatar_thumb": {
"uri": "https://p16-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/b745257b…",
"url_list": [
"https://p16-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/b745257b…"
],
"width": null,
"height": null,
"url_prefix": null
},
"avatar_medium": {
"uri": "https://p16-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/b745257b…",
"url_list": [
"https://p16-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/b745257b…"
],
"width": null,
"height": null,
"url_prefix": null
},
"avatar_larger": {
"uri": "https://p16-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/b745257b…",
"url_list": [
"https://p16-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/b745257b…"
],
"width": null,
"height": null,
"url_prefix": null
},
"region": "TR",
"language": null,
"create_time": null,
"follower_count": 10379,
"following_count": 877,
"aweme_count": 0,
"favoriting_count": 6889,
"total_favorited": 3433,
"verified": false,
"secret": false
}
comment
One comment or reply.
| Field | Type | |
|---|---|---|
cid | string | |
aweme_id | string | |
text | string | |
create_time | number | |
digg_count | number | |
reply_id | null | |
reply_to_reply_id | null | |
status | number | |
image_list | null | |
user | object | Nested — uid, unique_id, nickname, signature, sec_uid, avatar_thumb, … |
comment_language | null | |
text_extra | null | |
user_digged | null | |
is_author_digged | null | |
reply_comment | null | |
reply_comment_total | null |
{
"cid": "7612967610280805138",
"aweme_id": "7612965843596479751",
"text": "Thx𓀠𓀠",
"create_time": 1772532161,
"digg_count": 38,
"reply_id": null,
"reply_to_reply_id": null,
"status": 1,
"image_list": null,
"user": {
"uid": "7093407411964986370",
"unique_id": "artchiist",
"nickname": "ちい/Chii",
"signature": "⸝⋆꙳⟡.· ⋆ 𖦹ܾ 𖥧🪵🌿 \n \n🗺ɪɴꜱᴛᴀɢʀᴀᴍ : @ artchiist\n \nꜱᴜʙ:@たいやきくん(ちい) 🚹: …",
"sec_uid": "MS4wLjABAAAANiBD2T6ao7u2cE5Xj1zRRiVjShx-oKRUIDUFgHqmbyUkUOH-bk4iehKJ…",
"avatar_thumb": {
"uri": "https://p19-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/05fb1570…",
"url_list": [
"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/05fb1570…"
],
"width": null,
"height": null,
"url_prefix": null
},
"avatar_medium": {
"uri": "https://p19-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/05fb1570…",
"url_list": [
"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/05fb1570…"
],
"width": null,
"height": null,
"url_prefix": null
},
"avatar_larger": {
"uri": "https://p19-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/05fb1570…",
"url_list": [
"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/05fb1570…"
],
"width": null,
"height": null,
"url_prefix": null
},
"region": "JP",
"language": null,
"create_time": null,
"follower_count": 0,
"following_count": 0,
"aweme_count": 0,
"favoriting_count": 0,
"total_favorited": 0,
"verified": false,
"secret": false
},
"comment_language": null,
"text_extra": null,
"user_digged": null,
"is_author_digged": null,
"reply_comment": null,
"reply_comment_total": null
}
collection post
TikTok answers its collection surface in a different, web-style shape — this is the only place it appears.
| Field | Type | |
|---|---|---|
id | string | |
desc | null | |
createTime | number | |
AIGCDescription | null | |
CategoryType | null | |
IsHDBitrate | null | |
ShowAIGC | null | |
anchors | null | |
author | object | Nested — id, uniqueId, nickname |
stats | object | Nested — collectCount, commentCount, diggCount, playCount, shareCount |
video | object | Nested — duration, height, width, cover |
{
"id": "7399631056783035690",
"desc": null,
"createTime": 1722860874,
"AIGCDescription": null,
"CategoryType": null,
"IsHDBitrate": null,
"ShowAIGC": null,
"anchors": null,
"author": {
"id": "6791598551904076805",
"uniqueId": "nojo18",
"nickname": "Noah Lyles"
},
"stats": {
"collectCount": 38999,
"commentCount": 3102,
"diggCount": 500605,
"playCount": 3341424,
"shareCount": 22575
},
"video": {
"duration": 48,
"height": null,
"width": null,
"cover": "https://p16-common-sign.tiktokcdn.com/tos-useast5-p-0068-tx/oYQIDWNu…"
}
}