Dynamic Creative

Dynamic Creative is in beta and requires whitelisting through your Facebook account representative.

Dynamic creative enables you to leverage Facebook's exploration to automatically experiment and deliver different variations of an ad's creative. This helps you find the best ad creative combination per impression by taking your ad's images, titles, descriptions, and other assets, then learning from outcomes of how these combinations perform across audiences.

It automatically builds and displays the best creatives for groups of people in your broader target audience. This improves your ability to efficiently explore numerous creative combinations and audiences. Dynamic Creative aims to improve ads ROI by:

  • Automating workflow used to test creative
  • Choosing the effective combination of creative assets through learning across audiences

To create a campaign:

  1. Create a campaign
  2. Create an ad set
  3. Create an ad and specify asset feed inline OR create an asset feed and reference it in your ad

Create Campaign and Ad Set for Link Clicks

Creating a Dynamic Creative Campaign is the same as a normal campaign. Requirements:

  • objective: Must be LINK_CLICKS
  • buying_type: Must be the default, AUCTION, or left blank.
curl \
-F "name=Dynamic Creative Sample Campaign" \
-F "objective=LINK_CLICKS" \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/campaigns

On success, you get a new Campaign ID:

{"id":"23842500259110001"}

Create Ad Set

Create an ad set as you would for any other campaign. Requirements:

  • optimization_goal=LINK_CLICKS
  • billing_event=IMPRESSIONS or CLICKS
  • promoted_object: Not required. For app engagement, you should provide application_id and object_store_url.
  • targeting: 'publisher_platforms':['facebook', 'audience_network', 'instagram'], 'facebook_positions':['feed']
  • lifetime_imps: do not use
  • is_autobid or bid_amount: Must specify one, must match bidding type and value for regular ad set if you are comparing dynamic creative ads with regular ads

Example for Link Clicks ad set

curl \
-F "name=Dynamic Creative Ad Set" \
-F "campaign_id=<CAMPAIGN_ID>" \
-F "optimization_goal=LINK_CLICKS" \
-F "billing_event=IMPRESSIONS" \
-F "is_autobid=true" \
-F "lifetime_budget=500000" \
-F "end_time=1461974400" \
-F "targeting={
     'geo_locations':{'countries':['US']},
     'publisher_platforms':['facebook', 'audience_network', 'instagram']
   }" \
-F "tracking_specs=[
        {
          'action.type': [
            'offsite_conversion'
          ],
          'fb_pixel': [
            '<PIXEL_ID>'
          ]
        }
    ]" \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/adsets

Response

Ad set creation returns a new Ad Set ID

{"id":"23842500259260001"}

Note: asset_feed_id was available on ad set level, however you should now specify asset_feed_id on ad creative level. See Providing ad Creative. asset_feed_id on ad set level remains as a read-only field for existing ad sets.

Create Campaign and Ad Set for Conversions

Creating a Dynamic Creative Campaign is the same as a normal campaign. Requirements:

  • objective: Must be CONVERSIONS
  • buying_type: Must be the default, AUCTION, or left blank.
curl \
-F "name=Dynamic Creative Sample Campaign" \
-F "objective=CONVERSIONS" \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/campaigns

On success, you get a new Campaign ID:

{"id":"23842500259110001"}

Create Ad Set

Create an ad set as normal. Requirements:

  • optimization_goal=CONVERSIONS
  • billing_event=OFFSITE_CONVERSIONS (default), LINK_CLICKS, REACH, or IMPRESSIONS
  • promoted_object: For pixel conversion, must provide pixel_id and custom_event_type. For app engagement, must provide application_id, custom_event_type and object_store_url.
  • targeting: 'publisher_platforms':['facebook', 'audience_network']
  • lifetime_imps: do not use
  • is_autobid or bid_amount: Must specify one, must match bidding type and value for regular ad set if you are comparing dynamic creative ads and regular ads

Example for Conversions ad set

curl \
-F "name=Dynamic Creative Ad Set" \
-F "campaign_id=<CAMPAIGN_ID>" \
-F "optimization_goal=OFFSITE_CONVERSIONS" \
-F "billing_event=IMPRESSIONS" \
-F "is_autobid=true" \
-F "promoted_object={'pixel_id':<PIXEL_ID>, 'custom_event_type':<EVENT_TYPE>}" \
-F "lifetime_budget=500000" \
-F "end_time=1461974400" \
-F "targeting={
     'geo_locations':{'countries':['US']},
     'publisher_platforms':['facebook', 'audience_network'],
     'custom_audiences':[{'id':6004192254512}]}
   }" \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/adsets

Response

Ad set creation returns a new Ad Set ID

{"id":"23842500259260001"}

Create Campaign and Ad Set for App Installs

