TikTok Ad Library API — Getting Started — FetchLayer Docs
Documentation menu
FetchLayer FetchLayer API

Getting Started

Search the TikTok Ad Library in two steps, then follow an ad through to its video file.

1. Get your API key

Create an account and generate a FetchLayer API key from your dashboard. No TikTok developer account, app review, or access token is involved.

Create free account →

2. Search for ads

bash
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","adStatus":"active","limit":30}'

The date window defaults to 30 days

Leave shownFrom and shownTo out and the search covers the last 30 days, not all time. Set both explicitly for anything historical, and check filters in the response to see the window you actually ran.

3. Find one advertiser, then pull their rotation

Listings here are scoped by registered business name, not by TikTok handle, and one brand can be registered as several legal entities. Resolve the name first, then pass it back.

bash
curl -X POST https://api.fetchlayer.dev/tiktok-ad-library/search-advertisers \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"Acme Beauty","limit":10}'

curl -X POST https://api.fetchlayer.dev/tiktok-ad-library/advertiser-ads \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"advertiser":"Acme Beauty GmbH","country":"DE","adStatus":"all","pages":3}'

4. Follow an ad to its video

Every ad carries an adId. Pass it to /ad-media to resolve the video, cover frame and images, then stream the bytes from /media.

bash
curl -X POST https://api.fetchlayer.dev/tiktok-ad-library/ad-media \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"ad":"1794523310028321","kinds":["video","thumbnail"],"probe":true}'

Tip

TikTok's own media URLs are signed and expire within hours. Each asset also carries a downloadUrl served through GET /media, which does not — use that one if you are storing the link rather than the bytes. It supports HTTP Range, so a video seeks in a player.

5. Read the notes

Every response carries a notes array. It reports what this result could not do — a page walk that stopped before pagesRequested, an upstream cap, a filter the library declined to honour. A thin result set with an empty notes really is thin; a thin one with notes is truncated. Compare pagesScraped with pagesRequested, and adCount with totalMatches, before you conclude a brand is quiet.

Next steps