TikTok DSA Ads Transparency Library Scraper
Search TikTok's EU/EEA ad transparency database by keyword, advertiser or ad ID. Get creative media, advertiser identity, impression buckets, audit status and per-region/age/gender targeting.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | `library` = TikTok DSA Commercial Content Library (EU/EEA/UK/CH/TR). `creativeCenter` = global Top Ads inspiration feed. `both` = run both and label every row with `source`. |
keyword | string | optional | Search ads by keyword or advertiser name. Leave empty to browse recent ads in the selected region. (mode=library) |
advertiserName | string | optional | Exact advertiser name as shown in the library, e.g. `NIKE Retail B.V.`. If the exact search finds nothing, the actor retries it as a keyword. (mode=library) |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | `library` = TikTok DSA Commercial Content Library (EU/EEA/UK/CH/TR). `creativeCenter` = global Top Ads inspiration feed. `both` = run both and label every row with `source`. |
keyword | string | optional | Search ads by keyword or advertiser name. Leave empty to browse recent ads in the selected region. (mode=library) |
advertiserName | string | optional | Exact advertiser name as shown in the library, e.g. `NIKE Retail B.V.`. If the exact search finds nothing, the actor retries it as a keyword. (mode=library) |
advertiserId | string | optional | Optional TikTok business ID (`adv_biz_ids`) to disambiguate an advertiser search. Use it with the exact advertiser name. (mode=library) |
adIds | array | optional | Direct list of TikTok ad IDs. Skips search and opens each ad's detail page. (mode=library) |
startUrls | array | optional | Paste TikTok library search or ad-detail URLs. Search URLs carry their own region, keyword/advertiser, dates and filters; detail URLs are read as ad IDs. (mode=library) |
region | string | optional | TikTok DSA library covers EU/EEA countries plus the UK, Switzerland and Turkey. `all` searches the union (capped by TikTok), so split regions for deeper runs. (mode=library) |
startDate | string | optional | Earliest last-shown date (`YYYY-MM-DD`). Default: one year ago. (mode=library) |
endDate | string | optional | Latest last-shown date (`YYYY-MM-DD`). Default: today. (mode=library) |
sortBy | string | optional | Result order. (mode=library) |
adType | string | optional | Filter by creative type. (mode=library) |
adStatus | string | optional | Active ads are still being shown; inactive ads have stopped. (mode=library) |
age | array | optional | Only ads targeted at any of these age groups: `13-17`, `18-24`, `25-34`, `35-44`, `45-54`, `55+`. Leave empty for all ages. (mode=library) |
gender | string | optional | Only ads targeted at this gender. (mode=library) |
uniqueReach | string | optional | Filter by TikTok's unique-users-seen band. (mode=library) |
exactPhrase | boolean | optional | Treat the keyword as an exact phrase instead of individual words. (mode=library) |
includeDetails | boolean | optional | Open each ad's detail page for caption, CTA, landing page, advertiser identity and age/gender reach breakdown. Slower; recommended for smaller runs. (mode=library) |
countOnly | boolean | optional | Return one summary row with the number of matching ads instead of collecting ads. (mode=library) |
maxItems | integer | optional | Maximum records to collect per source (1–5,000). TikTok caps a single library search at about 5,000 results. |
ccCountry | string | optional | Creative Center market. (mode=creativeCenter or both) |
ccPeriod | string | optional | Performance window for Creative Center. (mode=creativeCenter or both) |
ccOrderBy | string | optional | How Creative Center ranks ads. (mode=creativeCenter or both) |
ccObjective | string | optional | Campaign objective filter. (mode=creativeCenter or both) |
ccIndustry | string | optional | Creative Center industry filter. 258 industries are available; leave `all` to sweep without an industry. (mode=creativeCenter or both) |
ccLanguage | string | optional | Ad language filter. (mode=creativeCenter or both) |
ccSweep | boolean | optional | Anonymous visitors see only 20 ads per filter combination. Sweeping periods, rankings, objectives and formats collects many more unique ads. (mode=creativeCenter or both) |
ccIncludeDetails | boolean | optional | Fetch each ad's landing page, comment and share counts. (mode=creativeCenter or both) |
Download the published input schema
View complete JSON
{
"description": "Search the TikTok DSA ad library in 33 European markets and/or the global Creative Center Top Ads. No login, cookies or proxy setup needed.",
"properties": {
"adIds": {
"default": [],
"description": "Direct list of TikTok ad IDs. Skips search and opens each ad's detail page. (mode=library)",
"editor": "stringList",
"prefill": [],
"title": "Ad IDs",
"type": "array"
},
"adStatus": {
"default": "active",
"description": "Active ads are still being shown; inactive ads have stopped. (mode=library)",
"editor": "select",
"enum": [
"all",
"active",
"inactive"
],
"enumTitles": [
"All statuses",
"Active",
"Inactive"
],
"prefill": "active",
"title": "Ad status",
"type": "string"
},
"adType": {
"default": "all",
"description": "Filter by creative type. (mode=library)",
"editor": "select",
"enum": [
"all",
"video",
"image",
"text"
],
"enumTitles": [
"All ad types",
"Video",
"Image",
"Text"
],
"prefill": "all",
"title": "Ad type",
"type": "string"
},
"advertiserId": {
"description": "Optional TikTok business ID (`adv_biz_ids`) to disambiguate an advertiser search. Use it with the exact advertiser name. (mode=library)",
"editor": "textfield",
"title": "Advertiser business ID",
"type": "string"
},
"advertiserName": {
"description": "Exact advertiser name as shown in the library, e.g. `NIKE Retail B.V.`. If the exact search finds nothing, the actor retries it as a keyword. (mode=library)",
"editor": "textfield",
"title": "Exact advertiser name",
"type": "string"
},
"age": {
"default": [],
"description": "Only ads targeted at any of these age groups: `13-17`, `18-24`, `25-34`, `35-44`, `45-54`, `55+`. Leave empty for all ages. (mode=library)",
"editor": "stringList",
"prefill": [],
"title": "Audience age",
"type": "array"
},
"ccCountry": {
"default": "US",
"description": "Creative Center market. (mode=creativeCenter or both)",
"editor": "select",
"enum": [
"AR",
"AU",
"BR",
"CA",
"CO",
"FR",
"DE",
"ID",
"IT",
"JP",
"MY",
"MX",
"NL",
"PK",
"PH",
"RO",
"SA",
"SG",
"ZA",
"KR",
"ES",
"SE",
"TH",
"TR",
"AE",
"GB",
"US",
"VN"
],
"enumTitles": [
"Argentina",
"Australia",
"Brazil",
"Canada",
"Colombia",
"France",
"Germany",
"Indonesia",
"Italy",
"Japan",
"Malaysia",
"Mexico",
"Netherlands",
"Pakistan",
"Philippines",
"Romania",
"Saudi Arabia",
"Singapore",
"South Africa",
"South Korea",
"Spain",
"Sweden",
"Thailand",
"Turkey",
"United Arab Emirates",
"United Kingdom",
"United States",
"Vietnam"
],
"prefill": "US",
"title": "Top Ads country",
"type": "string"
},
"ccIncludeDetails": {
"default": true,
"description": "Fetch each ad's landing page, comment and share counts. (mode=creativeCenter or both)",
"prefill": false,
"title": "Fetch Top Ads details",
"type": "boolean"
},
"ccIndustry": {
"default": "all",
"description": "Creative Center industry filter. 258 industries are available; leave `all` to sweep without an industry. (mode=creativeCenter or both)",
"editor": "select",
"enum": [
"all",
"label_11105000000",
"label_18110000000",
"label_25300000000",
"label_22000000000",
"label_24118000000",
"label_23113000000",
"label_23124000000",
"label_20112000000",
"label_24112000000",
"label_18101000000",
"label_19105000000",
"label_14105000000",
"label_20104000000",
"label_27104000000",
"label_25302000000",
"label_12104000000",
"label_15101000000",
"label_24113000000",
"label_18107000000",
"label_23130000000",
"label_26000000000",
"label_15000000000",
"label_17106000000",
"label_19100000000",
"label_23102000000",
"label_25303000000",
"label_19102000000",
"label_23127000000",
"label_13111000000",
"label_14101000000",
"label_24100000000",
"label_26107000000",
"label_23128000000",
"label_20109000000",
"label_24103000000",
"label_20101000000",
"label_13110000000",
"label_25308000000",
"label_21999000000",
"label_22109000000",
"label_20999000000",
"label_27101000000",
"label_28101000000",
"label_13108000000",
"label_23107000000",
"label_11999000000",
"label_23133000000",
"label_21104000000",
"label_11107000000",
"label_16102000000",
"label_15106000000",
"label_24119000000",
"label_18100000000",
"label_13101000000",
"label_11110000000",
"label_22112000000",
"label_24117000000",
"label_26100000000",
"label_28000000000",
"label_23112000000",
"label_10000000000",
"label_10100000000",
"label_12101000000",
"label_23100000000",
"label_25304000000",
"label_23132000000",
"label_30000000000",
"label_11109000000",
"label_14100000000",
"label_18000000000",
"label_11104000000",
"label_11106000000",
"label_23122000000",
"label_10104000000",
"label_12109000000",
"label_20108000000",
"label_26113000000",
"label_15107000000",
"label_16105000000",
"label_21102000000",
"label_26109000000",
"label_23125000000",
"label_27000000000",
"label_19101000000",
"label_24110000000",
"label_30102000000",
"label_25311000000",
"label_11100000000",
"label_17103000000",
"label_17105000000",
"label_22101000000",
"label_23117000000",
"label_10101000000",
"label_20100000000",
"label_13114000000",
"label_23000000000",
"label_29999000000",
"label_10105000000",
"label_13100000000",
"label_20000000000",
"label_24102000000",
"label_10106000000",
"label_16100000000",
"label_24101000000",
"label_23103000000",
"label_12106000000",
"label_25310000000",
"label_16000000000",
"label_23126000000",
"label_26101000000",
"label_14999000000",
"label_15105000000",
"label_20102000000",
"label_23110000000",
"label_26102000000",
"label_10999000000",
"label_15100000000",
"label_23116000000",
"label_23118000000",
"label_24109000000",
"label_25313000000",
"label_23123000000",
"label_13999000000",
"label_25312000000",
"label_24116000000",
"label_26104000000",
"label_25305000000",
"label_17000000000",
"label_26105000000",
"label_14106000000",
"label_11101000000",
"label_19000000000",
"label_25999000000",
"label_25306000000",
"label_27103000000",
"label_12108000000",
"label_13113000000",
"label_25000000000",
"label_13117000000",
"label_22107000000",
"label_26114000000",
"label_23101000000",
"label_16999000000",
"label_20106000000",
"label_14104000000",
"label_21100000000",
"label_11112000000",
"label_21103000000",
"label_11102000000",
"label_23114000000",
"label_12107000000",
"label_30101000000",
"label_23134000000",
"label_26106000000",
"label_11111000000",
"label_18106000000",
"label_25309000000",
"label_18111000000",
"label_13104000000",
"label_13109000000",
"label_22106000000",
"label_18112000000",
"label_20107000000",
"label_10103000000",
"label_29101000000",
"label_15102000000",
"label_13102000000",
"label_21105000000",
"label_23131000000",
"label_24114000000",
"label_11000000000",
"label_21101000000",
"label_23108000000",
"label_26108000000",
"label_19104000000",
"label_11108000000",
"label_14102000000",
"label_18104000000",
"label_28100000000",
"label_23115000000",
"label_12103000000",
"label_13116000000",
"label_16104000000",
"label_25301000000",
"label_24108000000",
"label_24120000000",
"label_22111000000",
"label_13103000000",
"label_18108000000",
"label_23105000000",
"label_26103000000",
"label_12999000000",
"label_22113000000",
"label_27999000000",
"label_24999000000",
"label_13112000000",
"label_29102000000",
"label_19106000000",
"label_24104000000",
"label_24107000000",
"label_23104000000",
"label_14107000000",
"label_23119000000",
"label_27102000000",
"label_12102000000",
"label_20103000000",
"label_20111000000",
"label_16101000000",
"label_13000000000",
"label_22102000000",
"label_26111000000",
"label_26999000000",
"label_12000000000",
"label_20110000000",
"label_13107000000",
"label_23109000000",
"label_19103000000",
"label_18102000000",
"label_24106000000",
"label_27100000000",
"label_12105000000",
"label_23111000000",
"label_23106000000",
"label_24000000000",
"label_18103000000",
"label_18109000000",
"label_19999000000",
"label_15104000000",
"label_18999000000",
"label_26112000000",
"label_13105000000",
"label_13115000000",
"label_18105000000",
"label_22105000000",
"label_22108000000",
"label_11103000000",
"label_24115000000",
"label_29103000000",
"label_12100000000",
"label_17999000000",
"label_14000000000",
"label_21000000000",
"label_22999000000",
"label_15999000000",
"label_23129000000",
"label_24111000000",
"label_20105000000",
"label_25307000000",
"label_23999000000",
"label_24105000000",
"label_12110000000",
"label_10102000000",
"label_15103000000",
"label_30100000000",
"label_14103000000",
"label_29000000000",
"label_29100000000",
"label_22110000000"
],
"enumTitles": [
"All industries",
"Used Cars",
"Cleaning Supplies",
"Hyper-Casual",
"Apparel & Accessories",
"Auction Services",
"Anime",
"Food & Cooking",
"Utilities",
"Marketing & Advertising",
"Daily Essentials",
"Pet Toys",
"Aesthetic Medicine",
"Education",
"Cooking & Recipes",
"Casino",
"Baby Bedding",
"Computers",
"Professional Consultation",
"Tissues & Wet Wipes",
"Real Estate Information",
"Life Services",
"Tech & Electronics",
"Travel Agencies & Services",
"Petfood",
"Business & Economy",
"Match",
"Pet Household Products",
"General Information",
"Loan Services",
"Haircare",
"Real Estate & Home Rentals",
"Used Good Sales Platforms",
"E-commerce Information",
"Health & Fitness",
"Constructional Engineering",
"Audio & Video Players",
"Investment Advisory",
"Simulation",
"Other Home Improvement",
"Men's Shoes",
"Other Apps",
"Food & Fresh Produce",
"Sports & Equipment",
"Credit Bureaus",
"Environmental Protection",
"Other Vehicle & Transportation",
"Tourist Information",
"Home Decor",
"Bicycles",
"Large Appliances",
"Network Products",
"Investment Planning & Management",
"Storage Products",
"Securities",
"Airplanes",
"Traditional & Ceremonial Clothing",
"Legal Services",
"Wedding Photography",
"Sports & Outdoor",
"TV Drama & Series",
"Education",
"Early Childhood & Preschool Education",
"Strollers & Cribs",
"Military",
"Puzzle",
"Streaming Site",
"E-Commerce (Non-app)",
"Water Vehicles",
"Oral Care",
"Household Products",
"Car Rentals",
"Motorcycles",
"Beauty & Personal Care",
"Vocational Training",
"Children's Apparel",
"Travel",
"Exercise & Fitness",
"Office Equipment",
"Digital Devices",
"Construction Materials & Lighting",
"Utilities Payments",
"Games & Utility Software",
"Food & Beverage",
"Pet Healthcare",
"Safety & Security",
"Large E-commerce Platforms",
"Party",
"Automobiles",
"Hotels & Accommodation",
"Tours & Attractions",
"Clothing Accessories",
"TV Variety Shows",
"Primary & Secondary Education & K-12",
"Social",
"Third-Party Payments",
"News & Entertainment",
"Other Health",
"Language Training",
"Commercial Banks",
"Apps",
"Recruitment & Job Searching",
"Non-academic Training (Hobbies)",
"Personal Care Appliances",
"Office Equipment & Supplies",
"Science & Technology",
"Toys for Kids",
"Strategy",
"Appliances",
"Car Information",
"Photography",
"Other Beauty & Personal Care",
"Computer Accessories",
"News & Reading",
"Live Events",
"Dating & Matchmaking Services",
"Other Education",
"Cell Phones",
"Culture & Art",
"Reading",
"Energy Conservation & Environmental Protection",
"Kids",
"Sports & Fitness",
"Other Financial Services",
"Tabletop",
"IT Services",
"Gifts & Flowers",
"Racing",
"Travel",
"Housekeeping",
"Fragrances & Perfumes",
"Auto Accessories",
"Pets",
"Other",
"RPG",
"Alcoholic Beverages",
"Baby Feeding Supplies",
"Precious Metals",
"Games",
"Credit Cards",
"High-end Jewelry",
"Beauty & Personal Care",
"Politics",
"Other Appliances",
"Financial Services",
"Cosmetics",
"Interior Design & Decorating Services",
"Car Dealerships",
"Hardware & Electrical",
"Auto Services",
"Astrology",
"Child Car Seats",
"Small & Medium-sized E-commerce Platforms",
"Social Media Account Promotion",
"Shopping Services",
"Accessories for 2/3-Wheeled Vehicles",
"Cleaning Appliances",
"Sports",
"Toys",
"Guarantees",
"Microfinance Companies",
"Ordinary Jewelry",
"Pest Control",
"Life & Leisure",
"Overseas Education",
"Medical Information",
"Computers Components",
"Insurance",
"Power Strips & Socket",
"Relationship Information",
"Exhibition Services",
"Vehicle & Transportation",
"Furniture",
"Celebrities & Gossip",
"Gardening",
"Pet Treats",
"Electric Scooters",
"Wig & Hair Styling",
"Coffee Accessories",
"Outdoor Equipment",
"Humor",
"Diapers & Baby Wipes",
"Cryptocurrencies",
"Home Appliances",
"Action",
"Agriculture, Forestry, Animal Husbandry & Fishing",
"Individual Entrepreneurship",
"Women's Shoes",
"Trusts",
"Laundry",
"Charity & Public Welfare",
"Wedding Celebrations",
"Other Baby, Kids & Maternity",
"Wearable Tech Devices",
"Other Food & Beverage",
"Other Business Services",
"Foreign Exchange Transactions",
"Dietary Supplements",
"Pet Travel Accessories",
"Electronics & Electrical",
"Franchising",
"Culture & History",
"Feminine Care",
"Movies",
"Non-alcoholic Beverages",
"Baby Formula",
"Photography",
"Parenting",
"Kitchen & Bathroom Appliances",
"Financial Services",
"Bags",
"Internet Services",
"Other Life Services",
"Baby, Kids & Maternity",
"Business & Productivity",
"Funds",
"Lifestyle News",
"Pet Grooming",
"Glasses & Drinkware",
"Machinery & Equipment",
"Cuisine",
"Baby Shoes",
"Collectables & Antiques",
"Law",
"Business Services",
"Tea Sets",
"Leather Care",
"Other Pets",
"Gaming Devices",
"Other Household Products",
"Consumer Services",
"Pawn Shops",
"Crowd Funding",
"Kitchen Accessories",
"Watches",
"Men's Clothing",
"Auto Parts",
"Service Outsourcing",
"Medicine",
"Baby Food",
"Other Travel",
"Beauty & Personal Care",
"Home Improvement",
"Other Apparel & Accessories",
"Other Tech & Electronics",
"Pet Information",
"Logistics",
"Online Shopping",
"Shooting",
"Other News & Entertainment",
"Chemical Materials",
"Baby Hygiene Products",
"Higher Education",
"Computer Repair",
"Big Box Retailers",
"Skincare",
"Health",
"Medical Services",
"Women's Clothing"
],
"prefill": "all",
"title": "Top Ads industry",
"type": "string"
},
"ccLanguage": {
"default": "all",
"description": "Ad language filter. (mode=creativeCenter or both)",
"editor": "select",
"enum": [
"all",
"en",
"es",
"ar",
"vi",
"th",
"de",
"id",
"pt",
"fr",
"ms",
"nl",
"ja",
"it",
"ro",
"zh-Hant",
"ko"
],
"enumTitles": [
"All languages",
"English",
"Spanish",
"Arabic",
"Vietnamese",
"Thai",
"German",
"Indonesian",
"Portuguese",
"French",
"Malay",
"Dutch",
"Japanese",
"Italian",
"Romanian",
"Chinese (Traditional)",
"Korean"
],
"prefill": "all",
"title": "Top Ads language",
"type": "string"
},
"ccObjective": {
"default": "all",
"description": "Campaign objective filter. (mode=creativeCenter or both)",
"editor": "select",
"enum": [
"all",
"1",
"2",
"3",
"4",
"5",
"8",
"15",
"16"
],
"enumTitles": [
"All objectives",
"Traffic",
"App Installs",
"Conversions",
"Video Views",
"Reach",
"Lead Generation",
"Product sales",
"App Promotion"
],
"prefill": "all",
"title": "Top Ads objective",
"type": "string"
},
"ccOrderBy": {
"default": "for_you",
"description": "How Creative Center ranks ads. (mode=creativeCenter or both)",
"editor": "select",
"enum": [
"for_you",
"ctr",
"like"
],
"enumTitles": [
"For You",
"Click-through rate",
"Likes"
],
"prefill": "for_you",
"title": "Top Ads ranking",
"type": "string"
},
"ccPeriod": {
"default": "30",
"description": "Performance window for Creative Center. (mode=creativeCenter or both)",
"editor": "select",
"enum": [
"7",
"30",
"180"
],
"enumTitles": [
"Last 7 days",
"Last 30 days",
"Last 180 days"
],
"prefill": "30",
"title": "Top Ads period",
"type": "string"
},
"ccSweep": {
"default": true,
"description": "Anonymous visitors see only 20 ads per filter combination. Sweeping periods, rankings, objectives and formats collects many more unique ads. (mode=creativeCenter or both)",
"prefill": false,
"title": "Sweep Top Ads filters",
"type": "boolean"
},
"countOnly": {
"default": false,
"description": "Return one summary row with the number of matching ads instead of collecting ads. (mode=library)",
"prefill": false,
"title": "Count only",
"type": "boolean"
},
"endDate": {
"description": "Latest last-shown date (`YYYY-MM-DD`). Default: today. (mode=library)",
"editor": "textfield",
"title": "Last shown to",
"type": "string"
},
"exactPhrase": {
"default": false,
"description": "Treat the keyword as an exact phrase instead of individual words. (mode=library)",
"prefill": false,
"title": "Exact phrase",
"type": "boolean"
},
"gender": {
"default": "all",
"description": "Only ads targeted at this gender. (mode=library)",
"editor": "select",
"enum": [
"all",
"female",
"male"
],
"enumTitles": [
"All genders",
"Female",
"Male"
],
"prefill": "all",
"title": "Audience gender",
"type": "string"
},
"includeDetails": {
"default": true,
"description": "Open each ad's detail page for caption, CTA, landing page, advertiser identity and age/gender reach breakdown. Slower; recommended for smaller runs. (mode=library)",
"prefill": false,
"title": "Fetch ad details",
"type": "boolean"
},
"keyword": {
"default": "",
"description": "Search ads by keyword or advertiser name. Leave empty to browse recent ads in the selected region. (mode=library)",
"editor": "textfield",
"prefill": "Nike",
"title": "Keyword",
"type": "string"
},
"maxItems": {
"default": 50,
"description": "Maximum records to collect per source (1–5,000). TikTok caps a single library search at about 5,000 results.",
"maximum": 5000,
"minimum": 1,
"prefill": 3,
"title": "Max items",
"type": "integer"
},
"mode": {
"default": "library",
"description": "`library` = TikTok DSA Commercial Content Library (EU/EEA/UK/CH/TR). `creativeCenter` = global Top Ads inspiration feed. `both` = run both and label every row with `source`.",
"editor": "select",
"enum": [
"library",
"creativeCenter",
"both"
],
"enumTitles": [
"DSA ad library",
"Creative Center Top Ads",
"Both sources"
],
"prefill": "library",
"title": "Data source",
"type": "string"
},
"region": {
"default": "all",
"description": "TikTok DSA library covers EU/EEA countries plus the UK, Switzerland and Turkey. `all` searches the union (capped by TikTok), so split regions for deeper runs. (mode=library)",
"editor": "select",
"enum": [
"all",
"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"
],
"enumTitles": [
"All supported countries",
"Austria",
"Belgium",
"Bulgaria",
"Switzerland",
"Cyprus",
"Czech Republic",
"Germany",
"Denmark",
"Estonia",
"Spain",
"Finland",
"France",
"United Kingdom",
"Greece",
"Croatia",
"Hungary",
"Ireland",
"Iceland",
"Italy",
"Liechtenstein",
"Lithuania",
"Luxembourg",
"Latvia",
"Malta",
"Netherlands",
"Norway",
"Poland",
"Portugal",
"Romania",
"Sweden",
"Slovenia",
"Slovakia",
"Turkey"
],
"prefill": "DE",
"title": "Ad target country",
"type": "string"
},
"sortBy": {
"default": "last_shown_date,desc",
"description": "Result order. (mode=library)",
"editor": "select",
"enum": [
"last_shown_date,desc",
"last_shown_date,asc",
"create_time,desc",
"create_time,asc",
"impression,desc",
"impression,asc"
],
"enumTitles": [
"Last shown — newest first",
"Last shown — oldest first",
"Created — newest first",
"Created — oldest first",
"Audience size — high to low",
"Audience size — low to high"
],
"prefill": "last_shown_date,desc",
"title": "Sort by",
"type": "string"
},
"startDate": {
"description": "Earliest last-shown date (`YYYY-MM-DD`). Default: one year ago. (mode=library)",
"editor": "textfield",
"title": "Last shown from",
"type": "string"
},
"startUrls": {
"default": [],
"description": "Paste TikTok library search or ad-detail URLs. Search URLs carry their own region, keyword/advertiser, dates and filters; detail URLs are read as ad IDs. (mode=library)",
"editor": "requestListSources",
"prefill": [],
"title": "TikTok library URLs",
"type": "array"
},
"uniqueReach": {
"default": "all",
"description": "Filter by TikTok's unique-users-seen band. (mode=library)",
"editor": "select",
"enum": [
"all",
"under10k",
"10k-100k",
"over100k"
],
"enumTitles": [
"All reach bands",
"Under 10K",
"10K–100K",
"Over 100K"
],
"prefill": "all",
"title": "Unique reach",
"type": "string"
}
},
"required": [],
"schemaVersion": 1,
"title": "TikTok DSA Ads Transparency Library Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
ads | string | optional | Dataset containing all scraped TikTok DSA ads and Creative Center top ads. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One row per TikTok DSA ad or Creative Center top ad, with creatives, advertiser identity, dates, reach, targeting and performance signals.",
"properties": {
"ads": {
"description": "Dataset containing all scraped TikTok DSA ads and Creative Center top ads.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "TikTok ads",
"type": "string"
}
},
"title": "TikTok Ads Library + Creative Center Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"fields": {
"adEndDate": {
"description": "Last date the ad was shown (YYYY-MM-DD).",
"title": "Last shown",
"type": "string"
},
"adFormat": {
"description": "`single_video`, `image`, `carousel` or `spark_ad` when TikTok discloses it.",
"title": "Ad format",
"type": "string"
},
"adId": {
"description": "TikTok ad ID.",
"title": "Ad ID",
"type": "string"
},
"adImages": {
"description": "Image creative URLs.",
"title": "Ad images",
"type": "array"
},
"adImpressions": {
"description": "TikTok's estimate bucket (e.g. `10K-100K`).",
"title": "Unique users seen",
"type": "string"
},
"adImpressionsExact": {
"description": "Exact count when TikTok discloses it (normally empty).",
"title": "Exact impressions",
"type": "integer"
},
"adImpressionsMax": {
"description": "Numeric upper bound of the bucket.",
"title": "Impressions upper bound",
"type": "integer"
},
"adImpressionsMin": {
"description": "Numeric lower bound of the bucket.",
"title": "Impressions lower bound",
"type": "integer"
},
"adLanguages": {
"description": "Languages carried by the search listing, when present.",
"title": "Ad languages",
"type": "array"
},
"adPlatforms": {
"description": "Platforms the ad ran on, when listed.",
"title": "Platforms",
"type": "array"
},
"adReachByCountry": {
"description": "Per-country reach with age × gender breakdowns.",
"title": "Reach by country",
"type": "array"
},
"adSpent": {
"description": "Disclosed spend when TikTok publishes it (normally empty).",
"title": "Spend",
"type": "string"
},
"adStartDate": {
"description": "First date the ad was shown (YYYY-MM-DD).",
"title": "First shown",
"type": "string"
},
"adTitle": {
"description": "Ad caption or headline.",
"title": "Ad caption/title",
"type": "string"
},
"adType": {
"description": "`video`, `image` or `text`.",
"title": "Ad type",
"type": "string"
},
"adUrl": {
"description": "Link to the ad's TikTok page.",
"title": "Ad URL",
"type": "string"
},
"adVideoCover": {
"description": "Cover image URL.",
"title": "Video cover",
"type": "string"
},
"adVideoUrl": {
"description": "Working video CDN URL (decoded from TikTok's library wrapper).",
"title": "Video URL",
"type": "string"
},
"adVideoUrlOriginal": {
"description": "TikTok's original library video URL, kept for traceability.",
"title": "Original video URL",
"type": "string"
},
"adVideos": {
"description": "All video renditions for carousel ads, each with `videoUrl`, optional `coverImage` and `videoUrlOriginal`.",
"title": "Ad videos",
"type": "array"
},
"advertiserBusinessId": {
"description": "Registered business ID.",
"title": "Business ID",
"type": "string"
},
"advertiserBusinessName": {
"description": "Registered business name.",
"title": "Registered advertiser",
"type": "string"
},
"advertiserCountries": {
"description": "Countries returned by the Creative Center detail endpoint.",
"title": "Creative Center countries",
"type": "array"
},
"advertiserCountry": {
"description": "Advertiser's registered country.",
"title": "Registry country",
"type": "string"
},
"advertiserId": {
"description": "TikTok business ID when disclosed.",
"title": "Advertiser ID",
"type": "string"
},
"advertiserIndustry": {
"description": "Industry when the source provides it.",
"title": "Advertiser industry",
"type": "string"
},
"advertiserName": {
"description": "Advertiser or brand name.",
"title": "Advertiser",
"type": "string"
},
"advertiserSponsor": {
"description": "Sponsor/payer name when different from the advertiser.",
"title": "Paid for by",
"type": "string"
},
"advertiserTikTokUser": {
"description": "Linked TikTok account: id/username/displayName/followers/accountType/avatar/profile.",
"title": "TikTok account",
"type": "object"
},
"advertisingObjective": {
"description": "Campaign objective (e.g. Traffic, Sales).",
"title": "Advertising objective",
"type": "string"
},
"audienceExclude": {
"description": "Whether the audience is excluded.",
"title": "Audience exclude",
"type": "string"
},
"audienceTargeting": {
"description": "TikTok's audience include/exclude flag.",
"title": "Audience targeting",
"type": "string"
},
"auditReasons": {
"description": "Additional audit reason codes/text.",
"title": "Audit reasons",
"type": "array"
},
"auditStatus": {
"description": "Raw TikTok audit code.",
"title": "Audit status",
"type": "string"
},
"auditStatusLabel": {
"description": "`approved`, `rejected`, `in_review` or `removed`.",
"title": "Audit status label",
"type": "string"
},
"avgImpressionsPerDay": {
"description": "Lower-bound bucket divided by daysActive.",
"title": "Avg impressions/day",
"type": "integer"
},
"ccSource": {
"description": "Source label from the Creative Center detail endpoint.",
"title": "Creative Center source",
"type": "string"
},
"commentCount": {
"description": "Creative Center comment count.",
"title": "Comments",
"type": "integer"
},
"commercialContentIndicator": {
"description": "Commercial-content indicator when present.",
"title": "Commercial content",
"type": "boolean"
},
"costTier": {
"description": "Creative Center budget tier code (0/1).",
"title": "Cost tier",
"type": "integer"
},
"creativeId": {
"description": "Creative identifier when present.",
"title": "Creative ID",
"type": "string"
},
"creativeName": {
"description": "Creative name when present.",
"title": "Creative name",
"type": "string"
},
"creatorInteractionsTargeting": {
"description": "Creator-interaction targeting when disclosed.",
"title": "Creator interactions",
"type": "string"
},
"ctaText": {
"description": "CTA button text.",
"title": "Call to action",
"type": "string"
},
"ctr": {
"description": "Creative Center click-through rate (0–1).",
"title": "CTR",
"type": "number"
},
"dataSource": {
"description": "Source-provided data label when present.",
"title": "Data source label",
"type": "string"
},
"daysActive": {
"description": "Inclusive days between first and last shown dates.",
"title": "Days active",
"type": "integer"
},
"detailUnavailable": {
"description": "True when TikTok had no detail data for the ad.",
"title": "Detail unavailable",
"type": "boolean"
},
"detailsFetched": {
"description": "True when the detail record was merged.",
"title": "Details fetched",
"type": "boolean"
},
"displayMode": {
"description": "TikTok detail page display mode.",
"title": "Display mode",
"type": "string"
},
"industryKey": {
"description": "Creative Center industry key.",
"title": "Industry key",
"type": "string"
},
"industryName": {
"description": "Creative Center industry name.",
"title": "Industry",
"type": "string"
},
"interestTargeting": {
"description": "Interest categories when disclosed.",
"title": "Interest targeting",
"type": "string"
},
"isSearchAd": {
"description": "Creative Center `is_search` flag.",
"title": "Search placement",
"type": "boolean"
},
"landingPageUrl": {
"description": "External website linked from the ad.",
"title": "Landing page",
"type": "string"
},
"likeCount": {
"description": "Creative Center like count.",
"title": "Likes",
"type": "integer"
},
"objectiveKey": {
"description": "Creative Center objective key.",
"title": "Objective key",
"type": "string"
},
"objectiveName": {
"description": "Creative Center objective name.",
"title": "Objective",
"type": "string"
},
"observedCountry": {
"description": "Creative Center country used for this row.",
"title": "Observed country",
"type": "string"
},
"observedPeriod": {
"description": "Creative Center period in days.",
"title": "Observed period",
"type": "integer"
},
"recordType": {
"description": "`ad` for a DSA library ad, `topAd` for a Creative Center top ad, `summary` for count-only runs.",
"title": "Record Type",
"type": "string"
},
"rejectionInfo": {
"description": "Rejection details when the ad was rejected.",
"title": "Rejection info",
"type": "object"
},
"scrapedAt": {
"description": "ISO 8601 UTC collection time.",
"title": "Scraped at",
"type": "string"
},
"searchQueryType": {
"description": "`keyword`, `advertiser` or `browse`.",
"title": "Search type",
"type": "string"
},
"searchRegion": {
"description": "Region used for this row.",
"title": "Search region",
"type": "string"
},
"searchTotal": {
"description": "TikTok's reported total for the search.",
"title": "Search total",
"type": "integer"
},
"shareCount": {
"description": "Creative Center share count.",
"title": "Shares",
"type": "integer"
},
"showMode": {
"description": "Raw TikTok show_mode code.",
"title": "Show mode",
"type": "integer"
},
"sorAuditStatus": {
"description": "TikTok's statement-of-reasons audit code.",
"title": "SOR audit status",
"type": "string"
},
"source": {
"description": "`tiktokAdsLibrary` or `creativeCenter`.",
"title": "Source",
"type": "string"
},
"targetAudienceSize": {
"description": "Estimated audience size bucket.",
"title": "Target audience size",
"type": "string"
},
"targetAudienceSizeMax": {
"description": "Numeric upper bound.",
"title": "Audience size upper",
"type": "integer"
},
"targetAudienceSizeMin": {
"description": "Numeric lower bound.",
"title": "Audience size lower",
"type": "integer"
},
"targetingByAge": {
"description": "Per-region targeted age buckets.",
"title": "Targeting by age",
"type": "array"
},
"targetingByGender": {
"description": "Per-region targeted genders.",
"title": "Targeting by gender",
"type": "array"
},
"targetingByLocation": {
"description": "Rows of `{region, impressions}`.",
"title": "Targeting by location",
"type": "array"
},
"targetingCities": {
"description": "Cities explicitly targeted.",
"title": "Targeted cities",
"type": "array"
},
"targetingCountries": {
"description": "Country codes explicitly targeted.",
"title": "Targeted countries",
"type": "array"
},
"targetingDeviceModels": {
"description": "Device models explicitly targeted.",
"title": "Targeted devices",
"type": "array"
},
"targetingHighSpendingPower": {
"description": "TikTok's high-spending-power flag.",
"title": "High spending power",
"type": "string"
},
"targetingLanguages": {
"description": "Languages explicitly targeted.",
"title": "Targeted languages",
"type": "array"
},
"targetingOperatingSystems": {
"description": "Operating systems explicitly targeted.",
"title": "Targeted operating systems",
"type": "array"
},
"targetingProvinces": {
"description": "Provinces/regions explicitly targeted.",
"title": "Targeted provinces",
"type": "array"
},
"targetingTotalImpressions": {
"description": "Total unique-users-seen bucket.",
"title": "Total reach",
"type": "string"
},
"targetingTotalRegions": {
"description": "Number of targeted regions.",
"title": "Targeted regions",
"type": "integer"
},
"videoDuration": {
"description": "Creative Center video length in seconds.",
"title": "Video duration",
"type": "number"
},
"videoHeight": {
"description": "Creative Center video height in pixels.",
"title": "Video height",
"type": "integer"
},
"videoInteractionsTargeting": {
"description": "Video-interaction targeting when disclosed.",
"title": "Video interactions",
"type": "string"
},
"videoRenditions": {
"description": "Creative Center video URLs keyed by resolution (360p–1080p).",
"title": "Video renditions",
"type": "object"
},
"videoWidth": {
"description": "Creative Center video width in pixels.",
"title": "Video width",
"type": "integer"
}
},
"title": "TikTok Ads",
"views": {
"creativeCenter": {
"title": "Creative Center Top Ads",
"transformation": {
"fields": [
"adId",
"advertiserName",
"adTitle",
"ctr",
"likeCount",
"costTier",
"industryName",
"objectiveName",
"observedCountry",
"observedPeriod",
"adVideoUrl",
"adUrl"
]
}
},
"detailed": {
"title": "Detailed ads",
"transformation": {
"fields": [
"adId",
"source",
"recordType",
"advertiserName",
"adTitle",
"adType",
"adFormat",
"adStartDate",
"adEndDate",
"daysActive",
"adImpressions",
"adImpressionsMin",
"adImpressionsMax",
"auditStatusLabel",
"ctaText",
"advertisingObjective",
"landingPageUrl",
"advertiserBusinessName",
"advertiserCountry",
"advertiserSponsor",
"targetAudienceSize",
"targetingCountries",
"adUrl"
]
}
},
"overview": {
"display": {
"component": "table",
"properties": {
"adEndDate": {
"format": "text",
"label": "Last shown"
},
"adId": {
"format": "text",
"label": "Ad ID"
},
"adImpressions": {
"format": "text",
"label": "Unique users seen"
},
"adStartDate": {
"format": "text",
"label": "First shown"
},
"adTitle": {
"format": "text",
"label": "Ad caption/title"
},
"adType": {
"format": "text",
"label": "Ad type"
},
"adUrl": {
"format": "link",
"label": "Ad URL"
},
"advertiserName": {
"format": "text",
"label": "Advertiser"
},
"ctr": {
"format": "number",
"label": "CTR"
},
"likeCount": {
"format": "number",
"label": "Likes"
},
"source": {
"format": "text",
"label": "Source"
}
}
},
"title": "TikTok Ads",
"transformation": {
"fields": [
"adId",
"source",
"advertiserName",
"adTitle",
"adType",
"adImpressions",
"adStartDate",
"adEndDate",
"ctr",
"likeCount",
"adUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
TikTok DSA Ads Transparency Library Scraper
Search TikTok's DSA ad transparency library across 33 European markets and the global Creative Center Top Ads from one actor. Get ad creatives, advertiser identity, first/last shown dates, unique-user reach, age/gender targeting, CTAs, landing pages and Creative Center performance signals — with no TikTok account, cookies, API key or proxy setup.
What this actor does
- DSA library search by keyword, exact advertiser name (optionally with its business ID), ad ID or a pasted library URL — in 33 EU/EEA/UK/CH/TR markets or all of them.
- Server-side filters for ad type, active/inactive status, age, gender, unique reach and six sort orders, plus an exact-phrase option.
- Full ad detail (optional): caption, CTA, landing page, advertising objective, registered advertiser, sponsor, linked TikTok account, per-country reach and age × gender breakdowns.
- Creative Center Top Ads (optional): global markets, 7/30/180-day windows, ranking by For You/CTR/likes, objective/industry/language filters, video renditions, CTR, likes, cost tier and optional landing pages/comments/shares.
- Both sources in one run, with a
sourcefield on every row. - Count-only mode for a quick number of matching DSA ads.
- Fields a source does not disclose are omitted, never left as null or placeholders.
Output per ad
DSA library rows (recordType: "ad", source: "tiktokAdsLibrary")
adId,adUrl— TikTok ad ID and its library detail pageadvertiserName,advertiserId,advertiserBusinessName,advertiserBusinessId,advertiserCountry,advertiserSponsoradvertiserTikTokUser— linked TikTok account:id,username,displayName,followers,accountType,avatarUrl,profileUrladTitle,adType,adFormat,showMode,adStartDate,adEndDate,daysActiveadImpressions,adImpressionsMin,adImpressionsMax,avgImpressionsPerDayadVideoUrl,adVideoCover,adVideos,adImages— working media URLsctaText,advertisingObjective,landingPageUrlauditStatus,auditStatusLabel,sorAuditStatus,rejectionInfo,auditReasonstargetingByLocation,adReachByCountry,targetingByAge,targetingByGender,targetAudienceSize,targetAudienceSizeMin,targetAudienceSizeMaxtargetingCountries,targetingCities,targetingProvinces,targetingLanguages,targetingDeviceModels,targetingOperatingSystems,targetingHighSpendingPower,audienceTargeting,audienceExcludeinterestTargeting,videoInteractionsTargeting,creatorInteractionsTargeting,displayModesearchTotal,searchRegion,searchQueryType,detailsFetched,detailUnavailablesource: "tiktokAdsLibrary",recordType: "ad",scrapedAt
Creative Center rows (recordType: "topAd", source: "creativeCenter")
adId,adUrl,adTitle,advertiserName,adType: "video"adVideoUrl,adVideoCover,videoRenditions,videoDuration,videoWidth,videoHeightctr,likeCount,costTier,industryKey,industryName,objectiveKey,objectiveNamelandingPageUrl,commentCount,shareCount,advertiserCountries,isSearchAd,ccSourceobservedCountry,observedPeriod,source: "creativeCenter",recordType: "topAd",scrapedAt
Count-only runs emit one row with recordType: "summary" and searchTotal.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | library |
library, creativeCenter or both |
keyword |
string | "" |
Keyword/advertiser text for a DSA search; empty = browse. |
advertiserName |
string | – | Exact advertiser name; retried as a keyword if the exact search is empty. |
advertiserId |
string | – | Optional business ID to disambiguate an advertiser search. |
adIds |
array | [] |
Direct ad IDs to open. |
startUrls |
array | [] |
TikTok library search or ad-detail URLs. Search URLs contribute their region, keyword/advertiser and date window. |
region |
string | all |
One of 33 country codes or all. |
startDate |
string | – | Last-shown date from (YYYY-MM-DD); default one year ago. |
endDate |
string | – | Last-shown date to (YYYY-MM-DD); default today. |
sortBy |
string | last_shown_date,desc |
One of six sort orders. |
adType |
string | all |
all, video, image, text. |
adStatus |
string | active |
all, active, inactive. |
age |
array | [] |
Any of 13-17, 18-24, 25-34, 35-44, 45-54, 55+. |
gender |
string | all |
all, female, male. |
uniqueReach |
string | all |
all, under10k, 10k-100k, over100k. |
exactPhrase |
boolean | false |
Treat the keyword as an exact phrase. |
includeDetails |
boolean | true |
Enrich DSA ads from their detail pages. |
countOnly |
boolean | false |
Return one summary row with the matching total. |
maxItems |
integer | 50 |
Records per source (1–5,000). |
ccCountry |
string | US |
Creative Center market (28 options). |
ccPeriod |
string | 30 |
7, 30 or 180 days. |
ccOrderBy |
string | for_you |
for_you, ctr or like. |
ccObjective |
string | all |
all or one of eight campaign objectives. |
ccIndustry |
string | all |
all or one of 258 industries. |
ccLanguage |
string | all |
all or one of 16 languages. |
ccSweep |
boolean | true |
Sweep filter combinations to collect more than 20 unique top ads. |
ccIncludeDetails |
boolean | true |
Add landing pages, comments and shares. |
Example: keyword search in Germany with details
{
"mode": "library",
"keyword": "Nike",
"region": "DE",
"includeDetails": true,
"maxItems": 25
}
Example: exact advertiser, all markets, image ads
{
"mode": "library",
"advertiserName": "NIKE Retail B.V.",
"region": "all",
"adType": "image",
"includeDetails": true,
"maxItems": 100
}
Example: Creative Center top ads in the US
{
"mode": "creativeCenter",
"ccCountry": "US",
"ccPeriod": "180",
"ccOrderBy": "ctr",
"ccSweep": true,
"maxItems": 100
}
Example: both sources
{
"mode": "both",
"keyword": "skincare",
"region": "FR",
"ccCountry": "FR",
"maxItems": 50
}
Use cases
- Competitive intelligence — see every ad a brand runs in Europe, with dates, reach and targeting.
- Creative research — collect working video/image creatives and CTAs across markets.
- Compliance monitoring — pull audit status, rejection details and advertiser identity.
- Market sizing — compare unique-user bands and per-country reach for a category.
- Global trend spotting — use Creative Center to find high-performing ads outside the EU.
- Advertiser due diligence — check the registered business, sponsor and linked TikTok account.
FAQ
Do I need a TikTok account or cookies? No. Both sources are public. The actor opens TikTok's public pages once to establish an anonymous session; no login, cookie file or API key is involved.
How many DSA ads can one search return? TikTok serves 12 ads per page and caps a single search at roughly 5,000 results. Split by country, date range or keyword to go deeper. The actor warns when it reaches the cap.
Why are some ads missing details?
TikTok marks some ads as unavailable or shows no detail data. Those rows keep their listing data and carry detailUnavailable: true. Detail pages are opened for at most 500 DSA ads and 200 Creative Center ads per run; rows beyond those limits keep their listing data.
Why are my video URLs sometimes expired? TikTok's media URLs are signed and time-limited. The actor converts the library's wrapper URLs into working CDN URLs; download or re-host the files promptly if you need them long-term.
What is the difference between the DSA library and Creative Center? The DSA library is the EU transparency database: dates, reach, targeting and advertiser identity. Creative Center is a global showcase of high-performing ads with CTR/likes/video renditions, but no dates or targeting.
Why does Creative Center return only 20 ads?
Anonymous visitors get one page of 20 per filter combination. With ccSweep on, the actor sweeps periods, rankings, objectives and formats, deduplicates, and collects many more unique ads.
Can I search Creative Center by keyword? Not reliably without a TikTok login. The actor does not offer a Creative Center keyword field; it sweeps the public Top Ads surface instead.
How do exact advertiser searches work?
TikTok matches the exact advertiser name (for example NIKE Retail B.V.). If that returns nothing, the actor retries the name as a keyword so you still get useful results.
Why do some fields stay empty? TikTok does not disclose them for every ad — for example spend, exact impressions, cities or device targeting. Empty fields are omitted rather than filled with placeholders.
Is this affiliated with TikTok? No. This is an independent third-party actor that reads TikTok's public ad transparency library and Creative Center pages.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build VN98RbYxVmnD8fOwy. Documentation is regenerated from the default published build; private drafts are not included.