Creating a Dynamic Creative Campaign is the same as a normal campaign. Requirements:

  • objective: Must be APP_INSTALLS.
  • buying_type: Must be the default, AUCTION, or left blank.
curl \
-F "name=Dynamic Creative Sample Campaign" \
-F "objective=APP_INSTALLS" \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/campaigns

On success, you get a new Campaign ID:

{"id":"23842500259110001"}

Create Ad Set

Create an ad set as normal. Requirements:

  • optimization_goal=APP_INSTALLS, OFFSITE_CONVERSIONS, or LINK_CLICKS
  • billing_event=IMPRESSIONS or APP_INSTALLS
  • promoted_object: Must provide object_store_url and application_id. URL must match asset feed\'s link_urls
  • targeting: 'publisher_platforms':['facebook', 'audience_network']
  • lifetime_imps: do not use
  • is_autobid or bid_amount: Must specify one, must match bidding type and value for regular ad set if you are comparing dynamic creative and regular ads

Example for App Installs ad set

curl \
-F "name=Dynamic Creative AdSet" \
-F "campaign_id=<CAMPAIGN_ID>" \
-F "optimization_goal=APP_INSTALLS" \
-F "billing_event=IMPRESSIONS" \
-F "is_autobid=true" \
-F "promoted_object={'object_store_url':'https://itunes.apple.com/us/app/facebook/id284882215','application_id':<ADVERTISED_APP_ID>}" \ // object_store_url must match what is provided in asset feed's link_urls 
-F "lifetime_budget=20000" \
-F "end_time=1461974400" \
-F "targeting={
     'geo_locations':{'countries':['US']},
     'age_min':18,
     'age_max':24,
     'publisher_platforms':['facebook', 'audience_network'],
     'user_os':['ios']
   }" \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/adsets

Response

Ad set creation returns a new Ad Set ID

{"id":"23842500259260001"}

Note: asset_feed_id was available on ad set level in v2.8 and prior. Moving forward, please specify on ad creative level as described below. asset_feed_id on ad set level will remain as a read-only field for legacy ad sets.

link_url in asset feed is required, must match ad set's promoted_object. Limit 1 for APP_INSTALLS objective

Create Ad Creative

Specify asset_feed_id or asset_feed_spec, page_id, and instagram_actor_id, if applicable, on the ad creative.

  • asset_feed_spec allows you to create the asset feed inline with the creative.
  • asset_feed_id requires you create the asset feed first, then reference it in ad creative creation.

Example creating a dynamic creative ad creative with asset_feed_spec:

Refer to asset feed parameters for asset feed spec.

curl \
  -F 'access_token=<ACCESS_TOKEN>' \
  -F 'object_story_spec={
       "page_id": "<YOUR_PAGE_ID>"
       "instagram_actor_id" : "<INSTAGRAM_ACTOR_ID>", // only used for instagram placement
    }' \
  -F "asset_feed_spec={'images': [{'hash':'1cd8e1b5de5a76c24f989d94160bfb06'}, {'hash':'2cd8e1b5de5a76c24f989d94160bfb06'}], 'bodies': [{'text':'Begin Your Adventure'}, {'text':'Once a Trainer, always a Trainer.'}], 'titles': [{'text':'Level Up'}, {'text':'Swipe to evolve'}], 'descriptions': [{'text':'Begin Your Adventure'}], 'ad_formats': ['SINGLE_IMAGE'], 'link_urls': [{'website_url':'<WEBSITE_URL>'}]}" \
https://graph.facebook.com/<VERSION>/act_<AD_ACCOUNT_ID>/adcreatives

Example creating a dynamic creative ad creative with asset_feed_id:

Refer to asset feed creation for how to generate asset_feed_id

curl \
  -F 'access_token=<ACCESS_TOKEN>' \
  -F 'object_story_spec={
       "page_id": "<YOUR_PAGE_ID>"
       "instagram_actor_id" : "<INSTAGRAM_ACTOR_ID>", // only used for instagram placement
    }' \
  -F 'asset_feed_id=<ASSET_FEED_ID>'\
https://graph.facebook.com/<VERSION>/act_<AD_ACCOUNT_ID>/adcreatives

Since dynamic creative is a new system, it can be difficult to set up a baseline to compare dynamic creative ad performance with the performance of standard ads. We recommend that you use split testing to measure the performance of Dynamic Creative ads against the ads in our current system. This way, you can cleanly split the user groups and avoid overlap. Once you've determined if it will perform better for you, we recommend to shift all ads into a Dynamic Creative asset feed and stop running split tests.

curl \
  -F 'name=Dynamic Creative Ad' \
  -F 'adset_id=<ADSET_ID>' \
  -F 'access_token=<ACCESS_TOKEN>' \
  -F 'creative={
      "creative_id": <CREATIVE_ID>,
   }' \
https://graph.facebook.com/<VERSION>/act_<AD_ACCOUNT_ID>/ads

