Every ad running on TikTok.
Video files included.
Search the public TikTok Ad Library by keyword or advertiser and get the hook, the call to action, the landing page, the run dates, the reach band, and the actual video file as structured JSON. No TikTok developer account, no research application, no approval queue.
Trusted by developers shipping real products.
494,175 served today
Request
$ curl -X POST \ https://api.fetchlayer.dev/tiktok-ad-library/search-ads \ -H "Authorization: Bearer ss-your-key" \ -H "Content-Type: application/json" \ -d '{"query":"skincare routine","country":"DE"}'
Response
{
"ads": [{
"adId": "1794523310028...",
"advertiser": "Acme Beauty GmbH",
"title": "Three steps. Two minutes.",
"callToAction": "Shop now",
"lastShownDate": "2026-09-11",
"estimatedAudience": "100K-1M",
"video": "https://.../ad.mp4"
}],
"notes": [],
"nextCursor": "eyJwYWdlIjoy..."
} Built for feedback workflows
Fetch the public signal. Use it wherever your team works.
Keyword and advertiser search
Search the library by keyword, or pull every ad one advertiser has run — filtered by country, status, media type, audience age bracket, gender, reach band, and the dates the ad was shown.
The video files, not screenshots
Get the video, its cover frame, and every image as a downloadable asset URL. TikTok’s own links are signed and expire within hours; ours do not, and GET /media streams the bytes with HTTP Range so seeking works.
The hook, the CTA, the objective
One ad detail call returns the ad text, the button copy, the landing page, and what the advertiser bought the ad for — the four things a creative brief actually needs.
Regional reach and targeting
For European countries, read impressions by region and then by age bracket and gender, the brackets the advertiser targeted, the audience size the targeting could reach, and the languages, cities and devices it covered.
Advertiser identity
Resolve a brand into its registered legal entity, then read its registered location, who paid for the ads, the linked account with follower count and verification type, and how many ads it ran in the window.
Ceilings you can see
Every response carries a notes array reporting truncated walks and upstream limits, alongside pagesScraped, pagesRequested and totalMatches. A thin result set tells you whether it is thin or merely cut short.
AI-ready JSON
Pass hooks, CTAs, objectives, run dates, and video URLs to an LLM or an MCP agent to cluster creative angles, spot rotation, and write the brief — no HTML parsing, no wrapper code.
Build a short-form swipe file with AI—then export it to CSV.
Prefer not to write code? Give FetchLayer Research Chat a brand, ask what it is running and which hooks have survived longest, and turn the whole ad set into a structured file for your swipe folder, client deck, or creative brief.
- ✓Ask questions in plain English
- ✓Analyze themes, sentiment, and pain points
- ✓Download the structured results as CSV or JSON
No code or setup required · Uses your FetchLayer credits
Pull every ad this brand is running in Germany right now. Group them by hook and objective, flag which creatives have run longest, then export it as CSV.
I found the active ads, grouped them into five hooks, and marked the three creatives still running after 90 days. The ad-level breakdown, with reach bands and video links, is ready to download.
tiktok-ad-library-competitor-ads.csv
96 ads · 12 columns · ready to download
Solutions
Build the workflow around the feedback.
Compare the paid mix
Pull the same brand’s Facebook and Instagram ads and see which hooks they run where.
Explore →Read the reaction
Pull public comments on video ads and creator content in the same JSON shape.
Explore →Find the demand
Search public discussions for the objections your next creative should answer.
Explore →From raw feedback to action
One request is the start of the workflow.
Store the structured response, run it on a schedule, pass it to an LLM, or feed it into the system your team already uses. FetchLayer handles retrieval so you can focus on the outcome.
- 01
Resolve the advertiser
Search a brand name to get the exact registered entity and its id. One brand is often several entities, and a listing is scoped by the registered name.
- 02
Pull the ads and the video
Filter by country, status, format, audience and date window, then request the media assets for the ads worth keeping — and check notes before you call the set complete.
- 03
Turn ads into creative intelligence
Build a swipe file, diff the rotation week over week, read the regional reach on the ads that scaled, or hand the JSON to an agent to write the brief.
MCP & agents
Your AI already knows
how to use this.
Use the TikTok Ad Library endpoint directly from your MCP-compatible agent. Ask it to retrieve public feedback, identify patterns, and turn the result into a useful brief without writing integration glue.
Pick your editor and we hand you the config with your key already in it — no JSON to hand-edit, no wrapper code.
Get your free API keyFree tier · no credit card · any MCP host
Find every ad this brand is running in Germany right now, tell me which hook has been live the longest, and get me the video files.
Pulled 41 active ads for the registered entity. The longest-running hook has been live for 88 days, four angles repeat across formats, and the video files are ready to download.
Works with every MCP-compatible tool
Use cases
What teams build with TikTok ad data.
Same API, endless applications. Here is what teams ship with public TikTok ad creative.
Competitor creative tracking
Search by keyword or advertiser to see every TikTok ad a brand runs — hooks, CTAs, formats and landing pages.
AI agent context
Hand Claude, Codex, or your MCP agent structured hooks, CTAs and objectives instead of a folder of screen recordings.
Ad fatigue & rotation
Poll an advertiser on a schedule to see which videos get killed, which keep running, and what replaces them.
Creative brief research
Read the hook, the button copy, the landing page and the objective together — what a creative brief actually needs.
Video swipe files
Download the actual video creative behind winning ads. TikTok’s own links expire within hours; these do not.
Reach & targeting research
Read European impressions by region, age and gender, plus the audience brackets the advertiser chose to buy.
Compare approaches
Spend time on the insight, not the collection layer.
| What you need | FetchLayer | Official API | Build it yourself |
|---|---|---|---|
| Search public ads with one API key | ✓ | Approved access required | You build it |
| Downloadable video & image assets | ✓ | Your integration | You extract them |
| Links that do not expire in hours | ✓ | Signed, short-lived URLs | You re-fetch them |
| Reach & targeting where published | ✓ | ✓ | You parse it |
| Ready for AI and MCP workflows | ✓ | Your integration | Your integration |
FetchLayer provides access to publicly available data. It is not affiliated with, endorsed by, or sponsored by the platform.
Pricing
Start free. Scale when ready.
Pay per request with no commitment, or lock in a flat monthly rate with built-in savings.
Free plan — 30 requests
Verify responses, inspect the API, no credit card required.
Pay as you go
$1.99
per 1,000 requests
$0.00199 per request · credits never expire
How credits work — no multipliers
One credit = one API call, on every endpoint and platform. No matter how many results come back, you pay for the call, not the output size. Most scraping APIs charge multipliers of 5x, 25x, even 75x per call depending on the target — here it's always 1.
- No multipliers — 1 request = 1 credit
- No monthly commitment
- Credits never expire
- Same API & MCP access as subscribers
- ∞ req/min, ∞ API keys
∞
Expiry
Credits stay until you use them. No monthly reset, no pressure to hit a quota.
0
Commitments
No subscription, no contract, no minimums. Start, pause, or scale whenever.
100%
Access
Every endpoint and MCP included. Not a limited tier — same data as any subscriber.
API reference
Every parameter, documented.
All requests are POST with a JSON body and Bearer auth header.
POST /tiktok-ad-library/search-ads Search the public ad library by keyword. Returns short-form video ads with their copy, call to action, landing page, objective, creative, run dates, and advertiser. Set queryMode to advertiser_name to match advertiser names instead of ad content.
query* string Keyword or phrase to search the TikTok Ad Library for queryMode string 'keyword' | 'advertiser_name'. Default keyword. exactPhrase boolean Match the query as a whole phrase instead of loose terms. country string Two-letter code of a covered country (the EU, GB, CH, NO, IS, LI, TR), or ALL. Defaults to ALL. countries string[] Several covered countries at once; overrides country. adStatus string 'all' | 'active' | 'inactive'. Defaults to active. mediaType string 'all' | 'video' | 'image' | 'text'. ages string[] Audience age brackets: '13-17', '18-24', '25-34', '35-44', '45-54', '55+', 'all'. reach string[] Reach band: 'under_10k', '10k_to_100k', 'over_100k', 'all'. gender string 'all' | 'female' | 'male'. Defaults to all. shownFrom string Only ads shown on or after this YYYY-MM-DD date. Defaults to 30 days before shownTo. shownTo string Only ads shown on or before this YYYY-MM-DD date. Defaults to today. limit number Maximum ads returned (max 2000), or -1 for everything available. Defaults to 30. pages number Pages of results to collect in one request (max 100). cursor string Resume from a previous response's nextCursor. sortBy string 'last_shown_date' | 'unique_users_seen'. POST /tiktok-ad-library/advertiser-ads Every ad one advertiser has run, with the same filters as a keyword search. Scoped by registered business name, so resolve the name with search-advertisers first — the fastest way to see a competitor’s whole rotation.
advertiser* string Registered advertiser name, or an ad library URL naming one advertiserId string The advertiser's numeric id, when search-advertisers has already returned one adStatus string 'all' | 'active' | 'inactive'. Defaults to active. mediaType string 'all' | 'video' | 'image' | 'text'. shownFrom string Start of the date window, YYYY-MM-DD. Defaults to 30 days back. limit number Maximum ads returned, or -1 for everything available. pages number Pages of results to collect in one request (max 100). POST /tiktok-ad-library/search-advertisers Find advertisers by brand or company name. Returns the registered name, advertiser id, and library URL the other routes accept — one brand can appear as several legal entities, and this is how you tell them apart.
query* string Advertiser or brand name to look up limit number Maximum advertisers returned (max 50), or -1 for everything available. Defaults to 20. POST /tiktok-ad-library/advertiser-profile An advertiser’s identity: registered business name and location, who paid for their ads, the linked account with follower count and verification type, ads published in the window, and the countries they ran in. Assembled from the advertiser’s latest matching ad, because the library publishes identity per ad rather than as a profile page — sampledAdId names the ad it was read from.
advertiser* string Registered advertiser name, or an ad library URL naming one country string Two-letter code of a covered country, or ALL. POST /tiktok-ad-library/ad-detail One ad in full: creative and copy, call to action, landing page, advertising objective, the advertiser’s identity and registered location, and — for European countries — the reach and targeting breakdown by region, age bracket and gender.
ad* string Ad id, or an ad library URL containing one POST /tiktok-ad-library/ad-media An ad’s video, cover frame, and images as downloadable asset URLs. TikTok’s own URLs are signed and expire within hours, so every asset also carries a FetchLayer download URL that does not. Pair it with GET /tiktok-ad-library/media, which streams the bytes with HTTP Range support so video seeking works.
ad* string Ad id, or an ad library URL containing one kinds string[] 'video' | 'image' | 'thumbnail'. Defaults to all three. probe boolean Confirm each asset is still downloadable and report its size and content type. inline boolean Return the bytes base64-encoded. Refused for assets over the inline size limit. POST /tiktok-ad-library/resolve-url Parse any TikTok Ad Library URL into the structured filters it encodes — whether it points at one ad, one advertiser, or a search, plus the country, status, media, audience, and date filters in the query string. A filter the URL leaves out comes back null, not defaulted. Free: it never consumes a credit.
url* string Any TikTok Ad Library URL, to be parsed into structured filters Fields marked * are required. Full API reference →
FAQ
Common questions.
Is the TikTok Ad Library public data?
Yes. TikTok publishes the Ad Library so anyone can see the ads running on the platform, who paid for them, and — in Europe — who they reached. FetchLayer retrieves those publicly available records and returns them as structured JSON. FetchLayer is not affiliated with, endorsed by, or sponsored by TikTok or ByteDance.
Do I need a TikTok developer account or an approved research application?
No. You authenticate with your FetchLayer API key — the same Bearer token you use for every other platform. There is no TikTok app to register, no research application to submit, no approval to wait on, and no token to refresh.
What identifiers can I pass in?
For an advertiser: the registered business name, or an ad library URL naming one, with the advertiser id as an optional shortcut. For a single ad: an ad id, or any ad library URL containing one. Listings here are scoped by registered name rather than by TikTok handle, and one brand can be registered as several legal entities — so run /search-advertisers first to get the exact name, and /resolve-url to turn any ad library URL into the filters it encodes.
Can I download the actual video files?
Yes, and on a short-form video platform that is most of the point. /ad-media returns the video, its cover frame, and any images as downloadable asset URLs, optionally probed to confirm they are still retrievable and to report size and content type. TikTok’s own URLs are signed and expire within hours, so every asset also carries a FetchLayer download URL that does not. GET /tiktok-ad-library/media then streams the bytes with HTTP Range support, so video seeking works in a player.
Can I research political ads?
No, and there is no filter for it, because TikTok prohibits political advertising outright. If you have come from another ad library looking for an ad-type switch or a “paid for by” byline filter, it is absent by design rather than missing. What the library does publish is a sponsor field naming who paid for an ad where that differs from the advertiser.
Which countries does the TikTok Ad Library cover?
Thirty-three: the 27 EU member states, plus the United Kingdom, Switzerland, Norway, Iceland, Liechtenstein and Turkey. That is TikTok’s own list — the library does not exist for other markets, so a request for the US, Canada, Australia or anywhere else is rejected. Pass a two-letter code (AT BE BG CH CY CZ DE DK EE ES FI FR GB GR HR HU IE IS IT LI LT LU LV MT NL NO PL PT RO SE SI SK TR) or ALL to search every covered country at once.
What reach and targeting data comes back?
For European countries, /ad-detail returns the disclosure: total reach, impressions broken down by region and then by age bracket and gender within each region, the age and gender brackets the advertiser actually targeted per region, the audience size the targeting could reach, and the countries, cities, languages, device models and operating systems it covered. Ads from elsewhere come back with the fields the library publishes for them and a null targeting block. Figures are published as bands — “10K-100K”, “35.9M-43.9M” — never as exact counts.
How do I know a result set is complete?
Read the notes array. Every response carries one, and it reports what that particular result could not do — a page walk that stopped short of what you asked for, an upstream cap, a filter the library would not honour. Compare pagesScraped with pagesRequested and adCount with totalMatches before you conclude a brand is quiet. Note also that a search with no dates covers the last 30 days, not all time; the filters block in each response shows the window you actually ran.
Can I use this with an AI model or MCP agent?
Yes. Every response is structured JSON you can store, embed, or hand to an LLM, and all eight endpoints are exposed through FetchLayer’s MCP server — so an agent can pull a competitor’s live ads, read the hooks and CTAs, and fetch the video files without any wrapper code.
How does billing work?
One API request equals one credit, the same as every other FetchLayer platform — no multipliers. Each page walked counts as one request, so pages: 10 bills as ten. Parsing an ad library URL with /resolve-url is free and consumes nothing; streaming media bytes bills as a normal request. TikTok Ad Library is in Beta while coverage expands, at standard pricing.
Start pulling TikTok Ad Library data today.
Get a free API key, make your first request, and put public feedback to work in your own product or research workflow.
Used by developers at
Individual developers or teams — not official partnerships