# TikTok Ads Library Scraper (`piotrv1001/tiktok-ads-library-scraper`) Actor

Scrape the TikTok Ads Library (EU ad transparency): search TikTok ads by keyword or advertiser in any EU/EEA country, the UK or Switzerland. Get ad videos, ad text, dates and reach, plus landing pages and targeting. Export TikTok ad examples to JSON, CSV or Excel.

- **URL**: https://apify.com/piotrv1001/tiktok-ads-library-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 ads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🚀 TikTok Ads Library Scraper

The **TikTok Ads Library Scraper** searches the TikTok Ad Library (TikTok's ad transparency library for Europe) and turns every ad into a clean row: advertiser, ad text, first and last shown dates, unique reach, ad video and image links and the cover image. Turn on details to also get the landing page URL, call to action, campaign objective, the advertiser's country and TikTok account, who paid for the ad and the full audience targeting (age, gender, countries, interests, audience size, impressions by country). Search by keyword or by advertiser in any EU/EEA country, the UK, Switzerland or Turkey, and export TikTok ad examples to JSON, CSV or Excel. It works like a TikTok Ad Library API, with no account and no key.

### 🎯 Use Cases

- **TikTok ads spy and competitor research**: list every ad a competitor ran on TikTok in Europe, with dates, reach and the landing pages they send traffic to.
- **TikTok ad examples and inspiration**: pull hundreds of ads for a product or niche ("skincare", "running shoes") with their video links, ready for a swipe file.
- **TikTok ads download**: every video ad comes with a direct video link and a cover image, so you can download TikTok ads in bulk.
- **TikTok ads targeting research**: see which ages, genders, countries and interests an advertiser targets and how big the audience is.
- **TikTok ads transparency and compliance**: monitor ads that mention your brand, track who pays for them, and check which ads were removed.
- **Ad intelligence datasets**: feed ad copy, objectives, categories and reach into dashboards, AI models or market research.

### ✨ Features

- **Keyword or advertiser search**: words in the ad text (use "double quotes" for an exact phrase), or an advertiser name or link from the library.
- **33 regions**: all EU/EEA countries, the United Kingdom, Switzerland and Turkey, one at a time or all together.
- **Date range and status**: ads shown between two dates (absolute or "30 days" ago), all, active or inactive ads.
- **Ad data**: ad ID and link, advertiser, ad text, format (video or image), first and last shown dates, unique reach range, video links, cover and image links, and whether the ad was removed.
- **Ad details (optional)**: landing page URL, call to action, objective, ad category, advertiser country, who paid, the advertiser's TikTok account (username, followers, account type) and targeting with impressions by country, age and gender.
- **Deep searches**: when a search has more ads than the library lists at once, the scraper splits the date range and keeps going, newest ads first.
- **Fair billing**: each ad is saved and charged once per run, even when the library repeats it across pages. Details are charged only when they loaded.

### 🛠️ How It Works

1. **Enter a keyword or an advertiser** and pick a region and dates.
2. **Run the scraper**: each ad becomes one row, newest first. Turn on **Include ad details** for landing pages and targeting.
3. **Download or connect**: export JSON, CSV or Excel, or pull the dataset through the Apify API.

### ⚙️ Input

| Field                  | What it does                                                                                                   |
| ---------------------- | -------------------------------------------------------------------------------------------------------------- |
| **Keyword**            | Words in the ad text, e.g. a brand or product. Put a phrase in double quotes for an exact match.               |
| **Advertiser**         | Advertiser name as the library lists it (e.g. `Zalando SE`) or an advertiser link from the library. Use instead of a keyword. |
| **Advertiser ID**      | Optional business ID to pick one advertiser when several share a name.                                         |
| **Region**             | Country where the ads were shown, or all regions. Default France.                                              |
| **Shown from / until** | Date range (YYYY-MM-DD or relative like "90 days"). Default: the last 30 days.                                 |
| **Ad status**          | All, active or inactive ads. Default all.                                                                      |
| **Include ad details** | Landing page, advertiser profile and targeting for each ad. Billed as an extra event.                          |
| **Max ads**            | Stop after this many ads. Default 50.                                                                          |

```json
{
    "advertiserName": "Zalando SE",
    "region": "DE",
    "startDate": "90 days",
    "includeDetails": true,
    "maxItems": 500
}
```

### 💰 Pricing

You pay only for the ads you get. There is no monthly rental.

| Event           | Price                                | What you get                                                                 |
| --------------- | ------------------------------------ | ---------------------------------------------------------------------------- |
| **Ad**          | $0.0008 per ad ($0.80 per 1,000)     | One ad with advertiser, ad text, dates, reach and video or image links       |
| **Ad details**  | $0.0015 per ad ($1.50 per 1,000)     | Landing page, advertiser profile and targeting, only with **Include ad details** and only when they loaded |
| **Actor start** | $0.00005 per run                     | Charged once when the run starts.                                            |

Examples: 1,000 ads = $0.80 · 1,000 ads with details = $2.30 · 10,000 ads = $8.00.

### 📊 Sample Output Data

```json
{
    "adId": "1879738212322914",
    "adUrl": "https://library.tiktok.com/ads/detail/?ad_id=1879738212322914",
    "advertiserName": "Snipes SE",
    "advertiserId": "6876496928549372673",
    "adText": "Jetzt adidas auf SNIPES entdecken.",
    "format": "video",
    "firstShownDate": "2026-10-22",
    "lastShownDate": "2026-10-22",
    "uniqueReach": "0-1K",
    "impressions": null,
    "spend": null,
    "videoUrls": ["https://library.tiktok.com/…"],
    "coverImageUrl": "https://p16-common-sign.tiktokcdn.com/tos-useast2a-p-0037-euttp/…",
    "imageUrls": [],
    "removed": false,
    "region": "DE",
    "searchKeyword": "adidas",
    "searchAdvertiser": null,
    "detailsScraped": true,
    "advertiserCountry": "Germany",
    "paidBy": "Snipes SE",
    "advertiserTikTok": {
        "username": "snipes",
        "displayName": "snipes",
        "followers": "802.1K",
        "accountType": "BLUEV_BA",
        "avatarUrl": "https://p16-common-sign.tiktokcdn-eu.com/…",
        "profileUrl": "https://www.tiktok.com/share/user/6678356281658885126?source=ad_review"
    },
    "landingPageUrl": "https://www.snipes.com/de-de/b/damen/adidas-825",
    "callToAction": "View now",
    "objective": "Sales",
    "category": "Apparel & Accessories",
    "targeting": {
        "audienceSize": "16.4M-20.0M",
        "countries": ["DE"],
        "regionsCount": 1,
        "totalImpressions": "0-1K",
        "ages": { "DE": ["13-17", "18-24", "25-34", "35-44", "45-54", "55+"] },
        "genders": { "DE": ["female"] },
        "cities": [],
        "provinces": [],
        "languages": [],
        "interests": null,
        "videoInteractions": null,
        "creatorInteractions": null,
        "deviceModels": [],
        "operatingSystems": ["ALL"],
        "customAudience": true,
        "excludedAudience": true,
        "highSpendingPower": false
    },
    "impressionsByRegion": [
        {
            "region": "DE",
            "impressions": "0-1K",
            "breakdown": [{ "age": "18-24", "gender": "FEMALE", "impressions": "0-1K" }]
        }
    ],
    "scrapedAt": "2026-10-26T15:29:01.592Z"
}
```

Reach and impressions are ranges, as the library publishes them. `advertiserId` is filled for advertiser searches and for every ad with details. Without details, the details fields are not in the row and `detailsScraped` is `false`. Video and image links are signed by TikTok and expire after a few hours, so download them soon after the run.

### 📅 Schedule and Integrate

To track a competitor's TikTok ads, save the advertiser search as a Task and run it daily or weekly with Apify **Schedules**, with **Shown from** set to "7 days". Send new ads to Google Sheets, Slack, Zapier, Make, n8n or your own system through webhooks and the Apify API.

### 🤖 Use with AI Agents (MCP)

The TikTok Ads Library Scraper works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (`https://mcp.apify.com`). An agent can call it with:

```json
{ "keyword": "protein powder", "region": "GB", "maxItems": 20 }
```

### ❓ FAQ

**What is the TikTok Ad Library?** It is TikTok's public ad repository, also called the TikTok commercial content library or ad transparency library. Under the EU Digital Services Act, TikTok publishes the ads shown in Europe with their advertiser, dates, reach and targeting. This scraper searches it for you and returns the results as data.

**Does it include US ads?** No. The library covers ads shown in the EU/EEA, the United Kingdom, Switzerland and Turkey only, so ads that ran only in the US or elsewhere are not in it.

**Is there a TikTok Ad Library API?** TikTok offers a commercial content API to approved researchers only. This scraper works without an application or a key: enter a keyword or an advertiser and run.

**How do I see a competitor's ads on TikTok?** Enter the competitor in **Advertiser** as the library lists it (e.g. `Zalando SE`), or paste the advertiser link from the library. If the name is not exact, the run tells you the similar advertiser names it found.

**How do I download TikTok ads?** Every video ad has its video link in `videoUrls` and a cover image in `coverImageUrl`. Download them right after the run, because the links expire after a few hours.

**How many ads can I get?** As many as the search has. The library lists a few hundred ads per search at a time, so for bigger searches the scraper splits the date range into smaller parts and continues. Raise **Max ads** to get more.

**Why do some ads have no video or image?** Some ads, like catalog ads, show products the library does not publish. They come with the ad text and dates and `format: "image"`.

**Is the TikTok Creative Center the same thing?** No. The Creative Center shows a selection of top ads for inspiration. The Ad Library lists all ads shown in Europe, with advertiser and targeting data.

### 🔗 Related Scrapers

- [Facebook Ads Library Scraper](https://apify.com/piotrv1001/facebook-ads-library-scraper): ads from the Meta Ad Library by keyword or page.
- [TikTok Video Scraper](https://apify.com/piotrv1001/tiktok-video-scraper): stats, caption, music and author for any TikTok video link.
- [TikTok Profile Videos Scraper](https://apify.com/piotrv1001/tiktok-profile-videos-scraper): every public video of a TikTok profile, newest first.

# Actor input Schema

## `keyword` (type: `string`):

Words in the ad text, e.g. a brand or product. Put the phrase in double quotes for an exact match ("running shoes"). Leave empty when you search by advertiser.

## `advertiserName` (type: `string`):

Advertiser name as the TikTok Ad Library lists it (e.g. Zalando SE), or an advertiser link copied from the library. Gets every ad of that advertiser. Use instead of a keyword.

## `advertiserId` (type: `string`):

Optional: the advertiser's business ID from the library, to pick one advertiser when several share a name. Use together with the advertiser name.

## `region` (type: `string`):

Country where the ads were shown. The library covers the EU/EEA, the UK, Switzerland and Turkey (no US ads).

## `startDate` (type: `string`):

Ads shown on or after this date (YYYY-MM-DD) or a relative date like "30 days". Default: 30 days ago.

## `endDate` (type: `string`):

Ads shown on or before this date. Default: today.

## `adStatus` (type: `string`):

All ads, only ads still running, or only ads that stopped.

## `includeDetails` (type: `boolean`):

Also get the landing page URL, call to action, objective, advertiser profile (country, TikTok account, who paid) and targeting (age, gender, countries, interests, audience size, impressions by country). Billed per ad as an extra event.

## `maxItems` (type: `integer`):

Stop after this many ads.

## Actor input object example

```json
{
  "keyword": "nike",
  "advertiserName": "Zalando SE",
  "region": "FR",
  "adStatus": "all",
  "includeDetails": false,
  "maxItems": 50
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keyword": "nike",
    "region": "FR",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/tiktok-ads-library-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keyword": "nike",
    "region": "FR",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/tiktok-ads-library-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keyword": "nike",
  "region": "FR",
  "maxItems": 50
}' |
apify call piotrv1001/tiktok-ads-library-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/tiktok-ads-library-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UDhvCedwBMfun2flW/builds/e8ngyhStBaAKZh1mV/openapi.json