When creating a dynamic creative ad, the ad set must be empty, and only one ad creation is allowed. Additional dynamic creative ads must be created in a new ad set. Once created, dynamic creative ad cannot be deleted/archived. Parent Dynamic Creative ad set should be deleted/archived in such case.

Your campaign is now viewable through Power Editor and Ads Manager.

Now your ad is in Facebook Ad Review before the campaign runs. Facebook checks that your ad meets Facebook Advertising Policies.

Asset Customization

Asset Customization is a new feature where you can use different images or videos for different placements in one ad and we deliver the images or videos to the configured placement. You can benefit from placement optimization and with the option to use different media for the placements.

Note: This feature is available in API version 2.10 and later only.

For more information, see:

  • Image Ads—Ads Help Center, Customize Facebook, Instagram and Audience Network image ads
  • Video Ads—Ads Help Center, Customize Facebook, Instagram and Audience Network image ads

Get started

  • Create a campaign
  • Create an ad set
  • Create an ad and specify asset feed inline OR create an asset feed and reference it in your ad

Restrictions

  1. ObjectivesBRAND_AWARENESS, REACH, LINK_CLICKS, APP_INSTALLS, and CONVERSIONS objective.
  2. For LINK_CLICKS and CONVERSIONS, app engagement is unsupported.
  3. Placements—Facebook Feed, Facebook Instream, Instagram Feed, Instagram Story, Audience Network Native, Banner and Interstitial, Audience Network Rewarded Video and Audience Network Instream Video.
  4. Buying typeAUCTION.
  5. Campaign structure— Asset Customization ads need to maintain a 1:1 relationship with their parent ad set. An Asset Customization ad should not have any sibling ads.
  6. Asset feeds:
    • Titles, descriptions, bodies text maximum length is 255.
    • No two image or video assets can be the same.
    • Each image or video should have a label attached with them.
    • The number of target rules in the asset feed should be the same as the number of images/videos used in the asset feed.

Create a Campaign and Ad Set for Link Clicks

Create a campaign

Create a campaign as a normal campaign.

Requirements:

  • objective—Must be LINK_CLICKS.
  • buying_type—Must be the default, AUCTION, or left blank.
curl 
-F "name=Asset Customization Sample Campaign" 
-F "objective=LINK_CLICKS" 
-F "access_token=ACCESS_TOKEN" 
https://graph.facebook.com/API_VERSION/act_AD_ACCOUNT_ID/campaigns

On success, you get a new Campaign ID:

{"id":"CAMPAIGN_ID"}

Create an Ad Set

Create an ad set as you would for any other campaign.

Requirements:

  • optimization_goal=LINK_CLICKS
  • billing_event=IMPRESSIONS or CLICKS
  • promoted_object—Not required.
  • targeting'publisher_platforms':['facebook', 'audience_network', 'instagram'], 'facebook_positions':['feed']
  • lifetime_imps—Don't use.
  • is_autobid or bid_amount—You must specify one.
curl 
  -F "name=Asset Customization Ad Set" 
  -F "campaign_id=CAMPAIGN_ID" 
  -F "optimization_goal=LINK_CLICKS" 
  -F "billing_event=IMPRESSIONS" 
  -F "is_autobid=true" 
  -F "lifetime_budget=500000" 
  -F "end_time=1461974400" 
  -F "targeting={
     'geo_locations':{'countries':['US']},
     'publisher_platforms':['facebook', 'audience_network', 'instagram'],
     'facebook_positions':['feed', 'instream_video'],
     'instagram_positions':['stream', 'story']
   }" 
  -F "tracking_specs=[
        {
          'action.type': [
            'offsite_conversion'
          ],
          'fb_pixel': [
            '<PIXEL_ID>'
          ]
        }
    ]" 
  -F "access_token=ACCESS_TOKEN" 
https://graph.facebook.com/API_VERSION/act_AD_ACCOUNT_ID/adsets

The ad set creation returns a new Ad Set ID:

{"id":"ADSET_ID"}

Create an asset feed with target rules

Restrictions

  1. Optimization type—The optimization_type field should always be PLACEMENT for Asset Customization ads.
  2. Ad formats:
    • Two ad_formats are supported—SINGLE_IMAGE and SINGLE_VIDEO.
    • Only one ad_format is allowed in one asset feed.
  3. At most, you can provide one item in the bodies, titles, descriptions, link_urls, and call_to_actions_types field.
  4. If you don't specify any description, we scrape the link you provided to retrieve the description as we now do for link ads.
  5. Title/Description/Body text max length is 255.
  6. The item in the link_urls field can contain a website_url and a display_url.
  7. Asset feed—Read only; you can reuse an asset feed ID, but not edit it. To change or reuse an asset feed, create a new one.
  8. Target rules:
    • The number of target rules in the spec should be the same as the number of images or videos specified.
    • The placement targeting in each target rule should be unique.
