Social media scraping 12 min read •

4 best TikTok ads scrapers and APIs in 2026

Compare four TikTok ad-data options for REST apps, scheduled datasets, company-domain enrichment, and approved first-party access, with current prices and a real CSV example.

by
Four TikTok ad-data jobs: public-library REST results, scheduled Apify datasets, Adyntel domain and creator context, and approved TikTok API access.

For a TikTok ads scraper, choose ScrapeCreators for public Ad Library results in a REST integration, Lexis Solutions on Apify for scheduled datasets, or Adyntel when your starting point is a company domain and you also need sponsored-creator discovery. Apply for TikTok’s Commercial Content API if you want a first-party integration and its approved-access, regional scope fits your project.

None of these choices makes a public ad archive a complete US advertising database or proves which ads are profitable.

I build ScrapeCreators, so it is included with that bias disclosed. Prices, documentation, and availability were checked on October 21, 2026. We executed the ScrapeCreators example below; we did not run a four-provider speed, accuracy, or coverage benchmark.

Choose by the job, not the word scraper

OptionChoose it whenInput and useful outputMain boundary
ScrapeCreatorsYour app needs public-library JSON with simple request billingKeyword or advertiser name, optional advertiser business ID; ads and an opaque cursorSearch cards are not complete targeting or performance reports
Lexis Solutions on ApifyYou want managed runs, scheduling, and downloadable datasetsQuery, advertiser name, or ad IDs; quick results or detail-enriched recordsExact Actor settings and page caps matter
AdyntelYou need domain-to-brand enrichment, sponsored creators, or separate library searchesCompany domain for brand posts; keyword for library results; ad ID for detailsThese are different endpoints and different record types
TikTok Commercial Content APIYour approved project needs a first-party data contractAuthorized keyword/advertiser queries and paginated ad recordsApplication required; the product page currently specifies EU ad data

For a wider comparison across Meta, Google, and LinkedIn, use the ad-library API guide. This article is specifically about choosing a TikTok ad-data source, not detecting an ad flag on an ordinary video or choosing a general TikTok profile scraper.

First separate the public library from Top Ads

The public Commercial Content Library and Creative Center Top Ads are different sources. A tool for one should not quietly stand in for the other. Lexis, for example, lists a separate Top Ads Actor alongside its public-library scraper.

Start with a concrete requirement: “Find this advertiser’s public archive entries” is different from “Find creative examples with performance-related rankings.” Ask the vendor which source and fields its particular endpoint uses. The ScrapeCreators search checked here identifies its source as tiktok_public_ads_library.

TikTok’s library FAQ says ads appear within 24 hours of campaign initiation, updates typically appear within 24 hours, and ads remain for one year after they were last shown. It also says you can use the public interface without a TikTok account. A fresh API request cannot remove that source-publication delay.

Geography needs its own check. TikTok’s official API product page currently specifies EU ad data. Adyntel’s library-search documentation has European country filters and explicitly excludes a US filter. Do not interpret a provider’s “all” setting as evidence that every US campaign is covered.

A useful lesson from this public research discussion is that brand names and registered advertisers can be hard to reconcile. Treat a name match as a candidate to review, not proof that you found every agency or legal entity connected to a brand.

1. ScrapeCreators for a direct REST integration

Use ScrapeCreators’ TikTok Ad Library API when you want to request a page of public ads and process the JSON in your own app. The current search contract accepts either query or advertiser_name, not both. You can pair advertiser_name with adv_biz_ids to select a particular advertiser, then pass the returned cursor for another page.

The advertiser-name flow returns candidates in advertiser_matches and the selected name in resolved_advertiser_name. Review them. Our Gymshark lookup returned multiple similarly named candidates, then selected GYMSHARK LTD. For a recurring job, preserve the intended name and business ID rather than assuming autocomplete will always make the same choice.

The live check also exposed boundaries worth knowing before you build:

  • The first advertiser page and its continuation each returned 12 ads, with no overlapping ad IDs. Both still had more results. That is a two-page observation, not an exhaustive export.
  • A keyword search for toys returned 12 ads with adv_biz_ids: null. Do not require advertiser IDs on every search card.
  • The first advertiser page had one record with an empty videos array. Preserve that record instead of assuming every ad includes a downloadable video.
  • All 12 advertiser cards had impression: 0 and spent: "". Those values do not establish zero real delivery or zero spend.
  • An ID-only request returned an uncharged 400. The business ID needs the advertiser name too.

This route searches the public library. It does not give you an advertiser’s private Ads Manager results, and the current public parameters do not expose your own country or date-range filter. Choose a provider with those controls if your research requires them.

The current pricing is $47 for 25,000 non-expiring credits, without a required subscription. This search normally costs one credit per request, including a successful empty result. Our deliberately unmatched query returned no ads and cost one credit. Cache hits cost zero only when a result is actually in the cache; a miss uses the endpoint’s normal price.

2. Lexis Solutions on Apify for scheduled datasets

