Apify actor · whoareyouanas/tiktok-ad-scraper

TikTok Ad Library & Creative Scraper - Spy on Competitor Ads

Research creatives from TikTok Ad Library, Creative Center, or both. Export available ad copy, advertiser context, media links, dates, and source-specific targeting or performance signals.

Documentation checked 2026-10-29 · deployed build 0.0.6 · run through your Apify account

01 / Overview

Match the actor to the job.

Two public sources

Select the transparency Ad Library or Creative Center according to your research question.

URL or parameters

Provide a supported source URL or build a search with mode, country, query, and filters.

Creative exports

Keep advertiser details and available media or metrics in structured records.

02 / Input

Start with a clear, bounded input.

targetUrl can identify the source directly. For parameter searches, choose scrapeMode and a compatible country. Ad Library and Creative Center have different geography and filter coverage. Start with a small maxResults.

input.json · example based on the deployed schema
{
  "targetUrl": "https://library.tiktok.com/ads?query=nike&region=DE",
  "maxResults": 10
}

Replace example targets and credential placeholders before running. These are documentation examples, not a promise of currently available source results.

Deployed actor input fields, types, defaults, and descriptions
FieldType / requiredDefaultPurpose
scrapeModestring"ad_library"Choose which TikTok data source to scrape. Ad Library covers EU/EEA with rich targeting data. Creative Center covers 50+ countries globally with performance metrics. 'Both' runs both sources.

Options: ad_library, creative_center, both

targetUrlstringNot specifiedPaste a TikTok Ad Library or Creative Center URL directly. If provided, all parameter fields below are ignored.
searchQuerystringNot specifiedKeyword or advertiser name to search for (e.g. 'nike', 'shopify', 'gaming app').
advertiserIdstringNot specifiedTikTok advertiser business ID to look up all ads from a specific advertiser.
maxResultsinteger10Maximum number of ads to return. Set to 0 for unlimited. Ad Library has a platform cap of ~3,600 results per query.

Minimum: 0 · Maximum: 10000

All other input controls (11)
Deployed actor input fields, types, defaults, and descriptions
FieldType / requiredDefaultPurpose
countrystring"all"Country code for filtering. For Ad Library: EU/EEA countries only (e.g. DE, FR, IT, ES, NL, GB). For Creative Center: any of 50+ countries (e.g. US, JP, BR, IN).

Options: all, US, GB, DE, FR, IT, ES, NL, PL, BE, SE, AT, DK, FI, IE, PT, CZ, RO, HU, SK, BG, HR, LT, SI, LV, EE, CY, LU, MT, GR, CH, NO, IS, LI, JP, KR, AU, BR, MX, IN, ID, TH, VN, PH, MY, SG, TW, CA, AR, CL, CO, PE, EG, SA, AE, TR, ZA, NG, KE

industrystring"all"Filter by industry vertical. Only applies to Creative Center mode.

Options: all, apparel_and_accessories, beauty_and_personal_care, ecommerce, education, finance, food_and_beverage, games, health, home_improvement, news_and_entertainment, tech_and_electronics, travel, vehicle

objectivestring"all"Filter by campaign objective. Only applies to Creative Center mode.

Options: all, app_install, traffic, lead_generation, conversions, reach, video_views, community_interaction

timePeriodstring"30"Time window for results. For Ad Library: custom date range via startDate/endDate. For Creative Center: preset windows.

Options: 7, 30, 180

startDatestringNot specifiedStart date for Ad Library search in YYYY-MM-DD format. Defaults to 1 year ago.
endDatestringNot specifiedEnd date for Ad Library search in YYYY-MM-DD format. Defaults to today.
sortBystring"last_shown_date_newest"Sort order for results.

Options: last_shown_date_newest, last_shown_date_oldest, published_date_newest, published_date_oldest, unique_users_high, unique_users_low, reach, ctr, likes

quickSearchbooleanfalseIf enabled, skips detail page visits for faster, cheaper scraping. Returns search-level fields only (no targeting or detailed reach data). Recommended for large-volume scrapes.
maxConcurrencyinteger1Number of parallel requests. Keep at 1 for stability. Increase to 2-3 only if you need faster scraping.

Minimum: 1 · Maximum: 5

requestHandlerTimeoutSecsinteger300Maximum time to wait for scraping to complete per page.

Minimum: 60 · Maximum: 900

proxyUrlstringNot specifiedResidential proxy URL for reliable scraping. Format: http://groups-RESIDENTIAL:[email protected]:8000. TikTok aggressively blocks datacenter IPs. External proxies (BrightData, Oxylabs) also supported.

03 / Output

Know what each returned row represents.