curl 
  -F 'object_story_spec={
       "page_id": "PAGE-ID",
       "instagram_actor_id": "INSTAGRAM-ID",
     }' 
  -F 'asset_feed_spec={
    "optimization_type": "PLACEMENT",
    "videos": [
      {
        "adlabels": [
          {
            "name": "labelfb",
          }
        ],
        "video_id": "10154618295707554"
      },
      {
        "adlabels": [
          {
            "name": "labelig",
          }
        ],
        "video_id": "10154618298562554"
      }
    ],
    "bodies": [
      {
        "text": "Begin Your Adventure"
      }
    ],
    "link_urls": [
      {
        "website_url": "WEBSITE_URL",
        "display_url": "DISPLAY_UR"
      }
    ],
    "titles": [
      {
        "text": "Level Up"
      }
    ],
    "ad_formats": [
      "SINGLE_VIDEO"
    ],
    "call_to_action_types": [
      "WATCH_MORE"
    ],
    "descriptions": [
      {
        "text": ""
      }
    ],
    "target_rules": [
      {
        "targeting": {          
          "publisher_platforms": [
            "facebook"
          ],          
          "facebook_positions": [
            "feed",
            "instream_video"
          ]
        },
        "video_label": {
          "name": "labelfb",
        }
      },
      {
        "targeting": {          
          "publisher_platforms": [
            "instagram"
          ],          
          "instagram_positions": [
            "stream"           
          ]
        },
        "video_label": {
          "name": "labelig",
        }
      }
    ]
  }' 
https://graph.facebook.com/API_VERSION/act_AD_ACCOUNT_ID/adasset_feeds

Verify you can use your asset feed

To verify you can use your asset feed, read it:

curl -G 
  -d "access_token=ACCESS_TOKEN" 
  -d "fields=videos,titles,bodies,descriptions,ad_formats,target_rules" 
https://graph.facebook.com/API_VERSION/ASSET_FEED_ID

Create an ad using an asset feed ID

curl 
  -F 'access_token=ACCESS_TOKEN' 
  -F 'object_story_spec={
       "page_id": "YOUR_PAGE_ID"
       "instagram_actor_id" : "INSTAGRAM_ACTOR_ID", // only used for instagram placement
    }' 
  -F 'asset_feed_id=ASSET_FEED_ID'
https://graph.facebook.com/VERSION/act_AD_ACCOUNT_ID/adcreatives
curl 
  -F 'name=Asset Customization Ad' 
  -F 'adset_id=ADSET_ID' 
  -F 'access_token=ACCESS_TOKEN' 
  -F 'creative={
      "creative_id": CREATIVE_ID,
   }' 
https://graph.facebook.com/VERSION/act_AD_ACCOUNT_ID/ads

Create an ad using asset feed spec inline

curl 
  -F 'access_token=ACCESS_TOKEN' 
  -F 'object_story_spec={
       "page_id": "YOUR_PAGE_ID"
       "instagram_actor_id" : "INSTAGRAM_ACTOR_ID", // only used for instagram placement
    }' 
  -F 'asset_feed_spec={
    "optimization_type": "PLACEMENT",
    "videos": [
      {
        "adlabels": [
          {
            "name": "labelfb",
          }
        ],
        "video_id": "10154618295707554"
      },
      {
        "adlabels": [
          {
            "name": "labelig",
          }
        ],
        "video_id": "10154618298562554"
      }
    ],
    "bodies": [
      {
        "text": "Begin Your Adventure"
      }
    ],
    "link_urls": [
      {
        "website_url": "WEBSITE_URL",
        "display_url": "DISPLAY_URL"
      }
    ],
    "titles": [
      {
        "text": "Level Up"
      }
    ],
    "ad_formats": [
      "SINGLE_VIDEO"
    ],
    "call_to_action_types": [
      "WATCH_MORE"
    ],
    "descriptions": [
      {
        "text": ""
      }
    ],
    "target_rules": [
      {
        "targeting": {          
          "publisher_platforms": [
            "facebook"
          ],          
          "facebook_positions": [
            "feed",
            "instream_video"
          ]
        },
        "video_label": {
          "name": "labelfb",
        }
      },
      {
        "targeting": {          
          "publisher_platforms": [
            "instagram"
          ],          
          "instagram_positions": [
            "stream"           
          ]
        },
        "video_label": {
          "name": "labelig",
        }
      }
    ],
  }' 
