How to audit Advantage+ enhancements on existing ads through the Marketing API

The interface shows you one ad at a time. The API shows you all of them, and it shows what is applied rather than what you clicked. Here is the read query, what the response means, and the traps in Meta's own documentation.

Adlio team4 min read

Why audit through the API at all

Ads Manager shows the Enhancements panel for one ad at a time, and it shows toggles, not outcomes. The API gives you two things the interface does not: every ad in one query, and the applied set rather than the clicked set, because Meta removes features that are not eligible for an ad before storing the spec. For a weekly batch of forty ads that is the difference between a sample check and a full check.

The read query

The setting lives on the ad creative in the field degrees_of_freedom_spec, which Meta's Ad Creative reference describes as "Specifies the types of transformations that are enabled for the given creative". Read it directly:

GET /v26.0/{creative-id}?fields=degrees_of_freedom_spec,asset_feed_spec

or through the ad, with standard Graph field expansion:

GET /v26.0/{ad-id}?fields=name,creative{degrees_of_freedom_spec,asset_feed_spec}

For a whole ad set:

GET /v26.0/{adset-id}/ads?fields=name,creative{degrees_of_freedom_spec,asset_feed_spec}&limit=200

A typical response for an image creative created with a full opt-out:

{
  "degrees_of_freedom_spec": {
    "creative_features_spec": {
      "image_touchups":                { "enroll_status": "OPT_OUT" },
      "text_optimizations":            { "enroll_status": "OPT_OUT" },
      "image_templates":               { "enroll_status": "OPT_OUT" },
      "image_brightness_and_contrast": { "enroll_status": "OPT_OUT" },
      "image_animation":               { "enroll_status": "OPT_OUT" },
      "image_background_gen":          { "enroll_status": "OPT_OUT" },
      "image_uncrop":                  { "enroll_status": "OPT_OUT" },
      "enhance_cta":                   { "enroll_status": "OPT_OUT" },
      "text_translation":              { "enroll_status": "OPT_OUT" }
    }
  }
}

Every call needs a token with ads_read on the account; if your account enforces app secret proof, include it as on any other server-side Graph call.

How to read the response

  • OPT_OUT present: the feature is off for this creative.
  • OPT_IN present: on, and eligible.
  • Key absent: either never specified, or specified and removed because it was ineligible for this format. Meta's guide: "Features specified as OPT_IN but ineligible for the given ad setup will be automatically removed from the creative_features_spec parameter." The January 2025 developer note adds that ineligible features are "removed entirely from the creative_features_spec field". An absent key on an eligible feature therefore means Meta's default applies, and for most features Meta's default is on ("Some enhancements may be turned on by default", Meta help; inline_comment and description_automation are documented as "Default is opt-in").
  • asset_feed_spec.audios: music is not a creative_features_spec key. Meta's guide: "the music feature ... is implemented with the asset_feed_spec parameter." Empty or absent means no music asset; [{"type": "random"}] means automatic music.

The practical audit rule: for every feature you care about, you want to see an explicit OPT_OUT, not an absence.

What changed in January 2025

Until Marketing API v21, most enhancements travelled as one bundle, standard_enhancements. Meta retired it: "We will deprecate the Standard Enhancements bundle from the Marketing API, starting with MAPI V22.0 (to be released on January 21, 2025)" and "advertisers can no longer create or update ads with Standard Enhancements specified in the API request" (Meta developer blog, 17 January 2025). The v22.0 changelog: "Opting ads in to and previewing ads using the STANDARD_ENHANCEMENTS bundle is no longer supported."

Two consequences for an audit today:

  1. Creatives created before 2025 may still show the bundle key; they are not wrong, they are old. New creatives must opt out per feature.
  2. Sending the bundle key on a create call fails the whole creative. That is the error subcode (3858504) we hit when we first built Adlio's opt-out, and why Adlio never sends it.

The traps in Meta's documentation

Three things that cost us time, so you do not repeat them:

  • The reference table and the guide disagree. Meta's Ad Creative Features Spec reference (v26.0) lists 46 keys, many for catalogue and WhatsApp formats, and omits image_brightness_and_contrast, image_uncrop, enhance_cta, video_auto_crop and video_uncrop; the "Get Started with Advantage+ Creative" guide documents exactly those with their Ads Manager labels. The reference, in turn, lists keys the guide does not describe (site_extensions, profile_card, music_generation, video_highlights). The only reliable list is the one your API version accepts on a real create call.
  • Relevant comments is inline_comment. A key literally named relevant_comments is rejected; inline_comment is the documented key ("Opt in/opt out of Relevant comments enhancement. Default is opt-in."). We got this wrong in an earlier article and have corrected it.
  • Vendor field names are not Meta's. Names such as image_auto_crop_enable or text_optimization_enable that circulate in some guides do not appear in any Meta document; Meta's fields are object keys with an enroll_status.

A minimal audit script

Pseudo-code, any language:

for each ad in GET /{adset-id}/ads?fields=name,creative{degrees_of_freedom_spec,asset_feed_spec}:
  spec   = ad.creative.degrees_of_freedom_spec.creative_features_spec or {}
  audios = ad.creative.asset_feed_spec.audios or []
  for key in REQUIRED_OPT_OUT_KEYS:
    if spec[key].enroll_status != "OPT_OUT": flag(ad.name, key, "not explicitly opted out")
  if len(audios) > 0: flag(ad.name, "music", "audio asset attached")

Run it on the paused batch before setting it live, and again a week later: vendors report enhancements reappearing after edits or duplication (JumpFly, August 2026: replacing the creative, changing the format, duplicating "may cause recommended enhancements to appear selected again"). A read query is the only check that scales to that.

How Adlio uses this

Adlio writes the opt-out into every creative at creation, only with keys verified against the live API, and never sends the retired bundle key. Because every ad lands paused, the audit above can run before a single impression; it is the API version of check 6 on the pre-launch QA checklist. The full control map, including the interface routes, is in how to turn off Advantage+ creative enhancements.

What that looks like from the user's side, folder in and paused ads out, is on bulk upload Facebook ads from a folder.

Frequently asked questions

Which field do I read?+

degrees_of_freedom_spec on the ad creative. Meta's Ad Creative reference lists it as a readable field ("Specifies the types of transformations that are enabled for the given creative"), and the spec reference marks reading as supported and create/update/delete on the spec endpoint itself as unsupported: you set it when creating the creative, and read it back afterwards.

Why are some keys missing from the response?+

Because Meta strips them. The developer guide: "Features specified as OPT_IN but ineligible for the given ad setup will be automatically removed from the creative_features_spec parameter." The January 2025 note repeats it: ineligible features are "removed entirely". So what you read back is the set that can actually apply to that ad.

Can I still use standard_enhancements?+

No. Meta's January 2025 developer note: "beginning with MAPI v22.0 (available January 21, 2025), and all subsequent API versions, advertisers can no longer create or update ads with Standard Enhancements specified in the API request." The key still appears in the reference table, but it is not accepted for create or update; opt out per feature instead.

Where is music in the response?+

Not in creative_features_spec. Meta implements music through asset_feed_spec.audios, so read that field too: an empty or absent audios list means no music asset was attached. Relevant comments, by contrast, is a normal key: inline_comment, "Default is opt-in" per Meta's reference.

Sources

Adlio team

Built by media buyers who launch Meta ads in volume. Questions or corrections: support@adlio.ai.

Topic cluster

Advantage+ control

Keeping Meta's automatic creative enhancements off, on every ad, and proving it.