The exact product here is lexis-solutions/tiktok-ads-scraper, not every TikTok scraper in the Apify marketplace. It is a useful fit when you want the run interface, scheduling, and exported datasets rather than writing that surrounding workflow yourself.

Its input schema includes query, advertiserName, adIds, maxPages, date controls, country, and sorting. The quickSearch setting returns partial information. Turn it off when you need the detail-enrichment path, and compare the resulting schema before making fields mandatory in your database.

The README states 12 ads per page and a 300-page source cap. It says the scraper cannot retrieve beyond that cap even if more results exist. Setting maxPages to zero means all available pages, not an unlimited worldwide archive. Treat those as the selected maintainer’s documented limits, not limits we independently stress-tested.

The live pricing tab lists an Ad event at $0.49 per 1,000 and an Actor Start event at $0.00001. The free platform plan includes $5 of usage; Starter lists $19 per month plus pay as you go, with $19 to spend. Check the complete event and platform-usage breakdown for your configuration rather than treating the headline as a flat all-in bill.

That current pricing matters because the maintainer’s walkthrough describes an older rental setup. Use the video to understand inputs and exports, then use today’s pricing tab to estimate cost.

Choose Lexis when a scheduled dataset is the result you need. Choose a direct API instead if you would otherwise start a managed run just to serve a small page of results to an application. Neither operating model is automatically faster or more reliable; we did not measure that comparison.

3. Adyntel for domain and creator enrichment

Adyntel is worth considering when the business question starts with a company domain. Its current TikTok offering has more than one path, and mixing them up would give you the wrong dataset.

The domain endpoint takes company_domain, resolves the brand’s TikTok handle, and returns brand_ads. Its optional influencer_ads mode adds discovered sponsored creators, a sample post, and evidence labels such as trust_tier. A disclosed partnership post and a public Ad Library entry are different objects. Keep them separate when reporting paid activity.

That endpoint normally costs one credit per call; enabling influencer discovery costs two. Its documented continuation tokens separate brand posts and influencer results. A webhook request first returns a job ID, with the finished data delivered later. A job acknowledgement is not a completed dataset. The docs also specify a 204 with an empty body when the company has no TikTok ads, so do not blindly call a JSON parser on every response.

Adyntel also has a separate keyword library search and ad-detail endpoint. The keyword endpoint’s country_code options do not include US. Do not assume it accepts the domain endpoint’s continuation_tokens; check each contract separately before planning a bulk export.

The live site shows 5,000 credits for $44 per month in subscription mode or $55 with the pay-as-you-go toggle selected. Its billing FAQ still says all purchases are one-time. Because those pages disagree, verify the selected purchase mode at checkout. The billing FAQ explicitly says requests are billable even when no ads are returned.

Choose Adyntel when domain resolution and creator context save work your team would otherwise do. Choose the public-library routes when you need archive entries with library IDs rather than a brand’s sponsored-post feed. We reviewed these contracts and prices, but did not execute an Adyntel request.

4. TikTok’s Commercial Content API for approved first-party access

TikTok’s own API deserves a place in the shortlist even though it is not a scraper. If its access and coverage fit, you may not need an intermediary at all.

The Commercial Content API supports customized advertiser-name or keyword searches across its commercial-content repository. The product page currently says EU ad data is included and that applicants can be located in any country. That distinction matters: a developer based in the US is not the same thing as a dataset covering US ads.

Access requires an application and approval. The getting-started guide then uses a client key and secret to obtain an access token. Its ad-query example calls /v2/research/adlib/ad/query/, and pagination uses has_more plus search_id. Those fields are not interchangeable with a managed provider’s cursor.

Choose this route for a project that needs the first-party relationship and can work within the approved scope. Do not choose it on the assumption that reading the public library in a browser automatically grants API credentials. The cited product page does not quote a usage price, and we did not obtain approval or execute the official API for this comparison.

A small export you can actually inspect

This Python example uses the standard library and requests at most two ScrapeCreators pages. The advertiser name and business ID were observed together on October 21, 2026. Review the current advertiser candidates before reusing them for your own research.

Set SCRAPE_CREATORS_API_KEY in your environment, then run the script. It writes stable IDs, source links, and raw date values to CSV. It does not download creative assets or claim to finish the archive.

import csv
import json
import os
from urllib.parse import urlencode
from urllib.request import Request, urlopen

params = {
    "advertiser_name": "GYMSHARK LTD",
    "adv_biz_ids": "7647240890083328016",
}
rows = {}
charges = 0
pages = 0
has_more = False