https://graph.facebook.com/VERSION/act_AD_ACCOUNT_ID/adcreatives
curl 
  -F 'name=Asset Customization Ad' 
  -F 'adset_id=ADSET_ID' 
  -F 'access_token=ACCESS_TOKEN' 
  -F 'creative={
      "creative_id": CREATIVE_ID,
   }' 
https://graph.facebook.com/VERSION>/act_AD_ACCOUNT_ID/ads

Asset Feed

Create your asset feed with different creative elements. You can create an asset feed at this endpoint:

POST https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/adasset_feeds

On success, you get a new Asset Feed ID:

{"id":"23842500259010001"}

If it fails, you get an error. This means the asset feed does not conform to restrictions listed in asset feed restrictions.

Parameters

The following parameters represent the assets eligible for ad rendering. Facebook explores combinations of these assets across eligible ad formats and optimizes delivery of the best combination and best format for each user.

Property Name Description Type Required

images

Array of eligible images. Images provided in this array should be included in the ad account's image library

array of list of {"url": "{IMAGE_URL}", "hash": "{IMAGE_HASH}", "url_tags": "{TAG}"}
where either url or hash is required

Required for SINGLE_IMAGE and CAROUSEL_IMAGE format

videos

Array of video_ids. video_ids provided in this array should belong to the ad account

array of list of {"video_id": "{VIDEO_ID}", "url_tags": "{TAG}"}

Required for SINGLE_VIDEO format

bodies

Array of bodies. The primary message or copy of the ad.

array of list of {"text": "{BODY_TEXT}", "url_tags": "{TAG}"}

No

call_to_action_types

Array of call-to-action-type values

array of list of {"{CALL_TO_ACTION}"}. You can provide multiple values up to 5 values.

Required for all objectives except REACH and BRAND AWARENESS

titles

Array of titles. A short headline in the ad, generally shown next to a link, image or video.

array of list of {"text": "{TITLE}", "url_tags": "{TAG}"}

No

descriptions

Array of secondary description text, displayed less prominently than bodies or titles. Generally appears next to a link, image or video. If not specified, Facebook scrapes the link you provide to generate a description just as we do for link ads. Use empty string with single space for blank description if you do not want to use the scraped text.

array of list of {"text": "{DESCRIPTION}", "url_tags": "{TAG}"}

No

link_urls

Array of link URLs

array of list of {"website_url": "{URL}"}

Required. Currently only 1 link url can be used.

ad_formats

Array of Facebook ad formats we should create the ads in. Suppported formats are: SINGLE_IMAGE, CAROUSEL_IMAGE, SINGLE_VIDEO

array of strings ["{AD_FORMAT}"]

Yes

Asset Feed Restrictions

  • Ad Formats:
  • Three ad_formats are supported: SINGLE_IMAGE, CAROUSEL_IMAGE and SINGLE_VIDEO. Only one ad_format is allowed in one asset feed. ad_format counts as one asset in an asset feed.
  • Number of Assets in Asset Feed:
  • Asset feed: Must be a maximum of 30 total assets, such as 10 images + 5 bodies + 5 titles + 5 descriptions + 1 ad_format + 1 link_url + 1 call_to_action_types = 28 assets
  • Total number of images: < 10
  • Recommended image specs: 1.9:1
  • If Instagram placement is included, consider using square images for better performance
  • Recommended image size: 1,200 x 628 pixels
  • Total number of videos: < 10
  • If Instagram placement is included, only square videos or landscape videos are allowed
  • Total number of bodies limited to 5
  • Total number of call to actions limited to 5
  • Total number of titles limited to 5
  • Total number of links limited to 1.
  • Total number of descriptions limited to 5. If you do not specify any description, we will scrape the link you provided to retrieve the description as we now do for link ads
  • Title/Description/Body text max length 255.
  • For CAROUSEL_IMAGE format, at least 2 images are required in the Asset Feed, while titles are optional.
  • Asset Feed: Read only; you can re-use asset feed ID, but not edit it. To change or re-use an asset feed, create a new one.
  • url_tags (Optional): Only available for IMAGES, VIDEOS, BODIES, DESCRIPTIONS, and TITLES fields. Facebook appends url_tags to the link URL as parameters for each asset in an ad.

Example of a valid asset feed combination setup for SINGLE_IMAGE format:

  • 5 images
  • 3 bodies
  • 3 titles
  • 3 descriptions
  • 1 format: SINGLE_IMAGE

Example

Create an asset feed with two alternate images, bodies, and titles:

