TikTok Creative Center scraper artworkTop Ads & creative signals

TikTok Creative Center Scraper.

Pick a market and industry, then collect examples from TikTok's Top Ads selection. Review the videos and their ranking context before deciding what to test in your own campaigns.

Run on Apify

Ways to use this scraper.

Try these examples for marketing, growth and competitor research.

01

Keep a weekly set of creative references

For a beauty brand, review Top Ads in your market and industry each week. Watch the available videos and note their opening hooks and product demonstrations. Use those patterns to plan tests for your audience.

Keep a reference library with source videos, your notes and the ranking context.

02

Compare video length across ranking lists

Collect separate lists ranked by CTR and six-second view rate. Compare the examples and their video lengths. A high ranking in one list won't guarantee the same result for another brand.

Make a test list that separates what you observed from what you want to try.

03

Check whether the landing page matches the ad

Enable ad details and compare captions, objectives and destination pages. Review how the creative's promise connects to the product or landing-page experience.

Keep an ad-to-landing-page audit with your annotations.

FROM FIRST RUN TO REPEATABLE WORKFLOW

Your first run, step by step.

  1. Open the Actor on Apify, select its Input tab and switch to the JSON editor if you want to paste a configuration.
  2. Start with one country such as US and one ranking such as ctr. Leave industry, objective and language unset until you have seen the first sample. This avoids accidentally multiplying the number of searches.
  3. Use period 7, maxAds 20 and maxQueries 1 for a quick check. Leave scrapeAdDetails false. A larger maxAds value will not remove the source’s roughly 20-ad limit for one search combination.
  4. Start the run and watch the log. Check which targets and filters were actually read before assuming an empty result means nothing exists.
  5. Open Storage → Dataset, inspect several records and export JSON for nested data or CSV for a first spreadsheet review.
First-run configuration
{
  "countries": ["US"],
  "period": "7",
  "sortBy": ["ctr"],
  "maxAds": 20,
  "maxQueries": 1,
  "scrapeAdDetails": false
}

Paste this into the Actor’s JSON input editor. Replace the example targets with yours before running.

Check the current input form on Apify

Choose how to search.

Creative Center is a curated Top Ads collection, not a complete advertiser archive. Use it to study examples, hooks and editing choices. Country, industry, objective, language and ranking filters create separate search combinations.

Search methodWhen to use itWhat changes
Market selectionWhen to use itYou need a view of a particular country or market.What changesSelect supported Top Ads markets below. Empty means all available markets. This coverage is different from TikTok Ad Library and includes the US. Extra countries add query combinations.
Ranking selectionWhen to use itYou want creative references grouped by a particular metric.What changesEach sort creates a separate ranked Top Ads query. for_you, like, ctr, impression, cvr, play_6s_rate and play_2s_rate select different lists; all requests every ranking.
Industry and campaign goalWhen to use itYou want broader coverage and can allow a larger run.What changesUse industry names from Creative Center, such as beauty. Names are matched loosely; a parent industry includes sub-industries. Several industries create separate queries, not a single combined category.

The difference that matters

Caps unique ads across all query combinations. One signed-out query yields at most 20, so maxAds 100 does not force one query to return 100. Add meaningful combinations for broader coverage.

Compare the related scraper

Every input, explained.

Use the exact field names below in JSON. In Apify’s form, enter list items separately, choose filters, and keep numbers and booleans in their proper types.

Default and prefill are different. A default applies when you omit a setting; a prefill is an example already entered in Apify’s form. Review prefilled targets and limits before every run. Some settings have no schema default. You still need to supply at least one supported target.

Targets and search inputs4
countries
ListForm prefill: ["US"]

Select supported Top Ads markets below. Empty means all available markets. This coverage is different from TikTok Ad Library and includes the US. Extra countries add query combinations.

Suggested JSON values
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
industries
List

Use industry names from Creative Center, such as beauty. Names are matched loosely; a parent industry includes sub-industries. Several industries create separate queries, not a single combined category.

objectives
List

Campaign-objective filters such as traffic or product sales. Each selected objective adds combinations. An objective label is campaign context, not verified performance of your own campaign.

Suggested JSON values
traffic app installs conversions video views reach lead generation product sales
adLanguages
List

The language of the ads, not the interface language. Several languages add query combinations. Keep empty for all languages when you do not need language-specific research.

Suggested JSON values
en es ar vi th de id pt fr ms nl ja it ro zh-Hant ko
Markets, dates and filters2
period
TextDefault: 30

Ranking lookback of 7, 30 or 180 days, supplied as a string. It is a Top Ads ranking period, not a request for every ad delivered during those dates.

