Manage Ads
Add ads to an existing TikTok ad group, moderate ad comments, swap creatives, update targeting, duplicate campaigns and list agency Business Centers.
Attach to an existing ad group
POST /v1/ads/create with adSetId creates a new ad inside an existing TikTok ad group. It skips the campaign and ad-group create.
Bid strategy, budget, targeting and goal are inherited from the ad group.
Use it when one ad group was configured by hand in TikTok Ads Manager and you want to add Zernio-managed creatives to it.
Ad comments
GET /v1/ads/{adId}/comments returns the comments on a TikTok ad, in the same normalized shape it returns for Meta.
TikTok also supports moderation: reply, hide or restore, and delete.
This endpoint reaches comments on ad creatives, dark posts included. Comments on organic posts are read and moderated through the inbox instead.
TikTok reads comments over a date window rather than all of history. The window is at most 30 days and defaults to the last 30 days.
See Ad comments for the endpoints, the window rules and the canReply / canDelete / canHide flags.
Listing uses the stored ad group, without resolving identity or looking up the video item ID. meta.tiktokItemId: null does not block it. There is no ad-level identity or item-ID check to perform first.
Moderation flags. canReply and canDelete are per comment, and false when the identity or item needed to moderate is unknown. Hiding does not require an identity.
A direct reply or delete can resolve missing fields lazily. Use the returned capabilities to guide the UI without blocking comment reads.
Creative swap
PUT /v1/ads/{adId} accepts a creative object that replaces the live creative on an existing TikTok ad. It is patch-style: only the fields you supply are touched.
| Field | On TikTok |
|---|---|
headline | Ignored (no slot on TikTok) |
body | Becomes ad_text |
linkUrl | Becomes landing_page_url |
videoUrl | Triggers a fresh upload |
curl -X PUT "https://zernio.com/api/v1/ads/66f0a1b2c3d4e5f6a7b8c9d0" \
-H "Authorization: Bearer $ZERNIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "creative": { "body": "Spring drop, last week", "videoUrl": "https://cdn.example.com/launch-v2.mp4" } }'Response (200):
{
"ad": { "_id": "66f0a1b2c3d4e5f6a7b8c9d0", "platform": "tiktok", "status": "pending_review", "creative": { "body": "Spring drop, last week" } },
"message": "Ad updated"
}Targeting update after creation
PUT /v1/ads/{adId} accepts targeting for TikTok ads, with the same field set as create. Zernio forwards it to /v2/adgroup/update/.
The other networks are narrower:
- Pinterest and X return
501. - Google accepts keyword and device bid adjustments only.
- LinkedIn accepts
countriesonly.
Campaign duplication
POST /v1/ads/campaigns/{campaignId}/duplicate with platform: "tiktok" works through a manual graph walk.
Zernio reads the source campaign, ad groups and ads. It then recreates each entity with bid configuration, targeting, schedule and creative fields preserved.
Spark Ad linkage (tiktok_item_id) carries over.
Everything is created paused, so you can review before launching. The response carries copiedCampaignId.
Agency Business Centers
Connecting a TikTok account that owns one or more Business Centers enumerates every advertiser under those BCs.
There is no per-call cap. GET /v1/ads/accounts walks /v2/bc/asset/get/ (paginated server-side), chunks the /v2/advertiser/info/ lookup underneath, and returns the full roster.
Solo advertisers without a BC fall back to the OAuth-time advertiser list. A single token can typically reach a handful of advertisers without a BC.
The advertiser list is cached on the connection for 1 hour, and refreshed on the next call after expiry.
GET /v1/ads/business-centers?accountId= lists the BCs themselves, with an advertiserCount each, for agency-style pickers.