curl \
-F "images=[{'hash':'1cd8e1b5de5a76c24f989d94160bfb06', 'url_tags':'image=image1'},{'hash':'2597fcfeab45e01d9393ce3fefd074e5', 'url_tags':'image=image2'}]" \
-F "bodies=[{'text':'Begin Your Adventure'}, {'text':'Once a Trainer, always a Trainer.'}]" \
-F "titles=[{'text':'Level Up'}, {'text':'Swipe to evolve'}]" \
-F "descriptions=[{'text':'Begin Your Adventure'}]" \
-F "ad_formats=['SINGLE_IMAGE']" \
-F "link_urls=[{'website_url':'<WEBSITE_URL>'}]" \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/adasset_feeds

To verify you can use your Asset Feed, read it:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
-d "fields=images,titles,bodies,descriptions,ad_formats" \
https://graph.facebook.com/<API_VERSION>/<ASSET_FEED_ID>

The response contains:

{
    "ad_formats": [
        "SINGLE_IMAGE"
    ],
    "bodies": {
        "data": [
            {
                "id": "23842500259070001", 
                "text": "Begin Your Adventure"
            }, 
            {
                "id": "23842500259080001", 
                "text": "Once a Trainer, always a Trainer."
            }
        ], 
        "paging": {
            "cursors": {
                "after": "MjM4NDI1MDAyNTkwODAwMDEZD", 
                "before": "MjM4NDI1MDAyNTkwNzAwMDEZD"
            }
        }
    }, 
    "descriptions": {
        "data": [
            {
                "id": "23842500259060001", 
                "text": "Begin Your Adventure"
            }
        ], 
        "paging": {
            "cursors": {
                "after": "MjM4NDI1MDAyNTkwNjAwMDEZD", 
                "before": "MjM4NDI1MDAyNTkwNjAwMDEZD"
            }
        }
    }, 
    "id": "23842500259010001", 
    "images": {
        "data": [
            {
                "hash": "1cd8e1b5de5a76c24f989d94160bfb06", 
                "id": "23842500259040001"
            }, 
            {
                "hash": "2597fcfeab45e01d9393ce3fefd074e5", 
                "id": "23842500259050001"
            }
        ], 
        "paging": {
            "cursors": {
                "after": "MjM4NDI1MDAyNTkwNTAwMDEZD", 
                "before": "MjM4NDI1MDAyNTkwNDAwMDEZD"
            }
        }
    }, 
    "titles": {
        "data": [
            {
                "id": "23842500259020001", 
                "text": "Level Up"
            }, 
            {
                "id": "23842500259030001", 
                "text": "Swipe to evolve"
            }
        ], 
        "paging": {
            "cursors": {
                "after": "MjM4NDI1MDAyNTkwMzAwMDEZD", 
                "before": "MjM4NDI1MDAyNTkwMjAwMDEZD"
            }
        }
    }
}

Example of a valid asset feed combination setup for SINGLE_VIDEO format:

  • 5 videos
  • 3 bodies
  • 3 titles
  • 3 descriptions
  • 1 format: SINGLE_VIDEO
Example

Create an asset feed with two alternate videos, bodies, and titles:

curl \
-F "videos=[{'video_id':'1611937202184324', 'url_tags':'video=video1'},{'video_id':'1611937188850991', 'url_tags':'video=video2'}]" \
-F "bodies=[{'text':'Begin Your Adventure'}, {'text':'Once a Trainer, always a Trainer.'}]" \
-F "titles=[{'text':'Level Up'}, {'text':'Swipe to evolve'}]" \
-F "descriptions=[{'text':'Begin Your Adventure'}]" \
-F "ad_formats=['SINGLE_VIDEO']" \
-F "link_urls=[{'website_url':'<WEBSITE_URL>'}]" \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/adasset_feeds

To verify you can use your Asset Feed, read it:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
-d "fields=videos,titles,bodies,descriptions,ad_formats" \
https://graph.facebook.com/<API_VERSION>/<ASSET_FEED_ID>

The response contains:

{
    "ad_formats": [
        "SINGLE_VIDEO"
    ],
    "bodies": {
        "data": [
            {
                "id": "23842500259070001", 
                "text": "Begin Your Adventure"
            }, 
            {
                "id": "23842500259080001", 
                "text": "Once a Trainer, always a Trainer."
            }
        ], 
        "paging": {
            "cursors": {
                "after": "MjM4NDI1MDAyNTkwODAwMDEZD", 
                "before": "MjM4NDI1MDAyNTkwNzAwMDEZD"
            }
        }
    }, 
    "descriptions": {
        "data": [
            {
                "id": "23842500259060001", 
                "text": "Begin Your Adventure"
            }
        ], 
        "paging": {
            "cursors": {
                "after": "MjM4NDI1MDAyNTkwNjAwMDEZD", 
                "before": "MjM4NDI1MDAyNTkwNjAwMDEZD"
            }
        }
    }, 
    "videos": {
        "data": [
            {
                "video_id": "1611937202184324", 
                "thumbnail_url": "<thumnail_url>"
                "id": "23842500159040001"
            }, 
            {
                "video_id": "1611937188850991", 
                "thumbnail_url": "<thumnail_url>"
                "id": "23842500359050001"
            }
        ], 
        "paging": {
            "cursors": {
                "after": "MjM4NDI1MDAyNTkwNTAwMDEZD", 
                "before": "MjM4NDI1MDAyNTkwNDAwMDEZD"
            }
        }
    }, 
    "titles": {
        "data": [
            {
                "id": "23842500259020001", 
                "text": "Level Up"
            }, 
            {
                "id": "23842500259030001", 
                "text": "Swipe to evolve"
            }
        ], 
        "paging": {
            "cursors": {
                "after": "MjM4NDI1MDAyNTkwMzAwMDEZD", 
                "before": "MjM4NDI1MDAyNTkwMjAwMDEZD"
            }
        }
    },
    "id": "23842500289010001"
}

