# TikTok Audience Demographics \[$0.25💰] | Country | Age | Gender (`ahmed_jasarevic/tiktok-audience-demographics`) Actor

Get a TikTok creator audience by country plus age, gender, devices and performance. Combines public engagement signals with the TikTok One follower profile. Export to CSV, JSON or API.

- **URL**: https://apify.com/ahmed_jasarevic/tiktok-audience-demographics.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $240.00 / 1,000 full audience samples

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 Audience Demographics

Get a TikTok creator's audience by country — plus age, gender, device brands and performance metrics — from public engagement signals and the creator's TikTok One follower profile.

### Vet Creators And Analyze TikTok Audiences

- Check whether a creator's audience actually sits in your target markets
- Compare creators by audience geography, engagement and follower profile
- Estimate the share of a creator's audience in specific countries
- Add audience context to influencer outreach and media plans
- Refresh creator data before every campaign on a schedule

### How It Works

![How the TikTok Audience Demographics actor turns a creator handle into country shares, age, gender and performance data.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-tiktok-audience-demographics.webp)

The Actor combines TikTok One follower data with publicly visible engagement signals to estimate audience geography. Region signals are normalized to ISO country codes and aggregated into a ranked country distribution with counts and shares.

TikTok does not expose a follower list, so the audience estimate reflects publicly engaged users, not a census. The Actor reports `coverage` (share of users with a usable region), `audienceSampleSize` and a `confidence` label so you can judge the result. When the public signal is too small, `auto` mode falls back to TikTok One's top-5 follower estimate and marks `sampleType` as `platform_estimate`.

### Analyze TikTok Audience Geography By Country

- `audienceCountries` lists every country found in the public signal with `count` and `share`
- `audienceCountryCount` is the number of countries represented
- `topCountry`, `top3Share` and `targetAudienceShare` summarize concentration and fit
- `targetCountries` drives `targetAudienceShare`; set the markets you actually care about (default `US`, `GB`, `CA`)
- `includeEngagedAudience` and `includeReachedAudience` add TikTok One's engaged and reached country breakdowns

### TikTok Demographics With Age, Gender And Devices

TikTok One supplies follower demographics that public engagement cannot:

- `audienceAge` — age brackets and shares
- `audienceGender` — gender split
- `topDeviceBrands` — device brand distribution
- `performance` — engagement rate, median views, growth rate and related metrics
- `platformFollowerCountries` — the platform's top-5 follower countries, kept alongside the public estimate for comparison

### Influencer Vetting And Creator Sourcing

- **Brand deals** — reject a creator whose audience is concentrated outside the campaign markets
- **Sourcing** — rank a list of creators by `targetAudienceShare` and engagement
- **Reporting** — export consistent audience metrics for client reports
- **Trend checks** — re-run monthly and compare country mix and follower growth

### Input

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `creators` | array of strings | Yes | `["mkbhd","mrbeast","khaby.lame"]` | Handles, `@handles` or profile URLs. |
| `accountId` | string | No | — | Optional TikTok One account identifier; detected from the session when omitted. |
| `targetCountries` | array of strings | No | `["US","GB","CA"]` | Pick from a dropdown of ISO 3166-1 alpha-2 codes (all countries); used for `targetAudienceShare`. |
| `audienceMode` | string | No | `auto` | `auto`, `full` or `platform`. See below. |
| `sampleVideos` | integer | No | `3` | Recent videos reviewed per creator. Maximum 10. |
| `commentPages` | integer | No | `2` | Comment pages per video, 50 comments per page. Maximum 5. |
| `replyThreads` | integer | No | `5` | High-reply threads expanded per video. Maximum 10. |
| `replyPages` | integer | No | `1` | Reply pages per expanded thread, 50 replies per page. Maximum 3. |
| `minAudienceSample` | integer | No | `50` | Minimum region-tagged users before the public estimate replaces the top-5 estimate. Maximum 5,000. |
| `rsshubBase` | string | No | — | Advanced: optional discovery source for recent video IDs. |
| `maxCreators` | integer | No | `50` | Maximum creators per run. Maximum 200. |
| `includeEngagedAudience` | boolean | No | `true` | Include TikTok One engaged-audience countries. |
| `includeReachedAudience` | boolean | No | `true` | Include TikTok One reached-audience countries. |
| `requestDelayMillis` | integer | No | `800` | Base delay between creators, with jitter. Maximum 10,000. |