for _ in range(2):  # A two-page sample, not a complete archive.
    request = Request(
        "https://api.scrapecreators.com/v1/tiktok/ad-library/search?"
        + urlencode(params),
        headers={"x-api-key": os.environ["SCRAPE_CREATORS_API_KEY"]},
    )
    with urlopen(request, timeout=60) as response:
        body = json.load(response)
    if not body.get("success"):
        raise RuntimeError(body.get("message", "Ad search failed"))
    pages += 1
    charges += body["credits_charged"]
    for ad in body["ads"]:
        rows[ad["id"]] = {key: ad.get(key) for key in (
            "id", "name", "adv_biz_ids", "url",
            "first_shown_date", "last_shown_date", "estimated_audience",
        )}
    has_more = body["has_more"]
    if not has_more or not body.get("cursor"):
        break
    params["cursor"] = body["cursor"]

fields = ["id", "name", "adv_biz_ids", "url",
          "first_shown_date", "last_shown_date", "estimated_audience"]
with open("tiktok-ads.csv", "w", newline="", encoding="utf-8") as handle:
    writer = csv.DictWriter(handle, fieldnames=fields)
    writer.writeheader()
    writer.writerows(rows.values())

print(json.dumps({"pages_requested": pages, "unique_ads": len(rows),
                  "credits_charged": charges, "has_more": has_more}))

The executed example produced:

{
  "pages_requested": 2,
  "unique_ads": 24,
  "credits_charged": 2,
  "has_more": true
}

We parsed the CSV and confirmed 24 unique rows for the selected business ID. Since has_more remained true, the file is a bounded sample. The separate first-page/continuation check also found no overlapping IDs; it does not prove later pages never repeat or change.

The date values observed in these search cards are Unix milliseconds. Keep that unit in your stored schema, or divide by 1,000 before converting to a UTC datetime. Keep the raw value too. When refreshing, deduplicate on ad ID and record collection time separately from the first and last shown dates.

Compare bills and coverage before choosing

OptionCurrent billing or access unitWhat to budget for
ScrapeCreatorsOne credit per normal search request; $47 buys 25,000 creditsPages, repeated checks, and billable empty results; actual cache hits are zero credits
Lexis on Apify$0.49 per 1,000 Ad events; $0.00001 Actor Start eventSelected plan, full event schedule, and any applicable platform usage
AdyntelOne credit per normal call; domain mode with influencer discovery uses twoPagination, separate detail calls, empty results, and subscription versus one-time purchase
Official TikTok APIApplication and approved credentials; no price quoted on cited product pageAccess approval, scope, token handling, and your own collection/storage work

A request, an ad event, and a completed advertiser export are not equivalent units. Compare the same bounded job, including the fields you need and what happens when the search is empty. Do not multiply a displayed total by a per-record rate and call that a verified full-export price.

We left lobstr’s Top Ads scraper out of the active recommendations because its page showed Disabled on the verification date. Check that status before relying on its older tutorials or listed export features.

Questions to settle before you pay

What is the best TikTok ads scraper for my app?

Use ScrapeCreators for a direct public-library integration, Lexis on Apify for managed datasets, and Adyntel when domain and creator enrichment are central. Consider TikTok’s API first if your project can obtain approval and its current regional coverage fits. There is no single winner across those jobs.

Can I get every competitor ad in the United States?

Do not buy on that promise without a country-specific demonstration. The official API currently specifies EU ad data, and the Adyntel library-search country filter excludes US. Our ScrapeCreators sample does not establish complete US coverage. Ask for known public fixtures, dates, advertiser identities, and pagination evidence for your target market.

Can these tools tell me which ads are profitable?

Public archive presence, a long run, or a large audience range does not establish sales or return on ad spend. Use those signals to decide what to investigate. Do not turn an empty spend field or a zero-valued search-card metric into a performance verdict, and do not let an AI report invent the missing financial data.

What should I try first?

Pick a known advertiser, review its legal-name candidates, fetch a small page, and inspect missing fields before scheduling more. If you need other networks too, the LinkedIn ads scraper comparison shows another version of the same identity and pagination problem. For the REST route here, create a ScrapeCreators account and use the current search docs. Keep the first run small enough that you can read every row.

FAQ

Frequently asked
questions

Can't find what you're looking for? Email us.

Adrian Horning

Written by

Adrian Horning

Founder of ScrapeCreators. I write about social data APIs, scraper reliability, and turning public creator data into useful products.

Connect

ScrapeCreatorsScrapeCreators
Social Media Scraping API
for Developers

Real-time data from TikTok, Instagram, YouTube, X, Facebook, Reddit, and more.

Real-time Data

Fresh, accurate, always up-to-date.

No Proxies

We handle the infrastructure.

Developer First

Simple API. Powerful results.

TikTok logoInstagram logoYouTube logoX logoFacebook logoReddit logo
{200 OK
"platform": "youtube",
"type": "video",
"title": "Never Gonna Give You Up",
"views": 12504321,
"transcript": "We're no strangers to love...",
}
Success124ms
Purple gift box representing 100 free ScrapeCreators credits
Get 100 credits on us - instantly.

No credit card required. Start building for free.

Try the API, on us.

New developers get 100 free credits automatically when they sign up. No credit card required.

Get started free
Trusted by 10,000+ developers
99.9% uptime
Secure API access