---
title: "TikTok scraper"
description: "Scrape TikTok profiles as JSON: username, bio, verified badge, followers, likes, video count and video URLs. One API request from Python, Node.js, the CLI or MCP."
canonical: https://www.zenrows.com/scrape/tiktok
updated: 2026-10-20
---

# TikTok scraper

The Zenrows TikTok scraper turns a public TikTok profile URL into structured JSON: user ID, username, nickname, bio, verified badge, bio link, follower count, following count, total likes, video count and the URLs of the profile's videos. You send the URL, Fetch in Adaptive Stealth Mode opens the page, and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: tiktok.com
- Returns: Profiles, followers, likes and video URLs

## Run it: one TikTok profile in, JSON out

```json Input
{
  "url": "https://www.tiktok.com/@zachking",
  "mode": "auto",
  "extract": "auto"
}
```

```json Output
{
  "profile": {
    "user_id": "68616495085350913",
    "username": "zachking",
    "nickname": "Zach King",
    "bio": "Bringing a little more wonder into the world, 15 seconds at a time",
    "verified": true,
    "private_account": false,
    "bio_link": "https://youtu.be/ulVscDewRPI?si=-65KnrnwSiGHDeT2",
    "language": "en",
    "profile_url": "https://www.tiktok.com/@zachking"
  },
  "stats": {
    "follower_count": 86820822,
    "following_count": 183,
    "like_count": 1304199204,
    "video_count": 619
  },
  "videos": [
    { "position": 1, "url": "https://www.tiktok.com/@zachking/video/7655004069190192398" },
    { "position": 2, "url": "https://www.tiktok.com/@zachking/video/6768504823336815877" },
    { "position": 3, "url": "https://www.tiktok.com/@zachking/video/7698023628859870477" }
  ]
}
```

Sample output for a TikTok profile page, built from a live request on Oct 20, 2026, trimmed for length. A field is returned when the page shows it.

## What data can you scrape from TikTok?

A public profile page carries the creator's identity, their account totals and the list of videos on the profile. These are the fields teams use most, with the path where each one lives in the JSON.

| Field | What it holds | Example |
|---|---|---|
| `profile.user_id` | TikTok's numeric account ID, stable across username changes | `68616495085350913` |
| `profile.sec_uid` | The secure account ID TikTok uses in its own links | `MS4wLjABAAAANnzJ9pdf…` |
| `profile.username` | The handle after the `@` in the URL | `zachking` |
| `profile.nickname` | The display name on the profile | `Zach King` |
| `profile.bio` | The profile bio text | `Bringing a little more wonder into the world…` |
| `profile.verified` | Whether the account carries the verified badge | `true` |
| `profile.private_account` | Whether the account is private | `false` |
| `profile.bio_link` | The link in the bio, when the account has one | `https://youtu.be/ulVscDewRPI?si=…` |
| `profile.language` | The account's language setting | `en` |
| `profile.avatar_url` | The profile picture, 1080 by 1080 | `https://p16-common-sign.tiktokcdn.com/…` |
| `stats.follower_count` | Followers, as an exact number | `86820822` |
| `stats.following_count` | Accounts the creator follows | `183` |
| `stats.like_count` | Total likes across all the creator's videos | `1304199204` |
| `stats.video_count` | Videos posted on the account | `619` |
| `stats.friend_count` | Mutual follows | `120` |
| `videos[].url` | Each video on the profile, in page order | `https://www.tiktok.com/@zachking/video/7655004069190192398` |
| `videos[].position` | The video's place on the profile grid, pinned videos first | `1` |

## How to scrape TikTok with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Pick the TikTok URL.** A profile is `https://www.tiktok.com/@username`. A single video is `https://www.tiktok.com/@username/video/ID`, with a 19-digit ID.
3. **Send it with the default configuration**: Adaptive Stealth Mode opens the page and renders it when TikTok needs it, and Extract returns the fields.
4. **Read `parsed`** from the response. To keep only the numbers, list `stats` paths and the response returns just those.
5. **Run your creator list in Batch**, then send the `videos[].url` values from each profile as a second job for the videos themselves.

```python Python
# pip install requests
import json
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.tiktok.com/@zachking",
    "mode": "auto",      # Adaptive Stealth Mode
    "extract": "auto",   # structured JSON
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
print(data["profile"]["username"], data["stats"]["follower_count"])
print(json.dumps(data, indent=2, ensure_ascii=False))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.tiktok.com/@zachking",
  mode: "auto",
  extract: "auto",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
console.log(parsed.profile.nickname, parsed.stats.follower_count, parsed.stats.like_count);
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.tiktok.com%2F%40zachking&mode=auto&extract=auto"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.tiktok.com%2F%40zachking&mode=auto&extract=auto&extract_fields=profile.username%2Cstats.follower_count%2Cstats.like_count%2Cstats.video_count"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
for handle in ["zachking", "khaby.lame"]:
    response = client.get(
        f"https://www.tiktok.com/@{handle}",
        params={"mode": "auto", "extract": "auto"},
    )
    stats = response.json()["parsed"]["stats"]
    print(handle, stats["follower_count"], stats["video_count"])
```

