TikTok Ad Intelligence & Creative Watcher avatar

TikTok Ad Intelligence & Creative Watcher

Pricing

from $12.00 / 1,000 delivered creatives

Go to Apify Store
TikTok Ad Intelligence & Creative Watcher

TikTok Ad Intelligence & Creative Watcher

Scrape TikTok Creative Center Top Ads by market and date window, and see which creatives are new or changed on every run. Flat, agent-ready records with advertiser, ad copy, video and image URLs. Optional AI read of hook, audience, offer, funnel stage and one A/B test.

Pricing

from $12.00 / 1,000 delivered creatives

Rating

5.0

(1)

Developer

Marielise

Marielise

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

0

Monthly active users

8 days ago

Last modified

Share

TikTok Creative Center Top Ads Scraper & Change Watcher

Scrape TikTok Creative Center Top Ads by market and date window, and get told which creatives are new or changed on every scheduled run. Built for developers, data teams, technical marketers and AI agents that want a TikTok creative feed inside their own stack rather than another dashboard to log into.

Every detected ad becomes a flat record led by a status field: advertiser, ad copy, creative format, media and destination URLs when TikTok publishes them, market, industry, the public performance signals TikTok exposes, and the exact source URL. There are no invented fields. A value is null when TikTok did not publish it.

How to scrape TikTok Creative Center Top Ads

Set Markets to the ISO country codes you care about and pick a Date window. That is the whole configuration.

{
"countries": ["US", "GB", "DE"],
"period": "30",
"maxAdsPerSearch": 20,
"watchMode": true,
"includeUnchanged": true,
"analyzeCreative": false
}

Running with an empty input {} is valid and returns TikTok's global 30-day Top Ads page. Every field has a default, so no call ever fails on a missing argument.

Need an industry filter or anything the fields above do not express? Paste full Creative Center URLs into Creative Center URLs (advanced). They are collected in addition to the markets above, and each URL is billed as one monitored source.

How to monitor new TikTok competitor ads daily

Watch mode is the reason to use this Actor rather than a plain scraper. It stores a compact fingerprint for each creative in a named key-value store and labels every ad on later runs as new, changed or unchanged.

Attach a daily or weekly schedule and the dataset's New and changed only view gives you an alerts feed with no diffing on your side. Set includeUnchanged to false if you would rather the dataset itself only ever contain alerts.

An ad is only marked as seen once it has actually been delivered to you, so a run stopped by a spending limit will not silently hide creatives from future runs.

How to choose the market for TikTok Top Ads

Use Markets. Each code becomes one Creative Center request with region set, which TikTok honours per request, so a single run can cover several markets.

The country field on each record is read back from TikTok's own API request rather than from your input, so it reports the market TikTok actually served.

What data does TikTok Creative Center expose publicly?

Everything this Actor collects is visible to any visitor at ads.tiktok.com without logging in. TikTok provides the ad title, creative media, public CTR and cost signals, likes, duration, and an internal industry identifier.

Two honest limits:

  • Top Ads is curated. It is a set of advertiser-authorised high performers, not a complete archive of TikTok advertising. Do not treat it as full ad coverage.
  • Advertiser name is present on roughly half of records, and a destination URL is rare. Both are null when absent rather than guessed. If a URL appears in the ad caption it is reported separately under signals.urlsMentioned, which is what it is, rather than being relabelled as the ad's destination.

TikTok Top Ads scraper output fields

Each dataset item is one flat record. status leads so a consumer can branch on it before reading anything else.

FieldMeaning
statusnew, changed, unchanged, untracked when watch mode is off, no_results when a market returned nothing, stopped when a spending limit ended collection
statusMessagePlain-language explanation on no_results and stopped rows, null on ad rows
adIdTikTok's creative identifier, null on diagnostic rows
advertiserName, adName, creativeTypeCreative identity, null when TikTok omits them
country, periodDaysThe market TikTok actually served, and the date window
videoUrl, imageUrlSigned TikTok CDN URLs. They expire — save media promptly
landingPageUrlOnly when TikTok publishes one
industryTikTok's internal label code, not a readable category name
metricsOnly the values TikTok returned: ctr, cost, likes, durationSeconds, width, height
opportunityScore, priorityReasonsExplainable prioritisation score and the reasons behind it
signalsHashtags, URLs mentioned, price mentions, calls to action, orientation
firstSeenAtPopulated in watch mode only
aiPresent only when AI analysis is enabled and the creative is new or changed
sourceUrlThe Creative Center URL this record came from

opportunityScore is computed by this Actor. It is not a TikTok performance metric.

A market that returns nothing produces a no_results record rather than silence, so an automated consumer always gets an answer it can act on. RUN_SUMMARY in the default key-value store reports extraction totals, how many sources were charged, and any source failures.

Use it from an AI agent (MCP)

Apify's hosted MCP server exposes this Actor as a tool built from its input schema. Point your client at:

https://mcp.apify.com/?tools=marielise.dev/tiktok-creative-watch

Transport is Streamable HTTP. Authenticate with OAuth, or with your Apify token as a bearer header.

Claude Code:

$claude mcp add tiktok-creative-watch "https://mcp.apify.com/?tools=marielise.dev/tiktok-creative-watch" -t http

Claude Desktop, claude_desktop_config.json:

