ScreenshotNeo

BlogHow-to

How to Scrape TikTok Follower Data with an API

Use TikTok’s approved Research API to read follower counts or paginate follower usernames without prohibited browser scraping.

By the ScreenshotNeo team1 October 20266 min read

Short answer: use TikTok’s approved Research API, not a browser crawler. The user-info request can return a profile’s follower_count. The Query User Followers endpoint returns follower usernames and display names in pages of up to 100 records. Research Tools access requires eligibility review and project approval; a normal developer account is not enough.

What TikTok follower data can you retrieve?

TikTok exposes two useful Research API patterns:

Need API pattern Result
Total followers User-info request with follower_count A profile snapshot and related public fields
Follower list POST https://open.tiktokapis.com/v2/research/user/followers/ Usernames and display names with cursor pagination

The follower-list request defaults to 20 records and accepts max_count up to 100. Continue while has_more is true, sending the returned cursor on the next request.

Before you write code: access and compliance

  1. Apply for TikTok Research Tools eligibility and an approved project. TikTok states that a developer account alone does not grant Research Tools access.
  2. Keep your client key and secret on a server or secure secret manager. Never ship the secret in browser JavaScript, mobile apps or public repositories.
  3. Request the research.data.basic scope for follower queries.
  4. Use the API only for an approved, lawful research purpose and follow TikTok’s Research Tools Terms, Community Guidelines and rate limits.
  5. Do not use Selenium, Playwright, headless Chrome, residential proxies or HTML parsing to extract TikTok users. TikTok’s Research API Terms prohibit scraping and other technical or manual extraction outside Research Tools.

Relevant first-party documentation: TikTok Research API getting started, Query User Followers specification, Research API FAQ and Research Tools Terms.

Get a TikTok follower count

Use TikTok’s user-info endpoint and include follower_count in the requested fields. The exact token and user-info URL depend on the Research API authorization flow enabled for your approved project; keep the bearer-token exchange on your backend and follow TikTok’s current getting-started guide.

Request shape

GET /v2/research/user/info/?username=example_username&fields=follower_count,display_name,username
Authorization: Bearer YOUR_ACCESS_TOKEN

Store the retrieval timestamp beside the returned count. TikTok says follower statistics can take up to 10 days to update, so this value is a research snapshot rather than a guaranteed live counter.

Query and paginate a follower list

The follower endpoint is a POST request. Send a JSON body containing the target username, an optional page size and, after the first page, the cursor returned by TikTok.

POST https://open.tiktokapis.com/v2/research/user/followers/
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json

{
  "username": "example_username",
  "max_count": 100
}

A response contains follower records, has_more and a cursor. Field names are defined by TikTok’s endpoint specification; persist the raw response while also normalizing the username and display name fields your project needs.

cURL: one page

curl -X POST "https://open.tiktokapis.com/v2/research/user/followers/" \
  -H "Authorization: Bearer $TIKTOK_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"username":"example_username","max_count":100}'

Python: fetch every page

import os
import time
import requests

TOKEN = os.environ["TIKTOK_ACCESS_TOKEN"]
ENDPOINT = "https://open.tiktokapis.com/v2/research/user/followers/"
username = "example_username"

headers = {
    "Authorization": f"Bearer {TOKEN}",
    "Content-Type": "application/json",
}

followers = []
cursor = None
retrieved_at = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())

while True:
    payload = {"username": username, "max_count": 100}
    if cursor is not None:
        payload["cursor"] = cursor

    response = requests.post(ENDPOINT, headers=headers, json=payload, timeout=60)
    response.raise_for_status()
    data = response.json()

    # Keep the raw page for auditability; adjust the key to the response schema
    # shown in TikTok's current specification.
    followers.extend(data.get("data", []))

    if not data.get("has_more"):
        break
    cursor = data.get("cursor")
    if cursor is None:
        raise RuntimeError("TikTok returned has_more=true without a cursor")

print({
    "username": username,
    "retrieved_at": retrieved_at,
    "count": len(followers),
    "followers": followers,
})

Node.js: fetch every page

const token = process.env.TIKTOK_ACCESS_TOKEN;
const endpoint = 'https://open.tiktokapis.com/v2/research/user/followers/';
const username = 'example_username';

const followers = [];
let cursor;

