Docs menu

TikTok profile videos

Beta GET /v1/tiktok/profile/videos

GET /v1/tiktok/profile/videos

The newest videos of a public account, from TikTok's embed page for it (no login). One page of about 10 (pinned videos first, then newest first), and no cursor: has_more is false because more cannot be fetched logged out, not because the account has no more. Each video has its id, caption, hashtags, cover, a signed play URL, size and play count (TikTok rounds it to two significant digits; extra.views_rounded), and a date taken from the video id (extra.published_at_from_id). Likes, comments, shares and duration are not on that page and stay null; is_pinned is true for a pinned video that can be told from the order (it never over-reports). parent is the account. sort=popular is refused, and a numeric id cannot be looked up: pass handle. A private account answers private.

  • Cost: 1 credit
  • Status: Beta. Built and tested against recorded responses; the shape may still gain fields.
  • Cache: Results are kept up to 30 days; send max_age_days to reuse them for free.
  • Timeout: A request still running after about 25 seconds answers 202 with a job to poll (Batch and jobs).

Parameters#

NameTypeRequiredDescription
handlestringone ofUsername, with or without the leading @. Also accepted as username.
idstringone ofTikTok user id (numeric) or secUid. Also accepted as user_id, secUid, sec_uid.
sortstringnoOrder of results. Changing it restarts the cursor chain. One of latest, popular. Default latest. Also accepted as sort_by, sortBy, order.
include_pinnedbooleannoSet false to drop the pinned videos that can be told from the page order. Default true.

Send at least one of handle, id. If you send several, the first listed is used and the rest are ignored.

Every request also accepts:

  • cursor: the cursor from the previous page (Pagination).
  • region: two-letter country code for results that vary by country. Changing it restarts the cursor chain.
  • trim: true for a smaller response without null fields and extra.
  • raw: true to also get the platform's original object as raw.
  • max_age_days: accept a cached result up to this many days old, for 0 credits (Caching).

Example request#

Set your key in the environment first (see Authentication).

curl
curl -G "https://api.socialscrape.io/v1/tiktok/profile/videos" \
  -H "x-api-key: $SOCIALSCRAPE_API_KEY" \
  --data-urlencode "handle=khaby.lame"
Python
import os
import requests

params = {
    "handle": "khaby.lame",
}
res = requests.get(
    "https://api.socialscrape.io/v1/tiktok/profile/videos",
    headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},
    params=params,
)
body = res.json()

if body["ok"]:
    print(body["data"])
else:
    print(body["error"]["code"], body["error"]["message"])
TypeScript
const url = new URL("https://api.socialscrape.io/v1/tiktok/profile/videos");
url.search = new URLSearchParams({
  "handle": "khaby.lame"
}).toString();
const res = await fetch(url, {
  headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! },
});
const body = await res.json();

if (body.ok) {
  console.log(body.data);
} else {
  console.error(body.error.code, body.error.message);
}
n8n
{
  "nodes": [
    {
      "name": "SocialScrape TikTok profile videos",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        0,
        0
      ],
      "parameters": {
        "method": "GET",
        "url": "https://api.socialscrape.io/v1/tiktok/profile/videos",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "handle",
              "value": "khaby.lame"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "={{ $env.SOCIALSCRAPE_API_KEY }}"
            }
          ]
        }
      }
    }
  ],
  "connections": {}
}

Example response#

This is a sample from a recorded response, lists and long text are shortened. Status 200.