`audienceMode` values:

- `auto` — try the public engagement estimate, fall back to the top-5 platform estimate when the signal is too small
- `full` — prefer the public engagement estimate and still return the estimate with `audienceSampleError` if collection fails
- `platform` — skip the engagement pass and use only the TikTok One top-5 estimate

### Output

One row per creator.

| Field | Description |
| --- | --- |
| `status`, `handle`, `nickname`, `profileUrl`, `avatarUrl` | Creator identity and run status. |
| `followerCount`, `livingRegion`, `storeRegion` | Profile basics from TikTok One. |
| `audienceCountries` | Estimated country distribution: `countryCode`, `country`, `count`, `share`. |
| `audienceCountryCount`, `audienceSampleSize` | Breadth and size of the public signal. |
| `sampleType` | `engagement_sample` or `platform_estimate`. |
| `topCountry`, `topCountryName`, `top3Share`, `targetAudienceShare` | Concentration and target-market fit. |
| `coverage`, `otherShare`, `platformCoverage` | Share of users with a usable region and platform top-5 coverage. |
| `confidence`, `isPartial`, `audienceSampleError` | Quality signals for the estimate. |
| `platformFollowerCountries` | TikTok One top-5 follower countries with estimated counts. |
| `audienceAge`, `audienceGender`, `topDeviceBrands` | Follower demographics. |
| `performance` | Engagement rate, median views, growth and related metrics. |
| `audienceEngagedCountries`, `audienceReachedCountries` | Optional TikTok One audience breakdowns. |
| `videoDiscoverySource`, `scrapedAt` | Run metadata. |

### Example Input

```json
{
  "creators": ["mkbhd", "mrbeast"],
  "targetCountries": ["US", "GB", "CA"],
  "audienceMode": "auto",
  "sampleVideos": 3,
  "maxCreators": 2
}
```

### Example Output

```json
{
  "status": "ok",
  "handle": "mkbhd",
  "nickname": "Marques Brownlee",
  "followerCount": 2343055,
  "topCountry": "US",
  "topCountryName": "United States",
  "top3Share": 0.4532,
  "targetAudienceShare": 0.4512,
  "coverage": 1,
  "otherShare": 0,
  "audienceSampleSize": 818,
  "audienceCountryCount": 113,
  "sampleType": "engagement_sample",
  "confidence": "high",
  "audienceCountries": [
    { "countryCode": "US", "country": "United States", "count": 283, "share": 0.346 },
    { "countryCode": "GB", "country": "United Kingdom", "count": 52, "share": 0.0636 },
    { "countryCode": "PH", "country": "Philippines", "count": 36, "share": 0.044 }
  ],
  "performance": { "engagementRate": 0.0662, "medianViews": 1288154 }
}
```

### Schedule Creator Audience Monitoring

- Read results through the **Apify API** or export **JSON, CSV, Excel or HTML**
- Connect **Zapier, Make or Google Sheets** through Apify integrations
- Add a **webhook** to refresh a creator database when a run finishes
- Schedule a monthly refresh per creator list; sessions expire, so refresh the credentials when a run returns an authentication error

Processing several creators is slow by design (`requestDelayMillis` and page caps keep runs reliable). For a quick pre-screen, use `audienceMode: "platform"`; use `auto` or `full` for the creators that pass.

### Related Actors

