This document describes various ad units designed to drive installs and engagement for desktop and mobile apps.
You should use this ad unit to drive people to your desktop or mobile app for the purpose of either install or engagement using photo, video, carousel, or Playable creatives.
Conceptually this allows for the following ads:
Photo | Video | Carousel | Playable | |
---|---|---|---|---|
Mobile Install Ad | ✓ | ✓ | ✓ | ✓ |
Mobile Engagement Ad | ✓ | ✓ | ✓ | |
Desktop Install Ad | ✓ | ✓ | ✓ | |
Desktop Engagement Ad | ✓ | ✓ | ✓ | |
Desktop App Ad for Virtual Goods | ✓ | ✓ | ✓ |
Desktop app ads for virtual goods are a subset of desktop engagement, you can use virtual good offers to re-engage your players to come back into your app. For example, an app can offer a discount for an item or a set of their in-app currency in feed to re-engage past payers. See here for instructions on how to set up your app to accept payments.
For reference, this is what the mobile install image unit looks like:
This is what the desktop app ad for virtual goods with image looks like
When creating the ad, note the following requirements:
APP_INSTALLS
, LINK_CLICKS
, or CONVERSIONS
.user_os
field. The placement should have a device_platforms
field with value of ['mobile
'] and highly recommend the use of the spec's other fields to target mobile devices on Facebook. Optionally, you can specify publisher_platforms
if you only want certain platforms.device_platforms
must be desktop
. Optionally, you can specify facebook_positions
if you do not want both Facebook desktop Feed and Right-Hand-Side column.GET_OFFER
is used for virtual goods, the price must be discounted. Please see virtual goods for more information.The below additional Call to Actions are available for app ads within the call_to_action
field of a post or the ad creative's object_story_spec
. You can also specify the mobile app's deep link in the app_link
field, or the desktop app's virtual good object in the product_link
field.
Key | Value | Required |
---|---|---|
type | Call to action types for mobile, regardless of install or engagement: | yes |
value | JSON dictionary of:
| yes
|
value.link | refers to the App Store, Google Play Store, or Facebook Canvas App URL, e.g. https://itunes.apple.com/us/app/facebook/id284882215 | yes |
value.app_link | To define the deep link destination only for mobile apps, e.g. | yes, only for mobile install or engagement ads |
value.product_link | To define the URL that points to the product\'s Open Graph virtual good object. See here for setup details. | yes, only for desktop virtual goods |
value.link_title | Allows you to customize the name for the link, which shows up below the ad\'s image | no |
To create a desktop or mobile app ad with a photo, first create a link Page Post with a photo using the ad creative's object_story_spec: {'link_data': ...}
field.
Example:
curl -X POST \
-F 'name="Sample Creative"' \
-F 'object_story_spec={
"page_id": "<PAGE_ID>",
"link_data": {
"call_to_action": {
"type": "INSTALL_MOBILE_APP",
"value": {
"link": "<APP_STORE_URL>"
}
},
"image_hash": "<IMAGE_HASH>",
"link": "<APP_STORE_URL>",
"message": "Try it out"
}
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0
/act_<AD_ACCOUNT_ID>/adcreatives
Alternatively, you can create the Page Post through the Page's feed endpoint and use the post ID in the creative. See the examples section below for more examples.
To create a mobile app install or engagement ad using the carousel ad format, follow the instructions in the carousel ads docs except in each child_attachments
' link
field, specify an app store link.
Note that you should specify the same app store link in each child_attachment
. You do not have to specify the link again in the call_to_action:{'value':{'link':... }}}
curl -X POST \
-F 'name="Carousel app ad"' \
-F 'object_story_spec={
"page_id": "<PAGE_ID>",
"link_data": {
"message": "My message",
"link": "http://www.example.com/appstoreurl",
"caption": "WWW.ITUNES.COM",
"name": "The link name",
"description": "The link description",
"child_attachments": [
{
"link": "http://www.example.com/appstoreurl",
"image_hash": "<IMAGE_HASH>",
"call_to_action": {
"type": "USE_MOBILE_APP",
"value": {
"app_link": "<DEEP_LINK>"
}
}
},
{
"link": "http://www.example.com/appstoreurl",
"image_hash": "<IMAGE_HASH>",
"call_to_action": {
"type": "USE_MOBILE_APP",
"value": {
"app_link": "<DEEP_LINK>"
}
}
},
{
"link": "http://www.example.com/appstoreurl",
"image_hash": "<IMAGE_HASH>",
"call_to_action": {
"type": "USE_MOBILE_APP",
"value": {
"app_link": "<DEEP_LINK>"
}
}
},
{
"link": "http://www.example.com/appstoreurl",
"image_hash": "<IMAGE_HASH>",
"call_to_action": {
"type": "USE_MOBILE_APP",
"value": {
"app_link": "<DEEP_LINK>"
}
}
}
],
"multi_share_optimized": true
}
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0
/act_<AD_ACCOUNT_ID>/adcreatives
To create an app ad with a video, first upload a video to the ad account's video library. Then use the video ID in the ad creative's object_story_spec: {'video_data':...}
field.
Example:
use FacebookAds\Object\AdCreative;
use FacebookAds\Object\AdCreativeVideoData;
use FacebookAds\Object\Fields\AdCreativeVideoDataFields;
use FacebookAds\Object\AdCreativeObjectStorySpec;
use FacebookAds\Object\Fields\AdCreativeObjectStorySpecFields;
use FacebookAds\Object\Fields\AdCreativeFields;
$video_data = new AdCreativeVideoData();
$video_data->setData(array(
AdCreativeVideoDataFields::IMAGE_URL => '<THUMBNAIL_URL>',
AdCreativeVideoDataFields::VIDEO_ID => <VIDEO_ID>,
AdCreativeVideoDataFields::CALL_TO_ACTION => array(
'type' => 'INSTALL_MOBILE_APP',
'value' => array(
'link' => '<APP_STORE_URL>',
),
),
));
$object_story_spec = new AdCreativeObjectStorySpec();
$object_story_spec->setData(array(
AdCreativeObjectStorySpecFields::PAGE_ID => <PAGE_ID>,
AdCreativeObjectStorySpecFields::VIDEO_DATA => $video_data,
));
$creative = new AdCreative(null, 'act_<AD_ACCOUNT_ID>');
$creative->setData(array(
AdCreativeFields::NAME => 'Sample Creative',
AdCreativeFields::OBJECT_STORY_SPEC => $object_story_spec,
));
$creative->create();
from facebookads.adobjects.adcreative import AdCreative
from facebookads.adobjects.adcreativeobjectstoryspec \
import AdCreativeObjectStorySpec
from facebookads.adobjects.adcreativevideodata \
import AdCreativeVideoData
video_data = AdCreativeVideoData()
video_data[AdCreativeVideoData.Field.description] = 'try it out'
video_data[AdCreativeVideoData.Field.video_id] = <VIDEO_ID>
video_data[AdCreativeVideoData.Field.image_url] = '<THUMBNAIL_URL>'
video_data[AdCreativeVideoData.Field.call_to_action] = {
'type': 'INSTALL_MOBILE_APP',
'value': {
'link': '<APP_STORE_URL>',
'link_title': 'Facebook',
},
}
object_story_spec = AdCreativeObjectStorySpec()
object_story_spec[AdCreativeObjectStorySpec.Field.page_id] = <PAGE_ID>
object_story_spec[AdCreativeObjectStorySpec.Field.video_data] = video_data
creative = AdCreative(parent_id='act_<AD_ACCOUNT_ID>')
creative[AdCreative.Field.name] = 'Sample Creative'
creative[AdCreative.Field.object_story_spec] = object_story_spec
creative.remote_create()
AdCreative adCreative = new AdAccount(act_<AD_ACCOUNT_ID>, context).createAdCreative()
.setName("Sample Creative")
.setObjectStorySpec(
new AdCreativeObjectStorySpec()
.setFieldPageId(<PAGE_ID>)
.setFieldVideoData(
new AdCreativeVideoData()
.setFieldCallToAction(
new AdCreativeLinkDataCallToAction()
.setFieldType(AdCreativeLinkDataCallToAction.EnumType.VALUE_INSTALL_MOBILE_APP)
.setFieldValue(
new AdCreativeLinkDataCallToActionValue()
.setFieldLink(<APP_STORE_URL>)
)
)
.setFieldLinkDescription("try it out")
.setFieldImageUrl(<THUMBNAIL_URL>)
.setFieldVideoId(<VIDEO_ID>)
)
)
.execute();
String ad_creative_id = adCreative.getId();
curl \
-F 'name=Sample Creative' \
-F 'object_story_spec={
"page_id": "<PAGE_ID>",
"video_data": {
"call_to_action": {"type":"INSTALL_MOBILE_APP","value":{"link":"<APP_STORE_URL>"}},
"image_url": "<THUMBNAIL_URL>",
"video_id": "<VIDEO_ID>"
}
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adcreatives
Alternatively, you can create the Page Post through the Page's video endpoint and use the video ID in the creative. See the examples section below for more examples.
To retrieve details about your Page Post, refer to the link Page Post docs or video Page Post docs.
You can list all Page Posts from the Page's /promotable_posts
edge.
curl https://graph.facebook.com/{API_VERSION}/{PAGE_ID}/promotable_posts
To retrieve details about your ad creative, refer to the ad creative documentation.
pages_manage_ads
permissionADVERTISE
task on the Page"call_to_action={'type':'LEARN_MORE', 'value':{'link':'https://itunes.apple.com/us/app/facebook/id284882215', 'app_link':'facebook://path/to/page'}}"
Before specifying an app link, you should validate that it has been scraped by calling:
https://graph.facebook.com/{API_VERSION}/?type=og&scrape=true&id={APP_LINK}
Insights only apply for ads with a promoted object containing the app ID. To obtain an app ID, register the app on Facebook.
Meta will provide aggregated daily insights on the demographics of people who installed your app. To retrieve this, you should use an app access token and query
https://graph.facebook.com/{API_VERSION}/{APP_ID}/insights/application_mobile_app_installs?&access_token={ACCESS_TOKEN}
You can also breakdown stats by specifying an additional URL param, breakdown
, equal to one of the following values. You cannot currently combine breakdowns.
Name | Description |
---|---|
| Break down your statistics on audience's age and gender |
| Break down your statistics on audience's country |
| Break down your statistics on audience's locale |
Examples:
https://graph.facebook.com/{API_VERSION}/{APP_ID}/insights/application_mobile_app_installs?breakdown=gender_age&access_token={ACCESS_TOKEN} https://graph.facebook.com/{API_VERSION}/{APP_ID}/insights/application_mobile_app_installs?breakdown=country&access_token={ACCESS_TOKEN} https://graph.facebook.com/{API_VERSION}/{APP_ID}/insights/application_mobile_app_installs?breakdown=locale&access_token={ACCESS_TOKEN}
Step 1. create the Page Post with image. Note that you should use PAGE_ACCESS_TOKEN
and Pages API session to create Page Post.
use FacebookAds\Api;
use FacebookAds\Http\RequestInterface;
$params = array(
'message' => 'Sign up today',
'picture' => '<IMAGE_URL>',
'link' => '<LINK>',
'published' => 1,
'call_to_action' => array(
'type' => 'SIGN_UP',
'value' => array(
'link' => '<LINK>',
),
),
);
$data = Api::instance()->call(
'/'.<PAGE_ID>.'/feed',
RequestInterface::METHOD_POST,
$params)->getContent();
from facebookads import FacebookAdsApi
params = {
'massage': 'Sign up today.',
'picture': '<IMAGE_URL>',
'link': '<LINK>',
'published': 1,
'call_to_action': {
'type': 'SIGN_UP',
'value': {
'link': '<LINK>',
},
},
}
data = FacebookAdsApi.get_default_api().\
call('POST', (<PAGE_ID>, 'feed'), params=params)
curl \
-F 'message=Sign up today' \
-F 'picture=<IMAGE_URL>' \
-F 'link=<LINK>' \
-F 'published=1' \
-F 'call_to_action={"type":"SIGN_UP","value":{"link":"<LINK>"}}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/<PAGE_ID>/feed
Step 2. Create the ad creative ({STORY_ID}
is in form of '{PAGE_ID}_{POST_ID}'
)
curl -X POST \
-F 'object_story_id="<PAGE_ID>_<POST_ID>"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/act_<AD_ACCOUNT_ID>/adcreatives
Step 3. Use the creative in an ad
curl -X POST \
-F 'name="My AdGroup with Redownload"' \
-F 'adset_id="<AD_SET_ID>"' \
-F 'creative={
"creative_id": "<CREATIVE_ID>"
}' \
-F 'redownload=1' \
-F 'status="PAUSED"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/act_<AD_ACCOUNT_ID>/ads
Step 1. Create the Page Post with image. Note that you should use PAGE_ACCESS_TOKEN
and Pages API session to create Page Post.
curl -X POST \
-F 'message="This is a test message"' \
-F 'call_to_action={
"type": "BUY_NOW",
"value": {
"link": "{app-store-url}",
"app_link": "{deep-link}"
}
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/{page-id}/feed
Step 2. Create the ad creative
curl -X POST \
-F 'object_story_id="<PAGE_ID>_<POST_ID>"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/act_<AD_ACCOUNT_ID>/adcreatives
Step 3. Set the bidding at the ad set, optimizing for clicks, paying for impressions.
use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\Values\AdSetBillingEventValues;
use FacebookAds\Object\Values\AdSetOptimizationGoalValues;
use FacebookAds\Object\Fields\TargetingFields;
use FacebookAds\Object\Targeting;
$adset = new AdSet(null, 'act_<AD_ACCOUNT_ID>');
$adset->setData(array(
AdSetFields::NAME => 'LifetimeBudgetSet',
AdsetFields::LIFETIME_BUDGET => 100000,
AdSetFields::BID_AMOUNT => 500,
AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS,
AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::LINK_CLICKS,
AdSetFields::PROMOTED_OBJECT => array(
'application_id' => <APP_ID>,
'object_store_url' => '<APP_STORE_URL>',
),
AdSetFields::TARGETING => (new Targeting())->setData(array(
TargetingFields::GEO_LOCATIONS => array(
'countries' => array('US'),
),
TargetingFields::USER_OS => array(
'IOS',
),
TargetingFields::PUBLISHER_PLATFORMS => array(
'facebook',
'audience_network',
),
TargetingFields::FACEBOOK_POSITIONS => array('feed'),
)),
AdSetFields::CAMPAIGN_ID => <CAMPAIGN_ID>,
AdSetFields::END_TIME =>
(new \DateTime("+1 week"))->format(\DateTime::ISO8601),
));
$adset->create(array(
AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED,
));
import time
from facebookads.adobjects.adset import AdSet
adset = AdSet(parent_id='act_<AD_ACCOUNT_ID>')
adset.update({
AdSet.Field.name: 'LifetimeBudgetSet',
AdSet.Field.campaign_id: <CAMPAIGN_ID>,
AdSet.Field.lifetime_budget: 10000,
AdSet.Field.start_time: int(time.time()),
AdSet.Field.end_time: int(time.time() + 100000),
AdSet.Field.optimization_goal: AdSet.OptimizationGoal.link_clicks,
AdSet.Field.billing_event: AdSet.BillingEvent.impressions,
AdSet.Field.bid_amount: 500,
AdSet.Field.promoted_object: {
'application_id': <APP_ID>,
'object_store_url': '<APP_STORE_URL>',
},
AdSet.Field.targeting: {
'geo_locations': {
'countries': ['US'],
},
'user_os': ['iOS'],
Targeting.Field.publisher_platforms: ['facebook', 'audience_network'],
Targeting.Field.facebook_positions: ['feed'],
},
})
adset.remote_create(params={
'status': AdSet.Status.paused,
})
curl \
-F 'name=LifetimeBudgetSet' \
-F 'lifetime_budget=100000' \
-F 'bid_amount=500' \
-F 'billing_event=IMPRESSIONS' \
-F 'optimization_goal=LINK_CLICKS' \
-F 'promoted_object={"application_id":"<APP_ID>","object_store_url":"<APP_STORE_URL>"}' \
-F 'targeting={
"facebook_positions": ["feed"],
"geo_locations": {"countries":["US"]},
"publisher_platforms": ["facebook","audience_network"],
"user_os": ["IOS"]
}' \
-F 'campaign_id=<CAMPAIGN_ID>' \
-F 'end_time=2018-02-06T04:45:30+0000' \
-F 'status=PAUSED' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adsets
Step 4. Use the creative in an ad
use FacebookAds\Object\Ad;
use FacebookAds\Object\Fields\AdFields;
$data = array(
AdFields::NAME => 'My Ad',
AdFields::ADSET_ID => <AD_SET_ID>,
AdFields::CREATIVE => array(
'creative_id' => <CREATIVE_ID>,
),
);
$ad = new Ad(null, 'act_<AD_ACCOUNT_ID>');
$ad->setData($data);
$ad->create(array(
'redownload' => 1,
));
from facebookads.adobjects.ad import Ad
ad = Ad(parent_id='act_<AD_ACCOUNT_ID>')
ad[Ad.Field.name] = 'My Ad'
ad[Ad.Field.adset_id] = <AD_SET_ID>
ad[Ad.Field.creative] = {'creative_id': <CREATIVE_ID>}
ad[Ad.Field.redownload] = True
ad.remote_create(params={
'status': Ad.Status.paused,
})
Ad ad = new AdAccount(act_<AD_ACCOUNT_ID>, context).createAd()
.setName("My Ad")
.setAdsetId(<AD_SET_ID>)
.setCreative(
new AdCreative()
.setFieldId(<CREATIVE_ID>)
)
.setRedownload(true)
.execute();
String ad_id = ad.getId();
curl \
-F 'name=My Ad' \
-F 'adset_id=<AD_SET_ID>' \
-F 'creative={"creative_id":"<CREATIVE_ID>"}' \
-F 'redownload=1' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/ads
Step 1. Create the Page Post with image. Note that you should use PAGE_ACCESS_TOKEN
and Pages API session to create Page Post.
use FacebookAds\Api;
use FacebookAds\Http\RequestInterface;
$params = array(
'message' => 'Check out this App today. Available on iTunes.',
'published' => 1,
'link' => '<APP_STORE_URL>',
'picture' => '<IMAGE_URL>',
'call_to_action' => array(
'type' => 'LEARN_MORE',
'value' => array(
'link' => '<APP_STORE_URL>',
'app_link' => '<APP_DEEP_LINK>',
),
),
);
$data = Api::instance()->call(
'/'.<PAGE_ID>.'/feed',
RequestInterface::METHOD_POST,
$params)->getContent();
from facebookads import FacebookAdsApi
params = {
'massage': 'Check out this App today. Available on iTunes.',
'picture': '<IMAGE_URL>',
'link': '<APP_STORE_URL>',
'published': 1,
'call_to_action': {
'type': 'LEARN_MORE',
'value': {
'link': '<APP_STORE_URL>',
'app_link': '<APP_DEEP_LINK>',
},
},
}
path = "/{}/feed".format(<PAGE_ID>)
data = FacebookAdsApi.get_default_api().call('POST', (path,), params=params)
curl \
-F 'message=Check out this App today. Available on iTunes.' \
-F 'published=1' \
-F 'link=<APP_STORE_URL>' \
-F 'picture=<IMAGE_URL>' \
-F 'call_to_action={
"type": "LEARN_MORE",
"value": {"link":"<APP_STORE_URL>","app_link":"<APP_DEEP_LINK>"}
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/<PAGE_ID>/feed
Step 2. Create the ad creative
curl -X POST \
-F 'object_story_id="<PAGE_ID>_<POST_ID>"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/act_<AD_ACCOUNT_ID>/adcreatives
Step 3. Set the bidding at the ad set, optimizing for app events, paying for impressions.
Note you must also set the ad set's promoted_object
to include a custom_event_type
to optimize towards, please refer to ad set docs for more details.
curl -X POST \
-F 'name="A CPA Ad Set optimized for App Events"' \
-F 'campaign_id="<AD_CAMPAIGN_ID>"' \
-F 'daily_budget=300' \
-F 'start_time="2024-10-21T04:08:33-0700"' \
-F 'end_time="2024-10-28T04:08:33-0700"' \
-F 'billing_event="IMPRESSIONS"' \
-F 'optimization_goal="OFFSITE_CONVERSIONS"' \
-F 'bid_amount=100' \
-F 'status="PAUSED"' \
-F 'promoted_object={
"application_id": "<APP_ID>",
"object_store_url": "<APP_STORE_URL>",
"custom_event_type": "PURCHASE"
}' \
-F 'targeting={
"facebook_positions": [
"feed"
],
"geo_locations": {
"countries": [
"US"
]
},
"user_os": [
"iOS"
]
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/act_<AD_ACCOUNT_ID>/adsets
Step 4. Use the creative in an ad
use FacebookAds\Object\Ad;
use FacebookAds\Object\Fields\AdFields;
$data = array(
AdFields::NAME => 'My Ad',
AdFields::ADSET_ID => <AD_SET_ID>,
AdFields::CREATIVE => array(
'creative_id' => <CREATIVE_ID>,
),
);
$ad = new Ad(null, 'act_<AD_ACCOUNT_ID>');
$ad->setData($data);
$ad->create(array(
'redownload' => 1,
));
from facebookads.adobjects.ad import Ad
ad = Ad(parent_id='act_<AD_ACCOUNT_ID>')
ad[Ad.Field.name] = 'My Ad'
ad[Ad.Field.adset_id] = <AD_SET_ID>
ad[Ad.Field.creative] = {'creative_id': <CREATIVE_ID>}
ad[Ad.Field.redownload] = True
ad.remote_create(params={
'status': Ad.Status.paused,
})
Ad ad = new AdAccount(act_<AD_ACCOUNT_ID>, context).createAd()
.setName("My Ad")
.setAdsetId(<AD_SET_ID>)
.setCreative(
new AdCreative()
.setFieldId(<CREATIVE_ID>)
)
.setRedownload(true)
.execute();
String ad_id = ad.getId();
curl \
-F 'name=My Ad' \
-F 'adset_id=<AD_SET_ID>' \
-F 'creative={"creative_id":"<CREATIVE_ID>"}' \
-F 'redownload=1' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/ads
Note that you should use PAGE_ACCESS_TOKEN
and Pages API session to create Page Post.
curl \
-F 'name=My Video' \
-F 'message=Check out this app!' \
-F 'thumbnail=<APP_STORE_URL>' \
-F 'published=0' \
-F 'call_to_action={"type":"INSTALL_MOBILE_APP","value":{"link":"<APP_STORE_URL>"}}' \
-F 'source=@<VIDEO_PATH>' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0
/<PAGE_ID>/videos
curl \
-F 'name=My Video' \
-F 'message=Check out this app!' \
-F 'thumbnail=<APP_STORE_URL>' \
-F 'published=0' \
-F 'call_to_action={
"type": "LEARN_MORE",
"value": {"link":"<APP_STORE_URL>","app_link":"<APP_DEEP_LINK>"}
}' \
-F 'source=@<VIDEO_PATH>' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0
/<PAGE_ID>/videos
curl \
-F 'name=My Video' \
-F 'message=Check out this app!' \
-F 'thumbnail=<THUMBNAIL_PATH>' \
-F 'published=0' \
-F 'call_to_action={"type":"PLAY_GAME","value":{"link":"<THUMBNAIL_PATH>"}}' \
-F 'source=@<VIDEO_PATH>' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0
/<PAGE_ID>/videos
curl \
-F 'message=Buy coins now!' \
-F 'picture=<IMAGE_URL>' \
-F 'link=<LINK>' \
-F 'published=1' \
-F 'call_to_action={"type":"BUY_NOW","value":{"link":"<LINK>","product_link":"<PRODUCT_LINK>"}}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0
/<PAGE_ID>/feed
curl \
-F 'name=My Video' \
-F 'message=Buy coins now!' \
-F 'thumbnail=<THUMBNAIL_PATH>' \
-F 'published=0' \
-F 'call_to_action={
"type": "BUY_NOW",
"value": {"link":"<THUMBNAIL_PATH>","product_link":"<THUMBNAIL_PATH>"}
}' \
-F 'source=@<VIDEO_PATH>' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0
/<PAGE_ID>/videos
Advantage+ catalog ads can drive people to install your mobile app. This enables you to retarget people with mobile install ads, based user's behavior.
Step 1. Create a campaign for your product catalog
curl -X POST \
-F 'name="App Installs Campaign with Dynamic Product Ads"' \
-F 'objective="OUTCOME_APP_PROMOTION"' \
-F 'status="PAUSED"' \
-F 'special_ad_categories=[]' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0/act_<AD_ACCOUNT_ID>/campaigns
Step 2. Create an ad set for a specific product set under the above product catalog
use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\Fields\TargetingFields;
use FacebookAds\Object\Values\AdSetBillingEventValues;
use FacebookAds\Object\Values\AdSetOptimizationGoalValues;
$adset = new AdSet(null, 'act_<AD_ACCOUNT_ID>');
$adset->setData(array(
AdSetFields::NAME => 'Mobile App Installs Ad Set with Dynamic Product Ads',
AdSetFields::BID_AMOUNT => 3000,
AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS,
AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::APP_INSTALLS,
AdSetFields::DAILY_BUDGET => 15000,
AdSetFields::CAMPAIGN_ID => <CAMPAIGN_ID>,
AdSetFields::TARGETING => array(
TargetingFields::GEO_LOCATIONS => array(
'countries' => array('US'),
),
TargetingFields::PUBLISHER_PLATFORMS => array(
'facebook',
'audience_network',
),
TargetingFields::DEVICE_PLATFORMS => array('mobile'),
TargetingFields::USER_OS => array(
'IOS',
),
TargetingFields::DYNAMIC_AUDIENCE_IDS => array(<PRODUCT_AUDIENCE_ID>),
),
AdSetFields::PROMOTED_OBJECT => array(
'product_set_id' => <PRODUCT_SET_ID>,
'application_id' => <APP_ID>,
'object_store_url' => '<APP_STORE_URL>',
),
));
$adset->create(array(
AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED,
));
from facebookads.adobjects.adset import AdSet
from facebookads.adobjects.targeting import Targeting
adset = AdSet(parent_id='act_<AD_ACCOUNT_ID>')
adset.update({
AdSet.Field.name: 'Mobile App Installs Ad Set with Dynamic Product Ads',
AdSet.Field.promoted_object: {
'product_set_id': product_set_id,
'application_id': <APP_ID>,
'object_store_url': '<APP_STORE_URL>',
},
AdSet.Field.campaign_id: <CAMPAIGN_ID>,
AdSet.Field.daily_budget: 15000,
AdSet.Field.optimization_goal: AdSet.OptimizationGoal.app_installs,
AdSet.Field.billing_event: AdSet.BillingEvent.impressions,
AdSet.Field.bid_amount: 3000,
AdSet.Field.targeting: {
Targeting.Field.geo_locations: {
'countries': ['US'],
},
Targeting.Field.publisher_platforms: ['facebook', 'audience_network'],
Targeting.Field.device_platforms: ['mobile'],
Targeting.Field.user_os: [
'IOS',
],
Targeting.Field.dynamic_audience_ids: [
<PRODUCT_AUDIENCE_ID>,
],
},
})
adset.remote_create(params={
'status': AdSet.Status.paused,
})
curl \
-F 'name=Mobile App Installs Ad Set with Dynamic Product Ads' \
-F 'bid_amount=3000' \
-F 'billing_event=IMPRESSIONS' \
-F 'optimization_goal=APP_INSTALLS' \
-F 'daily_budget=15000' \
-F 'campaign_id=<CAMPAIGN_ID>' \
-F 'targeting={
"geo_locations": {"countries":["US"]},
"publisher_platforms": ["facebook","audience_network"],
"device_platforms": ["mobile"],
"user_os": ["IOS"],
"dynamic_audience_ids": ["<PRODUCT_AUDIENCE_ID>"]
}' \
-F 'promoted_object={
"product_set_id": "<PRODUCT_SET_ID>",
"application_id": "<APP_ID>",
"object_store_url": "<APP_STORE_URL>"
}' \
-F 'status=PAUSED' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.8/act_<AD_ACCOUNT_ID>/adsets
Step 3. Create the Advantage+ catalog ads creative by using template
curl -X POST \
-F 'name="Advantage+ catalog ads template creative sample"' \
-F 'object_story_spec={
"page_id": "<PAGE_ID>",
"template_data": {
"call_to_action": {
"type": "INSTALL_MOBILE_APP",
"value": {
"link": "http://www.example.com/appstoreurl"
}
},
"message": "Test {{product.name | titleize}}",
"link": "http://www.example.com/appstoreurl",
"name": "Headline {{product.price}}",
"description": "Description {{product.description}}"
}
}' \
-F 'product_set_id="<PRODUCT_SET_ID>"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v21.0
/act_<AD_ACCOUNT_ID>/adcreatives
Step 4. Use the above Ad creative in an Ad
use FacebookAds\Object\Ad;
use FacebookAds\Object\Fields\AdFields;
$data = array(
AdFields::NAME => 'My Ad',
AdFields::ADSET_ID => <AD_SET_ID>,
AdFields::CREATIVE => array(
'creative_id' => <CREATIVE_ID>,
),
);
$ad = new Ad(null, 'act_<AD_ACCOUNT_ID>');
$ad->setData($data);
$ad->create(array(
'redownload' => 1,
));
from facebookads.adobjects.ad import Ad
ad = Ad(parent_id='act_<AD_ACCOUNT_ID>')
ad[Ad.Field.name] = 'My Ad'
ad[Ad.Field.adset_id] = <AD_SET_ID>
ad[Ad.Field.creative] = {'creative_id': <CREATIVE_ID>}
ad[Ad.Field.redownload] = True
ad.remote_create(params={
'status': Ad.Status.paused,
})
Ad ad = new AdAccount(act_<AD_ACCOUNT_ID>, context).createAd()
.setName("My Ad")
.setAdsetId(<AD_SET_ID>)
.setCreative(
new AdCreative()
.setFieldId(<CREATIVE_ID>)
)
.setRedownload(true)
.execute();
String ad_id = ad.getId();
curl \
-F 'name=My Ad' \
-F 'adset_id=<AD_SET_ID>' \
-F 'creative={"creative_id":"<CREATIVE_ID>"}' \
-F 'redownload=1' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/ads
curl \ -X POST \ -F "name=<name>" \ -F "source=<>" \ -F "access_token=<access_token>" \ "https://graph.facebook.com/<API_VERSION>/act_<account_id>/adplayables"
name
: Name that differentiates the ad asset from other playable ads in the ad account; for example, {ad_name}
-> {playable_asset_name}
source
: Absolute path of the file on your local machineaccess_token
: Can be generated from the Graph API ExplorerYou can add two metadata tags to your playable HTML 5 file. This enables Meta to attribute the playable in the ads to your app.
... <head> ... <meta name="ref-application-id" content="<YOUR_APP_ID>"> <meta name="ref-asset-id" content="<YOUR_ASSET_ID>"> ... </head> ...
curl \ -F 'name=Sample Creative' \ -F 'object_story_spec={ "page_id": "<PAGE_ID>", "video_data": { "call_to_action": {"type":"INSTALL_MOBILE_APP","value":{"application":<APP_ID>,"link":"<APP_STORE_URL>"}}, "image_url": "<THUMBNAIL_URL>", "link_description": "try it out", "video_id": "<VIDEO_ID>" } }' \ -F 'playable_asset_id=<PLAYABLE_ASSET_ID>' \ -F 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/adcreatives
curl \ -F 'name=My Ad' \ -F 'status=ACTIVE' \ -F 'adset_id=<AD_SET_ID>' \ -F 'creative={"creative_id":"<CREATIVE_ID>"}' \ -F 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/ads