We are introducing a new, unified, and streamlined process for creating campaigns, replacing the existing separate workflows for Manual, Advantage+ Shopping Campaigns (ASC) and Advantage+ App Campaigns.
As of v25.0, Marketing API developers will no longer be able to use or the Advantage+ app campaign API with the smart_promotion_type=SMART_APP_PROMOTION field to create AAC campaigns. Instead, developers will need to use Advantage+ audience, Advantage+ campaign budget, and Advantage+ placements to create campaigns with an advantage_state that reflects the type of Advantage+ campaign. Refer to the Advantage+ Campaigns documentation to start creating Advantage+ campaigns today and avoid disruption with the releases of v24.0 and v.25.0.
Advantage+ app campaigns (formerly known as Automated App Ads) use machine learning and automated systems to drive more results for your app install ads. This solution helps you scale campaigns and, ultimately, it makes your work more efficient.
Regular app ads versus Advantage+ app campaigns:
| Manual App Ads | Advantage+ App Campaigns |
|---|---|
1 campaign Multiple ad sets Multiple ads | 1 campaign 1 ad set Multiple ads |
Reliance on manual adjustments. | Reliance on machine learning adjustments. |
Manually test up to 50 creative combinations. | Manually test up to 50 creative combinations. |
SKAdNetwork Advantage+ app campaigns targeting iOS 14 users are now available.
To use Advantage+ app campaigns, you need:
ads_management and ads_readYou must be authorized to make GET and POST calls to the ad account used to fund your ads.
Send a POST request to /act_{ad_account_id}/campaigns with the following required, and optional, parameters:
| Parameter | Description | ||||
|---|---|---|---|---|---|
adlabelslist of objects | Ad Labels associated with the Advantage+ app campaigns campaign. Optional. | ||||
buying_typestring | Currently, Advantage+ app campaigns only supports the | ||||
execution_optionslist of enums | Default value:
If the call passes validation or review, the response will be | ||||
is_skadnetwork_attributionstring | Identifies a SKAdsNetwork Campaign. Optional | ||||
namestring | Name for the Advantage+ App Campaign. | ||||
objectiveenum | This is the campaign goal. Specify | ||||
promoted_objectobject | The object this ad set is promoting across all its ads. For Advantage+ app campaigns, provide If your optimization goal is not
Required if is_skadnetwork_attribution is set to true. | ||||
smart_promotion_typelist of objects | To specify this is an Advantage+ App Campaign, smart promotion type should be set to | ||||
special_ad_categorieslist of objects | Advantage+ app campaigns currently does not support special ad categories. Please specify this as an empty list, like so | ||||
statusenum | Valid options are: If this status is | ||||
topline_idnumeric string or integer | Topline ID. Optional. |
curl -X POST \
-F 'name=Advantage+ app campaigns sample campaign' \
-F 'objective=APP_INSTALLS' \
-F 'status=ACTIVE' \
-F 'special_ad_categories=[]' \
-F 'smart_promotion_type=SMART_APP_PROMOTION' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_{ad-account-id}/campaignsIf you already have a campaign and want to update it, see After Launch, Update Campaign.
As an option, you can check if you have successfully created an Advantage+ App Campaign. To do that, make a GET request to /{ad-campaign-id} with the field smart_promotion_type. A valid Advantage+ App Campaign returns SMART_APP_PROMOTION.
curl -X GET -G \
-d 'fields="smart_promotion_type"' \
-d 'access_token={access-token}' \
https://graph.facebook.com/v24.0/{ad-campaign-id}
Example response, if a valid Advantage+ App Campaign was created:
{
"smart_promotion_type": "SMART_APP_PROMOTION",
"id": {ad-campaign-id}
}
Once you have an ad campaign, create your ad set. An ad set is a group of ads that share the same daily or lifetime budget, schedule, bid type, bid info, and targeting data.
To create an ad set, make a POST request to /act_{ad_account_id}/adsets. You may include the following parameters:
| Parameter | Description | ||||
|---|---|---|---|---|---|
list of objects | Specifies list of labels to be associated with this object. Optional. | ||||
integer | Required if Bid cap or target cost for this ad set. The bid cap used in a lowest cost bid strategy is defined as the maximum bid you want to pay for a result based on your If an ad level The bid amount's unit is cents for currencies like USD, EUR, and the basic unit for currencies like JPY, KRW. The bid amount is for each occurrence, and has a minimum value 1 US cents. The minimum bid amounts of other currencies are of similar value to the US Dollar values provided. | ||||
list of objects | Required if Similar to an ad set budget, minimum Return on Ads Spend (ROAS) bidding uses this to provide the ROAS floor, but you cannot use | ||||
enum | Choose a bid strategy for this ad set to suit your specific business goals. Each strategy has tradeoffs and may be available for certain For Advantage+ app campaigns, the following strategies are available:
| ||||
billing_eventenum | The billing event that this ad set is using. For Automated App Aps, specify | ||||
campaign_idnumeric string or integer | The ID for a valid Advantage+ app campaigns ad campaign you wish to add this ad set to. Required. | ||||
enum | The campaign attribution type used by this ad set.
When one campaign has multiple ad sets, the campaign attribution type should be the same across all ad sets. This field is required when creating an iOS 14+ campaign. | ||||
int64 | The daily budget defined in your account currency, allowed only for ad sets with a duration (difference between Either | ||||
datetime | Required when When creating an ad set with a For example: | ||||
int64 | Lifetime budget, defined in your account currency. If specified, you must also specify an Either | ||||
namestring | Name for the Advantage+ app campaigns ad set. Required. | ||||
optimization_goalenum | What the ad set is optimizing for. Advantage+ app campaigns supports the following optimization goals:
| ||||
promoted_objectobject | The object this ad set is promoting across all its ads. For Advantage+ app campaigns, provide If your optimization goal is not
Required for all campaigns except SKAdNetwork Campaign. Optional for SKAdNetwork Campaign. | ||||
enum | Only | ||||
datetime | The start time of the set. For example: | ||||
targeting object | An Advantage+ App Campaign ad set’s targeting structure.
Valid targeting options are For example: {
"geo_location": {
"countries": [“US”]
},
"locales": [8]
}Advantage+ app campaigns do not support operating system targeting, however SKAdsNetwork Advantage+ app campaigns will only target iOS14.5+ users. Required. | ||||
datetime | Time to start running this ad set. | ||||
datetime | Time to stop running this ad set. |
| Parameter | Description |
|---|---|
array | Used to limit the audience of the ad set via the required argument countries. Valid value: |
array | Target people with language other than common language for a location. To use this field, provide an ID for the language, such as 5 for German. See Targeting Search, Locales for more information. |
curl -X POST \
-F 'name=Advantage+ app campaigns sample ad set' \
-F 'campaign_id={campaign-id}' \
-F 'optimization_goal=APP_INSTALLS' \
-F 'promoted_object={ "application_id": "{app-id}", "object_store_url": "{store-object-id} }' \
-F 'daily_budget=<num>' \
-F 'billing_event=IMPRESSIONS' \
-F 'targeting={"geo_locations": {"countries": ["US"]}}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_{ad-account-id}/adsets
If you already have an ad set and want to update it, see After Launch, Update Ad Sets.
At the ad set level, you must specify optimization goal, bid strategy and custom event type. The following table outlines valid combinations of these fields.
| Optimization Goal | Bid Strategy | Custom Event Type |
|---|---|---|
|
| Not applicable. |
|
|
|
|
| All standard app events, including |
|
|
|
curl -X POST \
-F 'name=Advantage+ app campaigns sample campaign' \
-F 'objective=APP_INSTALLS' \
-F 'status=ACTIVE' \
-F 'special_ad_categories=[]' \
-F 'smart_promotion_type=SMART_APP_PROMOTION' \
-F 'is_skadnetwork_attribution=true' \
-F 'promoted_object={ "application_id": "{app-id}", "object_store_url": "{object-store-url}" }' \
-F 'access_token={access-token}' \
https://graph.facebook.com/act_{ad-account-id}/campaignsOnce you have an ad set, you can create your ad by posting to the /act_{ad_account_id}/ads endpoint. You may include the following parameters:
| Parameter | Description |
|---|---|
int64 | Required. |
list of objects | Optional. |
AdCreative | Required. You can provide the creative in the following format: {
"creative_id": {creative-id}
}Provide a creative spec: {
"creative": {
\"name\": \"<NAME>\",
\"object_story_spec\": <SPEC>
}
} |
list of enums | Optional.
If the call passes validation or review, the response will be |
string | Required. |
AdCreative type: enum | Required. |
| Parameter | Description |
|---|---|
AdAssetFeedSpec | Required when using Used for Placement Asset Customization and Multi-Language Ads to customize the creative assets displayed in different ad placements or different languages. Formatted as a JSON string. Available fields:
Refer to Asset Feed Options for more information on each field. |
AdCreativeObjectStorySpec | Required. Use if you want to attach images or videos to an ad, or if you want to use the carousel ad format. You can also use this if you want to create a new unpublished Page post and turn the post into an ad. Available fields:
|
AdCreative | If set to |
If you provide your creative formatted as creative spec:
curl -X POST \
-F 'name=Advantage+ app campaigns sample ad' \
-F 'adset_id={adset-id}' \
-F 'creative={"name": {name}, "object_story_spec": {specifications}}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_{ad-account-id}/adsIf you would like to use creative_id, you must first provide your creative with a /adcreatives call:
curl -X POST \
-F 'object_story_spec={object-story-specifications}' \
-F 'asset_feed_spec={asset-feed-specifications}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_act_{ad-account-id}/adcreativesOn success, the previous call returns a creative_id you can use in your /ads call:
curl -X POST \
-F 'name=Advantage+ app campaigns sample ad' \
-F 'adset_id={adset-id}' \
-F 'creative={creative-id}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_{ad-account-id}/adsIf you already have an ad and want to update it, go to After Launch, Update Ads.
curl -X POST \
-F 'name=Advantage+ app campaigns static image/video sample ad' \
-F 'adset_id={adset-id}' \
-F 'creative={
"media_type": "SINGLE_IMAGE",
"object_story_spec": {
"instagram_user_id": "<IG_USER_ID>",
"page_id": "{page-id}",
"link_data": {
"call_to_action": {
"type": "INSTALL_MOBILE_APP"
},
"image_hash": "{image-hash}",
"link": "{link}",
"message": "{message}",
"name": "{name}"
}
}
}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_{ad-account-id}/ads
When you want to customize the creative assets displayed in different ad placements. Check Placement Asset Customization page for details.
curl -X POST \
-F 'object_story_spec={
"instagram_user_id": "<IG_USER_ID>",
"page_id": "{page-id}"
}' \
-F 'asset_feed_spec={
"ad_formats": [
"SINGLE_IMAGE"
],
"asset_customization_rules": [
{
"customization_spec": {
"publisher_platforms": [
"facebook"
],
"facebook_positions": [
"feed",
"instream_video"
]
},
"image_label": {
"name": "{image-label1}"
}
},
{
"customization_spec": {
"publisher_platforms": [
"instagram"
],
"instagram_positions": [
"stream"
]
},
"image_label": {
"name": "{image-label2}"
}
}
],
"bodies": [
{
"text": "{text}"
}
],
"call_to_action_types": [
"INSTALL_MOBILE_APP"
],
"images": [
{
"hash": "{image-hash1}",
"adlabels": [
{
"name": "{image-label1}"
}
]
},
{
"hash": "{image-hash2}",
"adlabels": [
{
"name": "{image-label2}"
}
]
}
],
"link_urls": [
{
"website_url": "{website-url}",
"display_url": "{display-url}",
"deeplink_url": "{deeplink-url}"
}
],
"titles": [
{
"text": "{title}"
}
]
}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_act_{ad-account-id}/adcreatives
When you want to customize different parts of ad creative such as the image, video, text, and body of an ad to reach speakers of different language. Check Multi-Language Ads page for details.
curl -X POST \
-F 'object_story_spec={
"instagram_user_id": "<IG_USER_ID>",
"page_id": "{page-id}"
}' \
-F 'asset_feed_spec={
"ad_formats": [
"SINGLE_IMAGE"
],
"asset_customization_rules": [
{
"is_default": true,
"customization_spec": {
"locales": [
24
]
},
"title_label": {
"name": "{title-label-english}"
},
"body_label": {
"name": "{body-label-english}"
},
"link_url_label": {
"name": "{link-label-english}"
},
"image_label": {
"name": "{image-label1}"
}
},
{
"customization_spec": {
"locales": [
9,
44
]
},
"title_label": {
"name": "{title-label-french}"
},
"body_label": {
"name": "{body-label-french}"
},
"link_url_label": {
"name": "{link-label-french}"
},
"image_label": {
"name": "{image-label2}"
}
}
],
"bodies": [
{
"text": "Primary Text in English",
"adlabels": [
{
"name": "{body-label-english}"
}
]
},
{
"text": "Primary Text in French",
"adlabels": [
{
"name": "{body-label-french}"
}
]
}
],
"call_to_action_types": [
"INSTALL_MOBILE_APP"
],
"images": [
{
"hash": "{image-hash1}",
"adlabels": [
{
"name": "{image-label1}"
}
]
},
{
"hash": "{image-hash2}",
"adlabels": [
{
"name": "{image-label2}"
}
]
}
],
"link_urls": [
{
"website_url": "{website-url}",
"display_url": "{display-url}",
"deeplink_url": "{deeplink-url}",
"adlabels": [
{
"name": "{link-label-english}"
}
]
},
{
"website_url": "{website-url}",
"display_url": "{display-url}",
"deeplink_url": "{deeplink-url}",
"adlabels": [
{
"name": "{link-label-french}"
}
]
}
],
"titles": [
{
"text": "English Title",
"adlabels": [
{
"name": "{title-label-english}"
}
]
},
{
"text": "French Title",
"adlabels": [
{
"name": "{title-label-french}"
}
]
}
]
}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_act_{ad-account-id}/adcreativesWhen you want to provide more than 1 Primary Text or Headline.
curl -X POST \
-F 'object_story_spec={
"instagram_user_id": "<IG_USER_ID>",
"page_id": "{page-id}"
}' \
-F 'asset_feed_spec={
"asset_feed_spec": {
"optimization_type": "DEGREES_OF_FREEDOM",
"bodies": [
{
"text": "Primary Text 1"
},
{
"text": "Primary Text 2"
},
{
"text": "Primary Text 3"
},
{
"text": "Primary Text 4"
},
{
"text": "Primary Text 5"
}
],
"call_to_action_types": [
"INSTALL_MOBILE_APP"
],
"images": [
{
"hash": "{image-hash}"
}
],
"link_urls": [
{
"website_url": "{website-url}",
"display_url": "{display-url}",
"deeplink_url": "{deeplink-url}"
}
],
"titles": [
{
"text": "Title 1"
},
{
"text": "Title 2"
},
{
"text": "Title 3"
},
{
"text": "Title 4"
},
{
"text": "Title 5"
}
]
}
}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_act_{ad-account-id}/adcreatives
curl -X POST \
-F 'object_story_spec={
"instagram_user_id": "<IG_USER_ID>",
"page_id": "{page-id}"
}' \
-F 'asset_feed_spec={
"ad_formats": [
"SINGLE_IMAGE"
],
"asset_customization_rules": [
{
"customization_spec": {
"publisher_platforms": [
"facebook"
],
"facebook_positions": [
"feed",
"instream_video"
]
},
"image_label": {
"name": "{image-label1}"
},
"body_label": {
"name": "{body-label1}"
},
"title_label": {
"name": "{title-label1}"
}
},
{
"customization_spec": {
"publisher_platforms": [
"instagram"
],
"instagram_positions": [
"stream"
]
},
"image_label": {
"name": "{image-label2}"
},
"body_label": {
"name": "{body-label2}"
},
"title_label": {
"name": "{title-label2}"
}
}
],
"bodies": [
{
"text": "Primary Text 1",
"adlabels": [
{
"name": "{body-label1}"
},
{
"name": "{body-label2}"
}
]
},
{
"text": "Primary Text 2",
"adlabels": [
{
"name": "{body-label1}"
},
{
"name": "{body-label2}"
}
]
},
{
"text": "Primary Text 3",
"adlabels": [
{
"name": "{body-label1}"
},
{
"name": "{body-label2}"
}
]
},
{
"text": "Primary Text 4",
"adlabels": [
{
"name": "{body-label1}"
},
{
"name": "{body-label2}"
}
]
},
{
"text": "Primary Text 5",
"adlabels": [
{
"name": "{body-label1}"
},
{
"name": "{body-label2}"
}
]
}
],
"call_to_action_types": [
"INSTALL_MOBILE_APP"
],
"images": [
{
"hash": "{image-hash1}",
"adlabels": [
{
"name": "{image-label1}"
}
]
},
{
"hash": "{image-hash2}",
"adlabels": [
{
"name": "{image-label2}"
}
]
}
],
"link_urls": [
{
"website_url": "{website-url}",
"display_url": "{display-url}",
"deeplink_url": "{deeplink-url}"
}
],
"titles": [
{
"text": "Title 1",
"adlabels": [
{
"name": "{title-label1}"
},
{
"name": "{title-label2}"
}
]
},
{
"text": "Title 2",
"adlabels": [
{
"name": "{title-label1}"
},
{
"name": "{title-label2}"
}
]
},
{
"text": "Title 3",
"adlabels": [
{
"name": "{title-label1}"
},
{
"name": "{title-label2}"
}
]
},
{
"text": "Title 4",
"adlabels": [
{
"name": "{title-label1}"
},
{
"name": "{title-label2}"
}
]
},
{
"text": "Title 5",
"adlabels": [
{
"name": "{title-label1}"
},
{
"name": "{title-label2}"
}
]
}
]
}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/act_act_{ad-account-id}/adcreatives
After you launch your Advantage+ app campaigns, you may need to update or read your ad objects —see how to perform those actions below. For ad insights information, see our Asset Feed Spec, Insights documentation.
If you need to update an Automatic App Ads campaign, make a POST request to /{campaign_id}. You can use the following parameters in your API call:
| Parameter | Description |
|---|---|
list of object | Ad Labels that should be associated with the Advantage+ App Campaign. |
list of enums | Default value:
If the call passes validation or review, the response is |
string | New name you would like to give to your Advantage+ App Campaign. |
enum | You can use the following status for an update API call:
If an ad campaign is set to |
numeric string or integer | Topline ID. |
curl -X POST \
-F 'name=Advantage+ app campaigns Update Sample Campaign' \
-F 'status=PAUSED' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/{campaign-id}
If you need to update an Automatic App Ads ad set, make a POST request to /{ad_set_id}. You can use the following parameters in your API call:
| Parameter | Description |
|---|---|
list of objects | Specifies list of labels to be associated with this object. Optional. |
integer | Required if Bid cap or target cost for this ad set. The bid cap used in a lowest cost bid strategy is defined as the maximum bid you want to pay for a result based on your If an ad level The bid amount's unit is cents for currencies like USD, EUR, and the basic unit for currencies like JPY, KRW. The bid amount is for each occurrence, and has a minimum value 1 US cents. The minimum bid amounts of other currencies are of similar value to the US Dollar values provided. |
enum | Choose a bid strategy for this ad set to suit your specific business goals. Each strategy has tradeoffs and may be available for certain To update Advantage+ App Campaign sets, the following strategies are available:
If you enable Campaign Budget Optimization, set |
int64 | The daily budget defined in your account currency, allowed only for ad sets with a duration (difference between |
datetime | End time, required when When creating an ad set with a daily budget, specify |
list of enums | Optional. Default value:
If the call passes validation or review, the response is |
int64 | Lifetime budget, defined in your account currency. If specified, you must also specify an |
object | Required with certain campaign objectives. The object this ad set is promoting across all its ads. If your optimization goal is not
|
datetime | The start time of the set. Must be provided in UTC UNIX timestamp. For example: |
enum | Available options for updates:
|
datetime | Time to start running this ad set. |
datetime | Time to stop running this ad set. |
curl -X POST \
-F 'name=Advantage+ app campaigns sample updated ad set' \
-F 'bid_strategy=LOWEST_COST_WITH_BID_CAP' \
-F 'bid_amount=200' \
-F 'access_token={access-token}' \
https://graph.facebook.com/v24.0/{ad-set-id}If you need to update an Automatic App Ads ad, make a POST request to /{ad_id}. You can use the following parameters in your API call:
| Parameter | Description |
|---|---|
string | Name of the ad. |
list of objects | Ad labels associated with this ad. |
list of enums | Optional. Default value:
If the call passes validation or review, the response is |
enum | Options are:
During testing, it is recommended to set ads to a |
AdCreative | The creative spec of the ad creative to be used by this ad. Valid fields can be found on Creative Fields. Provide the creative spec as follows: {
"creative": {
\"name\": \"<NAME>\",
\"object_story_spec\": <SPEC>
}
} |
curl -X POST \
-F 'name=Advantage+ app campaigns sample update ad' \
-F 'creative={"name": {name}, "object_story_spec": {specifications}}' \
-F 'access_token={access-token}' \
https://graph.facebook.com/{ad-id}