{
  "ok": true,
  "credits_charged": 1,
  "credits_remaining": 4999,
  "cached": false,
  "cached_at": null,
  "request_id": "req_a590f5665490570e7ca4a43f",
  "data": {
    "object": "list",
    "items": [
      {
        "object": "post",
        "platform": "tiktok",
        "id": "7697307919943060767",
        "url": "https://www.tiktok.com/@khaby.lame/video/7697307919943060767",
        "type": "video",
        "author": {
          "id": null,
          "handle": "khaby.lame",
          "name": "Khabane lame",
          "url": "https://www.tiktok.com/@khaby.lame",
          "avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?dr=9640&refresh_token=9a190ea0&x-expires=1793527200&x-signature=pU1CEsEIAzaj33MU4u87Qew1F5I%3D&t=4d5b047...",
          "verified": true
        },
        "title": null,
        "text": "I guess is time to retire #learnfromkhaby #comedy 🥊",
        "published_at": "2026-10-16T16:45:57Z",
        "duration_seconds": null,
        "language": null,
        "hashtags": [
          "learnfromkhaby",
          "comedy"
        ],
        "mentions": null,
        "stats": {
          "views": 4900000,
          "likes": null,
          "comments": null,
          "shares": null,
          "saves": null,
          "dislikes": null
        },
        "media": {
          "thumbnail_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oYRtUztSmZA4BIFDN9PBaVS1EiAX8iBIbVJ26~tplv-tiktokx-origin.image?dr=9636&x-expires=1793527200&x-signature=1f%2F2xH5jvSiwRT9X%2Fd3Fr98M9gQ%3D&t=4d5b0474&ps=13740610&shp=81f88b70&...",
          "video_url": "https://v16m.tiktokcdn-us.com/c90fce4f8f05c4e89e031b8ed08154e0/6ae715a5/video/tos/useast8/tos-useast8-pve-0068-tx2/okAtBQJDE2EBABOobPVaUIr8ztS8Vii6QRmMZ/?a=1233&bti=ODszNWYuMDE6&&bt=1050&ft=aEKfuqT0mIoPD12wO_9I3wU-ZgAbMeF~O5&mime_type=video...",
          "audio_url": null,
          "image_urls": null,
          "width": 720,
          "height": 1280
        },
        "song": null,
        "location": null,
        "is_pinned": null,
        "is_sponsored": null,
        "extra": {
          "animated_cover_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oQPPAi2pJ1BROSztUatBIVDI5iZVjmBE28AB6~tplv-tiktokx-origin.image?dr=9636&x-expires=1793527200&x-signature=KvXSUAZZIdwRw8YTwBGZE%2FJXFng%3D&t=4d5b0474&ps=13740610&shp=81f88b70&sh...",
          "is_private": false,
          "published_at_from_id": true,
          "ratio": "720p",
          "views_rounded": true,
          "warnings": [
            "The actions in this video are performed or supervised by professionals. Do not attempt."
          ]
        }
      },
      {
        "object": "post",
        "platform": "tiktok",
        "id": "7694335322922044703",
        "url": "https://www.tiktok.com/@khaby.lame/video/7694335322922044703",
        "type": "video",
        "author": {
          "id": null,
          "handle": "khaby.lame",
          "name": "Khabane lame",
          "url": "https://www.tiktok.com/@khaby.lame",
          "avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?dr=9640&refresh_token=9a190ea0&x-expires=1793527200&x-signature=pU1CEsEIAzaj33MU4u87Qew1F5I%3D&t=4d5b047...",
          "verified": true
        },
        "title": null,
        "text": "Was the ball out, or was it just my imagination? 🤨#learnfromkhaby #comedy",
        "published_at": "2026-10-08T16:30:45Z",
        "duration_seconds": null,
        "language": null,
        "hashtags": [
          "learnfromkhaby",
          "comedy"
        ],
        "mentions": null,
        "stats": {
          "views": 7100000,
          "likes": null,
          "comments": null,
          "shares": null,
          "saves": null,
          "dislikes": null
        },
        "media": {
          "thumbnail_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oUTRfAf9VxIBJxRXESASIJFEObmyVqHVD7E8Bc~tplv-tiktokx-origin.image?dr=9636&x-expires=1793527200&x-signature=KjVM2VKdtYrvbLYqOG2GxP2cIVU%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shc...",
          "video_url": "https://v16m.tiktokcdn-us.com/0b7b258fdf623905ea05c507479b77e7/6ae715ba/video/tos/useast8/tos-useast8-ve-0068c003-tx2/oEmjGeelIIxqIXxkjgVALC6HQxj4AfTSTISIkK/?a=1233&bti=ODszNWYuMDE6&&bt=1189&ft=aEKfuqT0mIoPD12wO_9I3wU-ZgAbMeF~O5&mime_type=v...",
          "audio_url": null,
          "image_urls": null,
          "width": 720,
          "height": 1280
        },
        "song": null,
        "location": null,
        "is_pinned": null,
        "is_sponsored": null,
        "extra": {
          "animated_cover_url": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/osAHzWAIipBAxVMie5CIDqxK0ArEREAAEKVSfn~tplv-tiktokx-origin.image?dr=9636&x-expires=1793527200&x-signature=bWMdNHEPUHdEpLWVpLMYWWxdksk%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shc...",
          "is_private": false,
          "published_at_from_id": true,
          "ratio": "720p",
          "views_rounded": true
        }
      }
    ],
    "cursor": null,
    "has_more": false,
    "parent": {
      "object": "profile",
      "platform": "tiktok",
      "id": null,
      "handle": "khaby.lame",
      "name": "Khabane lame",
      "headline": null,
      "url": "https://www.tiktok.com/@khaby.lame",
      "kind": "creator",
      "bio": "Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r in the right place😎",
      "avatar_url": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?dr=9640&refresh_token=9a190ea0&x-expires=1793527200&x-signature=pU1CEsEIAzaj33MU4u87Qew1F5I%3D&t=4d5b047...",
      "banner_url": null,
      "verified": true,
      "is_private": false,
      "external_url": null,
      "links": null,
      "location": null,
      "category": null,
      "created_at": null,
      "stats": {
        "followers": 163000000,
        "following": 82,
        "posts": null,
        "likes": null,
        "views": null
      },
      "extra": null
    }
  },
  "cursor": null,
  "has_more": false
}

Response#

A list of Post objects in data.items, with data.cursor and data.has_more.

See Data models for every field. The envelope around data is described in Responses.

Errors#

Failures are free: credits_charged is 0. Branch on error.code, never on the message.

CodeHTTPRetryMeaning
invalid_params400noA parameter is missing, unknown or has the wrong type.
not_found404noThe platform says this profile, post or item does not exist.

Every request can also fail with the account and platform errors listed on the Errors page.

Example error:

{
  "ok": false,
  "error": {
    "code": "not_found",
    "message": "The platform says this profile, post or item does not exist.",
    "retryable": false
  },
  "credits_charged": 0,
  "request_id": "req_7d2efc6374815888e4938aca"
}

Also served at#

These paths answer the same request, so code written for other APIs keeps working: /v3/tiktok/profile/videos. See Switching from ScrapeCreators.