# TikTok Sponsored Posts: Paid Partnerships & Branded Content (`vant47/tiktok-sponsored-posts`) Actor

Find TikTok sponsored posts and paid partnerships for any brand, e.g. Gymshark, SHEIN or Nike: creator, followers, views, likes, comments, shares, date, disclosure (#ad, label, promo code), EMV media value. $0.005 a post, 100 for $0.50. TikTok influencer marketing data, not sponsored ads. No login.

- **URL**: https://apify.com/vant47/tiktok-sponsored-posts.md
- **Developed by:** [fortbrand](https://apify.com/vant47) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 sponsored posts

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 Sponsored Posts: Paid Partnerships & Branded Content

For brands, agencies and creators who want to know which TikTok creators a brand pays, and how those posts perform.

**About $0.005 per sponsored post.** Checking 30 Gymshark partnerships costs $0.15; the brand summary row is free. No login, no cookies, no TikTok account.

Type a brand (Gymshark, @celsiusofficial or #fashionnova) and get one row per sponsored creator post: who posted it, their follower count, views, likes, comments, shares, the date, how the post discloses the deal (TikTok's own **Paid partnership** label, #ad or #sponsored, a promo code) and an estimated media value. Each brand also gets a free summary row with its creators, total reach, top creators, promo codes, posts by month and recent activity.

This is organic creator content, not the TikTok Ad Library. Ad library scrapers show ads a brand runs from its own account; this Actor finds the posts creators publish on their own accounts for the brand: influencer marketing, brand deals and branded content.

### What you get

| Field | What it is | Example |
|---|---|---|
| `summary` | The answer in one line | @leonkahara posted a paid partnership for Gymshark on 12 Oct 2026: 137K views |
| `brand` | The brand the post names | Gymshark |
| `creator`, `creatorName`, `creatorFollowers`, `creatorVerified` | Who posted it | @leonkahara, 525,900 followers |
| `disclosure` | The strongest disclosure on the post | TikTok paid partnership label |
| `disclosureTypes`, `disclosureEvidence` | Every disclosure found, with the proof | \["TikTok shows the Paid partnership label", "code LEON10"] |
| `confidence` | `high` for TikTok's label, #ad-style tags or wording, or a promo code in the creator's name; `medium` for gifted, PR or affiliate signs only | high |
| `promoCode` | The creator's discount code, when the caption has one | LEON10 |
| `views`, `likes`, `comments`, `shares`, `saves` | Public counts when the run read the post | 137,000 views |
| `engagementRatePct` | (likes + comments + shares) / views | 9.7 |
| `estimatedMediaValueUsd` | views / 1,000 x your CPM (default $10) | 1,370 |
| `postedAt`, `postedDate` | When it was posted | 2026-10-12 |
| `caption`, `hashtags`, `mentions` | The post text, its hashtags and tagged accounts | |
| `brandMatch` | How the post names the brand | @gymshark tagged |
| `paidPartnershipLabel`, `ranAsAd` | TikTok's label; whether the post also ran as a TikTok ad | true, true |
| `postUrl`, `creatorUrl`, `videoId` | Links | |
| `foundVia` | Which search or hashtag found it | search: Gymshark code |

**Brand summary row** (one per brand, free): `sponsoredPosts`, `creators`, `totalViews`, `medianViews`, `avgEngagementRatePct`, `estimatedMediaValueUsd`, `topCreators` (top 5 by views, with followers and their best post), `disclosureMix`, `promoCodes`, `postsByMonth`, `trend` (recent activity: active, occasional or quiet) and `trendNote`, `highConfidencePosts`, `sponsoredPostsFound`, `postsScanned` and `notes`.

Every run also saves a `SUMMARY` record and a one-page `REPORT` (HTML) in the key-value store, linked from the run's Output tab.

### How it finds sponsored posts

1. It searches TikTok the way a logged-out visitor does, with the words that find sponsored posts fastest: "Gymshark #ad", "Gymshark code", "Gymshark paid partnership", "Gymshark sponsored", the brand's @handle, and the brand's hashtags (#gymshark, #gymsharkpartner, #gymsharkambassador).
2. It keeps a post only when the caption names the brand, tags its account or uses its hashtag, and the post is not from the brand's own account.
3. It keeps only posts with a disclosure:
   - **TikTok paid partnership label**: TikTok's own "Paid partnership" tag, set by the creator when a brand pays. Read from the post's data; on every labelled post checked by hand, the public page showed the label.
   - **#ad or sponsored in caption**: #ad, #ads, #sponsored, #paidpartnership, #brandpartner, #gymsharkpartner, #anzeige, #werbung, #publicidad and others, "AD" on its own, or "paid partnership with", "in partnership with". "Sponsored by" or "partnered with" counts only next to a promo code: on its own it was as often a joke or news.
   - **Promo code**: a code in the creator's own name, the kind brands give their partners: "Code: LEON10" from @leonkahara, "código MARIAGU10" from @mariagutx. Shop-wide sale codes and coupon-site codes do not count on their own.
   - **Gifted or PR**: #gifted, #prpackage, "gifted by".
   - **TikTok Shop or affiliate link**: a TikTok Shop product link or affiliate wording.
4. It sorts by views (or newest first) and stops at your maximum per brand.

A post that only ran as a TikTok ad, with no disclosure, is not counted: creators can pay to boost their own posts, so that alone does not prove a brand deal. Posts that use #PaidPartnership only to join TikTok LIVE programmes are left out too.

### Use cases

- **Competitor research for brands**: which creators does a rival pay, how big are they, what codes do they give, and how active are their deals right now?
- **Agency pitches and reports**: a ready list of a brand's creators with reach and estimated media value, in one run.
- **Creators looking for brand deals**: see which brands sponsor creators of your size in your niche, and what they post.
- **Influencer discovery**: start from a brand you admire and get the creators already working in that category.
- **Campaign monitoring**: schedule it weekly for your own brand and catch new partner posts, codes and disclosure gaps.

### How to use it

1. Enter one or more brands (a name, an @handle or a #hashtag).
2. Optional: set the maximum posts per brand, a start date (2026-07-01 or "90 days"), or a list of creators.
3. Press Start. A 20-post run usually finishes in under a minute. Download the rows as Excel, CSV or JSON, or open the HTML report.

### Input

| Field | What to enter | Example |
|---|---|---|
| `brands` | Brand names, @handles or #hashtags, one per line | `["Gymshark", "@celsiusofficial", "#fashionnova"]` |
| `maxPosts` | Most sponsored posts per brand (default 30, up to 1,000) | `50` |
| `dateFrom` | Only posts from this date on: a date or a period | `"2026-07-01"`, `"90 days"` |
| `creators` | Optional TikTok creators (@handle or profile link). With brands: only their posts for those brands. Without brands: every sponsored post among each creator's latest videos, for any brand | `["@leonkahara"]` |
| `sortBy` | `views` (default) or `newest` | `"newest"` |
| `mediaValueCpm` | US dollars per 1,000 views for the media value (default 10) | `8` |

Input example:

```json
{
  "brands": ["Gymshark", "@celsiusofficial"],
  "maxPosts": 50,
  "dateFrom": "90 days",
  "sortBy": "views"
}
```

The Actor also accepts `keywords`, `queries` or `query` for brands, `usernames` or `startUrls` (profile links) for creators, and `maxResults` or `limit` for the maximum. Input it cannot read becomes a free note row, never a failed run.

### Output example

A real row from a test run on 13 October 2026:

```json
{
  "summary": "@martuojedax posted a paid partnership for Gymshark on 15 Aug 2026: 352K views",
  "type": "sponsored post",
  "brand": "Gymshark",
  "creator": "@martuojedax",
  "creatorFollowers": 67300,
  "disclosure": "TikTok paid partnership label",
  "disclosureEvidence": ["TikTok shows the Paid partnership label", "creator code Martu10"],
  "confidence": "high",
  "promoCode": "Martu10",
  "views": 351600,
  "likes": 51700,
  "comments": 467,
  "shares": 10200,
  "engagementRatePct": 17.74,
  "estimatedMediaValueUsd": 3516,
  "postedDate": "2026-08-15",
  "caption": "I completely blame @Gymshark Women Code: Martu10",
  "brandMatch": "@gymsharkwomen tagged",
  "paidPartnershipLabel": true,
  "postUrl": "https://www.tiktok.com/@martuojedax/video/7674336326472273183"
}
```

And brand summaries from the same day (three energy drink brands, 25 posts each, 52 to 89 seconds per run):

> Celsius: 25 sponsored posts by 24 creators, 14.4M views (est. media value $143,918). Top creator @jakepaul (10.4M views).
>
> Red Bull: 25 sponsored posts by 25 creators, 13.2M views (est. media value $132,015).
>
> Monster Energy: 25 sponsored posts by 23 creators, 1.1M views (est. media value $10,750).

### Tested on real runs

On 13 October 2026 the final version ran 42 varied test inputs in Apify's cloud (30 brand inputs, creator lists, date filters, bad input, field-name aliases and spending limits) and returned 1,018 sponsored posts. About 65% carried TikTok's own paid partnership label, 26% an #ad-style tag or wording, 6% a creator promo code and 4% gifted or affiliate signs. A one-brand, 20-post run took 29 to 58 seconds. In hand checks of 35 live posts, the public page showed the "Paid partnership" label on all 14 posts the Actor marked as labelled and on none of the 21 others, and the like counts matched.

### Pricing

Pay per event: **$0.005 per sponsored post** delivered ($0.00475 on Bronze, $0.0045 on Silver, $0.004 on Gold and above), plus Apify's tiny start fee. Brand summary rows, notes, posts without a disclosure and duplicates are free. You never pay for Apify platform usage on top.

| Job | Posts | Cost |
|---|---|---|
| One brand, the default 30 posts | 30 | $0.15 |
| Three energy drink brands, 25 each | 75 | $0.38 |
| Nike, 100 posts | 100 | $0.50 |
| 10 competitors, 50 each | 500 | $2.50 |

Set a maximum charge per run in Apify and the Actor stops cleanly when it is reached; it never delivers a post it cannot charge. On the free Apify plan each run delivers up to 100 sponsored posts; any paid Apify plan removes the limit.

### Tips

- Use the brand's @handle for short or common names ("@dove" rather than "Dove", "@on_running" rather than "On"). The handle also leaves the brand's own posts out.
- Add `dateFrom` for recent campaigns; TikTok's search then returns posts from that window only.
- `sortBy: "newest"` suits weekly monitoring; `views` suits "who drives the most reach".
- Filter on `paidPartnershipLabel: true` when you need only posts with TikTok's own label.
- To compare brands, run them together: each gets its own summary row and the HTML report shows them side by side.

### API

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vant47/tiktok-sponsored-posts").call(run_input={"brands": ["Gymshark"], "maxPosts": 30})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["summary"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('vant47/tiktok-sponsored-posts').call({ brands: ['Gymshark'], maxPosts: 30 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((row) => console.log(row.summary));
```

curl (runs and returns the rows in one call):

```bash
curl -X POST "https://api.apify.com/v2/acts/vant47~tiktok-sponsored-posts/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"brands": ["Gymshark"], "maxPosts": 30}'
```

### Integrations

Schedule it daily or weekly in Apify, send new rows to Google Sheets, Slack, Make, Zapier or n8n, or call a webhook when a run finishes. Each run is independent, so a weekly schedule with `dateFrom: "7 days"` gives you a clean weekly feed of new partner posts.

### Use with AI agents (MCP)

Connect Apify's MCP server (`https://mcp.apify.com`) to Claude, Cursor, ChatGPT or any MCP client and ask in plain words: "Which TikTok creators did paid partnerships with Gymshark in the last 3 months, and how many views did they get?" The agent can run `vant47/tiktok-sponsored-posts` with `{"brands": ["Gymshark"], "dateFrom": "3 months"}` and read the summary row first. Every row starts with a one-line answer, so agents can quote results directly.

### Limits

- **A sample, not a census.** TikTok's public search shows a few pages per query, so a run finds the sponsored posts among a few hundred to a few thousand public posts per brand, not every post ever made. Big brands give the most; a brand with few disclosed posts returns fewer rows (and costs less).
- **Activity, not a growth call.** TikTok's search favours recent posts, so a rising count would mostly reflect that. `trend` therefore gives a level (active: 3 or more sponsored posts found from the last 30 days; occasional: 1 or 2; quiet: none) and `postsByMonth` the shape. Compare brands with each other, or schedule the same brand monthly to see a real change.
- **Disclosure, not contracts.** A post counts when it carries a disclosure. Undisclosed deals cannot be seen, and posts whose only sign is "sponsored by" wording or a shop-wide code are left out on purpose, so a few real deals are missed.
- **One post, several brands.** A retailer's or another brand's paid post can also name your brand (a Sephora post paid for by a skincare brand, a McDonald's partner post about a Red Bull drink). The row's `brand` is the brand you searched; `hashtags` and `mentions` show the others.
- **Creators mode reads the latest videos only** (about 10 per creator, from TikTok's public profile card), plus a search for each creator with the brand.
- **Short or common brand names** ("Apple", "Dove") also match posts about the fruit or the bird; use the @handle.
- **Public, logged-out data only**, as TikTok shows it to a visitor in the United States. Private accounts and deleted posts are not visible. Follower counts and views are TikTok's public numbers when the run read them.
- **Media value is an estimate**: views x your CPM, what the same views would cost as TikTok ads.

### FAQ

**Is this the TikTok Ad Library?** No. Ad library scrapers list ads a brand runs from its own ad account. This Actor finds creators' own posts about the brand, which is where most influencer spending shows.

**Do I need a TikTok account or cookies?** No. It reads only what anyone sees on TikTok without logging in.

**How accurate is the paid partnership label?** It is TikTok's own flag on the post. In checks of 35 live posts on 13 October 2026, the public page showed "Paid partnership" on all 14 labelled posts and on none of the 21 others.

**Why do I get fewer posts than my maximum?** The brand had fewer disclosed creator posts in TikTok's public search, or your date window was short. The summary row's `notes` say why the search stopped.

**Can I check my own creators?** Yes: put them in `creators`, with or without `brands`.

**What does it cost if nothing is found?** Nothing beyond Apify's start fee of a fraction of a cent: summary rows and notes are free.

**Is scraping TikTok allowed?** This Actor reads only public, logged-out pages, like every TikTok scraper on Apify. TikTok's terms limit automated access, so use the data for research and keep to the laws that apply to you.

**Is this an official TikTok tool?** No. It is an independent tool, not affiliated with or endorsed by TikTok or any brand named here.

### Related searches

TikTok sponsored posts, TikTok paid partnerships, TikTok branded content, TikTok influencer marketing, TikTok brand deals, TikTok #ad posts, TikTok promo codes, TikTok creator partnerships, TikTok EMV media value, sponsored TikTok videos by brand.

# Actor input Schema

## `brands` (type: `array`):

The brands to check, one per line: a name (Gymshark), the brand's TikTok @handle (@gymshark) or a hashtag (#gymshark). For each brand you get its sponsored creator posts (paid partnership label, #ad, promo codes) and one summary row. $0.005 per sponsored post; brands with none found cost nothing. Use the @handle for short or common names.

## `maxPosts` (type: `integer`):

Stop at this many sponsored posts per brand (or per creator). 30 posts cost $0.15. Posts are picked by the sort order below.

## `dateFrom` (type: `string`):

Only posts from this date on: a date such as 2026-07-01, or a period such as 30 days, 3 months or 1 year. Leave empty for any date.

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

TikTok creators to check, one per line (@handle or profile link). With brands: only these creators' posts for those brands. Without brands: every sponsored post among each creator's latest videos (about 10), for any brand, with one summary row per creator.

## `sortBy` (type: `string`):

Which sponsored posts come first, and which are kept when there are more than the maximum: most viewed or newest.

## `mediaValueCpm` (type: `number`):

Estimated media value of a post = views / 1,000 x this price, what the same views would cost as TikTok ads. Default $10.

## Actor input object example

```json
{
  "brands": [
    "Gymshark",
    "@shein_official",
    "#celsiusenergy"
  ],
  "maxPosts": 20,
  "dateFrom": "90 days",
  "creators": [
    "@leonkahara",
    "https://www.tiktok.com/@lifts_withlina"
  ],
  "sortBy": "views",
  "mediaValueCpm": 10
}
```

# Actor output Schema

## `posts` (type: `string`):

No description

## `brands` (type: `string`):

No description

## `details` (type: `string`):

No description

## `report` (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 = {
    "brands": [
        "Gymshark"
    ],
    "maxPosts": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("vant47/tiktok-sponsored-posts").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 = {
    "brands": ["Gymshark"],
    "maxPosts": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("vant47/tiktok-sponsored-posts").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 '{
  "brands": [
    "Gymshark"
  ],
  "maxPosts": 20
}' |
apify call vant47/tiktok-sponsored-posts --silent --output-dataset

```

## MCP server setup

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

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/VCcZHQcMwCKZVyc51/builds/Jfwh6Gv91Hm1Scyek/openapi.json