Suggested JSON values
7 30 180
sortBy
ListForm prefill: ["for you"]

Each sort creates a separate ranked Top Ads query. for_you, like, ctr, impression, cvr, play_6s_rate and play_2s_rate select different lists; all requests every ranking.

Suggested JSON values
for_you like ctr impression cvr play_6s_rate play_2s_rate all
Limits, details and proxies4
maxAds
IntegerForm prefill: 100

Caps unique ads across all query combinations. One signed-out query yields at most 20, so maxAds 100 does not force one query to return 100. Add meaningful combinations for broader coverage.

maxQueries
IntegerDefault: 500

Caps country × industry × objective × ad language × ranking combinations. Two countries and two rankings mean four queries when other dimensions are unrestricted. The first combinations can exhaust this cap.

scrapeAdDetails
True or falseDefault: true

Adds landing pages, all reported countries, comments, shares and keywords. One extra request per ad. Disable for a quick Top Ads list; missing details are recorded in the run summary.

proxyConfiguration
ObjectDefault: {"useApifyProxy":true}Form prefill: {"useApifyProxy":true}

Apify Proxy is the default. The Actor retries refused exits and can fall back to residential. Keep the default for a first run; do not assume an empty list always means no eligible ads.

Advanced settings and recovery2
resume
True or falseDefault: true

Saves progress about every 30 seconds so an Apify restart or migration can continue the current run. Leave it on for normal use.

continueFromLastRun
True or falseDefault: false

Continues unfinished work from the previous run with matching input. Earlier results remain in that run’s dataset. Keep false for a fresh collection or a recurring snapshot.

This reference follows the Actor’s published input fields. Check the live form before changing a production workflow. Check the current input form on Apify.

Configurations you can copy.

Each example is a separate run. Start small, inspect the results, then increase coverage. Update the targets, countries and dates to match your question.

Compare two creative rankings

Two countries and two rankings make four search combinations. With roughly 20 ads available per combination, 80 is a planning ceiling rather than a promised unique count. Ads can appear in more than one ranking.

Compare two creative rankings
{
  "countries": ["US", "FR"],
  "period": "7",
  "sortBy": ["ctr", "play_6s_rate"],
  "maxAds": 80,
  "maxQueries": 4,
  "scrapeAdDetails": false
}

Find examples for a product-sales brief

Combine beauty, product sales and English ads in the US over 30 days. Enable details for the small sample. Use the videos to discuss hooks and execution; a Creative Center ranking does not predict your campaign’s results.

Find examples for a product-sales brief
{
  "countries": ["US"],
  "period": "30",
  "industries": ["beauty"],
  "objectives": ["product sales"],
  "adLanguages": ["en"],
  "sortBy": ["ctr"],
  "maxAds": 20,
  "maxQueries": 1,
  "scrapeAdDetails": true
}

Collect a broader inspiration board

Use all rankings for one country over 180 days, with no detail requests. This runs the seven supported ranking orders and deduplicates the results. maxQueries 7 keeps the search plan bounded.

Collect a broader inspiration board
{
  "countries": ["US"],
  "period": "180",
  "sortBy": ["all"],
  "maxAds": 100,
  "maxQueries": 7,
  "scrapeAdDetails": false
}

Run, check, export, repeat.

Keep the ad ID, video references, country and search combination with available ranking metrics. Metrics belong to the source’s selected Top Ads sample and should not be compared as though every campaign had equal exposure. Detail requests can fail separately from list collection; check SUMMARY.adsWithoutDetails and save expiring media links promptly.

  1. Check the dataset and the run’s SUMMARY record. Compare the number collected with your cap, inspect failed or skipped inputs, and verify a few original source links.
  2. Keep the original IDs and add collected_at and run_id when saving results. Export CSV for flat columns; retain JSON when arrays or nested details matter.
  3. Save the tested configuration as an Apify Task and schedule it. For repeated snapshots, leave continueFromLastRun false. Deduplicate new records by source ID while retaining each observation date.
  4. In Make or n8n, wait for a successful run, fetch its dataset and map fields into Sheets or your warehouse. Send records to Looker Studio through a reporting table; use dbt to flatten and test warehouse models.
  5. The same JSON works with Apify’s Actor API. In Claude with Apify MCP, name this Actor, ask it to inspect the live schema, and give explicit targets, markets and result limits before it runs.

Resume is not a fresh snapshot

resume protects the current run if Apify restarts it. continueFromLastRun continues an earlier run with the same configuration; earlier records stay in the earlier dataset. Combine both datasets for the complete collection, and raise a previously reached result cap when continuing. Start fresh when you want to see what changed today.

