# TikTok Mention Scraper: Verified @Tags by Account ID (`memo23/tiktok-mention-scraper`) Actor

Find every TikTok video that tags an account. Each mention is confirmed against that account's real TikTok ID, not a caption text match, so lookalikes like @nikeshoes and renamed handles stay out of your results. You pay only for confirmed mentions. No login, no cookies.

- **URL**: https://apify.com/memo23/tiktok-mention-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 mentions

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TikTok Mention Scraper

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/tiktok-mention-logo.png" width="140" alt="TikTok Mention Scraper"></p>

Find every TikTok video that tags a given account, and know that it really tagged them.

Give it a handle. It resolves that handle to the account's own TikTok ID, then confirms each result against TikTok's structured caption data. Lookalike handles, renamed accounts and plain text coincidences do not get through.

### Why Use This Scraper?

Mention tracking is easy to do badly, because the obvious approach — search for "@brand" and keep whatever comes back — is wrong in ways you cannot see from the output.

- **The visible @handle is not an identity.** On a real post we captured, the caption read `@@funnypets1` while the account actually linked in TikTok's data was ID `7616541516102747150` — but that handle resolves today to a *different* account, `6792680128733971461`. Handles get renamed and recycled. Text matching silently mixes the two.
- **Substring matching over-collects.** A naive search for `@nike` also returns `@nikeshoes`, `@nike.official` and anything else that starts the same way.
- **TikTok's mention entities carry no username.** They give you `user_id` and `sec_uid` only, so any scraper that reports "who was mentioned" from the caption text is guessing.

This Actor resolves your handle to its `sec_uid` and `user_id` once, then counts a post as a mention only when TikTok's own caption entity carries those exact IDs. Every row tells you which check passed, in a `matchType` field.

**You are only charged for confirmed mentions.** Guesses are not billable results.

### Overview

One row per post that mentions your account, with engagement, author details and the match type. Accounts with no mentions return a single explanatory row rather than an empty dataset. No login, no cookies.

### Supported Inputs

| Input | Example |
|---|---|
| Bare handle | `nike` |
| With the @ | `@nike` |
| Profile URL | `https://www.tiktok.com/@nike` |

Several accounts can be tracked in one run.

### Use Cases

- **Brand monitoring** — every video tagging your brand, without lookalike noise
- **Influencer verification** — confirm a creator actually tagged you before paying out
- **Campaign tracking** — count genuine tags across a launch window
- **Competitor watching** — see who is tagging a rival account
- **UGC sourcing** — find real customer posts that credited you
- **Partnership audits** — check contractual tagging was honoured

### How It Works

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-tiktok-mention.png" width="900" alt="How the TikTok Mention Scraper works"></p>

1. Each handle is normalized and resolved to its account IDs (`uid`, `sec_uid`), one lookup per handle.
2. TikTok search is walked page by page for that handle.
3. For each result, the caption's structured entities are checked for a `type: 5` mention carrying the exact resolved IDs.
4. Confirmed matches are written as `verified_account`. Caption-text-only hits are excluded by default, or included as `caption_text` if you ask for them.
5. Results are deduplicated by post ID across pages.

### Input Configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `handles` | array | — | **Required.** Usernames or profile URLs to find mentions of. |
| `maxResultsPerHandle` | integer | `100` | Stop after this many mentions per account. |
| `onlyVerifiedMentions` | boolean | `true` | Only return ID-confirmed mentions. Off also returns caption-text hits, labelled. |
| `includeAuthorStats` | boolean | `true` | Add follower/following counts for the posting account. |

#### Minimal input

```json
{
  "handles": ["@nike"]
}
```

#### Wider brand monitoring

```json
{
  "handles": ["@nike", "@adidas"],
  "maxResultsPerHandle": 500,
  "onlyVerifiedMentions": false
}
```

### Output Overview

One row per mention. `matchType` records how the match was established, so verified tags and text coincidences are never silently mixed.

### Output Samples

#### A confirmed mention

```json
{
  "mentionedHandle": "nike",
  "mentionedUserId": "6569595380449902597",
  "matchType": "verified_account",
  "captionAlsoMatches": true,
  "postId": "7624849269362625806",
  "postUrl": "https://www.tiktok.com/@runnerdaily/video/7624849269362625806",
  "caption": "new pair from @nike 🔥 #running",
  "createdAt": "2026-07-11T14:02:19.000Z",
  "durationSeconds": 27,
  "playCount": 14439226,
  "likeCount": 3304612,
  "commentCount": 11114,
  "shareCount": 869705,
  "saveCount": 248872,
  "authorId": "7644302491875001351",
  "authorUsername": "runnerdaily",
  "authorNickname": "Runner Daily",
  "authorVerified": false,
  "authorFollowerCount": 63795,
  "authorFollowingCount": 412,
  "musicId": "7132920769062897666",
  "musicTitle": "cats in the cold",
  "scrapedAt": "2026-08-18T09:40:11.402Z"
}
```

