Turning off Advantage+ creative enhancements, and proving they stayed off

· updated · 7 min read · by Everix

A Ben Heath video from this week has a comment section that reads like a support queue. Someone built a campaign last night and the AI-asset and enhancement options were simply missing. Someone else keeps switching the website-links enhancement off and Meta keeps switching it back on. A wedding videographer says Meta changes the contrast and colour of images that are, in his words, the product. The question under all three is the same: is this now forced, or is the switch just somewhere else?

Enhancements are stored per creative, not per account or per campaign, which is why switching one off does not keep it off for the next ad. In the API the field is enroll_status, what Meta stores does not match the documented defaults, and nothing counts as off until a GET says it is.

Where the switch actually is

It is per creative, and it lives in the Marketing API on the ad creative object, under degrees_of_freedom_spec → creative_features_spec. Each enhancement is a named feature with one field, enroll_status, which is either OPT_IN or OPT_OUT. That is the whole mechanism. There is no account-level master switch in the API, and there is no campaign-level one; the decision is attached to the creative you are creating, and a new creative is a new decision.

Meta's developer documentation lists 46 features you can set. When we read our own creatives back, Meta had stored 83 keys, so the documented list is only part of what is there. Grouped, the documented ones are:

  • Image: image_brightness_and_contrast, image_touchups, image_uncrop, image_templates, image_background_gen, image_animation, image_text_translation.
  • Video: video_auto_crop, video_uncrop, video_filtering, translate_voiceover, reveal_details_over_time.
  • Text: text_optimizations, add_text_overlay, description_automation, text_translation, enhance_cta, inline_comment.
  • Format and placement: adapt_to_placement, media_type_automation, creative_stickers, product_extensions, pac_relaxation.

The videographer's problem has a name on that list: image_brightness_and_contrast, with image_touchups next to it. The website-links complaint is different: that enhancement does not appear in the documented creative_features_spec list as of this writing, and Ads Manager surfaces it as a destination option, so for that one the switch is in the interface and there is no key to send — worth knowing before you go looking for one. A preview that will not load for some placements is a separate problem with two documented causes.

What is actually on by default

This is the part that explains the "forced" feeling. The documentation says omitting a feature means you are not enrolled in it, with adapt_to_placement as the one default opt-in. That is not what we read back. On ads we created through the API in our own account, adapt_to_placement came back off, the features the documentation describes as on by default came back off, and video_auto_crop, video_filtering and video_uncrop came back on. Once a creative carries any creative_features_spec, every key you did not name read back as OPT_OUT. So do not work from a list of defaults: name every feature, then read back what was stored. Ads Manager is a different surface with its own defaults, and its defaults are what most advertisers are fighting. Every ad you create or duplicate there is a new creative, and a new creative comes with the interface's defaults, not with the choices you made on the last one.

That is why it keeps coming back. Nothing is being switched on behind your back on an existing ad; the next ad simply does not inherit anything.

The recipe, and the part people skip

  • When you create the creative (or the ad, which creates one), send degrees_of_freedom_spec with creative_features_spec listing every feature you care about and enroll_status: OPT_OUT on each. Listing them explicitly is cheap and it is the only version that survives someone changing the defaults later.
  • Music is the odd one out. It is not in creative_features_spec; you opt out by passing an empty array in asset_feed_spec.audios.
  • Then read it back. GET the creative and retrieve creative_features_spec. Meta's documentation says features that are opted in but ineligible for the ad setup are removed automatically, which is a polite way of saying what you sent is not necessarily what got stored. The read-back is the only statement of what is actually on.
  • Compare the read-back to your policy, feature by feature, and treat any mismatch as a failure of the creation step, not as a warning.

If you keep one thing: enroll_status is stored per creative, the stored defaults are not the documented ones, and nothing counts as off until a GET says it is.

What this means if an agent is making the ads

An AI that creates ads through the API is in a better position than a person clicking through Ads Manager, for one reason: it can be told the policy once and made to send it every time. The failure mode is the same as the human one — forgetting on the tenth ad — except that a script does not forget. What it can still do is trust its own write. "I set OPT_OUT" is a claim about the request; the enhancement being off is a claim about Meta's stored object, and only the read-back proves the second. A tool that creates creatives and does not read creative_features_spec back is reporting its intentions.

Where we sit

Everix builds and runs Meta campaigns from a conversation. We do not generate creative for you. When Everix creates an ad it names every enhancement: the visual ones that fit your image or video to a placement stay on, such as cropping, placement formats, brightness and touch-ups; the ones that rewrite your copy or change where the click lands stay off, and so does anything Meta has not documented. It then reads back what Meta stored, checks again on every daily sync, and the lane page shows which ones are on. Cuts and pauses happen on their own; anything that spends more waits for a human, unless you have switched that lane to autopilot yourself, and then only inside the monthly budget you approved.

If you are reading this because an ad went out with enhancements you did not choose, pull the creative with fields=degrees_of_freedom_spec before you change anything. You will find out in one call whether the problem was the default, the duplication, or the tool that said it had turned them off.

Frequently asked questions

How do I turn off Advantage+ creative enhancements?
Advantage+ creative enhancements are switched off per creative, not per account. In the Marketing API, send degrees_of_freedom_spec with creative_features_spec, and enroll_status: OPT_OUT on every feature you care about, when you create the creative. In Ads Manager, check them on every new or duplicated ad, because each one starts from the interface's defaults.
Why do Advantage+ creative enhancements keep turning back on?
They are stored per creative. Every ad you create or duplicate is a new creative, and it does not inherit the choices you made on the last one. Nothing is switched back on for an existing ad; the next ad simply starts from the defaults again.
Is there an account-level switch for Advantage+ creative enhancements?
Not in the Marketing API. There is no account-level or campaign-level switch there; the setting is attached to each creative.
Which Advantage+ creative enhancement is on by default in the API?
Do not rely on a list. The documentation names adapt_to_placement as the default opt-in, but on API-created ads in our own account it read back off, while video_auto_crop, video_filtering and video_uncrop read back on. Once you send any creative_features_spec, every key you leave out reads back as OPT_OUT. Name each feature and read the creative back.
How do I stop Meta changing the brightness and contrast of my images?
Opt out of image_brightness_and_contrast, and image_touchups next to it, in creative_features_spec on each creative.
How do I opt out of the website links enhancement?
Website links is not in the documented creative_features_spec list as of this writing. Ads Manager shows it as a destination option, so switch it off there.
How do I opt out of music on Meta ads through the API?
Music is not in creative_features_spec. Pass an empty array in asset_feed_spec.audios.
How do I check that creative enhancements are really off?
GET the creative with fields=degrees_of_freedom_spec and read creative_features_spec. Meta's documentation says opted-in features that are ineligible for the ad are removed automatically, so what you sent is not necessarily what was stored. The read-back is the only statement of what is actually on.