Review status of each creative in a TikTok Smart+ ad
Shows which Spark post, video or carousel of an Upgraded Smart+ ad TikTok approved or rejected, with every rejection reason, keyed by the TikTok post id for a Spark post.
Reads TikTok's /smart_plus/ad/review_info/ live (read-only, works on a paused ad) for the
Smart+ ad that holds adId, and returns the ad-level verdict plus one entry per creative.
adId may be the Smart+ ad itself or any creative of it synced as its own ad: Zernio finds
the Smart+ ad in the ad's ad group through /smart_plus/ad/get/, and uses the ad group's only
Smart+ ad when no creative list names the ad.
materialType, tiktokItemId, videoId, name and operationStatus come from the Smart+
ad's creative_list. TikTok leaves out of that list the creatives it added on its own
(creator content, authorized TikTok posts, Creative Library content) and lists each image of a
carousel under its own material id, so those entries come back with the review verdict and
null descriptive fields. TikTok returns no review timestamp; readAt is when Zernio read it.
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Path Parameters
Zernio ad id (24-char hex) or the TikTok ad id: the Smart+ ad id or the ad id of one of its creatives.
Response Body
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.getTikTokSmartPlusAdReview({ path: { adId: 'ad_abc123', },});console.log(data);{ "adId": "string", "platform": "tiktok", "platformAdId": "string", "smartPlusAdId": "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"}Read the platform's review verdict for an ad
Shows whether the platform approved an ad, where it may not deliver, and every rejection reason, without re-enabling a paused ad. Reads the ad's review verdict from the platform now: whether it was approved, where it may not deliver, and every rejection reason with TikTok's suggestion and the piece of content it refers to. Read-only, so it works on a paused ad without re-enabling it. **Google**: reads `ad_group_ad.policy_summary` live. `approvalStatus` and `reviewStatus` are Google's verbatim (`approvalStatus`: APPROVED, APPROVED_LIMITED, AREA_OF_INTEREST_ONLY, DISAPPROVED, UNKNOWN; `reviewStatus`: REVIEW_IN_PROGRESS, REVIEWED, UNDER_APPEAL, ELIGIBLE_MAY_SERVE); `approved` is true for the three approved statuses, false for DISAPPROVED, null otherwise. `policyTopics` carries every policy topic entry with its `type` (PROHIBITED, LIMITED, ...) and Google's `evidences` and `constraints` verbatim; each PROHIBITED topic is also listed in `rejections` (reason = the topic). The `forbidden*` arrays are TikTok-only and always empty on Google. **Meta** (Facebook and Instagram ads): reads the Ad's `ad_review_feedback`, `effective_status` and `issues_info` live. `reviewStatus` is Meta's `effective_status` verbatim (ACTIVE, PAUSED, PENDING_REVIEW, DISAPPROVED, PREAPPROVED, WITH_ISSUES, IN_PROCESS, ...); `approved` is true for ACTIVE and PREAPPROVED, false for DISAPPROVED, null otherwise. `reviewFeedback` carries Meta's feedback verbatim: `global` (reason -> explanation) and `placementSpecific` (placement -> reason -> explanation). Each global reason is listed in `rejections`, and so is each placement-specific reason, with that placement in its `forbiddenPlacements`; the review's `forbiddenPlacements` lists every placement with feedback. When Meta returns no feedback (usually an ad in review or approved everywhere), the status comes back with empty `rejections` and empty `reviewFeedback` maps; an ACTIVE ad rejected on one placement still carries that placement's feedback. A deleted ad answers 404. `issues` is Meta's `issues_info` verbatim. `forbiddenAges`, `forbiddenLocations` and `forbiddenOperatingSystems` are always empty on Meta. TikTok uses `/ad/review_info/`. Platforms other than TikTok, Google and Meta return 501. On TikTok, use it alongside the ad's `platformStatus`: TikTok reports `AD_STATUS_AUDIT` while the ad is in review and `AD_STATUS_AD_PRE_ONLINE` once it passed and is about to deliver (both map to `status: pending_review`); `AD_STATUS_AUDIT_DENY` maps to `rejected`.
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.