TikTok Smart+ campaigns: ad set / ad on-off and budget edits are rejected with 422 — please route Smart+ objects to the smart_plus/* endpoints
WHAT WE'RE SEEING
Any write against an object inside a TikTok Upgraded Smart+ campaign is rejected. The error appears to come from TikTok rather than Zernio (type: platform_error).
PUT /v1/ads/ad-sets/1869951936115057/status { "status": "paused", "platform": "tiktok" } -> 422 {"error":"This API does not support Upgraded Smart Plus ads.", "type":"platform_error","code":"platform_api_error","platform":"tiktok"}
PUT /v1/ads/campaigns/1869951871762465 { "platform": "tiktok", "budget": { "amount": 65000, "type": "daily" } } -> 422 (same body)
PUT /v1/ads/1876480917059634/status { "status": "paused", "platform": "tiktok" } -> 422 {"error":"Changes can't be made to creative assets that were auto-generated in a Smart+ campaign. Remove those assets to continue.", ...}
Campaign-level on/off, however, works fine on Smart+ campaigns: PUT /v1/ads/campaigns/1856916649715825/status returns updated: 1 and reverts cleanly. So it isn't that Smart+ campaigns are off-limits - only their child objects and budgets are.
WHAT WE'D LIKE (PRIMARY REQUEST)
Could writes against Smart+ objects be routed to TikTok's dedicated smart_plus/* endpoints?
Per TikTok's Business API docs, Smart+ is managed through a separate endpoint family rather than the standard ones: smart_plus/campaign/ provides Create, Get, Update, StatusUpdate (/open_api/v1.3/smart_plus/campaign/status/update/) and CopyTask, and creative-level enable/disable has its own page ("Disable or enable creatives in a TikTok Upgraded Smart+ Ad"). This matches what we observe in TikTok Ads Manager, where ads inside a Smart+ campaign do show a working on/off toggle.
The wording of the error we get - "This API does not support Upgraded Smart Plus ads" - also reads as "wrong endpoint" rather than "unsupported on the platform".
FALLBACK (IF ROUTING ISN'T FEASIBLE SOON)
If routing isn't practical right now, a field that lets us identify which campaigns are Smart+ would still help: we could disable the affected controls up front so users don't hit a failure after clicking.
One constraint, though: it needs to be on the synced record - the default GET /v1/ads/tree or GET /v1/ads/campaigns response. See point 3 below for why a live-only field wouldn't work for us.
Something equivalent to TikTok's campaign/get fields campaign_type / is_smart_performance_campaign (or automation_type) would be enough.
WHAT WE CHECKED ON OUR SIDE
No Smart+ indicator in the default responses. We went through every field on the campaign rows of GET /v1/ads/tree and GET /v1/ads/campaigns.
nativeSettings (with live=true) doesn't carry it either. It does come back, but with a fixed set of 8 keys (budget_optimize_on, budget, objective_type, operation_status, campaign_id, budget_mode, advertiser_currency, advertiser_timezone), and the payloads for 3 Smart+ campaigns and 1 regular campaign were identical in shape. The spec describes this as TikTok's campaign/get record verbatim, but in practice it looks like a subset.
live=true isn't usable for list rendering. It's capped at 20 campaigns per request (400 "live=true reads at most 20 campaigns per request" above that) and takes about 3.5s for 20. The account we work with has 84 campaigns, so that's 5 calls / ~15s - too slow to put in front of a list view.
Campaign objective doesn't separate them. Most Smart+ campaigns in this account are WEB_CONVERSIONS, which looked like a signal at first, but campaign 1869601509352561 is objective_type: TRAFFIC and is Smart+.
Today the only reliable way we can tell is to attempt a write and read the 422. Re-sending a campaign's existing budget unchanged separates Smart+ (422) from regular (200) perfectly in our sample (4/4), but it's still a write - it would pollute the advertiser's change history, so we can't use it as a general check.
REFERENCE - OBJECTS USED FOR THE CHECKS
Smart+ campaign 1856916649715825 *구매_중동(UAE/사우디)
Smart+ campaign 1869951871762465 *구매_미국
Smart+ campaign (TRAFFIC) 1869601509352561 *트래픽_칠레
Regular campaign 1865514462512418 동영상 조회_칠레 챌린지
Smart+ ad set 1869951936115057 최고거래량
Smart+ ad 1876480917059634 -
Log in to comment and vote
No comments yet
Be the first to share your thoughts.