{
"mcpServers": {
"tiktok-creative-watch": {
"url": "https://mcp.apify.com/?tools=marielise.dev/tiktok-creative-watch",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}

Example tool call:

{ "countries": ["US"], "period": "7", "maxAdsPerSearch": 5, "watchMode": false }

Example record in the response:

{
"status": "untracked",
"statusMessage": null,
"adId": "7412...",
"advertiserName": "Acme Skincare",
"adName": "Stop wasting money on 5 serums #skincare",
"country": "US",
"periodDays": 7,
"creativeType": "video",
"videoUrl": "https://v16m.tiktokcdn.com/...",
"imageUrl": "https://p16.tiktokcdn.com/...",
"landingPageUrl": null,
"metrics": { "ctr": 0.043, "likes": 12400, "durationSeconds": 21 },
"opportunityScore": 71,
"priorityReasons": ["Contains a call to action", "High visible engagement signal"],
"firstSeenAt": null,
"collectedAt": "2026-09-07T09:14:02.118Z",
"ai": null,
"sourceUrl": "https://ads.tiktok.com/business/creativecenter/inspiration/topads/pc/en?period=7&region=US"
}

The agent pays this Actor's normal pay-per-event prices, on its own Apify account. There is no separate MCP price and no surcharge from the MCP server.

Expect the call to be asynchronous. One market takes about 90 to 100 seconds end to end, and the Apify MCP server waits only waitSecs (30 by default, 45 maximum) before returning. Your agent will get a run reference rather than rows, then finish with the companion tools the server loads alongside this one:

  1. marielise-dot-dev--tiktok-creative-watch — starts the run, returns runId and datasetId.
  2. get-actor-run with that runId and waitSecs — poll until the status is terminal.
  3. get-dataset-items with that datasetId — read the rows.
  4. get-key-value-store-record with recordKey: RUN_SUMMARY — optional, for counts and per-market diagnostics.

Set waitSecs to its 45 maximum on the first call to cut one poll, and keep countries to a single market when latency matters.

Change detection works normally through MCP: watch state is per-account, so an agent calling with watchMode on gets new and changed labels against its own history.

Standby is deliberately off

This Actor does not enable Standby mode. Apify rejects Standby Actors from agentic payment rails — the API defines the error type actor-standby-not-supported-for-agentic-payments — and this Actor is currently eligible for them. A Standby MCP server would also add nothing to discovery, because mcp.apify.com builds its tool from the input schema and starts a normal run, rather than proxying an Actor's own MCP endpoint.

Direct API

Start a run and get the dataset back in one request. The synchronous endpoint returns 408 past 300 seconds, so keep it to a small number of markets:

curl -X POST "https://api.apify.com/v2/acts/marielise.dev~tiktok-creative-watch/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"countries":["US"],"period":"7","maxAdsPerSearch":5,"watchMode":false}'

For larger sweeps, start asynchronously and read the dataset when the run finishes:

curl -X POST "https://api.apify.com/v2/acts/marielise.dev~tiktok-creative-watch/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"countries":["US","GB","DE"],"period":"30"}'

Pricing

Pay per event.

EventPrice
Run start$0.10 once per run
Market monitored$0.20 per market and window successfully collected
Delivered creative$0.004 per ad
AI creative insight$0.010 per analysis, only when AI analysis is on

You are charged for a market only when TikTok actually returns ads. A blocked or empty market costs nothing. AI insights are never charged for an unchanged creative.

Worked examples:

  • One market, 20 ads, no AI: $0.38, which is $0.019 per ad.
  • Daily watch, 3 markets, 6 new ads, no AI: $0.72 per run.
  • Three markets across three windows, 180 ads, no AI: $2.62, which is $0.015 per ad.
  • Same sweep with AI on every ad: add $0.010 per creative. AI is off by default for this reason.

Your run's maximum-spend setting is always respected. The Actor checks the remaining budget before fetching a market, so it stops cleanly instead of doing paid work it cannot bill, and it records a stopped row telling you where collection ended.

Reliability and limits

  • TikTok serves 20 ads per Top Ads page and does not paginate. Anonymous access returns page one only, so maxAdsPerSearch above 20 has no effect on a single market. Breadth comes from more markets, periods and industry filters.
  • Collection starts with a low-cost HTTP request and falls back to a browser session with a fresh proxy session when TikTok returns an empty or blocked payload.
  • Residential proxy is the reliable configuration and is the default.
  • If two markets in a row return nothing, the run stops rather than spending your budget on a target that is clearly refusing it.
  • If collection cannot succeed, the run finishes with no_results records and a diagnostic in RUN_SUMMARY instead of failing or silently manufacturing ads.
  • A run collecting many markets needs a longer run timeout. Each market takes roughly 60 to 90 seconds, so raise the timeout above the 300-second default before sweeping more than three.

FAQ

Is there a TikTok Creative Center API? No. TikTok publishes no public API for Creative Center Top Ads, which is why scripting a recurring pull requires an Actor like this one.

Can I scrape TikTok ads without logging in? Yes. Top Ads browsing is public. This Actor never authenticates and never asks for TikTok credentials.

How many ads does TikTok Top Ads return per page? Twenty, and there is no page two for anonymous access. Collect more by varying market, period and industry.

How do I get only new TikTok ads? Keep watch mode on, attach a schedule, and read the dataset's New and changed only view, or set includeUnchanged to false.

Does this show every ad running on TikTok? No. Top Ads is a curated set of advertiser-authorised high performers.

Why is the advertiser name sometimes empty? TikTok only publishes it on roughly half of records. It is null rather than guessed.

What happens if TikTok blocks the run? You get no_results records naming the market and the reason, and you are not charged for those markets. The run still succeeds.

Saved Apify tasks

Ten published task templates cover the US, UK, Canada, Australia, Germany, France and Brazil, plus a multi-period creative library, a 180-day AI analysis, a UK hooks-and-offers feed, and a raw export with AI disabled. They configure searchUrls directly, which remains fully supported.

Support

Include the market, the date window and the RUN_SUMMARY record when reporting an issue. Never include TikTok account credentials; this Actor does not use them.