Update an ad set
Ad-set-level writes. Use this for ABO budget updates, ad-set-scoped
pause/resume, bid-strategy edits, Meta value-rule-set attach/detach, and
Meta-only post-launch delivery settings via platformSpecificData. At
least one updatable field is required.
Value rule sets (Meta only, see /v1/ads/value-rule-sets):
- ATTACH or REPLACE: send
valueRuleSetId. Attachment is driven by the id's presence, sovalueRulesApplied: trueis optional. Sending a different id replaces the previous association; there is no separate replace call. - DETACH: send
valueRulesApplied: falseand OMITvalueRuleSetId. - Sending
valueRulesApplied: falseTOGETHER withvalueRuleSetIdreturns 400mutually_exclusive_fields. This is deliberate: Meta attaches the rule set whenevervalue_rule_set_idis present, even withvalue_rules_appliedfalse, so echoing stored state while asking to detach would silently keep the bid adjustments live. - Eligibility: only ad sets on
LOWEST_COST_WITHOUT_CAPorCOST_CAP. Meta rejects the rest server-side. - Read back with
GET /v1/ads/ad-sets/{adSetId}?fields=value_rule_set_id. Meta does not documentvalue_rules_appliedas a readable ad-set field, so the boolean cannot be read back.
Bid strategy compatibility (per Meta's spec):
LOWEST_COST_WITHOUT_CAP: nobidAmount, noroasAverageFloor.LOWEST_COST_WITH_BID_CAP/COST_CAP:bidAmountREQUIRED (whole currency units).LOWEST_COST_WITH_MIN_ROAS:roasAverageFloorREQUIRED (decimal multiplier, e.g. 2.0 = 2.0x ROAS).- Meta only: send
bidAmountWITHOUTbidStrategyto change the cap amount on an ad set under a COST_CAP / LOWEST_COST_WITH_BID_CAP parent campaign, leaving the strategy itself (inherited from the campaign) untouched.roasAverageFloorwithoutbidStrategyis rejected (it has no meaning outside LOWEST_COST_WITH_MIN_ROAS).
Delivery settings are validated by Meta against the campaign objective; incompatible combinations (e.g. a billingEvent the optimization goal doesn't allow) surface as 400s from Meta.
When updating budget on an ABO campaign: if the parent campaign is
CBO, the response is 409 with code BUDGET_LEVEL_MISMATCH — route to
PUT /v1/ads/campaigns/{campaignId} instead.
Authorization
bearerAuth API key authentication - use your Zernio API key as a Bearer token
In: header
Path Parameters
Platform ad set ID
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
{ "budget": { "amount": 0, "type": "daily" }, "budgetLevel": "adset", "status": "active", "statusUpdated": 0, "statusSkipped": 0, "statusSkippedReasons": [ "string" ], "statusMessage": "string", "bidStrategy": "LOWEST_COST_WITHOUT_CAP", "bidAmount": 0, "roasAverageFloor": 0, "platformSpecificData": {}}Live ad-set details incl. learning phase
Reads the ad set live from Meta, returned verbatim. The default projection includes `learning_stage_info` (learning-phase status: LEARNING / SUCCESS / FAIL / WAIVING — Meta omits its `status` key on paused ad sets), delivery settings, budgets, schedule and targeting. `fields` is a raw-passthrough override; unknown fields return Meta's 400 verbatim.
Duplicate an ad set
Duplicates an ad set, including its ads and creatives by default (`deepCopy: true`), via Meta's native `POST /{adset-id}/copies`. The copy is created paused so callers can review before launching. `campaignId` retargets the copy into another campaign; omitted = the source's own campaign. The new hierarchy materializes asynchronously — sync discovery is triggered automatically (`syncAfter: false` to skip).