Editing Ad's creative

You can edit ad creative; add, replace, or remove any of the assets. Provide a new creative with your new asset feed spec, and we deliver the new assets. For the same asset spec, such as image hashes, we report assets as the same ones. ** For new creatives, all restrictions have to be met just like for the creation part.**

When you provide new creative assets you must meet all the same restrictions that applied when you initially provided the ad creative.

curl \
  -F 'access_token=<ACCESS_TOKEN>' \
  -F 'creative={
      "creative_id": <CREATIVE_ID>,
   }' \
https://graph.facebook.com/<VERSION>/act_<AD_ACCOUNT_ID>/<AD_ID>

On success, you get the following response:

{"success": true}

Using Deep Links

You can use deeplinks with the App Install objective for dynamic creative ads. Add deeplink_url in LINK_URL when you create your asset feed:

curl \
-F "images=[{'hash':'<image_hash>'},]" \
-F "bodies=[{'text':'Body 1'}, {'text':'Body 2'}]" \
-F "titles=[{'text':'Title 1'}, {'text':'Title 2'}]" \
-F "descriptions=[{'text':' '}]" \
-F "ad_formats=['SINGLE_IMAGE']" \
-F "link_urls=[{'website_url':'<App's object store URL>','deeplink_url':'<deeplink URL>'}]" \
-F "call_to_action_types=['SHOP_NOW']" \
-F "access_token=<access_token>" \
https://graph.facebook.com/<VERSION>/act_XXXXX/adasset_feeds

Then use this asset feed for your ads.

Limitations:

  • Only one deeplink_url

Checking Ad Review Status

After you create your campaign, ad set, and ad, check your ad review status:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
-d 'fields=review_feedback' \
https://graph.facebook.com/<VERSION>/<ADSET_ID>

The result includes dynamic creative ad review feedback:

{
  "review_feedback":"[]",
  "id":"<ADSET_ID>"
}

An empty array means your ad passed review and will display when your ad set reaches its start date. Otherwise, if one of your creative assets does not meet review, you see the following:

{
  "__fb_trace_id__": "GGIjhVp6ka5",
  "review_feedback": {
    {"id":23842500258220001,"text":"Body 1","reason":["ALCOHOL"]},
    {"id":23842500258160001,"text":"Title 1","reason":["ALCOHOL"]},
    {"id":23842500258170001,"text":"Title 2","reason":["ALCOHOL"]}
  }",
  "id": "<AD_ID>"  
}

Insights

You can read Insights for dynamic creative ad set and ad objects. In Ads Manager, you can view your asset level breakdowns. Using the API, you can get the following breakdowns when you query for asset insights:

  • body_asset
  • description_asset
  • image_asset
  • title_asset
  • call_to_action_asset
  • link_url_asset

These breakdowns can also be combined with the following existing breakdowns:

  • age
  • gender
  • age, gender

Get the following fields when you query for dynamic creative asset insights:

Field Description

actions

The number of actions taken on your ad, broken down by action type

clicks

The total number of clicks on your ad

impressions

The number of times your ad was served

Facebook supports different values derived from the fields above. For example you can also retrieve ctr, actions_per_impressions, and so on.

Examples

To retrieve insights for an ad with the body_asset breakdown, make this call:

curl -G \
-d "breakdowns=body_asset" \
-d "fields=impressions" \
-d "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/<AD_ID>/insights

A sample response from this call looks like this:

{
  "data": [
    {
      "impressions": "8801",
      "date_start": "2016-04-29",
      "date_stop": "2016-05-13",
      "body_asset": {
        "text": "Test text",
        "id": "6051732675652"
      }
    },
    {
      "impressions": "7558",
      "date_start": "2016-04-29",
      "date_stop": "2016-05-13",
      "body_asset": {
        "text": "Test ext new",
        "id": "6051732676452"
      }
    },
  ],
  "paging": {
    "cursors": {
      "before": "MAZDZD",
      "after": "MgZDZD"
    }
  }}