#### No mentions found

```json
{
  "handle": "@someaccount",
  "error": "no_mentions_found",
  "message": "No verified mentions of @someaccount found in 96 search result(s)."
}
```

### Key Output Fields

| Field | Description |
|---|---|
| `matchType` | `verified_account` (TikTok's data links that exact account) or `caption_text` (handle appears in the caption, unconfirmed). |
| `captionAlsoMatches` | Whether the caption text also contains the handle — corroboration, not proof. |
| `mentionedUserId` | The resolved account ID the match was checked against. |
| `postUrl` / `postId` | The post doing the mentioning. |
| `authorUsername` / `authorFollowerCount` | Who posted it, and their reach. |
| `playCount`, `likeCount`, `commentCount`, `shareCount`, `saveCount` | Engagement on the mentioning post. |
| `error` / `message` | Present only on rows for handles that returned nothing. |

### About result depth

TikTok's search is shallow. It commonly returns 18 to 20 results for a query and then reports nothing further, which for a mention hunt means finding tagged posts largely by luck.

This Actor continues on a second source when the first runs dry, scanning several times deeper. On `@nike` that is the difference between 0 mentions and 10, because the tags exist past the point TikTok's search stops.

The deeper source is reached only when the primary has genuinely run out and you asked for more than it found, so a small run never pays for it. Posts are deduplicated by ID across both sources, and `maxSearchPages` caps how far the walk goes.

### FAQ

**How is this different from searching "@brand" myself?**
Search returns anything textually similar. This confirms each hit against the account's own TikTok ID, so `@nikeshoes` and renamed handles do not count as `@nike`.

**What does `caption_text` mean?**
The caption contains your handle, but no structured entity confirms the account was tagged. Often it is a genuine mention typed as plain text — but it can also be a different account that once used that name. Off by default.

**Will it find mentions in comments?**
No — captions only. Comments are a separate dataset.

**Does it need a login or cookies?**
No.

**Why did I get a row saying no mentions were found?**
So a run never returns an empty dataset with no explanation. It tells you how many results were scanned.

**How many mentions should I expect to find?**
It varies by handle, because TikTok has no "who tagged me" index. Mentions have to be discovered through search, and search matches the handle as an ordinary word, so a distinctive handle yields far more per page than one that is also a common word.

The Actor works around this by continuing on a second, deeper source when TikTok's own search runs dry, which it does after roughly 18 to 20 results. Measured 2026-08-19:

| Handle | Primary source alone | With the deeper source |
|---|---|---|
| `@nike` | 0 mentions in 18 results | **10 mentions from 133 scanned** |
| `@sephora` | 5 mentions in 19 results | **30 mentions from 87 scanned** |
| `@gymshark` | 12 mentions in 15 results | **40 mentions from 50 scanned** |

`@sephora` and `@gymshark` stopped at the limit that was set, not because they ran out.

A common word like `nike` still yields less per page than a distinctive one like `gymshark`, since search buries real tags under keyword matches. The depth is what makes a low-yield handle workable rather than empty. `maxSearchPages` bounds how hard the Actor looks, and you are never billed for the non-mentions it discards.

**What does it cost?**
Pay per result: one charge per mention returned, plus a small per-run start fee. Unconfirmed guesses are excluded by default, so you are not paying for rows you would have thrown away. No subscription.

### Support

Found a bug or need a field added? Open an issue on the Actor's **Issues** tab in Apify Console, or email <muhamed.didovic@gmail.com>.

### Additional Services

Need a custom TikTok or social-media scraper, enrichment pipeline, or a private version of this Actor? Custom builds available — reach out at <muhamed.didovic@gmail.com>.

### Explore More Scrapers

- **[TikTok Video Downloader](https://apify.com/memo23/tiktok-video-downloader)** — watermark-free MP4, cover and audio on stable links
- **[TikTok Post Scraper](https://apify.com/memo23/tiktok-post-scraper)** — full metadata and engagement for any post
- **[TikTok Comments Scraper](https://apify.com/memo23/tiktok-comments-scraper)** — every comment on any video, with commenter profiles
- **[TikTok Profile Scraper](https://apify.com/memo23/tiktok-profile-scraper)** — profile details and stats for any account
- **[TikTok Search Scraper](https://apify.com/memo23/tiktok-search-scraper)** — TikTok's ranked search results for any keyword

Browse the full portfolio: [muhamed-didovic.github.io](https://muhamed-didovic.github.io/)

### 🤖 For AI Agents & LLM Apps

**Purpose:** Return public TikTok posts that tag a given account, with each match confirmed against that account's TikTok ID rather than caption text.

**Minimal tested input:**

```json
{ "handles": ["@tiktok"] }
```

**Output:** array of flat objects, one per mention. Core fields: `mentionedHandle`, `mentionedUserId`, `matchType`, `captionAlsoMatches`, `postId`, `postUrl`, `caption`, `createdAt`, `durationSeconds`, `playCount`, `likeCount`, `commentCount`, `shareCount`, `saveCount`, `authorId`, `authorUsername`, `authorNickname`, `authorVerified`, `musicId`, `musicTitle`, `scrapedAt`. With `includeAuthorStats`: `authorFollowerCount`, `authorFollowingCount`.

**Critical for agents:** branch on `matchType`. Only `verified_account` proves the account was tagged — `caption_text` means the handle appeared in the caption with nothing linking it, and a caption's visible handle can point at a different account than the one it resolves to today. Do not infer the mentioned account from `caption`.

**Behavior & billing:** Pay-per-event — one charge per mention returned. Unconfirmed matches are excluded unless `onlyVerifiedMentions` is false. Unknown handles and handles with no mentions yield one error item each (`error`, `message`) instead of failing the run. No login or cookies required.

### ⚠️ Disclaimer

This Actor accesses publicly available data on TikTok for legitimate research, brand-monitoring, and business-analysis purposes. It does not log in, bypass authentication, or access private content. Use of this Actor must comply with TikTok's Terms of Service and all applicable laws, including data-protection regulations (GDPR, CCPA, etc.). The authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading TikTok's infrastructure
- Not use scraped data to violate user privacy or platform terms
- Process any personal data only with a lawful basis and in compliance with their jurisdiction
- Not republish scraped content in violation of copyright

We do not store scraped data; the Actor returns it directly to your Apify dataset for your authorized use. TikTok is a trademark of ByteDance Ltd.; this Actor is not affiliated with or endorsed by TikTok or ByteDance.

### SEO Keywords

tiktok mention scraper, tiktok brand mentions, track tiktok mentions, tiktok tag scraper, who mentioned me on tiktok, tiktok brand monitoring, tiktok social listening, tiktok influencer verification, tiktok ugc finder, tiktok campaign tracking, find tiktok posts mentioning, tiktok @mention api, tiktok mention monitoring, tiktok competitor mentions, tiktok tagged videos, tiktok brand tracking tool, tiktok mention export, apify tiktok mention scraper

# Actor input Schema

## `handles` (type: `array`):

TikTok usernames or profile URLs. Each is resolved to its account ID, so a mention is confirmed against the linked account rather than the caption text.

## `maxResultsPerHandle` (type: `integer`):

Stop after this many mentions are found for each account.

## `maxSearchPages` (type: `integer`):

Safety limit on how deep to search per account. TikTok matches the handle as a plain word, so a rarely-tagged account can return pages with no real mentions — this stops the run rather than searching indefinitely.

## `onlyVerifiedMentions` (type: `boolean`):

On (recommended): return only posts where TikTok's own caption data links the exact account. Off: also return posts whose caption text contains the handle, labelled as caption\_text — useful for wider brand monitoring, but not proof the account was tagged.

## `includeAuthorStats` (type: `boolean`):

Add follower and following counts for the account that posted each mention.

## Actor input object example

```json
{
  "handles": [
    "@tiktok",
    "https://www.tiktok.com/@nike"
  ],
  "maxResultsPerHandle": 100,
  "maxSearchPages": 15,
  "onlyVerifiedMentions": true,
  "includeAuthorStats": true
}
```

# Actor output Schema

## `mentions` (type: `string`):

All mention rows in the default dataset.

# 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 = {
    "handles": [
        "@tiktok"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/tiktok-mention-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 = { "handles": ["@tiktok"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/tiktok-mention-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 '{
  "handles": [
    "@tiktok"
  ]
}' |
apify call memo23/tiktok-mention-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/tiktok-mention-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/gQeQBj6XvELg0UGSh/builds/byVQeJhDiV8WLhu4d/openapi.json
