# TikTok Followers & Following Scraper (`deepmine/tiktok-followers-scraper`) Actor

Export the followers or following list of any TikTok profile: each account's username, name, bio, followers, following, likes, verified badge, email in bio and profile link, newest follow first. Whole following lists, the newest ~10,000 followers. Usernames in, CSV or JSON out. No login.

- **URL**: https://apify.com/deepmine/tiktok-followers-scraper.md
- **Developed by:** [DeepMine](https://apify.com/deepmine) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.39 / 1,000 accounts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Followers & Following Scraper

A **TikTok followers scraper and following scraper** in one: enter TikTok usernames and get the accounts that follow them, or the accounts they follow, as clean rows. Each row has the username, name, bio, exact follower, following and like counts, verified badge, the email written in the bio, the profile link, and its place in the list, newest follow first.

No TikTok account, no cookies, no login. Turn on **Creator details** to add each account's join date, bio link, app language and friends count.

| Account | 👤 Name | 📝 Bio | 👥 Followers | ❤️ Likes | 📋 List | 🎯 Source Profile | 🏅 Rank |
|---|---|---|---:|---:|---|---|---:|
| [@lindseystirling](https://www.tiktok.com/@lindseystirling) | Lindsey Stirling | Snow Waltz Tour 2026 ✨ Master of Tides Cruise 2027… | 5,194,586 | 119,950,011 | following | zachking | 2 |
| [@insaneshayne](https://www.tiktok.com/@insaneshayne) | Shayne Boyle | Sports Stunts Skits Best 👄 Bluuue 42 🏈 Brands: tea… | 3,995,679 | 193,998,230 | following | zachking | 3 |
| [@cooperkupp](https://www.tiktok.com/@cooperkupp) | Cooper Kupp | Believed. Achieved! 📌 Seattle ☕️ @dodocoffeeco | 694,492 | 6,793,036 | following | zachking | 5 |

<sub>Collected 2026-10-19 with `{"profiles": ["zachking"], "listType": "following", "maxUsersPerProfile": 50, "creatorDetails": true}`. Every row also has the full bio, photo, video count, liked videos, user ID and secUid; these rows also have their join date and bio link.</sub>

**$0.49 per 1,000 accounts** on the Starter plan ($0.59 Free, $0.45 Scale, $0.39 Business). The prefilled run (100 accounts) costs about $0.05.

### Why this one

- **Exact counts.** Followers, following and likes are TikTok's exact numbers (3,787,370 followers, not "3.8M"), for every account in the list.
- **The whole following list.** The Actor walks a profile's following list to its end, up to TikTok's 10,000 cap (2,546 accounts for a profile following 2,632 in a test; TikTok leaves out deleted and banned accounts). For followers, TikTok shows the newest ~10,000; the Actor reads all of them.
- **Lead-list ready.** The first email address written in each account's bio comes in its own `email` column, with `hasEmail` and `hasPhone` flags.
- **Creator details, same price.** Turn on `creatorDetails` and each row also gets the account's join date, bio link, app language, friends count and business-account flag from its profile page. No extra charge.
- **Who follows whom.** Each row names whose list it is (`sourceUsername`) and which list (`listType`), so the lists of many profiles in one run stay apart: an account that follows two of your profiles is a row under each.
- **Hidden lists cost nothing.** Some creators hide their following list. The Actor checks the profile first, skips the list, and marks the profile `hidden` in the run summary.
- **Fails loudly, never silently.** Every run saves a per-profile summary (`OUTPUT`). If TikTok stops answering part-way, that profile is marked `partial` and says how far it got.

### Input

| Field | What it does | Default |
|---|---|---|
| `profiles` | TikTok usernames or profile URLs, one per line: `zachking`, `@zachking`, `https://www.tiktok.com/@zachking`. | `zachking` |
| `listType` | `followers` (accounts that follow each profile) or `following` (accounts each profile follows). | `followers` |
| `maxUsersPerProfile` | Accounts per profile's list, newest follow first, up to 10,000. | 100 |
| `creatorDetails` | Also read each listed account's profile page: join date, bio link, app language, friends count, business-account flag. Same price; about 30 seconds per 100 accounts instead of 3. | off |
| `proxyConfiguration` | Apify Proxy. Keep datacenter (the default); residential doesn't help here. | Apify datacenter |

Example:

```json
{
  "profiles": ["zachking", "khaby.lame"],
  "listType": "following",
  "maxUsersPerProfile": 1000
}
```

### Output

One row per account in a list, profile by profile in your order, each list newest follow first. Table views in the Console:

- **📊 Overview**: 🖼️ Photo, 🏷️ Username, 👤 Name, 📝 Bio, 🔗 TikTok, ✔️ Verified, 👥 Followers, ❤️ Likes, 📋 List, 🎯 Source Profile, 🏅 Rank
- **📈 Stats**: 🏷️ Username, 🔗 TikTok, ✔️ Verified, 👥 Followers, ➕ Following, ❤️ Likes, 🎬 Videos, 💗 Liked Videos, 🔒 Private, ⭕ Active Story, 🎯 Source Profile, 🏅 Rank
- **👤 Creator Details** (with Creator details on): 🖼️ Photo, 🏷️ Username, 👥 Followers, 🤝 Friends, 📅 Joined, 🌐 Bio Link, 📧 Email, 📞 Phone, 🌐 App Language, 💼 Business Account, 🎯 Source Profile

The profiles you entered are in a second dataset, **👤 Profiles** (free): one row each, with their own follower and following counts, join date and bio link.

#### Output fields

Every row has these keys, in this order; the ones marked "With Creator details" are there only with `creatorDetails` on. A value TikTok didn't send is `null` (never an empty string or a made-up 0); with Creator details, a profile TikTok wouldn't show leaves its columns `null`.

- `avatar`: profile picture.
- `name`: display name.
- `bio`: the full bio, line breaks kept.
- `bioSnippet`: the bio's first 50 characters on one line, for tables.
- `username`: TikTok username, without @.
- `profileUrl`: the profile on TikTok.
- `verified`: TikTok's verified badge.
- `followers`: followers (exact).
- `following`: accounts they follow.
- `likes`: total likes on all their videos.
- `videos`: their public videos.
- `likedVideos`: videos they have liked, as TikTok counts them.
- `friends`: accounts they follow that follow them back. With Creator details (the list doesn't say).
- `private`: the account is private.
- `isSeller`: TikTok marks the account as a TikTok Shop seller.
- `hasActiveStory`: the account had a story up when the list was read (the ring around its photo). Stories last 24 hours.
- `email`: the first email address written in their bio, when there is one.
- `hasEmail`: their bio shows an email address.
- `hasPhone`: their bio shows a phone number.
- `joinedAt`: when the account was created (UTC). With Creator details.
- `bioLinkUrl`: the link in their bio. With Creator details.
- `isCommerceAccount`: a TikTok business (commerce) account. With Creator details.
- `language`: their TikTok app language (`en`, `es`, ...). With Creator details.
- `rank`: place in the list, newest follow first (1 = followed most recently).
- `listType`: `following` or `followers`.
- `sourceUsername`: whose list it is (the profile you entered, as TikTok spells it).
- `input`: the profile you entered, exactly as entered.
- `userId`: TikTok's user ID.
- `secUid`: TikTok's secUid, the ID its own web API uses.
- `scrapedAt`: when it was collected (UTC).

Example row (Creator details on):

```json
{
  "avatar": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/b01af4dd7d733828f3e5493902ecfac2~tplv-tiktokx-cropcenter:1080:1080.jpeg?...",
  "name": "The Johnson Brothers",
  "bio": "Brands@TheJohnsonBrothers.com\n \nAll Socials + Merch ⬇️",
  "bioSnippet": "Brands@TheJohnsonBrothers.com All Socials + Merch…",
  "username": "the.johnsonbrothers",
  "profileUrl": "https://www.tiktok.com/@the.johnsonbrothers",
  "verified": false,
  "followers": 3787370,
  "following": 13,
  "likes": 255010057,
  "videos": 569,
  "likedVideos": 1648,
  "friends": 12,
  "private": false,
  "isSeller": false,
  "hasActiveStory": false,
  "email": "Brands@TheJohnsonBrothers.com",
  "hasEmail": true,
  "hasPhone": false,
  "joinedAt": "2021-05-26T20:01:34Z",
  "bioLinkUrl": "https://thejohnsonbrothers.com",
  "isCommerceAccount": false,
  "language": "en",
  "rank": 1,
  "listType": "following",
  "sourceUsername": "zachking",
  "input": "zachking",
  "userId": "6966691146177496070",
  "secUid": "MS4wLjABAAAACLPzWS76nojm2K2EguU_ybZ0c4yo5WQVpFBz_dXt04Fs8hR_mIrUsiAvbBiNb5sq",
  "scrapedAt": "2026-10-19T18:52:46Z"
}
```

The **👤 Profiles** dataset has one row per profile you entered, with these keys:

- `avatar`: profile picture.
- `name`: display name.
- `bio`: the full bio.
- `bioSnippet`: the bio's first 50 characters.
- `username`: TikTok username.
- `profileUrl`: the profile on TikTok.
- `verified`: TikTok's verified badge.
- `followers`: followers (exact).
- `following`: accounts they follow.
- `likes`: total likes on all their videos.
- `videos`: their public videos.
- `joinedAt`: when the account was created (UTC).
- `bioLinkUrl`: the link in their bio.
- `userId`: TikTok's user ID.
- `secUid`: TikTok's secUid.
- `scrapedAt`: when it was collected (UTC).

Notes:

- **Lists are newest first.** TikTok orders both lists by when the follow happened, newest first, so `maxUsersPerProfile` 100 gives the 100 most recent follows.
- **Followers stop at about 10,000.** TikTok shows logged-out visitors the newest ~10,000 followers of a profile and then ends the list (9,885 for @khaby.lame in a test). Following lists are complete, up to TikTok's own 10,000 cap.
- **A little under the profile's count.** TikTok leaves deleted and banned accounts out of the lists, so a list usually comes out a few percent shorter than the count on the profile (about 96% in our tests).
- **Image links expire.** `avatar` is signed by TikTok and stops working about 2 days after the run. Download the images you need soon after the run.

#### Run summary (`OUTPUT`)

```json
{
  "results": 100,
  "inputs": [
    {"input": "zachking", "status": "ok", "results": 100, "stopReason": "max_results", "username": "zachking", "listSize": 86821865}
  ]
}
```

`listSize` is the list's size on the profile. `status` per profile: `ok`, `hidden` (the profile hides its following list; free), `private`, `not_found`, `no_results` (an empty list), `partial` (TikTok stopped answering part-way; the rows read are kept), `blocked` (the run fails so you notice), `stopped` (your spending limit). `stopReason`: `max_results`, or `end` when the list ended.

### How long does a run take?

The first accounts usually arrive **about 2 to 4 seconds after the run starts**, counted on Apify's own clock from the run's start time, so the container start and loading the Apify SDK are included (2.1 to 4.2 s in five test runs; the slowest was a new build's first run, which loads its image). The prefilled run takes 4 to 6 seconds in all. A list reads at about 30 accounts per second (one page of 30 a second), so 1,000 accounts take under a minute and 10,000 about 5 to 6 minutes. With Creator details, each account's profile page is read too, 10 at a time: about 30 seconds per 100 accounts (182 in 58 seconds in a test). Several profiles in one run are read in parallel.

### Pricing

Pay per result, no start fee and no minimum. Example: 1,000 accounts cost $0.49 on the Starter plan.

| Your Apify plan | Per 1,000 accounts |
|---|---|
| Free | $0.59 |
| Starter | $0.49 |
| Scale | $0.45 |
| Business | $0.39 |

You pay only for rows that reach your dataset. Profiles, hidden lists, private or missing profiles cost nothing. When your spending limit is reached, the run stops.

### FAQ

**Do I need a TikTok account?** No. The Actor reads only what TikTok shows logged-out visitors.

**Can I get both lists of a profile?** Run it once with `followers` and once with `following`. Each row says which list it came from.

**Why are there fewer followers than the profile shows?** TikTok shows logged-out visitors only the newest ~10,000 followers, and leaves deleted or banned accounts out of every list.

**Can I find similar creators?** Run the following lists of a few creators in one niche: the accounts several of them follow are usually creators of the same niche. Count `username` per `sourceUsername` in the export.

**Need their videos too?** Use our TikTok Profile & Videos API with the usernames from this run.

### Feedback

Missing a field, or a result that doesn't look right? Open an issue on the **Issues** tab and we'll look into it. If the data helps you, a short review on this page helps other people find it.

# Actor input Schema

## `profiles` (type: `array`):

TikTok usernames or profile URLs, one per line. Examples: zachking, @zachking, https://www.tiktok.com/@zachking

## `listType` (type: `string`):

Followers: the accounts that follow each profile (TikTok shows the newest ~10,000). Following: the accounts each profile follows (the whole list, up to TikTok's 10,000 cap). Some creators hide their following list; those cost nothing.

## `maxUsersPerProfile` (type: `integer`):

Accounts to get from each profile's list, newest follow first. Up to 10,000. You pay per account.

## `creatorDetails` (type: `boolean`):

Also open each listed account's profile page for its join date, bio link, app language, friends count and business-account flag. Included in the price per account; about 30 seconds per 100 accounts instead of 3.

## `proxyConfiguration` (type: `object`):

TikTok is reached through Apify Proxy. Datacenter proxies are enough; residential ones don't help here.

## Actor input object example

```json
{
  "profiles": [
    "zachking"
  ],
  "listType": "followers",
  "maxUsersPerProfile": 100,
  "creatorDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `profiles` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "profiles": [
        "zachking"
    ],
    "listType": "followers",
    "maxUsersPerProfile": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/tiktok-followers-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "profiles": ["zachking"],
    "listType": "followers",
    "maxUsersPerProfile": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/tiktok-followers-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "profiles": [
    "zachking"
  ],
  "listType": "followers",
  "maxUsersPerProfile": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call deepmine/tiktok-followers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deepmine/tiktok-followers-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EvisGoy10ABrws4tJ/builds/zltBemABS8K9OlrmC/openapi.json