Illustrative output shape · not a live run
{
  "adId": "12345678",
  "advertiserName": "Nike",
  "advertiserBusinessId": "987654321",
  "advertiserLocation": "US",
  "videoUrl": "https://v16m.tiktokcdn.com/...",
  "videoUrlHd": "https://v16m.tiktokcdn.com/...",
  "coverImageUrl": "https://p16-sign.tiktokcdn.com/...",
  "adCopy": "Just Do It. Shop the latest Nike collection.",
  "firstShownDate": "2025-01-15",
  "lastShownDate": "2025-03-20",
  "status": "active",
  "estimatedAudience": "500K-1M",
  "estimatedAudienceMin": 500000,
  "estimatedAudienceMax": 1000000,
  "reachByCountry": {
    "DE": 250000,
    "FR": 150000,
    "IT": 100000
  },
  "targetGender": [
    "FEMALE",
    "MALE"
  ],
  "targetAgeRange": [
    "18-24",
    "25-34"
  ],
  "targetCountries": [
    "DE",
    "FR",
    "IT"
  ],
  "targetInterests": [
    "Sports",
    "Fashion"
  ],
  "likes": 15000,
  "ctr": 2.5,
  "viewRate2s": 45.2,
  "viewRate6s": 28.7,
  "industry": "Apparel & Accessories",
  "campaignObjective": "Traffic",
  "adFormat": "Single Video",
  "source": "ad_library",
  "sourceUrl": "https://library.tiktok.com/ads?id=12345678",
  "scrapeDate": "2025-03-28T10:00:00.000Z"
}

Example values illustrate the published contract. Available fields and populated values depend on the source, mode, and result status.

Fields in the documented output view

adId

Ad ID

advertiserName

Advertiser

advertiserBusinessId

Business ID

advertiserLocation

Location

paidForBy

Paid For By

status

Status

adFormat

Format

firstShownDate

First Shown

lastShownDate

Last Shown

estimatedAudience

Est. Audience

estimatedAudienceMin

Audience Min

estimatedAudienceMax

Audience Max

videoUrl

Video

coverImageUrl

Cover

adCopy

Ad Copy

targetGender

Target Gender

targetAgeRange

Target Age

audienceSize

Audience Size

likes

Likes

ctr

CTR

viewRate2s

2s View Rate

viewRate6s

6s View Rate

industry

Industry

campaignObjective

Objective

videoDuration

Duration (s)

detailUrl

Detail URL

source

Source

sourceUrl

Source URL

Output views select columns. They do not necessarily filter record types or exhaust the full JSON payload. Use structured JSON when you need nested arrays or objects.

Dataset links and run artifacts (2)
Overview
Overview of all scraped ads with key metrics and details
All Ads (Full Data)
Complete dataset with all fields including targeting, reach, and creative assets

04 / Pricing

Understand the billable unit.

These are the active public event prices checked on 2026-10-29, in USD. They describe each event, not a universal flat price for a run. Confirm your current Apify plan and run budget before starting.

Actor event prices and billing units
Billable eventRate (USD)When it applies

Actor Start

apify-actor-start

$0.00005 / event

Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event).

Start units depend on allocated memory: one event per GB, with at least one event.

Ad scraped

apify-default-dataset-item

$0.005 / event

One scraped TikTok ad with creative, targeting, reach, and advertiser data

$5.00 per 1,000 of this event. Other events and separate services are additional.

  • The ad event and startup event below come from the current public pricing configuration.
  • The README's source or mode examples are not a universal all-in cost guarantee.

A result limit and a spending cap are different controls. Account charges, applicable taxes, and separately billed providers or proxies must be considered where relevant. A cap setting is not a minimum invoice charge.

05 / API & automation

Use the same input from your workflow.

Test a small run in Apify Console, inspect its records and charges, then save a task or call the actor from your own application. Keep your Apify token in an environment variable. Source-specific credentials, if required, are separate from the Apify API token.

cURL · start an asynchronous actor run
# Save the input example as input.json and set APIFY_TOKEN.
# This request starts an asynchronous, potentially billable run.
curl --request POST \
  'https://api.apify.com/v2/acts/whoareyouanas~tiktok-ad-scraper/runs' \
  --header "Authorization: Bearer $APIFY_TOKEN" \
  --header 'Content-Type: application/json' \
  --data @input.json

The response identifies the run. Wait for it to finish, inspect its status, and use its default dataset and key-value store to retrieve results. A successful run can still contain partial or failed records; check the output contract above before continuing downstream.

Coverage & interpretation

Check the result before relying on it.

Questions

Before you build an integration.

What do I need to provide?

targetUrl can identify the source directly. For parameter searches, choose scrapeMode and a compatible country. Ad Library and Creative Center have different geography and filter coverage. Start with a small maxResults.

What should I check in the output?
  • The returned fields depend on the selected source and quickSearch setting.
  • Reach, targeting, and performance fields can be estimates or source-specific labels. Preserve their context instead of treating them as verified sales.
How do I budget the run?
  • The ad event and startup event below come from the current public pricing configuration.
  • The README's source or mode examples are not a universal all-in cost guarantee.

Keep exploring

Practical guides for the next step.