- [TikTok Scraper](https://apify.com/clockworks/tiktok-scraper) — videos, hashtags, profiles, comments and metadata
- [TikTok Profile Scraper](https://apify.com/clockworks/tiktok-profile-scraper) — profile and post history for creator research
- [TikTok Comments Scraper](https://apify.com/clockworks/tiktok-comments-scraper) — comments for sentiment and engagement analysis
- [TikTok Scraper (Pay Per Result)](https://apify.com/apidojo/tiktok-scraper) — another high-volume TikTok data source
- [TikTok Video Scraper](https://apify.com/clockworks/tiktok-video-scraper) — single-video metadata and downloads

### FAQ

#### Does TikTok have a public API for audience demographics?

TikTok does not expose a creator's follower list or audience country breakdown through its public developer tools. TikTok One (Creator Marketplace) shows aggregate follower demographics to logged-in accounts, and public engagement signals are visible without login. This Actor combines both sources and clearly labels the result as an engagement estimate or a platform estimate.

#### Why is the audience an estimate rather than an exact count?

TikTok never publishes who follows a creator. The Actor uses publicly visible engagement signals and aggregates public regions. `audienceSampleSize`, `coverage` and `confidence` tell you how much to trust the result; when the public signal is below `minAudienceSample`, the Actor falls back to TikTok One's top-5 follower estimate.

#### What are alternatives to this Actor?

TikTok's own Creator Marketplace analytics, third-party influencer platforms and general TikTok comment scrapers. Comment scrapers give raw comments without country aggregation; influencer platforms often report only top-5 markets. This Actor adds a full distribution, age, gender, devices and performance in one record.

#### Do I need TikTok One credentials?

No, not as a user. The Actor owner configures a TikTok One session through the `TIKTOK_ONE_COOKIES` environment variable; all runs use it automatically. The session must belong to a TikTok One account that can open Creator Marketplace profiles. Public engagement signals alone are not enough to start a run.

#### What does confidence mean?

`high` means coverage of at least 0.9 of sampled users, `medium` at least 0.6 and `low` below that. Low confidence usually means many sampled users hide their region; raise `sampleVideos`, `commentPages` or `replyThreads`, or switch to `platform` mode.

#### How many creators can one run process?

Up to `maxCreators` (default 50, maximum 200). Each creator is processed with a delay to keep runs reliable, so large lists take time; split them across scheduled runs if needed.

### For AI Agents & LLM Apps

Returns one row per TikTok creator with estimated audience countries, engagement quality signals, follower demographics and performance metrics.

Minimal input (credentials are configured by the Actor owner via `TIKTOK_ONE_COOKIES` and never exposed in the input):

```json
{ "creators": ["mkbhd"] }
```

Platform-only mode (no engagement pass, top-5 follower estimate):

```json
{ "creators": ["mkbhd"], "audienceMode": "platform" }
```

Output fields: `status`, `handle`, `nickname`, `profileUrl`, `avatarUrl`, `followerCount`, `livingRegion`, `storeRegion`, `aioCreatorID`, `ttUID`, `audienceCountries`, `audienceCountryCount`, `audienceSampleSize`, `sampleType`, `topCountry`, `topCountryName`, `top3Share`, `targetAudienceShare`, `coverage`, `otherShare`, `platformCoverage`, `confidence`, `isPartial`, `audienceSampleError`, `platformFollowerCountries`, `audienceAge`, `audienceGender`, `topDeviceBrands`, `performance`, `audienceEngagedCountries`, `audienceReachedCountries`, `videoDiscoverySource`, `scrapedAt`.

Behaviors an agent should know:

- `creators` is required; each creator produces one row plus an optional `SUMMARY` record.
- Credentials come from the Actor's `TIKTOK_ONE_COOKIES` environment variable; the input has no credentials field.
- `auto` falls back to the top-5 platform estimate when fewer than `minAudienceSample` users have a usable region.
- `platform` mode skips the engagement pass entirely and is the fastest, least precise option.
- Page caps (`sampleVideos`, `commentPages`, `replyThreads`, `replyPages`) control both runtime and sample size.
- Each creator is billed as one creator event; see the Pricing tab for the currently active events.

Billing: pay-per-event, configured at **$0.25 per creator** for the full engagement sample and **$0.10 per creator** for the basic/platform mode.

### Legal & Compliance Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by TikTok. It uses publicly visible engagement signals and TikTok One data through credentials that you supply; it does not bypass login, collect private profiles or solve CAPTCHAs.

Sampled data can include usernames and public region information, and the output aggregates it into country shares. You are responsible for complying with TikTok's Terms of Service and applicable data-protection law, including GDPR and CCPA where relevant, and for keeping your TikTok One credentials secure.

### SEO Keywords

tiktok audience demographics, tiktok audience geography, tiktok audience country breakdown, tiktok creator analytics, tiktok follower demographics, tiktok audience analysis, tiktok influencer vetting, tiktok creator database, tiktok comments scraper, tiktok audience age gender, tiktok one api, tiktok creator marketplace data, influencer audience analysis, tiktok marketing research, tiktok audience targeting, tiktok creator sourcing, tiktok audience api, tiktok demographics tool

# Actor input Schema

## `creators` (type: `array`):

TikTok handles, @handles, or profile URLs to analyze.

## `accountId` (type: `string`):

Optional aioClientID. Leave empty to detect it automatically from the configured TikTok One session.

## `targetCountries` (type: `array`):

Select target markets from the dropdown. Values are ISO 3166-1 alpha-2 country codes used to calculate targetAudienceShare.

## `audienceMode` (type: `string`):

auto: try the full engagement sample and fall back to the TikTok One top-5 estimate. full: prefer the engagement sample; if it fails, still return the top-5 estimate with audienceSampleError. platform: skip sampling and use the top-5 estimate.

## `sampleVideos` (type: `integer`):

Number of recent videos whose comments and replies are sampled.

## `commentPages` (type: `integer`):

Pages of top-level comments to read per video (50 comments per page).

## `replyThreads` (type: `integer`):

Number of high-reply comment threads to expand per video.

## `replyPages` (type: `integer`):

Pages of replies to read per expanded thread (50 replies per page).

## `minAudienceSample` (type: `integer`):

Minimum number of region-tagged users required before replacing the top-5 estimate with the engagement sample.

## `rsshubBase` (type: `string`):

Advanced: RSSHub-compatible base URL used only to discover recent video IDs. Leave empty to rotate through the default public instances.

## `maxCreators` (type: `integer`):

Maximum number of creators to process per run.

## `includeEngagedAudience` (type: `boolean`):

Add the top countries of the engaged audience.

## `includeReachedAudience` (type: `boolean`):

Add the top countries of the reached audience.

## `requestDelayMillis` (type: `integer`):

Base delay between creator requests. A small random jitter is added.

## Actor input object example

```json
{
  "creators": [
    "mkbhd",
    "mrbeast",
    "khaby.lame"
  ],
  "targetCountries": [
    "US",
    "GB",
    "CA"
  ],
  "audienceMode": "auto",
  "sampleVideos": 3,
  "commentPages": 2,
  "replyThreads": 5,
  "replyPages": 1,
  "minAudienceSample": 50,
  "maxCreators": 50,
  "includeEngagedAudience": true,
  "includeReachedAudience": true,
  "requestDelayMillis": 800
}
```

# Actor output Schema

## `creators` (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 = {
    "creators": [
        "mkbhd",
        "mrbeast",
        "khaby.lame"
    ],
    "targetCountries": [
        "US",
        "GB",
        "CA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/tiktok-audience-demographics").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 = {
    "creators": [
        "mkbhd",
        "mrbeast",
        "khaby.lame",
    ],
    "targetCountries": [
        "US",
        "GB",
        "CA",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/tiktok-audience-demographics").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 '{
  "creators": [
    "mkbhd",
    "mrbeast",
    "khaby.lame"
  ],
  "targetCountries": [
    "US",
    "GB",
    "CA"
  ]
}' |
apify call ahmed_jasarevic/tiktok-audience-demographics --silent --output-dataset

```

## MCP server setup

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

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/jA9GqBquINgIp0HNr/builds/ePNOiviktcd4w2qUU/openapi.json
