Review status of every TikTok Smart+ ad of an advertiser
Returns the review verdict of every Upgraded Smart+ ad of one TikTok advertiser, with each creative's verdict, in one paginated read. Use it to refresh reviews periodically: one call (plus its pages) per advertiser per refresh, instead of GET /v1/ads/{adId}/tiktok-smart-plus-review per ad.
Zernio lists the advertiser's Smart+ ads with /smart_plus/ad/get/ (deleted ones only with includeDeleted=true; the listing is cached for 5 minutes) and reads /smart_plus/ad/review_info/ for up to 100 Smart+ ads per call, across ad groups, one call after another. A full refresh of N Smart+ ads costs about ceil(N / 100) listing calls and ceil(N / 100) review calls on TikTok. Each review is cached for 10 minutes per connection, advertiser and Smart+ ad, shared with the single-ad read, so cached reviews are served without calling TikTok and readAt can be up to 10 minutes old.
TikTok's review endpoint has a strict quota of its own. When it is over quota (or Zernio is holding review reads for this advertiser and connection after an overage), Zernio stops calling TikTok and answers 200 with the reviews it has: incomplete: true, the Smart+ ads still to read in pendingSmartPlusAdIds, and retryAfterSeconds (also in the Retry-After header). Every Smart+ ad of the page is in items, failedSmartPlusAds or pendingSmartPlusAdIds. Wait retryAfterSeconds and read the same page again: only the pending ads reach TikTok.
A Smart+ ad whose review TikTok refuses on its own (for example one deleted on TikTok since the listing was cached) is returned in failedSmartPlusAds with TikTok's error, and the rest of the page is still read. Zernio finds it by splitting the refused batch in halves, at most 16 extra TikTok calls per page; ads still unresolved after that come back in failedSmartPlusAds with the batch error. A refusal of a single ad is remembered for 10 minutes. When both halves of a refused batch are refused with the same TikTok error (for example a permission error), the whole request fails with that error instead.
Items are sorted by adGroupId, then smartPlusAdId, so pages are stable. Read the pages of one advertiser one after another, not in parallel: parallel pages spend the review quota at the same time and come back incomplete.
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Query Parameters
A tiktok or tiktokads account ID
TikTok advertiser ID
Also return Smart+ ads deleted on TikTok (listed with primary_status: STATUS_ALL).
false1 <= value11 <= value <= 1000500Response Body
application/json
application/json
application/json
application/json
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.adcampaigns.listTikTokSmartPlusReviews({ query: { accountId: 'account_abc123', adAccountId: 'adaccount_abc123', },});console.log(data);{ "adAccountId": "string", "includeDeleted": true, "page": 0, "pageSize": 0, "totalPages": 0, "totalSmartPlusAds": 0, "items": [ { "smartPlusAdId": "string", "adGroupId": "string", "campaignId": "string", "review": { "reviewStatus": "approved", "rawReviewStatus": "string", "rejectReasons": [ "string" ], "passedLocations": [ "string" ], "appealStatus": "string", "appealRejectReasons": [ "string" ], "rejections": [ { "reasons": [ "string" ], "suggestion": "string", "forbiddenPlacements": [ "string" ], "forbiddenAges": [ "string" ], "forbiddenLocations": [ "string" ], "content": { "type": "string", "text": "string", "imageId": "string", "videoId": "string", "musicId": "string" } } ] }, "materials": [ { "adMaterialId": "string", "materialType": "spark_post", "tiktokItemId": "string", "videoId": "string", "name": "string", "operationStatus": "string", "reviewStatus": "approved", "rawReviewStatus": "string", "rejectReasons": [ "string" ], "passedLocations": [ "string" ], "rejections": [ { "reasons": [ "string" ], "suggestion": "string", "forbiddenPlacements": [ "string" ], "forbiddenAges": [ "string" ], "forbiddenLocations": [ "string" ], "content": { "type": "string", "text": "string", "imageId": "string", "videoId": "string", "musicId": "string" } } ] } ], "readAt": "2019-08-24T14:15:22Z" } ], "failedSmartPlusAds": [ { "smartPlusAdId": "string", "adGroupId": "string", "campaignId": "string", "error": { "tiktokCode": 0, "message": "string" } } ], "incomplete": true, "pendingSmartPlusAdIds": [ "string" ], "retryAfterSeconds": 0}List shared budgets
Lists a Google Ads account's shared budgets and how many campaigns draw from each. Lists the Google Ads customer's shared campaign budgets (`campaign_budget.explicitly_shared` = true, not removed), with how many campaigns use each. Move a campaign onto one with `sharedBudgetId` on PUT /v1/ads/campaigns/{campaignId}. Google only; other platforms return 501.
Creative library
Lists the creatives saved in a Meta ad account so you can reuse one in a new ad. Lists the ad account's creative library (Meta's `/act_X/adcreatives`), rows returned verbatim. The default projection covers id, name, status, object type, thumbnail, object_story_spec / asset_feed_spec and url_tags; `fields` is a raw-passthrough override. Any creative id here is reusable on the create endpoints via `existingCreativeId`.