## Input

The scraper takes one TikTok URL per request, plus the options below. A Batch job applies the same options to every URL, so the input for a list of creators is a list of profile URLs with these settings.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | A public TikTok profile (`/@username`) or video (`/@username/video/ID`) |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the profile fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `profile.username,stats.follower_count` |
| `proxy_country` | string | any | Two-letter country code. TikTok varies content by region, so set it when you compare markets |
| `wait_for` | string | none | A CSS selector to wait for before the page is read, such as the video grid |
| `session_id` | integer | none | Reuse the same session across several requests, up to 10 minutes |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto"
  },
  "tasks": [
    { "url": "https://www.tiktok.com/@zachking", "external_id": "zachking" },
    { "url": "https://www.tiktok.com/@khaby.lame", "external_id": "khaby.lame" },
    { "url": "https://www.tiktok.com/@zachking/video/7655004069190192398", "external_id": "zachking-7655004069190192398" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as TikTok served it, and `parsed`, the structured record. A profile page returns `profile`, `stats` and `videos`. The sample below was built from a live request on Oct 20, 2026, and trimmed.

```json Profile page
{
  "profile": {
    "user_id": "68616495085350913",
    "sec_uid": "MS4wLjABAAAANnzJ9pdfxtlf3m5Ku_M-rCXVitJC13w4GavqyUD3RE8h1cZ-7O9FT-uQ9rCJjU_E",
    "username": "zachking",
    "nickname": "Zach King",
    "bio": "Bringing a little more wonder into the world, 15 seconds at a time",
    "verified": true,
    "private_account": false,
    "bio_link": "https://youtu.be/ulVscDewRPI?si=-65KnrnwSiGHDeT2",
    "language": "en",
    "profile_url": "https://www.tiktok.com/@zachking",
    "avatar_url": "https://p16-common-sign.tiktokcdn.com/tos-alisg-avt-0068/smgf5f369c884044a8df770614bbfd64717~tplv-tiktokx-cropcenter:1080:1080.jpeg?…"
  },
  "stats": {
    "follower_count": 86820822,
    "following_count": 183,
    "like_count": 1304199204,
    "video_count": 619,
    "friend_count": 120
  },
  "videos": [
    { "position": 1, "url": "https://www.tiktok.com/@zachking/video/7655004069190192398" },
    { "position": 2, "url": "https://www.tiktok.com/@zachking/video/6768504823336815877" },
    { "position": 3, "url": "https://www.tiktok.com/@zachking/video/7698023628859870477" },
    { "position": 4, "url": "https://www.tiktok.com/@zachking/video/7691074636825644302" }
  ]
}
```

Counts come back as exact integers: the profile shows "86.8M" followers, the JSON holds `86820822`. The avatar URL is signed and expires, so download the image if you need to keep it. Need a spreadsheet? Load `parsed` into pandas with `pd.json_normalize(...)` and write CSV or Excel. Need the page for an LLM? Ask for Markdown instead of JSON.

## Scrape TikTok from your coding agent

Claude Code, Cursor, Codex and any MCP client can scrape TikTok profiles from a prompt.

The agent sends the same Fetch and Extract request a developer would, so it reads the JSON shown above. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.tiktok.com/@zachking"
```

```text Then ask your agent
Use Zenrows to open these TikTok profiles and return a table with the
username, verified badge, followers, total likes and likes per video,
sorted by followers:
https://www.tiktok.com/@zachking
https://www.tiktok.com/@khaby.lame
```

## Scrape TikTok at scale with Batch and Crawl

**Batch** runs a list of TikTok URLs as one job, in parallel, with your own ID on each result. Put the username in `external_id`, run the job weekly, and the difference between two runs is each creator's follower and like growth.

**Crawl** follows links from a starting page. Start it on a profile, keep only links that contain `/video/`, and it returns the video pages it reaches from that profile. Send those URLs to Batch, or to the TikTok comment scraper.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto" },
    "tasks": [
      { "url": "https://www.tiktok.com/@zachking", "external_id": "zachking" },
      { "url": "https://www.tiktok.com/@khaby.lame", "external_id": "khaby.lame" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# creators.jsonl: one {"url": "...", "external_id": "...", "extract": "auto"} per line
zenrows batch create creators.jsonl --wait
zenrows batch results <job-id> --out tiktok-profiles.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.tiktok.com/@zachking",
    "depth": 1,
    "max_pages": 100,
    "include_patterns": ["/@zachking/video/"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto"
      },
      "tasks": [
        {
          "url": "https://www.tiktok.com/@zachking",
          "external_id": "tiktok"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with TikTok data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Influencer discovery and vetting | Followers, total likes, video count, verified badge and bio per creator | Influencer marketing agencies and brand teams |
| Creator growth tracking | Weekly follower and like counts per account | Talent managers and creator-economy platforms |
| Competitor brand accounts | The brand account's totals and newest videos | Social media and brand teams |
| Campaign reporting | The videos a creator posted during a campaign, by URL | Agencies and media buyers |
| Creator CRM enrichment | User ID, username, nickname, bio link and avatar | Partnerships and sales teams |
| Trend and culture research | Profiles and video lists around a niche or topic | Researchers and analysts |

## Tips for scraping TikTok

- **Key creators on `user_id`.** A username can change; the numeric `profile.user_id` does not. Store both and join on the ID.
- **Clean the URL.** Strip `?lang=`, `?is_from_webapp=` and share parameters. `https://www.tiktok.com/@username` and `https://www.tiktok.com/@username/video/ID` are all a request needs.
- **Expand short links first.** `vm.tiktok.com` and `vt.tiktok.com` links redirect to the full video URL. Resolve them once and store the full URL.
- **Read the video ID as a date.** TikTok video IDs encode the posting time: shift the ID right by 32 bits and you get a Unix timestamp in seconds, which dates any video from its URL alone.
- **Compute engagement per video.** `stats.like_count` divided by `stats.video_count` gives average likes per video, a quick way to compare creators of different sizes.
- **Set a country when you compare markets.** TikTok serves different content by region, so match the country to the market you study and keep it fixed between runs.
- **Skip private accounts.** `profile.private_account` tells you when an account hides its videos; keep those rows for the totals and move on.

## Frequently asked questions

### Is it legal to scrape TikTok?

Collecting publicly available TikTok data, such as public profiles, follower counts and video links that any visitor can see, is common practice for influencer and market research. Profiles belong to people, and personal data is protected by laws such as the GDPR and the CCPA, so collect only what you have a legitimate reason to use and nothing from private accounts. Check TikTok's terms for your use case and ask your lawyer if you are unsure.

### Is there an official TikTok API?

TikTok has several, each for a narrow audience. The Research API is for approved non-profit academic researchers in the US and Europe and requires an application. The Display API returns a user's own profile and videos only after that user logs in and grants access. The Commercial Content API covers ads. None of them returns any public profile on demand for business use, which is why teams use a scraper for creator research.

### What TikTok pages can I scrape?

Public profile pages ( /@username ) and public video pages ( /@username/video/ID ) on tiktok.com. A profile returns the creator's identity, totals and the URLs of the videos on it. For the comments under a video, see the TikTok comment scraper .

### Can I scrape TikTok follower counts?

Yes. stats.follower_count holds the exact follower number of a public account, next to following, total likes and video count. The page rounds it ("86.8M"); the JSON does not.

### Can I scrape private TikTok accounts?

No. A private account shows its videos only to approved followers, and a scraper sees what a logged-out visitor sees. The profile record marks these accounts with profile.private_account .

### How do I scrape TikTok with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the TikTok URL, Adaptive Stealth Mode and Extract turned on, as in the Python example above. The parsed key of the response holds the profile as a Python dictionary. The zenrows package on PyPI wraps the same request.

### How many TikTok profiles can I scrape?

Send one URL per request, or a whole creator list as a Batch job that runs the URLs in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file.

### Can AI agents scrape TikTok with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the creators you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape TikTok on a schedule?

Yes. Create a scheduled Batch job with your TikTok URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the TikTok scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Influencer teams often run it from Clay to enrich a creator list, or from n8n to log weekly follower counts to Google Sheets. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want.

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com

## Structured data



<script type="application/ld+json">
{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://www.zenrows.com/scrape/tiktok#webpage","url":"https://www.zenrows.com/scrape/tiktok","name":"TikTok scraper","description":"Scrape TikTok profiles as JSON: username, bio, verified badge, followers, likes, video count and video URLs. One API request from Python, Node.js, the CLI or MCP.","isPartOf":{"@id":"https://www.zenrows.com/#website"},"inLanguage":"en","datePublished":"2026-10-20","dateModified":"2026-10-20","about":{"@type":"WebSite","name":"TikTok","url":"https://tiktok.com"},"keywords":"tiktok scraper, tiktok api, tiktok scraper api, tiktok scraping, scrape tiktok, tiktok video scraper, tiktok profile scraper, tiktok profiles scraper, tiktok posts scraper, tiktok data scraper, tiktok comment scraper","mainEntity":{"@id":"https://www.zenrows.com/scrape/tiktok#scraper"},"publisher":{"@type":"Organization","name":"Zenrows","url":"https://www.zenrows.com/"}},{"@type":"SoftwareApplication","@id":"https://www.zenrows.com/scrape/tiktok#scraper","name":"TikTok scraper by Zenrows","url":"https://www.zenrows.com/scrape/tiktok","applicationCategory":"DeveloperApplication","operatingSystem":"Any (HTTP API, CLI, MCP)","description":"The Zenrows TikTok scraper turns a public TikTok profile URL into structured JSON: user ID, username, nickname, bio, verified badge, bio link, follower count, following count, total likes, video count and the URLs of the profile's videos. You send the URL, Fetch in Adaptive Stealth Mode opens the page, and Extract returns the fields. Run it from an API call, the CLI or an AI agent.","featureList":"Profiles, followers, likes and video URLs","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"provider":{"@type":"Organization","name":"Zenrows","url":"https://www.zenrows.com/"}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.zenrows.com/"},{"@type":"ListItem","position":2,"name":"Scrapers","item":"https://www.zenrows.com/scrape"},{"@type":"ListItem","position":3,"name":"TikTok scraper","item":"https://www.zenrows.com/scrape/tiktok"}]},{"@type":"FAQPage","@id":"https://www.zenrows.com/scrape/tiktok#faq","mainEntity":[{"@type":"Question","name":"Is it legal to scrape TikTok?","acceptedAnswer":{"@type":"Answer","text":"Collecting publicly available TikTok data, such as public profiles, follower counts and video links that any visitor can see, is common practice for influencer and market research. Profiles belong to people, and personal data is protected by laws such as the GDPR and the CCPA, so collect only what you have a legitimate reason to use and nothing from private accounts. Check TikTok's terms for your use case and ask your lawyer if you are unsure."}},{"@type":"Question","name":"Is there an official TikTok API?","acceptedAnswer":{"@type":"Answer","text":"TikTok has several, each for a narrow audience. The Research API is for approved non-profit academic researchers in the US and Europe and requires an application. The Display API returns a user's own profile and videos only after that user logs in and grants access. The Commercial Content API covers ads. None of them returns any public profile on demand for business use, which is why teams use a scraper for creator research."}},{"@type":"Question","name":"What TikTok pages can I scrape?","acceptedAnswer":{"@type":"Answer","text":"Public profile pages ( /@username ) and public video pages ( /@username/video/ID ) on tiktok.com. A profile returns the creator's identity, totals and the URLs of the videos on it. For the comments under a video, see the TikTok comment scraper ."}},{"@type":"Question","name":"Can I scrape TikTok follower counts?","acceptedAnswer":{"@type":"Answer","text":"Yes. stats.follower_count holds the exact follower number of a public account, next to following, total likes and video count. The page rounds it (\"86.8M\"); the JSON does not."}},{"@type":"Question","name":"Can I scrape private TikTok accounts?","acceptedAnswer":{"@type":"Answer","text":"No. A private account shows its videos only to approved followers, and a scraper sees what a logged-out visitor sees. The profile record marks these accounts with profile.private_account ."}},{"@type":"Question","name":"How do I scrape TikTok with Python?","acceptedAnswer":{"@type":"Answer","text":"Send a GET request to https://api.zenrows.com/v1/ with your API key, the TikTok URL, Adaptive Stealth Mode and Extract turned on, as in the Python example above. The parsed key of the response holds the profile as a Python dictionary. The zenrows package on PyPI wraps the same request."}},{"@type":"Question","name":"How many TikTok profiles can I scrape?","acceptedAnswer":{"@type":"Answer","text":"Send one URL per request, or a whole creator list as a Batch job that runs the URLs in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file."}},{"@type":"Question","name":"Can AI agents scrape TikTok with Zenrows?","acceptedAnswer":{"@type":"Answer","text":"Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the creators you want in plain language and the agent calls Fetch and Extract for you."}},{"@type":"Question","name":"Can I scrape TikTok on a schedule?","acceptedAnswer":{"@type":"Answer","text":"Yes. Create a scheduled Batch job with your TikTok URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time."}},{"@type":"Question","name":"Which integrations work with the TikTok scraper?","acceptedAnswer":{"@type":"Answer","text":"Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Influencer teams often run it from Clay to enrich a creator list, or from n8n to log weekly follower counts to Google Sheets. See the integrations page for the full list."}},{"@type":"Question","name":"What format does the data come in?","acceptedAnswer":{"@type":"Answer","text":"JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want."}}]}]}
</script>
