> ## Documentation Index
> Fetch the complete documentation index at: https://lava.so/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# TikTok Ads

> TikTok's official Marketing API for managing the full lifecycle of TikTok ad campaigns on behalf of authorized advertisers — advertiser discovery, campaigns, ad groups, ads, audiences, custom audiences, creatives, pixels, conversion events, and reporting.

TikTok's official Marketing API for managing the full lifecycle of TikTok ad campaigns on behalf of authorized advertisers — advertiser discovery, campaigns, ad groups, ads, audiences, custom audiences, creatives, pixels, conversion events, and reporting. Best for agents that need to launch, optimize, or report on TikTok ads through TikTok For Business accounts. Unlike aggregator marketing platforms, this is a first-party surface that exposes TikTok-specific targeting (interests, behaviors, hashtags) and granular reporting breakdowns (placement, creative, audience).

14 example endpoints available through Lava's AI Gateway. See the [TikTok Ads API docs](https://business-api.tiktok.com/portal/docs) for full documentation.

<Warning>This provider requires your own credentials — connect your API key or OAuth account before use.</Warning>

<Info>This is a **catch-all provider** — any valid URL under `https://business-api.tiktok.com` is supported. TikTok Marketing API. Base URL: [https://business-api.tiktok.com/open\_api/v1.3](https://business-api.tiktok.com/open_api/v1.3). Auth header is `Access-Token: <token>` (NOT `Authorization: Bearer`). Discover advertiser\_ids via GET /oauth2/advertiser/get/. Most resources are scoped to an advertiser\_id query param, e.g. /campaign/get/?advertiser\_id=...\&campaign\_ids=\[...]. Responses are wrapped in an envelope: `{ code, message, request_id, data }` — non-zero `code` indicates an error. Pagination uses page/page\_size query params and returns `data.page_info { page, page_size, total_number, total_page }`. Reports endpoint (GET /report/integrated/get/) accepts breakdowns, dimensions, metrics, and date ranges as query params. See [https://business-api.tiktok.com/portal/docs](https://business-api.tiktok.com/portal/docs) for full reference. The endpoints below are curated examples.</Info>

## Endpoints

### List advertisers that have granted this app permission to manage their accounts. Start here after OAuth to discover the advertiser\_ids the user authorized; every other endpoint takes one of these as a query param. Requires app\_id and secret as query params alongside the user's Access-Token.

**GET** `https://business-api.tiktok.com/open_api/v1.3/oauth2/advertiser/get/?app_id={app_id}&secret={secret}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/oauth2/advertiser/get/?app_id={app_id}&secret={secret}', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Foauth2%2Fadvertiser%2Fget%2F%3Fapp_id%3D%7Bapp_id%7D%26secret%3D%7Bsecret%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Fetch details for one or more advertisers — currency, time zone, status, balance, contact info. Useful for confirming an authorized advertiser\_id is active before further calls.

**GET** `https://business-api.tiktok.com/open_api/v1.3/advertiser/info/?advertiser_ids=["{advertiser_id}"]` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/advertiser/info/?advertiser_ids=["{advertiser_id}"]', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fadvertiser%2Finfo%2F%3Fadvertiser_ids%3D%5B%22%7Badvertiser_id%7D%22%5D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### List campaigns under an advertiser. Paginated via page/page\_size; response envelope includes data.page\_info \{ page, page\_size, total\_number, total\_page }. Filterable by status, objective\_type, budget\_mode.

**GET** `https://business-api.tiktok.com/open_api/v1.3/campaign/get/?advertiser_id={advertiser_id}&page=1&page_size=20` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/campaign/get/?advertiser_id={advertiser_id}&page=1&page_size=20', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fcampaign%2Fget%2F%3Fadvertiser_id%3D%7Badvertiser_id%7D%26page%3D1%26page_size%3D20" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Create a new campaign under an advertiser. Required: advertiser\_id, campaign\_name, objective\_type (TRAFFIC, CONVERSIONS, REACH, VIDEO\_VIEWS, LEAD\_GENERATION, etc.), budget\_mode, budget. New campaigns default to DISABLE; activate via campaign/update/.

**POST** `https://business-api.tiktok.com/open_api/v1.3/campaign/create/` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/campaign/create/', {
      body: {
    "advertiser_id": "{advertiser_id}",
    "campaign_name": "Q2 Awareness Campaign",
    "objective_type": "TRAFFIC",
    "budget_mode": "BUDGET_MODE_DAY",
    "budget": 50
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fcampaign%2Fcreate%2F" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"advertiser_id":"{advertiser_id}","campaign_name":"Q2 Awareness Campaign","objective_type":"TRAFFIC","budget_mode":"BUDGET_MODE_DAY","budget":50}'
    ```
  </Tab>
</Tabs>

### Update campaign settings. Common: campaign\_name, budget, operation\_status (ENABLE / DISABLE / DELETE). Only fields included are modified.

**POST** `https://business-api.tiktok.com/open_api/v1.3/campaign/update/` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/campaign/update/', {
      body: {
    "advertiser_id": "{advertiser_id}",
    "campaign_id": "{campaign_id}",
    "operation_status": "ENABLE"
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fcampaign%2Fupdate%2F" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"advertiser_id":"{advertiser_id}","campaign_id":"{campaign_id}","operation_status":"ENABLE"}'
    ```
  </Tab>
</Tabs>

### List ad groups under an advertiser (optionally filtered by campaign\_ids). Ad groups carry targeting, placement, bidding, schedule, and conversion event settings.

**GET** `https://business-api.tiktok.com/open_api/v1.3/adgroup/get/?advertiser_id={advertiser_id}&page=1&page_size=20` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/adgroup/get/?advertiser_id={advertiser_id}&page=1&page_size=20', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fadgroup%2Fget%2F%3Fadvertiser_id%3D%7Badvertiser_id%7D%26page%3D1%26page_size%3D20" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Create an ad group under a campaign. Key fields: campaign\_id, adgroup\_name, placement\_type, placements, billing\_event (CPC, CPM, OCPM), bid\_type, bid\_price, schedule\_type, schedule\_start\_time, location\_ids, audience\_ids, interests, pixel\_id (for conversion ad groups).

**POST** `https://business-api.tiktok.com/open_api/v1.3/adgroup/create/` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/adgroup/create/', {
      body: {
    "advertiser_id": "{advertiser_id}",
    "campaign_id": "{campaign_id}",
    "adgroup_name": "US — programmers",
    "placement_type": "PLACEMENT_TYPE_NORMAL",
    "placements": [
      "PLACEMENT_TIKTOK"
    ],
    "location_ids": [
      "6252001"
    ],
    "billing_event": "CPC",
    "bid_type": "BID_TYPE_CUSTOM",
    "bid_price": 0.5,
    "budget_mode": "BUDGET_MODE_DAY",
    "budget": 20,
    "schedule_type": "SCHEDULE_FROM_NOW",
    "operation_status": "DISABLE"
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fadgroup%2Fcreate%2F" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"advertiser_id":"{advertiser_id}","campaign_id":"{campaign_id}","adgroup_name":"US — programmers","placement_type":"PLACEMENT_TYPE_NORMAL","placements":["PLACEMENT_TIKTOK"],"location_ids":["6252001"],"billing_event":"CPC","bid_type":"BID_TYPE_CUSTOM","bid_price":0.5,"budget_mode":"BUDGET_MODE_DAY","budget":20,"schedule_type":"SCHEDULE_FROM_NOW","operation_status":"DISABLE"}'
    ```
  </Tab>
</Tabs>

### List ads under an advertiser (filterable by campaign\_ids or adgroup\_ids). Each ad references a creative (video\_id or image\_ids) and an ad group, inheriting targeting from the ad group.

**GET** `https://business-api.tiktok.com/open_api/v1.3/ad/get/?advertiser_id={advertiser_id}&page=1&page_size=20` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/ad/get/?advertiser_id={advertiser_id}&page=1&page_size=20', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fad%2Fget%2F%3Fadvertiser_id%3D%7Badvertiser_id%7D%26page%3D1%26page_size%3D20" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Create one or more ads under an ad group. Each ad in `creatives[]` needs ad\_name, ad\_format, video\_id (or image\_ids), ad\_text, call\_to\_action, and landing\_page\_url.

**POST** `https://business-api.tiktok.com/open_api/v1.3/ad/create/` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/ad/create/', {
      body: {
    "advertiser_id": "{advertiser_id}",
    "adgroup_id": "{adgroup_id}",
    "creatives": [
      {
        "ad_name": "Programmers — Q2 traffic ad",
        "ad_format": "SINGLE_VIDEO",
        "video_id": "{video_id}",
        "ad_text": "Build faster with our AI tools.",
        "call_to_action": "LEARN_MORE",
        "landing_page_url": "https://example.com/lp"
      }
    ]
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fad%2Fcreate%2F" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"advertiser_id":"{advertiser_id}","adgroup_id":"{adgroup_id}","creatives":[{"ad_name":"Programmers — Q2 traffic ad","ad_format":"SINGLE_VIDEO","video_id":"{video_id}","ad_text":"Build faster with our AI tools.","call_to_action":"LEARN_MORE","landing_page_url":"https://example.com/lp"}]}'
    ```
  </Tab>
</Tabs>

### List custom audiences (CUSTOMER\_FILE, ENGAGEMENT, WEB, APP, LOOKALIKE, etc.) under an advertiser. Use these as targeting building blocks for ad groups.

**GET** `https://business-api.tiktok.com/open_api/v1.3/dmp/custom_audience/list/?advertiser_id={advertiser_id}&page=1&page_size=20` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/dmp/custom_audience/list/?advertiser_id={advertiser_id}&page=1&page_size=20', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fdmp%2Fcustom_audience%2Flist%2F%3Fadvertiser_id%3D%7Badvertiser_id%7D%26page%3D1%26page_size%3D20" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Create a customer-file custom audience. Identifiers must be SHA-256 hashed before upload (TikTok will not hash for you). After creation, use /dmp/custom\_audience/file/upload/ to add hashed identifiers in batches.

**POST** `https://business-api.tiktok.com/open_api/v1.3/dmp/custom_audience/create/` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/dmp/custom_audience/create/', {
      body: {
    "advertiser_id": "{advertiser_id}",
    "custom_audience_name": "Newsletter subscribers — May",
    "audience_sub_type": "NORMAL"
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fdmp%2Fcustom_audience%2Fcreate%2F" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"advertiser_id":"{advertiser_id}","custom_audience_name":"Newsletter subscribers — May","audience_sub_type":"NORMAL"}'
    ```
  </Tab>
</Tabs>

### List TikTok Pixels for an advertiser. Required to find a pixel\_id for conversion-based ad groups and for sending server-side events via the Events API.

**GET** `https://business-api.tiktok.com/open_api/v1.3/pixel/list/?advertiser_id={advertiser_id}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/pixel/list/?advertiser_id={advertiser_id}', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fpixel%2Flist%2F%3Fadvertiser_id%3D%7Badvertiser_id%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### TikTok Events API — post a single server-side pixel event. Body fields: pixel\_code, event (e.g. CompletePayment), event\_id (for deduplication with browser pixel), timestamp (Unix seconds), and context.user identifiers (email, phone\_number, external\_id — all pre-hashed SHA-256). Optional properties for value/currency/content\_id. Used for offline / CRM / CAPI conversion tracking.

**POST** `https://business-api.tiktok.com/open_api/v1.3/pixel/track/` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/pixel/track/', {
      body: {
    "pixel_code": "{pixel_code}",
    "event": "CompletePayment",
    "event_id": "order_12345",
    "timestamp": 1747008000,
    "context": {
      "user": {
        "email": "{sha256_hashed_email}",
        "phone_number": "{sha256_hashed_phone}"
      }
    },
    "properties": {
      "value": 49.99,
      "currency": "USD"
    }
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Fpixel%2Ftrack%2F" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"pixel_code":"{pixel_code}","event":"CompletePayment","event_id":"order_12345","timestamp":1747008000,"context":{"user":{"email":"{sha256_hashed_email}","phone_number":"{sha256_hashed_phone}"}},"properties":{"value":49.99,"currency":"USD"}}'
    ```
  </Tab>
</Tabs>

### Integrated reporting — pull synchronous performance metrics for an advertiser. Specify report\_type (BASIC, AUDIENCE, PLAYABLE\_MATERIAL), data\_level (AUCTION\_CAMPAIGN, AUCTION\_ADGROUP, AUCTION\_AD, AUCTION\_ADVERTISER), dimensions (campaign\_id, adgroup\_id, stat\_time\_day, country\_code, etc.), metrics (impressions, clicks, spend, cpc, ctr, conversions, conversion\_rate), and date\_range (start\_date / end\_date YYYY-MM-DD). Returns paginated rows.

**GET** `https://business-api.tiktok.com/open_api/v1.3/report/integrated/get/?advertiser_id={advertiser_id}&report_type=BASIC&data_level=AUCTION_CAMPAIGN&dimensions=["campaign_id","stat_time_day"]&metrics=["impressions","clicks","spend","cpc","ctr","conversion"]&start_date=2026-05-01&end_date=2026-05-11&page=1&page_size=100` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://business-api.tiktok.com/open_api/v1.3/report/integrated/get/?advertiser_id={advertiser_id}&report_type=BASIC&data_level=AUCTION_CAMPAIGN&dimensions=["campaign_id","stat_time_day"]&metrics=["impressions","clicks","spend","cpc","ctr","conversion"]&start_date=2026-05-01&end_date=2026-05-11&page=1&page_size=100', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fbusiness-api.tiktok.com%2Fopen_api%2Fv1.3%2Freport%2Fintegrated%2Fget%2F%3Fadvertiser_id%3D%7Badvertiser_id%7D%26report_type%3DBASIC%26data_level%3DAUCTION_CAMPAIGN%26dimensions%3D%5B%22campaign_id%22%2C%22stat_time_day%22%5D%26metrics%3D%5B%22impressions%22%2C%22clicks%22%2C%22spend%22%2C%22cpc%22%2C%22ctr%22%2C%22conversion%22%5D%26start_date%3D2026-05-01%26end_date%3D2026-05-11%26page%3D1%26page_size%3D100" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

## Next Steps

<CardGroup cols={2}>
  <Card title="All Providers" icon="grid" href="/gateway/supported-providers">
    Browse all supported AI providers
  </Card>

  <Card title="Forward Proxy" icon="route" href="/gateway/forward-proxy">
    Learn how to construct proxy URLs and authenticate requests
  </Card>
</CardGroup>