Follow the Sheets, Claude, Looker and BigQuery setup guides
Run this Actor from the API

Save one configuration above as input.json. Set APIFY_TOKEN to your Apify API token in your terminal, then send the file as the request body.

Start the run
curl --fail-with-body --request POST \
  --url "https://api.apify.com/v2/actors/jmlp~tiktok-creative-center-scraper/runs" \
  --header "Authorization: Bearer $APIFY_TOKEN" \
  --header "Content-Type: application/json" \
  --data-binary @input.json

The response contains a run ID and defaultDatasetId, not finished results. Wait for the run to succeed, set DATASET_ID to that dataset ID, then fetch its items. For large datasets, use limit and offset to page through the export.

Fetch the dataset
curl --fail-with-body \
  --url "https://api.apify.com/v2/datasets/$DATASET_ID/items?format=json" \
  --header "Authorization: Bearer $APIFY_TOKEN"

Apify’s run and export API reference
Dataset export options

When the results look wrong.

Change one setting at a time, keep a small cap, and check the run summary before scaling up.

Why does a search stop at about 20 ads?

Caps unique ads across all query combinations. One signed-out query yields at most 20, so maxAds 100 does not force one query to return 100. Add meaningful combinations for broader coverage.

A few filters created many search combinations.

Caps country × industry × objective × ad language × ranking combinations. Two countries and two rankings mean four queries when other dimensions are unrestricted. The first combinations can exhaust this cap.

The listing exists, but detailed fields are missing.

Adds landing pages, all reported countries, comments, shares and keywords. One extra request per ad. Disable for a quick Top Ads list; missing details are recorded in the run summary.

The run succeeded but returned nothing

Success means the Actor finished handling the request, not that the source returned data. Check SUMMARY.inputProblem, SUMMARY.problem and the log for missing targets, unsupported filters or refused requests. Test one known target with fewer filters.

Fewer records than expected

Check the global limit, per-search or per-page limits, platform coverage and deduplication. Several searches can find the same record. A source’s headline count can include records the public endpoint does not return. Review unfinished jobs before treating the dataset as complete.

Use the results in your tools.

Google Sheets

Keep ad_id, brand_name, ctr, video_duration, rank, scraped_sort and creative_center_url. Watch each video before adding your own hook and offer labels.

Read the setup
Claude + MCP

Ask Claude to organize captions and reported metrics with source links. Give it the actual media or transcripts for video analysis; a URL and caption don't describe the whole creative.

Read the setup
Looker Studio

Compare video lengths and reported signals by industry, country and ranking. Show the query context and label the results as a Top Ads sample.

Read the setup
BigQuery + dbt

Keep Top Ads observations with every query dimension. Record which list first found each deduplicated ad, and save the raw metrics before normalizing them.

Read the setup
Copy a prompt for Claude
Prompt for Claude + Apify MCP
Inspect jmlp/tiktok-creative-center-scraper and collect US beauty Top Ads from the last seven days ranked by CTR, capped at 50 ads and 10 queries. Summarize captions, video durations and reported metrics, cite creative_center_url, and label the data as a Top Ads sample. Do not infer unobserved video content or guaranteed performance.

The fields you’ll get.

Keep the collection time and original IDs with your records. You’ll need them to check where a result came from or compare it with a later run.

Before you draw conclusions

Top Ads is TikTok's curated, ranked selection. Signed-out collection returns up to 20 ads per query combination. Rankings and reported CTR belong to that source context and don't predict your campaign results. Video URLs can expire within hours. This scraper doesn't collect hashtag, song or creator trend lists.

ad_id / creative_center_url
The selected ad’s stable ID and source page.
ad_title / brand_name / industry / objective
Caption, brand and Creative Center classifications.
ctr / likes / comments / shares
Reported creative and engagement signals where available.
video_url / video_duration / video_cover
Video asset, length and preview information.
landing_page / countries / keywords
Additional fields when detailed collection is enabled.
rank / scraped_country / scraped_period / scraped_sort
Context of the Top Ads list that found the record.

Common questions.

How is this different from TikTok Ad Library?

Creative Center selects and ranks Top Ads for inspiration, including markets such as the US. Ad Library collects Commercial Content Library records across supported EU/EEA, UK and Swiss markets. Use the one that fits your research question.

Why does one query return only 20 ads?

That is the signed-out Top Ads limit per filter combination. Additional countries, rankings and industries create more queries, with duplicate ads removed by the scraper.

Source and current product details: JMLP’s TikTok Creative Center Actor on Apify.

Other scrapers
you might use.

Let’s talk about
your project.

Tell me what you need to collect or understand. I can help with a custom scraper, a pipeline or the analysis.

Start a project