while (true) {
  const body = { username, max_count: 100 };
  if (cursor !== undefined) body.cursor = cursor;

  const response = await fetch(endpoint, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(body)
  });

  if (!response.ok) {
    throw new Error(`TikTok API ${response.status}: ${await response.text()}`);
  }

  const page = await response.json();
  followers.push(...(page.data || []));

  if (!page.has_more) break;
  if (page.cursor === undefined) throw new Error('Missing cursor');
  cursor = page.cursor;
}

console.log(JSON.stringify({ username, retrieved_at: new Date().toISOString(), followers }));

Pagination checklist

  • Set max_count to 100 to reduce requests, unless your approved design needs smaller pages.
  • Send the cursor exactly as returned; do not calculate or increment it yourself.
  • Stop only when has_more is false.
  • Protect against a missing or repeated cursor to avoid an infinite loop.
  • Deduplicate by stable identifier or username if your downstream job retries a page.
  • Save the username, retrieval time, request status, cursor and raw response metadata.

Handling tokens, lag and privacy

  • Research API access tokens expire after two hours. Refresh them before a long export and retry once after an authentication failure.
  • Counts and other statistics may lag live TikTok values by up to 10 days. Label dashboards and exports with “retrieved at” and “Research API snapshot.”
  • Follower usernames are personal data in many jurisdictions. Limit access, encrypt storage, document retention and delete inadvertently generated personal data within the period required by TikTok’s terms (the Research API Terms specify 30 days).
  • Publish a privacy policy and terms of service when your application requires them, obtain consent before sharing personally identifiable information, and honor throttling guidance.

Troubleshooting

Symptom Likely cause Fix
scope_not_authorized Your project lacks research.data.basic or Research Tools approval. Verify project approval and scopes in the TikTok developer console; request access through Research Tools.
401 or expired-token response The two-hour access token expired or is malformed. Obtain a new token server-side and retry once. Do not expose the client secret.
403 or permission error The username or dataset is outside your approved access. Check eligibility, project scope and TikTok privacy requirements.
429 or throttling response Requests exceed TikTok’s limits. Apply exponential backoff with jitter, reduce concurrency and cache completed pages.
Empty page The account has no accessible results, the username is invalid, or the response was filtered by policy. Validate the username, retain the response status and do not fall back to HTML scraping.
Loop never ends The cursor is not being replaced or a retry replays the same page. Track the previous cursor and abort if TikTok returns the same cursor twice.
Count differs from TikTok app Research data is a delayed snapshot. Display retrieval time and explain the possible ten-day lag.

Performance, reliability and cost

Use pages of 100, bounded concurrency and a durable queue for large studies. Checkpoint after every successful page so a token refresh or transient 429 does not restart the export. Exponential backoff should handle temporary failures, while permanent 4xx authorization errors should be surfaced immediately.

TikTok’s Research API eligibility, quotas and terms determine whether your project can run at the required scale. Do not estimate freshness from request frequency: polling more often cannot remove the documented statistics lag. Cache results according to your research protocol and delete data when retention requirements expire.

Or skip the browser setup

If your workflow also needs a visual record of a TikTok page, ScreenshotNeo provides a single screenshot request without maintaining Playwright or Selenium infrastructure. Its consent handling accepts cookie banners and removes more than 60 known consent platforms, newsletter popups and chat widgets before capture. Bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and the response identifies the result with X-Page-Verdict and X-Billed headers. It also includes an MCP server so Claude, Cursor and other MCP clients can call take_screenshot, get_page_info and capture_pdf.

See the ScreenshotNeo API documentation for all options.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://www.tiktok.com/@example_username -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://www.tiktok.com/@example_username"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://www.tiktok.com/@example_username' }); const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

There is a free allowance of 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Create a free ScreenshotNeo account.

FAQ

Can any TikTok developer read follower lists?

No. Research Tools eligibility and project approval are required.

Is this real-time follower data?

No. TikTok documents that follower statistics can take up to 10 days to update.

Can I export every follower to a CSV?

Only when your approved Research Tools project permits that use. Paginate the endpoint, apply privacy safeguards and follow retention rules.

Can I use a third-party TikTok scraper instead?

Review its authorization status, data handling and terms carefully. TikTok’s applicable terms prohibit unauthorized scraping and crawler-based extraction.