TikTok Ad Library API — Ads and Video as JSON | FetchLayer
Unofficial Third-party API
8 endpoints live

Every ad running on TikTok.
Video files included.

Ad copy & hooks Downloadable video Regional reach & targeting AI-ready JSON

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.

Free tier included No credit card No scraper maintenance

Trusted by developers shipping real products.

494,175 served today

POST /tiktok-ad-library/search-ads
200 OK

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..."
}

Used by developers at

Individual developers or teams — not official partnerships

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.

FetchLayer Research Chat

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
Research ads in Chat

No code or setup required · Uses your FetchLayer credits

TikTok Ad Library research

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.

Y

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

CSV

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.

  1. 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.

  2. 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.

  3. 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

Live

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.

1
Pick your editor
2
Agent discovers 8+ tools
3
Query any platform instantly
connect your agent ~30s

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 key

Free tier · no credit card · any MCP host

New chat fetchlayer connected

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.

Used fetchlayer.tiktok_ad_library_advertiser_ads

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.

Ask a follow-up…

Works with every MCP-compatible tool

Cursor
Claude
VS Code
Windsurf
Cline
Hermes
OpenClaw
Kiro
No wrapper code
All 8 endpoints exposed as tools
Official & maintained
Free to install

Use cases

What teams build with TikTok ad data.

Same API, endless applications. Here is what teams ship with public TikTok ad creative.

01

Competitor creative tracking

Search by keyword or advertiser to see every TikTok ad a brand runs — hooks, CTAs, formats and landing pages.

competitorsadsresearch
02

AI agent context

Hand Claude, Codex, or your MCP agent structured hooks, CTAs and objectives instead of a folder of screen recordings.

llmagentsmcp
03

Ad fatigue & rotation

Poll an advertiser on a schedule to see which videos get killed, which keep running, and what replaces them.

alertsmonitoringcron
04

Creative brief research

Read the hook, the button copy, the landing page and the objective together — what a creative brief actually needs.

hooksbriefscreative
05

Video swipe files

Download the actual video creative behind winning ads. TikTok’s own links expire within hours; these do not.

creativevideoswipe
06

Reach & targeting research

Read European impressions by region, age and gender, plus the audience brackets the advertiser chose to buy.

reachtargetingeu

Compare approaches

Spend time on the insight, not the collection layer.

What you needFetchLayerOfficial APIBuild it yourself
Search public ads with one API keyApproved access requiredYou build it
Downloadable video & image assetsYour integrationYou extract them
Links that do not expire in hoursSigned, short-lived URLsYou re-fetch them
Reach & targeting where publishedYou parse it
Ready for AI and MCP workflowsYour integrationYour 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.

Try free

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
Get API key

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.