TikTok Ad Intelligence & Creative Watcher
Pricing
from $12.00 / 1,000 delivered creatives
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
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
0
Monthly active users
8 days ago
Last modified
Categories
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
nullwhen absent rather than guessed. If a URL appears in the ad caption it is reported separately undersignals.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.
| Field | Meaning |
|---|---|
status | new, changed, unchanged, untracked when watch mode is off, no_results when a market returned nothing, stopped when a spending limit ended collection |
statusMessage | Plain-language explanation on no_results and stopped rows, null on ad rows |
adId | TikTok's creative identifier, null on diagnostic rows |
advertiserName, adName, creativeType | Creative identity, null when TikTok omits them |
country, periodDays | The market TikTok actually served, and the date window |
videoUrl, imageUrl | Signed TikTok CDN URLs. They expire — save media promptly |
landingPageUrl | Only when TikTok publishes one |
industry | TikTok's internal label code, not a readable category name |
metrics | Only the values TikTok returned: ctr, cost, likes, durationSeconds, width, height |
opportunityScore, priorityReasons | Explainable prioritisation score and the reasons behind it |
signals | Hashtags, URLs mentioned, price mentions, calls to action, orientation |
firstSeenAt | Populated in watch mode only |
ai | Present only when AI analysis is enabled and the creative is new or changed |
sourceUrl | The 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)
Hosted Apify MCP server (recommended)
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®ion=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:
marielise-dot-dev--tiktok-creative-watch— starts the run, returnsrunIdanddatasetId.get-actor-runwith thatrunIdandwaitSecs— poll until the status is terminal.get-dataset-itemswith thatdatasetId— read the rows.get-key-value-store-recordwithrecordKey: 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.
| Event | Price |
|---|---|
| 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
maxAdsPerSearchabove 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_resultsrecords and a diagnostic inRUN_SUMMARYinstead 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.