# TikTok Top Ads API. Top ads, on request.

Best-performing ads by country, period and industry. We handle the proxies, blocks and platform changes.

[Get API key](https://socialtap.dev/signup/?next=%2Fplayground%2F%3Fendpoint%3Dtiktok.top_ads)

## TikTok Top Ads API at a glance

Returns TikTok Creative Center's Top Ads board: the ads that performed best in a market over the last 7, 30 or 180 days. Each ad has its video, headline, brand, industry and campaign objective, with the board's rank, likes, click-through percentile and budget level. Narrow it by industry, objective or ad language, and rank it by Creative Center's own order or by impressions, likes, click-through, conversion or view-through rate. With no params you get the US board for the last 30 days.

GET `/v1/tiktok/top_ads`

[Read the API reference](https://socialtap.dev/docs/reference/tiktok/top_ads/index.md)

- **1 credit** per page, $0.75–$1.97 per 1,000 pages
- **20 typed fields** null when unknown
- **20** best-performing ads per page, Creative Center's rank by rank_by, best first
- **100 credits** free when you sign up, no card, so you can build before you spend

## Send one request. Get up to 20 best-performing ads back.

Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.

`$ npm install socialtap`

[Open in playground](https://socialtap.dev/playground/?endpoint=tiktok.top_ads)

cURL:

```shell
curl 'https://socialtap.dev/v1/tiktok/top_ads' \
  -H "x-api-key: $SOCIALTAP_API_KEY"
```

TypeScript SDK:

```typescript
import { SocialTap } from "socialtap";

const client = new SocialTap(); // apiKey defaults to process.env.SOCIALTAP_API_KEY

const res = await client.tiktok.topAds.list({});
console.log(res.data);
console.log(res.credits.charged, res.meta.request_id);
```

Node.js (fetch):

```javascript
const params = new URLSearchParams({
});
const res = await fetch(`https://socialtap.dev/v1/tiktok/top_ads?${params}`, {
  headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, page, meta } = body;
console.log(data, meta.credits_charged);
```

Python (requests):

```python
import os

import requests

res = requests.get(
    "https://socialtap.dev/v1/tiktok/top_ads",
    params={},
    headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
    raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, page, meta = body["data"], body["page"], body["meta"]
print(data, meta["credits_charged"])
```

Go (net/http):

```go
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"net/url"
	"os"
)

func main() {
	q := url.Values{}
	req, err := http.NewRequest("GET", "https://socialtap.dev/v1/tiktok/top_ads?"+q.Encode(), nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	var body struct {
		Data  json.RawMessage `json:"data"`
		Page  json.RawMessage `json:"page"`
		Meta  map[string]any  `json:"meta"`
		Error *struct {
			Code    string `json:"code"`
			Message string `json:"message"`
		} `json:"error"`
	}
	if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
		log.Fatal(err)
	}
	if body.Error != nil {
		log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
	}
	fmt.Println(string(body.Data), body.Meta["credits_charged"])
}
```

200 OK:

```json
{
  "data": [
    {
      "advertiser": {
        "avatar_url": null,
        "display_name": null,
        "id": null,
        "is_verified": null,
        "url": null,
        "username": null
      },
      "approximate_fields": [],
      "audience_size": null,
      "country_codes": [
        "US"
      ],
      "creatives": [
        {
          "body": null,
          "cta_text": null,
          "link_description": null,
          "link_url": null,
          "media": [
            {
              "alt_text": null,
              "duration_ms": 20781,
              "expires_at": "2026-10-25T18:00:00Z",
              "height": 720,
              "thumbnail_url": "https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0051c001-sg/oUIHIbBqBgTQc9Ni3Es7fBJAe3dDvFrOsUhwGD~tplv-noop.image?dr=18692&refresh_token=64c44a34&x-expires=4070908800&x-signature=SCRUBBED&t=9276707c&ps=14f1eb3e&shp=9e36835a&shcp=317596d8&idc=my&VideoID=v14033g50000davc7dvog65l…",
              "type": "video",
              "url": "https://v16m-default.tiktokcdn.com/SCRUBBED/f2a52380/video/tos/alisg/tos-alisg-ve-0051c001-sg/oQQwvwCN2QbID92BEqngivDqFDfgAB6EFIf8cY/?a=0&bti=NTU4QDM1NGA%3D&&bt=874&ft=cApXJCz7ThWHd6C8LGZmo0P&mime_type=video_mp4&rc=aDpnaDs4aWQ3NDM5N2Q6NkBpajdnM285cmdmZDMzODYzNEAuMi0tMzRhXmAxXjAzX…",
              "width": 720
            }
          ],
          "title": "Flooring Sale This Week Only!"
        }
      ],
      "first_shown_at": null,
      "id": "7691721167887056917",
      "impressions": null,
      "is_active": null,
      "is_political": null,
      "languages": [],
      "last_shown_at": null,
      "paid_by": null,
      "platform": "tiktok",
      "platform_specific": {
        "tiktok": {
          "advertiser_business_id": null,
          "advertiser_registry_location": null,
          "budget": "low",
          "category": "Interior Design & Decorating Services",
          "ctr_top_percent": 63,
          "is_removed": null,
          "like_count": 7,
          "objective": "Lead Generation",
          "rank": 1,
          "removal_country_codes": [],
          "removal_reasons": [],
          "targeting": null
        }
      },
      "publisher_platforms": [
        "tiktok"
      ],
      "reach": null,
      "spend": null,
      "type": "video",
      "unknown_fields": [
        "languages",
        "platform_specific.tiktok.removal_country_codes",
        "platform_specific.tiktok.removal_reasons"
      ],
      "url": "https://ads.tiktok.com/business/creativecenter/topads/7691721167887056917/pc/en"
    },
    {
      "advertiser": {
        "avatar_url": null,
        "display_name": null,
        "id": null,
        "is_verified": null,
        "url": null,
        "username": null
      },
      "approximate_fields": [],
      "audience_size": null,
      "country_codes": [
        "US"
      ],
      "creatives": [
        {
          "body": null,
          "cta_text": null,
          "link_description": null,
          "link_url": null,
          "media": [
            {
              "alt_text": null,
              "duration_ms": 25282,
              "expires_at": "2026-10-25T18:00:00Z",
              "height": 1280,
              "thumbnail_url": "https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0051c001-sg/oUhDPioYDsJVOA9BI3aizgYdEAzkFL5bjAvAM~tplv-noop.image?dr=18692&refresh_token=c8a4f8ed&x-expires=4070908800&x-signature=SCRUBBED&t=9276707c&ps=14f1eb3e&shp=9e36835a&shcp=317596d8&idc=my&VideoID=v14033g50000db1outnog65j5…",
              "type": "video",
              "url": "https://v16m-default.tiktokcdn.com/SCRUBBED/f2a52380/video/tos/alisg/tos-alisg-ve-0051c001-sg/ocgG0NLbIeoARfLAVnwAkGxeIvWbCbGhHgDhIi/?a=0&bti=NTU4QDM1NGA%3D&&bt=1088&ft=cApXJCz7ThWHd6C8LGZmo0P&mime_type=video_mp4&rc=NmY3PGlmOmk4ZjZkZzw6aEBpanc3bG05cndyZTMzODYzNEBgLjQxNDU0NTAxMF4y…",
              "width": 720
            }
          ],
          "title": "9 Home Elements That Age Your Space Instantly"
        }
      ],
      "first_shown_at": null,
      "id": "7693148617658236936",
      "impressions": null,
      "is_active": null,
      "is_political": null,
      "languages": [],
      "last_shown_at": null,
      "paid_by": null,
      "platform": "tiktok",
      "platform_specific": {
        "tiktok": {
          "advertiser_business_id": null,
          "advertiser_registry_location": null,
          "budget": "low",
          "category": "Lifestyle News",
          "ctr_top_percent": 50,
          "is_removed": null,
          "like_count": 5,
          "objective": "Traffic",
          "rank": 2,
          "removal_country_codes": [],
          "removal_reasons": [],
          "targeting": null
        }
      },
      "publisher_platforms": [
        "tiktok"
      ],
      "reach": null,
      "spend": null,
      "type": "video",
      "unknown_fields": [
        "languages",
        "platform_specific.tiktok.removal_country_codes",
        "platform_specific.tiktok.removal_reasons"
      ],
      "url": "https://ads.tiktok.com/business/creativecenter/topads/7693148617658236936/pc/en"
    },
    {
      "advertiser": {
        "avatar_url": null,
        "display_name": null,
        "id": null,
        "is_verified": null,
        "url": null,
        "username": null
      },
      "approximate_fields": [],
      "audience_size": null,
      "country_codes": [
        "US"
      ],
      "creatives": [
        {
          "body": null,
          "cta_text": null,
          "link_description": null,
          "link_url": null,
          "media": [
            {
              "alt_text": null,
              "duration_ms": 27243,
              "expires_at": "2026-10-25T18:00:00Z",
              "height": 1280,
              "thumbnail_url": "https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0051c001-sg/oEqAUk2MnB3I3AFNmBtQhsfDOuDUgBftuV6DE8~tplv-noop.image?dr=18692&refresh_token=331ddbb4&x-expires=4070908800&x-signature=SCRUBBED&t=9276707c&ps=14f1eb3e&shp=9e36835a&shcp=317596d8&idc=my&VideoID=v14033g50000datnapvog65j…",
              "type": "video",
              "url": "https://v16m-default.tiktokcdn.com/SCRUBBED/f2a52380/video/tos/alisg/tos-alisg-ve-0051c001-sg/o8PquQDWIBBEHK7hfDAgERAFHo6hieiTXWvNQh/?a=0&bti=NTU4QDM1NGA%3D&&bt=2105&ft=cApXJCz7ThWHd6C8LGZmo0P&mime_type=video_mp4&rc=aTlkNDY6ODkzNzlpaWVnZ0BpM3U8N205cnNxZDMzODYzNEA0NDVhYmJgNmIxXmNj…",
              "width": 720
            }
          ],
          "title": "Залишайте заявку, щоб дізнатися більше"
        }
      ],
      "first_shown_at": null,
      "id": "7690605832515158037",
      "impressions": null,
      "is_active": null,
      "is_political": null,
      "languages": [],
      "last_shown_at": null,
      "paid_by": null,
      "platform": "tiktok",
      "platform_specific": {
        "tiktok": {
          "advertiser_business_id": null,
          "advertiser_registry_location": null,
          "budget": "low",
          "category": "Home Decor",
          "ctr_top_percent": 88,
          "is_removed": null,
          "like_count": 6,
          "objective": "Lead Generation",
          "rank": 3,
          "removal_country_codes": [],
          "removal_reasons": [],
          "targeting": null
        }
      },
      "publisher_platforms": [
        "tiktok"
      ],
      "reach": null,
      "spend": null,
      "type": "video",
      "unknown_fields": [
        "languages",
        "platform_specific.tiktok.removal_country_codes",
        "platform_specific.tiktok.removal_reasons"
      ],
      "url": "https://ads.tiktok.com/business/creativecenter/topads/7690605832515158037/pc/en"
    }
  ],
  "page": {
    "has_more": false,
    "next_cursor": null,
    "next_cursor_expires_at": null,
    "end_reason": "platform_limit"
  },
  "meta": {
    "request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
    "platform": "tiktok",
    "source": "api",
    "is_cached": false,
    "credits_charged": 1,
    "latency_ms": 816,
    "fetched_at": "2026-10-25T12:00:00Z",
    "input": null,
    "credits_remaining": 9999,
    "client_request_id": null,
    "warnings": []
  }
}
```

Long arrays and strings are shortened here. Real responses are complete.

## One schema on 4 platforms.

The [response reference](https://socialtap.dev/docs/reference/tiktok/top_ads/index.md#response) lists every field, its type and when it is `null`. [See the full schema](https://socialtap.dev/resources/ad/index.md).

- ### Null means unknown

  A field TikTok Ad Library doesn't show is null, never zero or an empty string, so a real zero always means zero.
- ### No input needed

  Every parameter is optional: the plain request returns the default list.
- ### Write one parser

  TikTok Ad Library, Facebook Ad Library, Google Ads Transparency Center and LinkedIn Ad Library answer in these fields, so the code that reads one reads them all.

- **`platform`string**: Library owner's platform ID (facebook for Meta's library, tiktok, google, linkedin).
- **`id`string**: Library ad ID (string).
- **`url`string**: Public library page of the ad.
- **`advertiser`object**: The advertising page, business or account.
- **`paid_by`string**: Disclosed payer ("Paid for by").
- **`is_active`boolean**: True while the ad is running.
- **`first_shown_at`string**: First delivery, RFC 3339 UTC (often date-only: see approximate_fields).
- **`last_shown_at`string**: Last delivery, RFC 3339 UTC; null while active.

Live data from 33 platforms.

[TikTok](https://socialtap.dev/apis/tiktok/index.md) · [Instagram](https://socialtap.dev/apis/instagram/index.md) · [Facebook](https://socialtap.dev/apis/facebook/index.md) · [YouTube](https://socialtap.dev/apis/youtube/index.md) · [Reddit](https://socialtap.dev/apis/reddit/index.md) · [Threads](https://socialtap.dev/apis/threads/index.md) · [Spotify](https://socialtap.dev/apis/spotify/index.md) · [Amazon](https://socialtap.dev/apis/amazon/index.md) · [Apple Music](https://socialtap.dev/apis/applemusic/index.md) · [Pinterest](https://socialtap.dev/apis/pinterest/index.md) · [Rumble](https://socialtap.dev/apis/rumble/index.md) · [X](https://socialtap.dev/apis/x/index.md) · [Bluesky](https://socialtap.dev/apis/bluesky/index.md) · [Twitch](https://socialtap.dev/apis/twitch/index.md) · [LinkedIn](https://socialtap.dev/apis/linkedin/index.md) · [Telegram](https://socialtap.dev/apis/telegram/index.md) · [TikTok Shop](https://socialtap.dev/apis/tiktokshop/index.md) · [Kwai](https://socialtap.dev/apis/kwai/index.md) · [Snapchat](https://socialtap.dev/apis/snapchat/index.md) · [SoundCloud](https://socialtap.dev/apis/soundcloud/index.md) · [Truth Social](https://socialtap.dev/apis/truthsocial/index.md) · [Kick](https://socialtap.dev/apis/kick/index.md) · [Komi](https://socialtap.dev/apis/komi/index.md) · [Lnk.Bio](https://socialtap.dev/apis/linkbio/index.md) · [Linkme](https://socialtap.dev/apis/linkme/index.md) · [Linktree](https://socialtap.dev/apis/linktree/index.md) · [Pillar](https://socialtap.dev/apis/pillar/index.md) · [TikTok Ad Library](https://socialtap.dev/apis/tiktok-ad-library/index.md) · [Facebook Ad Library](https://socialtap.dev/apis/facebook-ad-library/index.md) · [Facebook Events](https://socialtap.dev/apis/facebook-events/index.md) · [Facebook Marketplace](https://socialtap.dev/apis/facebook-marketplace/index.md) · [Google Ads Transparency Center](https://socialtap.dev/apis/google-ads-transparency/index.md) · [LinkedIn Ad Library](https://socialtap.dev/apis/linkedin-ad-library/index.md)

## What teams build with the TikTok Top Ads API.

- ### See which ads win in a market
- ### Track an industry's top ads month by month
- ### Collect winning hooks and headlines for briefs
- ### Compare top ads across countries

## Good to know before you build.

- Logged out, Creative Center serves only the first page of each board, so the page ends with page.end_reason platform_limit.
- Each filter and rank_by value is its own board, so combine them to read more ads.
- platform_specific.tiktok.ctr_top_percent is a percentile, not a rate: a smaller value means a higher click-through rate.
- The board shows no spend, impressions or reach, so those fields are null.
- country_codes is the board's market, and an ad can run in more markets than the one you asked for.
- advertiser holds the brand name the board shows and no account, and advertiser.display_name is null when the board shows no brand.
- Video links are TikTok's signed CDN links and expire at media\[\].expires_at.
- A market Creative Center publishes no board for returns invalid_input naming the markets it does.

## 1 credit per page. Failed requests are free.

Buy credits once and spend them on any endpoint, on any platform.

[Plans and packs](https://socialtap.dev/pricing/index.md) · [How this endpoint is priced](https://socialtap.dev/docs/reference/tiktok/top_ads/index.md#pricing) · [How credits work](https://socialtap.dev/docs/credits/index.md)

| Source | Price per successful page | Per 1,000 pages |
| --- | --- | --- |
| Platform API `api` | 1 credit | $0.75–$1.97 |

- Cache hits are free.
- Credits from packs and top-ups never expire.
- A monthly plan's credits are spent first, and what is left of them ends at each renewal.
- Prices exclude tax: sales tax is added at checkout where it applies.
- Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.

## Questions about the TikTok Top Ads API.

More in the [API reference](https://socialtap.dev/docs/reference/tiktok/top_ads/index.md).

**How much does the TikTok Top Ads API cost?**

A page of up to 20 best-performing ads costs 1 credit. Every successful page is charged, empty pages included. SocialTap credits cost $0.75–$1.97 per 1,000, depending on the plan or pack.

**How do I get the next page?**

Repeat the same request with cursor set to page.next_cursor from the previous response, keeping the other parameters. When page.has_more is false there are no more pages. Cursors expire after 24 hours.

Other platforms

## Ads on 3 more platforms.

- [Facebook Ad Library Ad API](https://socialtap.dev/apis/facebook/ad/index.md) (1 credit · `GET /v1/facebook/ad`)
- [Google Ads Transparency Center Ad API](https://socialtap.dev/apis/google/ad/index.md) (1 credit · `GET /v1/google/ad`)
- [LinkedIn Ad Library Ad API](https://socialtap.dev/apis/linkedin/ad/index.md) (1 credit · `GET /v1/linkedin/ad`)

More TikTok Ad Library

## TikTok Ad Library API. 3 endpoints, one key.

- [TikTok Ad Library Ad API](https://socialtap.dev/apis/tiktok/ad/index.md) (1 credit · `GET /v1/tiktok/ad`)
- [TikTok Ad Library Search API](https://socialtap.dev/apis/tiktok/search_ads/index.md) (1 credit / page · `GET /v1/tiktok/search_ads`)

## See what's on the list right now.

Run it in the playground, or copy the request into your code.

100free credits

- No credit card
- Failed requests are free
- Works on all 218 endpoints

[Start for free](https://socialtap.dev/signup/) [Read the docs](https://socialtap.dev/docs/index.md)

---

[HTML version](https://socialtap.dev/apis/tiktok/top_ads/) · [Docs index for AI agents](https://socialtap.dev/llms.txt) · [All docs in one file](https://socialtap.dev/llms-full.txt)
