TikTok Ad Library Ads Search API
Search TikTok ads by keyword, brand or slogan, by country and date range: advertiser, ad text, audience size, subject and first and last day shown.
- 10 credits per call
- Failed calls are free
- Updated
- tiktok-adlibrary.ad.search
{ "total_items": 50, "items": [ { "name": "NIKE Retail B.V.", "title": "Trainiere ohne Kompromisse - im Nike Hybrid RN.", "audit_status": "1", "estimated_audience": "100K-200K", "first_shown_date": 1791936000000, "id": "1879011035967585", "impression": 0, "last_shown_date": 1791936000000, "rejection_info": null, "show_mode": 2, "sor_audit_status": "1", "spent": "", "type": "2" }, { "name": "NIKE Retail B.V.", "title": "Trainiere ohne Kompromisse - im Nike Hybrid RN.", "audit_status": "1", "estimated_audience": "10K-100K", "first_shown_date": 1791936000000, "id": "1879008267714690", "impression": 0, "last_shown_date": 1791936000000, "rejection_info": null, "show_mode": 2, "sor_audit_status": "1", "spent": "", "type": "2" } ]}
| # | Advertiser | Ad text | Audience | First shown | Last shown | Ad ID | Audit status | Impression | Show mode | Sor audit status |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 100K-200K | 1,791,936,000,000 | 1,791,936,000,000 | 1879011035967585 | 1 | 0 | 2 | 1 |
| 2 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 10K-100K | 1,791,936,000,000 | 1,791,936,000,000 | 1879008267714690 | 1 | 0 | 2 | 1 |
| 3 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 10K-100K | 1,791,936,000,000 | 1,791,936,000,000 | 1879011032364849 | 1 | 0 | 2 | 1 |
| 4 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 100K-200K | 1,791,936,000,000 | 1,791,936,000,000 | 1879011042908338 | 1 | 0 | 2 | 1 |
| 5 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 10K-100K | 1,791,936,000,000 | 1,791,936,000,000 | 1879011035967569 | 1 | 0 | 2 | 1 |
| 6 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 10K-100K | 1,791,936,000,000 | 1,791,936,000,000 | 1879011040882386 | 1 | 0 | 2 | 1 |
| 7 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 10K-100K | 1,791,936,000,000 | 1,791,936,000,000 | 1879011032364833 | 1 | 0 | 2 | 1 |
| 8 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 10K-100K | 1,791,936,000,000 | 1,791,936,000,000 | 1879011040882402 | 1 | 0 | 2 | 1 |
| 9 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 10K-100K | 1,791,936,000,000 | 1,791,936,000,000 | 1879011042908322 | 1 | 0 | 2 | 1 |
| 10 | NIKE Retail B.V. | Trainiere ohne Kompromisse - im Nike Hybrid RN. | 10K-100K | 1,791,936,000,000 | 1,791,936,000,000 | 1879008267714674 | 1 | 0 | 2 | 1 |
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| query | string | yes | The keyword, brand, product or slogan to search for, such as nike. | nike |
| country | string | no | A country the library covers, such as DE, FR or GB, or ALL. The regions endpoint lists them. | ALL · AT · BE · BG · CH · CY · CZ · DE · DK · E… |
| cursor | string | no | Pass next_cursor from the last response to get the next page. | |
| end_date | string | no | Only ads shown up to this day (YYYY-MM-DD). Today by default. | |
| limit | integer | no | How many ads to return in this call. | |
| start_date | string | no | Only ads shown on or after this day (YYYY-MM-DD). By default, 30 days before the end date. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| items[].name | string | The advertiser's registered name. | NIKE Retail B.V. |
| items[].title | string | The ad's text. | Trainiere ohne Kompromisse - im Nike Hybrid RN. |
| items[].estimated_audience | string | TikTok's audience band, such as 100K-200K. | 100K-200K |
| items[].first_shown_date | integer | The first day the ad was shown, as a Unix time in milliseconds. | 1,791,936,000,000 |
| items[].last_shown_date | integer | The last day the ad was shown, as a Unix time in milliseconds. | 1,791,936,000,000 |
| items[].id | string | TikTok's ID for the ad, used by the ad detail endpoint. | 1879011035967585 |
| items[].audit_status | string | TikTok's review status code for the ad. | 1 |
| items[].impression | integer | Impressions as a number, when TikTok gives one; often 0. | 0 |
| items[].rejection_info | null | Why TikTok rejected the ad, when it did. | null |
| items[].show_mode | integer | TikTok's code for how the ad is shown. | 2 |
| items[].sor_audit_status | string | A second review status code TikTok gives the ad. | 1 |
| items[].spent | string | Amount spent on the ad, when TikTok shows it. | |
| items[].type | string | TikTok's code for the kind of ad. | 2 |
| items | array | The results. | 50 records |
| total_items | integer | How many results this response holds. | 50 |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "tiktok-adlibrary.ad.search", "input": { "query": "nike" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "tiktok-adlibrary.ad.search", "input": { "query": "nike" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "tiktok-adlibrary.ad.search", "input": { "query": "nike" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
Using Upscrape, search the TikTok Ad Library for nike and give me a table of advertiser, ad text, audience size and the days each ad was first and last shown.
More from the TikTok Ad Library API
The same data from other platforms
TikTok Ad Library Ads Search API FAQ
The short answers. The docs have the long ones.
How much does the TikTok Ad Library Ads Search API cost?
10 credits per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send query. The input fields below list every option with its type and limits.
Do I need a TikTok Ad Library login?
No. It reads public TikTok Ad Library data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds tiktok-adlibrary.ad.search, checks its price and runs it with the same credits as the REST API.
Your first TikTok Ad Library call is free.
Up to 100 free credits to start, no card needed.