To retrieve insights for ad set broken down by image_asset and age, make this call:

curl -G \
-d "breakdowns=image_asset,age" \
-d "fields=impressions" \
-d "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<API_VERSION>/<ADSET_ID>/insights

A sample response from this call looks like this:

{
  "data": [
    {
      "impressions": "5497",
      "date_start": "2016-04-29",
      "date_stop": "2016-05-13",
      "image_asset": {
        "hash": "<REDACTED>",
        "url": "<REDACTED>",
        "id": "6051732672052"
      }
    },
    {
      "impressions": "5962",
      "date_start": "2016-04-29",
      "date_stop": "2016-05-13",
      "image_asset": {
        "hash": "<REDACTED>",
        "url": "<REDACTED>",
        "id": "6051732672652"
      }
    },
  ],
  "paging": {
    "cursors": {
      "before": "MAZDZD",
      "after": "MwZDZD"
    }

FAQ's

Common Pitfalls

The following scenario will cause issues with dynamic creative ads:

  • Create dynamic creative with 10% budget and compare with baseline. Try to compare CTR and CPA.

Why is this wrong?

  • Budget needs to be equal between the two Ad Sets
  • Both campaigns need similar number of delivered impressions for comparison.

-

Q: Is ads delivery optimization different from dynamic creative and normal ads? If we adjusted image and title ourselves and created regular ads with possible combinations, would the outcome be any different?

A: Yes, the optimization is different between dynamic creative and the ads in our current system. If you create various image/title combinations today, our delivery system picks the best performing, fully formed ad and puts the majority of spend behind that ad. Creative optimization is happening at a fixed, and fully formed ad within the ad set. With dynamic creative, we are doing creative optimization at the individual creative asset level such as image, title, body, and converging on the best creative asset combination per impression.

For dynamic creative ads insights, you can retrieve creative asset level insights, and group data by age range, gender.

Q: How should I use dynamic creative? As a testing tool for figuring out the best creative concepts, or do we replace regular campaigns with them?

A: Dynamic creative is a new primary workflow to run actual ad campaigns and determine the best performing creatives. It is ideal for evergreen campaigns, or campaigns that run longer than 5 days. However, we ask that you split test Dynamic Creative against your existing campaign strategies to see which approach performs better for your needs.

We believe that this ads optimization model gets trained with more advertiser data over time, you should be able to consistently get higher ROI using dynamic creative compared to the existing delivery system.

Q: Can I view insights on the full, delivered ad? What about creative asset level breakdowns?

Currently, we only show creative asset level breakdowns such as metrics by image, title, body, and so on. These metrics are available on Ads Manager under the 'By Delivery' breakdown.

Q: For regular ads we create a mix of single, carousel, image, or video ads under a single ad set. How can I do that with dynamic creative?

A: We are currently only support a single format. Selected format can be a single image, video or carousel image. We are working on multiple format support in one ad set.

Q: Can we use daily budget feature, or it has to be lifetime only?

A: You can use both daily and lifetime budget.

Q: Do ads insights work the same way for dynamic creative as they do for non-dynamic creative fields?

A: Dynamic creative does not support the ad-level specific insights field: 'relevance_score'.

Q: How does dynamic creative work for CAROUSEL_IMAGE ad format?

A: Dynamic creative delivers the best combination of the assets in carousel ad format. The number of cards is the number of images in the asset feed if less than 10, otherwise we display 10. In asset insights breakdown, for in-card assets, such as image, title, and description, we aggregate metrics when the asset is in the first card. We recommend square sizes for images.

Q: Can I edit my creative?

A: You can change ad creative by providing it with a new asset feed ID or asset feed spec. If you send the same spec, we report results for new assets under the older, existing asset name. We reuse assets based on asset value and type. For example, if you have two asset feeds with the same image hash, and you update one feed with another in your ad, you see combined impressions for that asset in the asset breakdowns. You can add new assets, remove existing assets and replace assets with completely new ones. However, you cannot change formats such as SINGLE IMAGE to VIDEO. You also cannot switch a dynamic creative ad to a non-dynamic creative ad which has no asset feed in the creative.

Q: What placements does dynamic creative support?

A: Dynamic creative supports all the placements except Instagram Stories and Sponsored Messages on Messenger. The other restrictions that are in place for regular ads, still apply for dynamic creative ads.

Q: Can I crop my images in dynamic creative?

A: Dynamic creative supports image cropping. Specify cropping for your image definition in images. You can provide only one crop per image. We apply specified crops to all placements of your image. See Marketing API, Image Cropping. for more details.