An ad set is a group of ads that share the same daily or lifetime budget, schedule, bid type, bid info, and targeting data. Ad sets enable you to group ads according to your criteria, and you can retrieve the ad-related statistics that apply to a set. See Optimized CPM and Promoted Object .
For example, create an ad set with a daily budget:
curl -X POST \
-F 'name="My Reach Ad Set"' \
-F 'optimization_goal="REACH"' \
-F 'billing_event="IMPRESSIONS"' \
-F 'bid_amount=2' \
-F 'daily_budget=1000' \
-F 'campaign_id="<AD_CAMPAIGN_ID>"' \
-F 'targeting={
"geo_locations": {
"countries": [
"US"
]
},
"facebook_positions": [
"feed"
]
}' \
-F 'status="PAUSED"' \
-F 'promoted_object={
"page_id": "<PAGE_ID>"
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/adsets
'use strict';
const bizSdk = require('facebook-nodejs-business-sdk');
const AdAccount = bizSdk.AdAccount;
const AdSet = bizSdk.AdSet;
const access_token = '<ACCESS_TOKEN>';
const app_secret = '<APP_SECRET>';
const app_id = '<APP_ID>';
const id = '<AD_ACCOUNT_ID>';
const api = bizSdk.FacebookAdsApi.init(access_token);
const showDebugingInfo = true; // Setting this to true shows more debugging info.
if (showDebugingInfo) {
api.setDebug(true);
}
const logApiCallResult = (apiCallName, data) => {
console.log(apiCallName);
if (showDebugingInfo) {
console.log('Data:' + JSON.stringify(data));
}
};
let fields, params;
fields = [
];
params = {
'name' : 'My Reach Ad Set',
'optimization_goal' : 'REACH',
'billing_event' : 'IMPRESSIONS',
'bid_amount' : '2',
'daily_budget' : '1000',
'campaign_id' : '<adCampaignLinkClicksID>',
'targeting' : {'geo_locations':{'countries':['US']},'facebook_positions':['feed']},
'status' : 'PAUSED',
'promoted_object' : {'page_id':'<pageID>'},
};
const adsets = (new AdAccount(id)).createAdSet(
fields,
params
);
logApiCallResult('adsets api call complete.', adsets);
require __DIR__ . '/vendor/autoload.php';
use FacebookAds\Object\AdAccount;
use FacebookAds\Object\AdSet;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
$access_token = '<ACCESS_TOKEN>';
$app_secret = '<APP_SECRET>';
$app_id = '<APP_ID>';
$id = '<AD_ACCOUNT_ID>';
$api = Api::init($app_id, $app_secret, $access_token);
$api->setLogger(new CurlLogger());
$fields = array(
);
$params = array(
'name' => 'My Reach Ad Set',
'optimization_goal' => 'REACH',
'billing_event' => 'IMPRESSIONS',
'bid_amount' => '2',
'daily_budget' => '1000',
'campaign_id' => '<adCampaignLinkClicksID>',
'targeting' => array('geo_locations' => array('countries' => array('US')),'facebook_positions' => array('feed')),
'status' => 'PAUSED',
'promoted_object' => array('page_id' => '<pageID>'),
);
echo json_encode((new AdAccount($id))->createAdSet(
$fields,
$params
)->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adaccount import AdAccount
from facebook_business.adobjects.adset import AdSet
from facebook_business.api import FacebookAdsApi
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_ACCOUNT_ID>'
FacebookAdsApi.init(access_token=access_token)
fields = [
]
params = {
'name': 'My Reach Ad Set',
'optimization_goal': 'REACH',
'billing_event': 'IMPRESSIONS',
'bid_amount': '2',
'daily_budget': '1000',
'campaign_id': '<adCampaignLinkClicksID>',
'targeting': {'geo_locations':{'countries':['US']},'facebook_positions':['feed']},
'status': 'PAUSED',
'promoted_object': {'page_id':'<pageID>'},
}
print AdAccount(id).create_ad_set(
fields=fields,
params=params,
)
import com.facebook.ads.sdk.*;
import java.io.File;
import java.util.Arrays;
public class SAMPLE_CODE_EXAMPLE {
public static void main (String args[]) throws APIException {
String access_token = \"<ACCESS_TOKEN>\";
String app_secret = \"<APP_SECRET>\";
String app_id = \"<APP_ID>\";
String id = \"<AD_ACCOUNT_ID>\";
APIContext context = new APIContext(access_token).enableDebug(true);
new AdAccount(id, context).createAdSet()
.setName(\"My Reach Ad Set\")
.setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_REACH)
.setBillingEvent(AdSet.EnumBillingEvent.VALUE_IMPRESSIONS)
.setBidAmount(2L)
.setDailyBudget(1000L)
.setCampaignId(\"<adCampaignLinkClicksID>\")
.setTargeting(
new Targeting()
.setFieldFacebookPositions(Arrays.asList(\"feed\"))
.setFieldGeoLocations(
new TargetingGeoLocation()
.setFieldCountries(Arrays.asList(\"US\"))
)
)
.setStatus(AdSet.EnumStatus.VALUE_PAUSED)
.setPromotedObject(\"{\\"page_id\\":\\"<pageID>\\"}\")
.execute();
}
}
require 'facebook_ads'
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_ACCOUNT_ID>'
FacebookAds.configure do |config|
config.access_token = access_token
config.app_secret = app_secret
end
ad_account = FacebookAds::AdAccount.get(id)
adsets = ad_account.adsets.create({
name: 'My Reach Ad Set',
optimization_goal: 'REACH',
billing_event: 'IMPRESSIONS',
bid_amount: '2',
daily_budget: '1000',
campaign_id: '<adCampaignLinkClicksID>',
targeting: {'geo_locations':{'countries':['US']},'facebook_positions':['feed']},
status: 'PAUSED',
promoted_object: {'page_id':'<pageID>'},
})
Create an ad set with a lifetime budget
curl -X POST \
-F 'name="My First Adset"' \
-F 'lifetime_budget=20000' \
-F 'start_time="2024-09-29T02:48:57-0700"' \
-F 'end_time="2024-10-09T02:48:57-0700"' \
-F 'campaign_id="<AD_CAMPAIGN_ID>"' \
-F 'bid_amount=100' \
-F 'billing_event="LINK_CLICKS"' \
-F 'optimization_goal="LINK_CLICKS"' \
-F 'targeting={
"facebook_positions": [
"feed"
],
"geo_locations": {
"countries": [
"US"
]
},
"publisher_platforms": [
"facebook",
"audience_network"
]
}' \
-F 'status="PAUSED"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/adsets
'use strict';
const bizSdk = require('facebook-nodejs-business-sdk');
const AdAccount = bizSdk.AdAccount;
const AdSet = bizSdk.AdSet;
const access_token = '<ACCESS_TOKEN>';
const app_secret = '<APP_SECRET>';
const app_id = '<APP_ID>';
const id = '<AD_ACCOUNT_ID>';
const api = bizSdk.FacebookAdsApi.init(access_token);
const showDebugingInfo = true; // Setting this to true shows more debugging info.
if (showDebugingInfo) {
api.setDebug(true);
}
const logApiCallResult = (apiCallName, data) => {
console.log(apiCallName);
if (showDebugingInfo) {
console.log('Data:' + JSON.stringify(data));
}
};
let fields, params;
fields = [
];
params = {
'name' : 'My First Adset',
'lifetime_budget' : '20000',
'start_time' : '2024-07-29T17:54:57-0700',
'end_time' : '2024-08-08T17:54:57-0700',
'campaign_id' : '<adCampaignLinkClicksID>',
'bid_amount' : '100',
'billing_event' : 'LINK_CLICKS',
'optimization_goal' : 'LINK_CLICKS',
'targeting' : {'facebook_positions':['feed'],'geo_locations':{'countries':['US']},'publisher_platforms':['facebook','audience_network']},
'status' : 'PAUSED',
};
const adsets = (new AdAccount(id)).createAdSet(
fields,
params
);
logApiCallResult('adsets api call complete.', adsets);
require __DIR__ . '/vendor/autoload.php';
use FacebookAds\Object\AdAccount;
use FacebookAds\Object\AdSet;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
$access_token = '<ACCESS_TOKEN>';
$app_secret = '<APP_SECRET>';
$app_id = '<APP_ID>';
$id = '<AD_ACCOUNT_ID>';
$api = Api::init($app_id, $app_secret, $access_token);
$api->setLogger(new CurlLogger());
$fields = array(
);
$params = array(
'name' => 'My First Adset',
'lifetime_budget' => '20000',
'start_time' => '2024-07-29T17:54:57-0700',
'end_time' => '2024-08-08T17:54:57-0700',
'campaign_id' => '<adCampaignLinkClicksID>',
'bid_amount' => '100',
'billing_event' => 'LINK_CLICKS',
'optimization_goal' => 'LINK_CLICKS',
'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US')),'publisher_platforms' => array('facebook','audience_network')),
'status' => 'PAUSED',
);
echo json_encode((new AdAccount($id))->createAdSet(
$fields,
$params
)->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adaccount import AdAccount
from facebook_business.adobjects.adset import AdSet
from facebook_business.api import FacebookAdsApi
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_ACCOUNT_ID>'
FacebookAdsApi.init(access_token=access_token)
fields = [
]
params = {
'name': 'My First Adset',
'lifetime_budget': '20000',
'start_time': '2024-07-29T17:54:57-0700',
'end_time': '2024-08-08T17:54:57-0700',
'campaign_id': '<adCampaignLinkClicksID>',
'bid_amount': '100',
'billing_event': 'LINK_CLICKS',
'optimization_goal': 'LINK_CLICKS',
'targeting': {'facebook_positions':['feed'],'geo_locations':{'countries':['US']},'publisher_platforms':['facebook','audience_network']},
'status': 'PAUSED',
}
print AdAccount(id).create_ad_set(
fields=fields,
params=params,
)
import com.facebook.ads.sdk.*;
import java.io.File;
import java.util.Arrays;
public class SAMPLE_CODE_EXAMPLE {
public static void main (String args[]) throws APIException {
String access_token = \"<ACCESS_TOKEN>\";
String app_secret = \"<APP_SECRET>\";
String app_id = \"<APP_ID>\";
String id = \"<AD_ACCOUNT_ID>\";
APIContext context = new APIContext(access_token).enableDebug(true);
new AdAccount(id, context).createAdSet()
.setName(\"My First Adset\")
.setLifetimeBudget(20000L)
.setStartTime(\"2024-07-29T17:54:57-0700\")
.setEndTime(\"2024-08-08T17:54:57-0700\")
.setCampaignId(\"<adCampaignLinkClicksID>\")
.setBidAmount(100L)
.setBillingEvent(AdSet.EnumBillingEvent.VALUE_LINK_CLICKS)
.setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_LINK_CLICKS)
.setTargeting(
new Targeting()
.setFieldFacebookPositions(Arrays.asList(\"feed\"))
.setFieldGeoLocations(
new TargetingGeoLocation()
.setFieldCountries(Arrays.asList(\"US\"))
)
.setFieldPublisherPlatforms(Arrays.asList(\"facebook\", \"audience_network\"))
)
.setStatus(AdSet.EnumStatus.VALUE_PAUSED)
.execute();
}
}
require 'facebook_ads'
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_ACCOUNT_ID>'
FacebookAds.configure do |config|
config.access_token = access_token
config.app_secret = app_secret
end
ad_account = FacebookAds::AdAccount.get(id)
adsets = ad_account.adsets.create({
name: 'My First Adset',
lifetime_budget: '20000',
start_time: '2024-07-29T17:54:57-0700',
end_time: '2024-08-08T17:54:57-0700',
campaign_id: '<adCampaignLinkClicksID>',
bid_amount: '100',
billing_event: 'LINK_CLICKS',
optimization_goal: 'LINK_CLICKS',
targeting: {'facebook_positions':['feed'],'geo_locations':{'countries':['US']},'publisher_platforms':['facebook','audience_network']},
status: 'PAUSED',
})
The following are the limits on ad sets
Limit | Value |
---|---|
Maximum number of ad sets per regular ad account |
5000 non-deleted ad sets |
Maximum number of ad sets per bulk ad account |
10000 non-deleted ad sets |
Maximum number of ads per ad set |
50 non-archived ads |
Facebook is committed to protecting people from discrimination, and we are continually improving our ability to detect and deter potential abuse. It’s already against our policies to discriminate by wrongfully targeting or excluding specific groups of people. As part of a historic settlement agreement , we are making changes to the way we manage housing, employment and credit ads.
Advertisers must specify a special_ad_category
for ad campaigns that market housing, employment, and credit. In doing so, the set of targeting options available for ads in these campaigns will be restricted. See Special Ad Category
for more information.
Beginning Tuesday, May 16, 2023 advertisers who include the European Union (EU), associated territories, or select global/worldwide in their ad targeting on Facebook and Instagram will be asked to include information about who benefits from the ad (the beneficiary) and who is paying for the ad (the payor) for each ad set. Advertisers will be prompted for this information in all ads buying surfaces including Ads Manager and the Marketing API. Beginning Wednesday, August 16, 2023, if beneficiary and payer information is not provided, the ad will not be published.
We are launching this requirement to respond to the EU Digital Services Act (DSA) which goes into full effect for Facebook and Instagram later this year.
Ad sets targeted to the EU and/or associated territories (see here
for a complete list) are required to provide beneficiary information (who benefits from the ad running), and payer information (who pays for the ad). This applies to new ads, duplicated ads, or significantly edited ads from May 16 forward, and without the required information, the API will respond with a wrong parameter error. For convenience the advertiser can set a saved beneficiary and payor in their ad account, which will be auto-populated during ad set creation, copying, and updating targets to include EU locations and ads under existing ad seta without configured the payor and beneficiary.. For more information about the ad account level parameters, default_dsa_payor
and default_dsa_beneficiary
, see to the check the Ad Account reference document
.
To facilitate the creation of ad sets targeting the EU, we're offering a new API which allows developers to get a list of likely beneficiary/payer strings, based on ad account activity. See Ad Account DSA Recommendations for more information.
Notice:
default_dsa_payor
is payor_default
and default_dsa_beneficiary
is beneficiary_default
. During ad set creation, if only dsa_payor
is passed with the payor, the dsa_beneficiary
will be automatically filled with value of beneficiary_default
instead of dsa_payor
.payer
and the beneficiary
fields are only for ad sets targeting the EU and/or associated territories.To facilitate the creation of ad sets targeting the EU, we're offering a new API which allows developers to get a list of likely beneficiary/payer strings, based on ad account activity. See Ad Account Dsa Recommendations for more information.
An ad set is a group of ads that share the same daily or lifetime budget, schedule, bid type, bid info, and targeting data. Ad sets enable you to group ads according to your criteria, and you can retrieve the ad-related statistics that apply to a set.
The date_preset = lifetime
parameter is disabled in Graph API v10.0 and replaced with date_preset = maximum
, which returns a maximum of 37 months of data. For v9.0 and below, date_preset = maximum
will be enabled on May 25, 2021, and any lifetime
calls will default to maximum
and return only 37 months of data.
curl -X GET \
-d 'fields="name,status"' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/<AD_SET_ID>/
'use strict';
const bizSdk = require('facebook-nodejs-business-sdk');
const AdSet = bizSdk.AdSet;
const access_token = '<ACCESS_TOKEN>';
const app_secret = '<APP_SECRET>';
const app_id = '<APP_ID>';
const id = '<AD_SET_ID>';
const api = bizSdk.FacebookAdsApi.init(access_token);
const showDebugingInfo = true; // Setting this to true shows more debugging info.
if (showDebugingInfo) {
api.setDebug(true);
}
const logApiCallResult = (apiCallName, data) => {
console.log(apiCallName);
if (showDebugingInfo) {
console.log('Data:' + JSON.stringify(data));
}
};
let fields, params;
fields = [
'name',
'status',
];
params = {
};
const sample_code = (new AdSet(id)).get(
fields,
params
);
logApiCallResult('sample_code api call complete.', sample_code);
require __DIR__ . '/vendor/autoload.php';
use FacebookAds\Object\AdSet;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
$access_token = '<ACCESS_TOKEN>';
$app_secret = '<APP_SECRET>';
$app_id = '<APP_ID>';
$id = '<AD_SET_ID>';
$api = Api::init($app_id, $app_secret, $access_token);
$api->setLogger(new CurlLogger());
$fields = array(
'name',
'status',
);
$params = array(
);
echo json_encode((new AdSet($id))->getSelf(
$fields,
$params
)->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adset import AdSet
from facebook_business.api import FacebookAdsApi
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_SET_ID>'
FacebookAdsApi.init(access_token=access_token)
fields = [
'name',
'status',
]
params = {
}
print AdSet(id).get(
fields=fields,
params=params,
)
import com.facebook.ads.sdk.*;
import java.io.File;
import java.util.Arrays;
public class SAMPLE_CODE_EXAMPLE {
public static void main (String args[]) throws APIException {
String access_token = \"<ACCESS_TOKEN>\";
String app_secret = \"<APP_SECRET>\";
String app_id = \"<APP_ID>\";
String id = \"<AD_SET_ID>\";
APIContext context = new APIContext(access_token).enableDebug(true);
new AdSet(id, context).get()
.requestNameField()
.requestStatusField()
.execute();
}
}
require 'facebook_ads'
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_SET_ID>'
FacebookAds.configure do |config|
config.access_token = access_token
config.app_secret = app_secret
end
ad_set = FacebookAds::AdSet.get(id ,'name,status')
To retrieve date-time related fields in a UNIX timestamp format, use the date_format
parameter:
curl -X GET \
-d 'fields="id,name,start_time,end_time"' \
-d 'date_format="U"' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/<AD_SET_ID>/
'use strict';
const bizSdk = require('facebook-nodejs-business-sdk');
const AdSet = bizSdk.AdSet;
const access_token = '<ACCESS_TOKEN>';
const app_secret = '<APP_SECRET>';
const app_id = '<APP_ID>';
const id = '<AD_SET_ID>';
const api = bizSdk.FacebookAdsApi.init(access_token);
const showDebugingInfo = true; // Setting this to true shows more debugging info.
if (showDebugingInfo) {
api.setDebug(true);
}
const logApiCallResult = (apiCallName, data) => {
console.log(apiCallName);
if (showDebugingInfo) {
console.log('Data:' + JSON.stringify(data));
}
};
let fields, params;
fields = [
'id',
'name',
'start_time',
'end_time',
];
params = {
'date_format' : 'U',
};
const sample_code = (new AdSet(id)).get(
fields,
params
);
logApiCallResult('sample_code api call complete.', sample_code);
require __DIR__ . '/vendor/autoload.php';
use FacebookAds\Object\AdSet;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
$access_token = '<ACCESS_TOKEN>';
$app_secret = '<APP_SECRET>';
$app_id = '<APP_ID>';
$id = '<AD_SET_ID>';
$api = Api::init($app_id, $app_secret, $access_token);
$api->setLogger(new CurlLogger());
$fields = array(
'id',
'name',
'start_time',
'end_time',
);
$params = array(
'date_format' => 'U',
);
echo json_encode((new AdSet($id))->getSelf(
$fields,
$params
)->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adset import AdSet
from facebook_business.api import FacebookAdsApi
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_SET_ID>'
FacebookAdsApi.init(access_token=access_token)
fields = [
'id',
'name',
'start_time',
'end_time',
]
params = {
'date_format': 'U',
}
print AdSet(id).get(
fields=fields,
params=params,
)
import com.facebook.ads.sdk.*;
import java.io.File;
import java.util.Arrays;
public class SAMPLE_CODE_EXAMPLE {
public static void main (String args[]) throws APIException {
String access_token = \"<ACCESS_TOKEN>\";
String app_secret = \"<APP_SECRET>\";
String app_id = \"<APP_ID>\";
String id = \"<AD_SET_ID>\";
APIContext context = new APIContext(access_token).enableDebug(true);
new AdSet(id, context).get()
.setParam(\"date_format\", \"U\")
.requestIdField()
.requestNameField()
.requestStartTimeField()
.requestEndTimeField()
.execute();
}
}
require 'facebook_ads'
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_SET_ID>'
FacebookAds.configure do |config|
config.access_token = access_token
config.app_secret = app_secret
end
ad_set = FacebookAds::AdSet.get(id ,'id,name,start_time,end_time')
To retrieve information for multiple ad sets:
use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
$ad_set_ids = array(<AD_SET_1_ID>, <AD_SET_2_ID>, <AD_SET_3_ID>);
$fields = array(
AdSetFields::NAME,
AdSetFields::CONFIGURED_STATUS,
AdSetFields::EFFECTIVE_STATUS,
);
$adsets = AdSet::readIds($ad_set_ids, $fields);
foreach ($adsets as $adset) {
echo $adset->{AdSetFields::NAME}.PHP_EOL;
}
curl -G \
-d 'fields=name,configured_status,effective_status' \
-d 'ids=1000002,1000002,1000002' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/
To read all ad sets from one ad account:
use FacebookAds\Object\AdAccount;
use FacebookAds\Object\Fields\AdSetFields;
$account = new AdAccount('act_<AD_ACCOUNT_ID>');
$adsets = $account->getAdSets(array(
AdSetFields::NAME,
AdSetFields::CONFIGURED_STATUS,
AdSetFields::EFFECTIVE_STATUS,
));
foreach ($adsets as $adset) {
echo $adset->{AdSetFields::NAME}.PHP_EOL;
}
from facebookads.adobjects.adaccount import AdAccount
from facebookads.adobjects.adset import AdSet
account = AdAccount('act_<AD_ACCOUNT_ID>')
adsets = account.get_ad_sets(fields=[AdSet.Field.name])
for adset in adsets:
print(adset[AdSet.Field.name])
APINodeList<AdSet> adSets = new AdAccount(act_<AD_ACCOUNT_ID>, context).getAdSets()
.requestNameField()
.requestConfiguredStatusField()
.requestEffectiveStatusField()
.execute();
curl -G \
-d 'fields=name,configured_status,effective_status' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adsets
To read the names of ad sets with status paused in an ad account
use FacebookAds\Object\AdAccount;
use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
$account = new AdAccount('act_<AD_ACCOUNT_ID>');
$adsets = $account->getAdSets(
array(),
array(
AdSetFields::EFFECTIVE_STATUS => array(
AdSet::STATUS_PAUSED,
),
));
foreach ($adsets as $adset) {
echo $adset->{AdSetFields::NAME}.PHP_EOL;
}
APINodeList<AdSet> adSets = new AdAccount(act_<AD_ACCOUNT_ID>, context).getAdSets()
.setEffectiveStatus("[\"PAUSED\"]")
.execute();
curl -G \
-d 'effective_status=["PAUSED"]' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adsets
To read the end_time
of multiple ad sets.
use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
$adsets = AdSet::readIds(
array($ad_set_1_id, $ad_set_2_id),
array(AdSetFields::END_TIME));
foreach ($adsets as $adset) {
echo $adset->{AdSetFields::END_TIME}.PHP_EOL;
}
curl -G \
-d 'fields=end_time' \
-d 'ids=1000002,1000002' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/
GET /v20.0/<AD_SET_ID>/?fields=adset_schedule HTTP/1.1
Host: graph.facebook.com
/* PHP SDK v5.0.0 */
/* make the API call */
try {
// Returns a `Facebook\FacebookResponse` object
$response = $fb->get(
'/<AD_SET_ID>/?fields=adset_schedule',
'{access-token}'
);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$graphNode = $response->getGraphNode();
/* handle the result */
/* make the API call */
FB.api(
"/<AD_SET_ID>/",
{
"fields": "adset_schedule"
},
function (response) {
if (response && !response.error) {
/* handle the result */
}
}
);
Bundle params = new Bundle();
params.putString("fields", "adset_schedule");
/* make the API call */
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"/<AD_SET_ID>/",
params,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
/* handle the result */
}
}
).executeAsync();
NSDictionary *params = @{
@"fields": @"adset_schedule",
};
/* make the API call */
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
initWithGraphPath:@"/<AD_SET_ID>/"
parameters:params
HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
id result,
NSError *error) {
// Handle the result
}];
curl -X GET -G \
-d 'fields="adset_schedule"' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/<AD_SET_ID>/
Parameter | Description |
---|---|
date_preset
enum{today, yesterday, this_month, last_month, this_quarter, maximum, data_maximum, last_3d, last_7d, last_14d, last_28d, last_30d, last_90d, last_week_mon_sun, last_week_sun_sat, last_quarter, last_year, this_week_mon_today, this_week_sun_today, this_year}
|
Date Preset |
time_range
{'since':YYYY-MM-DD,'until':YYYY-MM-DD}
|
Time Range. Note if time range is invalid, it will be ignored. |
since
datetime
|
A date in the format of "YYYY-MM-DD", which means from the beginning midnight of that day. |
until
datetime
|
A date in the format of "YYYY-MM-DD", which means to the beginning midnight of the following day. |
id
ID for the Ad Set
account_id
ID for the Ad Account associated with this Ad Set
adlabels
Ad Labels associated with this ad set
adset_schedule
Ad set schedule, representing a delivery schedule for a single day
asset_feed_id
The ID of the asset feed that constains a content to create ads
attribution_spec
Conversion attribution spec used for attributing conversions for optimization. Supported window lengths differ by optimization goal and campaign objective. See Objective, Optimization Goal and attribution_spec
.
bid_adjustments
Map of bid adjustment types to values
bid_amount
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 optimization_goal
. The target cost used in a target cost bid strategy
lets Facebook bid on your behalf to meet your target on average and keep costs stable as you raise budget.
The bid amount's unit is cents for currencies like USD, EUR, and the basic unit for currencies like JPY, KRW. The bid amount for ads with IMPRESSION
or REACH
as billing_event
is per 1,000 occurrences of that event, and the bid amount for ads with other billing_event
s is for each occurrence.
bid_constraints
Choose bid constraints for ad set to suit your specific business goals. It usually works together with bid_strategy
field.
bid_info
Map of bid objective to bid value.
Bid strategy for this ad set when you use AUCTION
as your buying type:
LOWEST_COST_WITHOUT_CAP
: Designed to get the most results for your budget based on
your ad set optimization_goal
without limiting your bid amount. This is the best strategy
if you care most about cost efficiency. However with this strategy it may be harder to get
stable average costs as you spend. This strategy is also known as automatic bidding
.
Learn more in Ads Help Center, About bid strategies: Lowest cost
.
LOWEST_COST_WITH_BID_CAP
: Designed to get the most results for your budget based on
your ad set optimization_goal
while limiting actual bid to your specified
amount. With a bid cap you have more control over your
cost per actual optimization event. However if you set a limit which is too low you may
get less ads delivery. Get your bid cap with the field bid_amount
.
This strategy is also known as manual maximum-cost bidding
.
Learn more in Ads Help Center, About bid strategies: Lowest cost
.
Notes:
bid_strategy
at the parent campaign level.TARGET_COST
bidding strategy has been deprecated with Marketing API v9
.billing_event
The billing event for this ad set:
APP_INSTALLS
: Pay when people install your app.
CLICKS
: Pay when people click anywhere in the ad.
IMPRESSIONS
: Pay when the ads are shown to people.
LINK_CLICKS
: Pay when people click on the link of the ad.
OFFER_CLAIMS
: Pay when people claim the offer.
PAGE_LIKES
: Pay when people like your page.
POST_ENGAGEMENT
: Pay when people engage with your post.
VIDEO_VIEWS
: Pay when people watch your video ads for at least 10 seconds.
THRUPLAY
: Pay for ads that are played to completion, or played for at least 15 seconds.
brand_safety_config
Brand Safety and Suitability config
budget_remaining
Remaining budget of this Ad Set
campaign
The campaign that contains this ad set
campaign_active_time
Campaign running length
campaign_attribution
campaign_attribution, a new field for app ads campaign, used to indicate a campaign's attribution type, eg: SKAN or AEM
campaign_id
The ID of the campaign that contains this ad set
configured_status
The status set at the ad set level. It can be different from the effective status due to its parent campaign. Prefer using 'status' instead of this.
contextual_bundling_spec
specs of contextual bundling Ad Set setup, including signal of opt-in/out the feature
created_time
Time when this Ad Set was created
creative_sequence
Order of the adgroup sequence to be shown to users
daily_budget
The daily budget of the set defined in your account currency .
daily_min_spend_target
Daily minimum spend target of the ad set defined in your account currency. To use this field, daily budget must be specified in the Campaign. This target is not a guarantee but our best effort.
daily_spend_cap
Daily spend cap of the ad set defined in your account currency. To use this field, daily budget must be specified in the Campaign.
destination_type
Destination of ads in this Ad Set.
Options include: WEBSITE
, APP
, MESSENGER
, INSTAGRAM_DIRECT
.
The ON_AD
, ON_POST
, ON_VIDEO
, ON_PAGE
, and ON_EVENT
destination types are currently in limited beta testing. Trying to duplicate campaigns with existing destination types using these new destination types may throw an error. See the Outcome-Driven Ads Experiences
section below for more information.
dsa_beneficiary
The beneficiary of all ads in this ad set.
dsa_payor
The payor of all ads in this ad set.
effective_status
The effective status of the adset. The status could be effective either
because of its own status, or the status of its parent campaign. WITH_ISSUES
is available for version 3.2 or higher. IN_PROCESS
is available for version 4.0 or higher.
end_time
End time, in UTC UNIX timestamp
frequency_control_specs
An array of frequency control specs for this ad set. As there is only one event type currently supported, this array has no more than one element. Writes to this field are only available in ad sets where REACH
is the objective.
instagram_actor_id
Represents your Instagram account id, used for ads, including dynamic creative ads on Instagram.
Whether this ad set is a dynamic creative ad set. dynamic creative ad can be created only under ad set with this field set to be true.
Issues for this ad set that prevented it from deliverying
learning_stage_info
Info about whether the ranking or delivery system is still learning for this ad set. While the ad set is still in learning , we might unstablized delivery performances.
lifetime_budget
The lifetime budget of the set defined in your account currency .
lifetime_imps
Lifetime impressions. Available only for campaigns with buying_type=FIXED_CPM
lifetime_min_spend_target
Lifetime minimum spend target of the ad set defined in your account currency. To use this field, lifetime budget must be specified in the Campaign. This target is not a guarantee but our best effort.
lifetime_spend_cap
Lifetime spend cap of the ad set defined in your account currency. To use this field, lifetime budget must be specified in the Campaign.
min_budget_spend_percentage
min_budget_spend_percentage
multi_optimization_goal_weight
multi_optimization_goal_weight
name
Name of the ad set
optimization_goal
The optimization goal this ad set is using.
NONE
: Only available in read mode for campaigns created pre-v2.4.
APP_INSTALLS
: Optimize for people more likely to install your app.
AD_RECALL_LIFT
: Optimize for people more likely to remember seeing your ads.
CLICKS
: Deprecated. Only available in read mode.
ENGAGED_USERS
: Optimize for people more likely to take a particular action in your app.
EVENT_RESPONSES
: Optimize for people more likely to attend your event.
IMPRESSIONS
: Show the ads as many times as possible.
LEAD_GENERATION
: Optimize for people more likely to fill out a lead generation form.
QUALITY_LEAD
: Optimize for people who are likely to have a deeper conversation with advertisers after lead submission.
LINK_CLICKS
: Optimize for people more likely to click in the link of the ad.
OFFSITE_CONVERSIONS
: Optimize for people more likely to make a conversion on the site.
PAGE_LIKES
: Optimize for people more likely to like your page.
POST_ENGAGEMENT
: Optimize for people more likely to engage with your post.
QUALITY_CALL
: Optimize for people who are likely to call the advertiser.
REACH
: Optimize to reach the most unique users for each day or interval specified in frequency_control_specs
.
LANDING_PAGE_VIEWS
: Optimize for people who are most likely to click on and load your chosen landing page.
VISIT_INSTAGRAM_PROFILE
: Optimize for visits to the advertiser's Instagram profile.
VALUE
: Optimize for maximum total purchase value within the specified attribution window.
THRUPLAY
: Optimize delivery of your ads to people who are more likely to play your ad to completion, or play it for at least 15 seconds.
DERIVED_EVENTS
: Optimize for retention, which reaches people who are most likely to return to the app and open it again during a given time frame after installing. You can choose either two days, meaning the app is likely to be reopened between 24 and 48 hours after installation; or seven days, meaning the app is likely to be reopened between 144 and 168 hours after installation.
APP_INSTALLS_AND_OFFSITE_CONVERSIONS
: Optimizes for people more likely to install your app and make a conversion on your site.
CONVERSATIONS
: Directs ads to people more likely to have a conversation with the business.
optimization_sub_event
Optimization sub event for a specific optimization goal. For example: Sound-On event for Video-View-2s optimization goal.
pacing_type
Defines the pacing type, standard or using ad scheduling
promoted_object
The object this ad set is promoting across all its ads.
recommendations
If there are recommendations for this ad set, this field includes them. Otherwise, will not be included in the response. This field is not included in redownload mode.
recurring_budget_semantics
If this field is true
, your daily spend may be more than your daily budget while your weekly spend will not exceed 7 times your daily budget. More details explained in the Ad Set Budget
document. If this is false
, your amount spent daily will not exceed the daily budget. This field is not applicable for lifetime budgets.
regional_regulated_categories
This param is used to specify regional_regulated_categories. Currently it supports null
and TAIWAN_FINSERV
.
Example: null
or [TAIWAN_FINSERV]
regional_regulation_identities
This param is used to specify regional_regulation_identities.
Example:
regional_regulation_identities: {
"taiwan_finserv_beneficiary": <verified_identity_id>,
"taiwan_finserv_payer": <verified_identity_id>
}
Passing null
as the id will remove existing id.
review_feedback
Reviews for dynamic creative ad
rf_prediction_id
Reach and frequency prediction ID
source_adset
The source ad set that this ad set was copied from
source_adset_id
The source ad set id that this ad set was copied from
start_time
Start time, in UTC UNIX timestamp
status
The status set at the ad set level. It can be different from the
effective status due to its parent campaign. The field returns the same
value as configured_status
, and is the suggested one to use.
targeting
Targeting
Targeting options that are relaxed and used as a signal for optimization
time_based_ad_rotation_id_blocks
Specify ad creative that displays at custom date ranges in a campaign
as an array. A list of Adgroup IDs. The list of ads to display for each
time range in a given schedule. For example display first ad in Adgroup
for first date range, second ad for second date range, and so on. You
can display more than one ad per date range by providing more than
one ad ID per array. For example set time_based_ad_rotation_id_blocks
to [[1], [2, 3], [1, 4]]. On the
first date range show ad 1, on the second date range show ad 2 and ad 3
and on the last date range show ad 1 and ad 4. Use with time_based_ad_rotation_intervals
to specify date ranges.
time_based_ad_rotation_intervals
Date range when specific ad creative displays during a campaign.
Provide date ranges in an array of UNIX timestamps where each
timestamp represents the start time for each date range. For example a
3-day campaign from May 9 12am to May 11 11:59PM PST can have three
date ranges, the first date range starts from May 9 12:00AM to
May 9 11:59PM, second date range starts from May 10 12:00AM to
May 10 11:59PM and last starts from May 11 12:00AM to May 11 11:59PM.
The first timestamp should match the campaign start time. The last
timestamp should be at least 1 hour before the campaign end time. You
must provide at least two date ranges. All date ranges must cover the
whole campaign length, so any date range cannot exceed campaign length.
Use with time_based_ad_rotation_id_blocks
to specify ad creative for
each date range.
updated_time
Time when the Ad Set was updated
use_new_app_click
If set, allows Mobile App Engagement ads to optimize for LINK_CLICKS
Edge | Description |
---|---|
Edge<AdActivity>
|
The activities of this ad set |
Edge<AdStudy>
|
The ad studies containing this ad set |
Edge<AdCreative>
|
The creatives of this ad set |
Edge<AdRule>
|
Ad rules that govern this ad set - by default, this only returns rules that either directly mention the ad set by id or indirectly through the set |
Edge<Adgroup>
|
The ads under this ad set |
Edge<AdAsyncRequest>
|
Async ad requests for this ad set |
Edge<AdCampaign>
|
The copies of this ad set |
Edge<AdCampaignDeliveryEstimate>
|
The delivery estimate for this ad set |
Edge<MessageDeliveryEstimate>
|
Delivery estimation of the marketing message campaign |
Edge<TargetingSentenceLine>
|
The targeting description sentence for this ad set |
Error | Description |
---|---|
100 | Invalid parameter |
80004 | There have been too many calls to this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting#ads-management. |
200 | Permissions error |
190 | Invalid OAuth 2.0 Access Token |
2500 | Error parsing graph query |
2635 | You are calling a deprecated version of the Ads API. Please update to the latest version. |
3018 | The start date of the time range cannot be beyond 37 months from the current date |
Validate an ad set with a daily budget where campaign objective is set to APP_INSTALLS
curl -X POST \
-F 'name="Mobile App Installs Ad Set"' \
-F 'daily_budget=1000' \
-F 'bid_amount=2' \
-F 'billing_event="IMPRESSIONS"' \
-F 'optimization_goal="APP_INSTALLS"' \
-F 'campaign_id="<AD_CAMPAIGN_ID>"' \
-F 'promoted_object={
"application_id": "<APP_ID>",
"object_store_url": "<APP_STORE_URL>"
}' \
-F 'targeting={
"device_platforms": [
"mobile"
],
"facebook_positions": [
"feed"
],
"geo_locations": {
"countries": [
"US"
]
},
"publisher_platforms": [
"facebook",
"audience_network"
],
"user_os": [
"IOS"
]
}' \
-F 'status="PAUSED"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/adsets
'use strict';
const bizSdk = require('facebook-nodejs-business-sdk');
const AdAccount = bizSdk.AdAccount;
const AdSet = bizSdk.AdSet;
const access_token = '<ACCESS_TOKEN>';
const app_secret = '<APP_SECRET>';
const app_id = '<APP_ID>';
const id = '<AD_ACCOUNT_ID>';
const api = bizSdk.FacebookAdsApi.init(access_token);
const showDebugingInfo = true; // Setting this to true shows more debugging info.
if (showDebugingInfo) {
api.setDebug(true);
}
const logApiCallResult = (apiCallName, data) => {
console.log(apiCallName);
if (showDebugingInfo) {
console.log('Data:' + JSON.stringify(data));
}
};
let fields, params;
fields = [
];
params = {
'name' : 'Mobile App Installs Ad Set',
'daily_budget' : '1000',
'bid_amount' : '2',
'billing_event' : 'IMPRESSIONS',
'optimization_goal' : 'APP_INSTALLS',
'campaign_id' : '<adCampaignAppInstallsID>',
'promoted_object' : {'application_id':'<appID>','object_store_url':'<appLink>'},
'targeting' : {'device_platforms':['mobile'],'facebook_positions':['feed'],'geo_locations':{'countries':['US']},'publisher_platforms':['facebook','audience_network'],'user_os':['IOS']},
'status' : 'PAUSED',
};
const adsets = (new AdAccount(id)).createAdSet(
fields,
params
);
logApiCallResult('adsets api call complete.', adsets);
require __DIR__ . '/vendor/autoload.php';
use FacebookAds\Object\AdAccount;
use FacebookAds\Object\AdSet;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
$access_token = '<ACCESS_TOKEN>';
$app_secret = '<APP_SECRET>';
$app_id = '<APP_ID>';
$id = '<AD_ACCOUNT_ID>';
$api = Api::init($app_id, $app_secret, $access_token);
$api->setLogger(new CurlLogger());
$fields = array(
);
$params = array(
'name' => 'Mobile App Installs Ad Set',
'daily_budget' => '1000',
'bid_amount' => '2',
'billing_event' => 'IMPRESSIONS',
'optimization_goal' => 'APP_INSTALLS',
'campaign_id' => '<adCampaignAppInstallsID>',
'promoted_object' => array('application_id' => '<appID>','object_store_url' => '<appLink>'),
'targeting' => array('device_platforms' => array('mobile'),'facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US')),'publisher_platforms' => array('facebook','audience_network'),'user_os' => array('IOS')),
'status' => 'PAUSED',
);
echo json_encode((new AdAccount($id))->createAdSet(
$fields,
$params
)->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adaccount import AdAccount
from facebook_business.adobjects.adset import AdSet
from facebook_business.api import FacebookAdsApi
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_ACCOUNT_ID>'
FacebookAdsApi.init(access_token=access_token)
fields = [
]
params = {
'name': 'Mobile App Installs Ad Set',
'daily_budget': '1000',
'bid_amount': '2',
'billing_event': 'IMPRESSIONS',
'optimization_goal': 'APP_INSTALLS',
'campaign_id': '<adCampaignAppInstallsID>',
'promoted_object': {'application_id':'<appID>','object_store_url':'<appLink>'},
'targeting': {'device_platforms':['mobile'],'facebook_positions':['feed'],'geo_locations':{'countries':['US']},'publisher_platforms':['facebook','audience_network'],'user_os':['IOS']},
'status': 'PAUSED',
}
print AdAccount(id).create_ad_set(
fields=fields,
params=params,
)
import com.facebook.ads.sdk.*;
import java.io.File;
import java.util.Arrays;
public class SAMPLE_CODE_EXAMPLE {
public static void main (String args[]) throws APIException {
String access_token = \"<ACCESS_TOKEN>\";
String app_secret = \"<APP_SECRET>\";
String app_id = \"<APP_ID>\";
String id = \"<AD_ACCOUNT_ID>\";
APIContext context = new APIContext(access_token).enableDebug(true);
new AdAccount(id, context).createAdSet()
.setName(\"Mobile App Installs Ad Set\")
.setDailyBudget(1000L)
.setBidAmount(2L)
.setBillingEvent(AdSet.EnumBillingEvent.VALUE_IMPRESSIONS)
.setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_APP_INSTALLS)
.setCampaignId(\"<adCampaignAppInstallsID>\")
.setPromotedObject(\"{\\"application_id\\":\\"<appID>\\",\\"object_store_url\\":\\"<appLink>\\"}\")
.setTargeting(
new Targeting()
.setFieldDevicePlatforms(Arrays.asList(Targeting.EnumDevicePlatforms.VALUE_MOBILE))
.setFieldFacebookPositions(Arrays.asList(\"feed\"))
.setFieldGeoLocations(
new TargetingGeoLocation()
.setFieldCountries(Arrays.asList(\"US\"))
)
.setFieldPublisherPlatforms(Arrays.asList(\"facebook\", \"audience_network\"))
.setFieldUserOs(Arrays.asList(\"IOS\"))
)
.setStatus(AdSet.EnumStatus.VALUE_PAUSED)
.execute();
}
}
require 'facebook_ads'
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_ACCOUNT_ID>'
FacebookAds.configure do |config|
config.access_token = access_token
config.app_secret = app_secret
end
ad_account = FacebookAds::AdAccount.get(id)
adsets = ad_account.adsets.create({
name: 'Mobile App Installs Ad Set',
daily_budget: '1000',
bid_amount: '2',
billing_event: 'IMPRESSIONS',
optimization_goal: 'APP_INSTALLS',
campaign_id: '<adCampaignAppInstallsID>',
promoted_object: {'application_id':'<appID>','object_store_url':'<appLink>'},
targeting: {'device_platforms':['mobile'],'facebook_positions':['feed'],'geo_locations':{'countries':['US']},'publisher_platforms':['facebook','audience_network'],'user_os':['IOS']},
status: 'PAUSED',
})
When creating an ad set, from v2.4
and on, there will be a minimum budget for different billing events (clicks, impressions, actions). Minimum values are defined in terms of the daily budget but apply to lifetime budgets as well. For example, if the minimum daily budget is $5, a campaign lasting 5 days will need at least $25 for budget. All values in this section are in US Dollars. Differenct currency has different minimum daily budget limit.
If bid_strategy
is set to LOWEST_COST_WITHOUT_CAP
in the ad set:
Billing Event | Minimum Daily Budget | Notes |
---|---|---|
Impressions |
$0.50 |
|
Clicks/Likes/Video Views |
$2.50 |
|
Low-frequency Actions |
$40 |
Low-frequency actions include mobile app installs, offer claims or canvas app installs. Important:This minimum daily budget is the same for all countries. |
If bid_strategy
is set to LOWEST_COST_WITH_BID_CAP
in the ad set:
Billing Event | Minimum Daily Budget |
---|---|
Impressions |
At least the |
Clicks/Actions |
5x the |
Budgets in other non-USD currencies will be converted and validated upon time of ad set creation.
For ads belonging to ad accounts from countries in the list below, the minimum values are 2x the ones in the tables. For example if billing event is an impression, minimum daily budget is $0.50 but in the the following countries minimum would be $1.00:
Australia, Austria, Belgium, Canada, Denmark, Finland, France, Germany, Greece, Hong Kong, Israel, Italy, Japan, Netherlands, New Zealand, Norway, Singapore, South Korea, Spain, Sweden, Switzerland, Taiwan, United Kingdom, United States of America.
The only exception to this rule are low-frequency actions when bid_strategy
is LOWEST_COST_WITHOUT_CAP
.
If you promote a Page post which has been targeted by locale the ad set targeting must include the same, or a subset of, locale targeting as the Page post.
E.g. if the Page post is targeted at locales 6 (US English) and 24 (UK English), then the ad set must be targeted at one or more of the same locales.
Mobile app ad sets should
Desktop app ad sets must
'page_types':['desktopfeed']
or'page_types':['rightcolumn']
or'page_types':['desktop']
along with the other targeting options you have selected.CANVAS_APP_*
objectiveBeginning with v13.0, for newly created ad sets that optimize for value, conversions, or app events, lookalike expansion will be turned on by default and cannot be disabled. When getting an ad set that optimizes for value, conversions, or app events, we will return a new lookalike property in the targeting_optimization_types
map that indicates lookalike expansion is enabled and complements the existing detailed_targeting
property for the detailed targeting expansion.
For ad sets targeting the EU and/or associated territories, the dsa_payor
and dsa_beneficiary
fields are required. The information provided in these 2 fields will be shown to end users to indicate who is paying for the ad and who is the beneficiary of the ad.
Request
Include the following fields in an API call to the /{adset_id}
endpoint.
{ "dsa_payor": "<PAYOR_NAME>", "dsa_beneficiary": "<BENEFICIARY_NAME>" ... }
Fields
Name | Description |
---|---|
string (max 512 char)
|
The payor of all ads in this ad set. |
string (max 512 char)
|
The beneficiary of all ads in this ad set. |
If these fields are not provided, the API may returns the following errors: Payor missing error
{ "error": { "message": "Invalid parameter", "type": "FacebookApiException", "code": 100, "error_data": "{\"blame_field_specs\":[[\"dsa_payor\"]]}", "error_subcode": 3858079, "is_transient": false, "error_user_title": "No payor provided in DSA regulated region", "error_user_msg": "The DSA requires ads to provide payor information in regulated regions. Updating/creating ad needs to provide payor of the ad.", "fbtrace_id": "fbtrace_id" }, "__fb_trace_id__": "fbtrace_id", "__www_request_id__": "request_id" }Beneficiary missing error
{ "error": { "message": "Invalid parameter", "type": "FacebookApiException", "code": 100, "error_data": "{\"blame_field_specs\":[[\"dsa_beneficiary\"]]}", "error_subcode": 3858081, "is_transient": false, "error_user_title": "No payor/beneficiary provided in DSA regulated location", "error_user_msg": "The DSA requires ads to provide beneficiary information in regulated regions. Updating/creating ad needs to provide beneficiary of the ad.", "fbtrace_id": "fbtrace_id" }, "__fb_trace_id__": "fbtrace_id", "__www_request_id__": "request_id" }
copies
edge from the following paths:
Parameter | Description |
---|---|
campaign_id
numeric string or integer
|
Single ID of a campaign to make parent of the copy. The copy inherits all campaign settings, such as budget from the parent.Ignore if you want to keep the copy under the original campaign parent. |
deep_copy
boolean
|
Default value:
false
Whether to copy all the child ads. Limits: the total number of children ads to copy should not exceed 3 for a synchronous call and 51 for an asynchronous call. |
end_time
datetime
|
The end time of the set, e.g. |
rename_options
JSON or object-like arrays
|
Rename options |
rename_strategy
enum {DEEP_RENAME, ONLY_TOP_LEVEL_RENAME, NO_RENAME}
|
Default value:
ONLY_TOP_LEVEL_RENAME
|
rename_prefix
string
|
A prefix to copy names. Defaults to null if not provided. |
rename_suffix
string
|
A suffix to copy names. Defaults to null if not provided and appends a localized string of |
start_time
datetime
|
The start time of the set, e.g. |
status_option
enum {ACTIVE, PAUSED, INHERITED_FROM_SOURCE}
|
Default value:
PAUSED
|
copied_adset_id
in the return type.copied_adset_id
: numeric string,ad_object_ids
: List [ ad_object_type
: enum {unique_adcreative, ad, ad_set, campaign, opportunities, privacy_info_center, topline, ad_account},source_id
: numeric string,copied_id
: numeric string,Error | Description |
---|---|
100 | Invalid parameter |
200 | Permissions error |
368 | The action attempted has been deemed abusive or is otherwise disallowed |
190 | Invalid OAuth 2.0 Access Token |
adsets
edge from the following paths:
POST /v20.0/act_<AD_ACCOUNT_ID>/adsets HTTP/1.1
Host: graph.facebook.com
name=My+First+AdSet&daily_budget=10000&bid_amount=300&billing_event=IMPRESSIONS&optimization_goal=REACH&campaign_id=%3CAD_CAMPAIGN_ID%3E&promoted_object=%7B%22page_id%22%3A%22%3CPAGE_ID%3E%22%7D&targeting=%7B%22facebook_positions%22%3A%5B%22feed%22%5D%2C%22geo_locations%22%3A%7B%22countries%22%3A%5B%22US%22%5D%2C%22regions%22%3A%5B%7B%22key%22%3A%224081%22%7D%5D%2C%22cities%22%3A%5B%7B%22key%22%3A777934%2C%22radius%22%3A10%2C%22distance_unit%22%3A%22mile%22%7D%5D%7D%2C%22genders%22%3A%5B1%5D%2C%22age_max%22%3A24%2C%22age_min%22%3A20%2C%22publisher_platforms%22%3A%5B%22facebook%22%2C%22audience_network%22%5D%2C%22device_platforms%22%3A%5B%22mobile%22%5D%2C%22flexible_spec%22%3A%5B%7B%22interests%22%3A%5B%7B%22id%22%3A%22%3CINTEREST_ID%3E%22%2C%22name%22%3A%22%3CINTEREST_NAME%3E%22%7D%5D%7D%5D%7D&status=PAUSED
/* PHP SDK v5.0.0 */
/* make the API call */
try {
// Returns a `Facebook\FacebookResponse` object
$response = $fb->post(
'/act_<AD_ACCOUNT_ID>/adsets',
array (
'name' => 'My First AdSet',
'daily_budget' => '10000',
'bid_amount' => '300',
'billing_event' => 'IMPRESSIONS',
'optimization_goal' => 'REACH',
'campaign_id' => '<AD_CAMPAIGN_ID>',
'promoted_object' => '{"page_id":"<PAGE_ID>"}',
'targeting' => '{"facebook_positions":["feed"],"geo_locations":{"countries":["US"],"regions":[{"key":"4081"}],"cities":[{"key":777934,"radius":10,"distance_unit":"mile"}]},"genders":[1],"age_max":24,"age_min":20,"publisher_platforms":["facebook","audience_network"],"device_platforms":["mobile"],"flexible_spec":[{"interests":[{"id":"<INTEREST_ID>","name":"<INTEREST_NAME>"}]}]}',
'status' => 'PAUSED',
),
'{access-token}'
);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$graphNode = $response->getGraphNode();
/* handle the result */
/* make the API call */
FB.api(
"/act_<AD_ACCOUNT_ID>/adsets",
"POST",
{
"name": "My First AdSet",
"daily_budget": "10000",
"bid_amount": "300",
"billing_event": "IMPRESSIONS",
"optimization_goal": "REACH",
"campaign_id": "<AD_CAMPAIGN_ID>",
"promoted_object": "{\"page_id\":\"<PAGE_ID>\"}",
"targeting": "{\"facebook_positions\":[\"feed\"],\"geo_locations\":{\"countries\":[\"US\"],\"regions\":[{\"key\":\"4081\"}],\"cities\":[{\"key\":777934,\"radius\":10,\"distance_unit\":\"mile\"}]},\"genders\":[1],\"age_max\":24,\"age_min\":20,\"publisher_platforms\":[\"facebook\",\"audience_network\"],\"device_platforms\":[\"mobile\"],\"flexible_spec\":[{\"interests\":[{\"id\":\"<INTEREST_ID>\",\"name\":\"<INTEREST_NAME>\"}]}]}",
"status": "PAUSED"
},
function (response) {
if (response && !response.error) {
/* handle the result */
}
}
);
Bundle params = new Bundle();
params.putString("name", "My First AdSet");
params.putString("daily_budget", "10000");
params.putString("bid_amount", "300");
params.putString("billing_event", "IMPRESSIONS");
params.putString("optimization_goal", "REACH");
params.putString("campaign_id", "<AD_CAMPAIGN_ID>");
params.putString("promoted_object", "{\"page_id\":\"<PAGE_ID>\"}");
params.putString("targeting", "{\"facebook_positions\":[\"feed\"],\"geo_locations\":{\"countries\":[\"US\"],\"regions\":[{\"key\":\"4081\"}],\"cities\":[{\"key\":777934,\"radius\":10,\"distance_unit\":\"mile\"}]},\"genders\":[1],\"age_max\":24,\"age_min\":20,\"publisher_platforms\":[\"facebook\",\"audience_network\"],\"device_platforms\":[\"mobile\"],\"flexible_spec\":[{\"interests\":[{\"id\":\"<INTEREST_ID>\",\"name\":\"<INTEREST_NAME>\"}]}]}");
params.putString("status", "PAUSED");
/* make the API call */
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"/act_<AD_ACCOUNT_ID>/adsets",
params,
HttpMethod.POST,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
/* handle the result */
}
}
).executeAsync();
NSDictionary *params = @{
@"name": @"My First AdSet",
@"daily_budget": @"10000",
@"bid_amount": @"300",
@"billing_event": @"IMPRESSIONS",
@"optimization_goal": @"REACH",
@"campaign_id": @"<AD_CAMPAIGN_ID>",
@"promoted_object": @"{\"page_id\":\"<PAGE_ID>\"}",
@"targeting": @"{\"facebook_positions\":[\"feed\"],\"geo_locations\":{\"countries\":[\"US\"],\"regions\":[{\"key\":\"4081\"}],\"cities\":[{\"key\":777934,\"radius\":10,\"distance_unit\":\"mile\"}]},\"genders\":[1],\"age_max\":24,\"age_min\":20,\"publisher_platforms\":[\"facebook\",\"audience_network\"],\"device_platforms\":[\"mobile\"],\"flexible_spec\":[{\"interests\":[{\"id\":\"<INTEREST_ID>\",\"name\":\"<INTEREST_NAME>\"}]}]}",
@"status": @"PAUSED",
};
/* make the API call */
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
initWithGraphPath:@"/act_<AD_ACCOUNT_ID>/adsets"
parameters:params
HTTPMethod:@"POST"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
id result,
NSError *error) {
// Handle the result
}];
curl -X POST \
-F 'name="My First AdSet"' \
-F 'daily_budget=10000' \
-F 'bid_amount=300' \
-F 'billing_event="IMPRESSIONS"' \
-F 'optimization_goal="REACH"' \
-F 'campaign_id="<AD_CAMPAIGN_ID>"' \
-F 'promoted_object={
"page_id": "<PAGE_ID>"
}' \
-F 'targeting={
"facebook_positions": [
"feed"
],
"geo_locations": {
"countries": [
"US"
],
"regions": [
{
"key": "4081"
}
],
"cities": [
{
"key": 777934,
"radius": 10,
"distance_unit": "mile"
}
]
},
"genders": [
1
],
"age_max": 24,
"age_min": 20,
"publisher_platforms": [
"facebook",
"audience_network"
],
"device_platforms": [
"mobile"
],
"flexible_spec": [
{
"interests": [
{
"id": "<INTEREST_ID>",
"name": "<INTEREST_NAME>"
}
]
}
]
}' \
-F 'status="PAUSED"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/act_<AD_ACCOUNT_ID>/adsets
adlabels
Specifies list of labels to be associated with this object. This field is optional
adset_schedule
Ad set schedule, representing a delivery schedule for a single day
start_minute
A 0 based minute of the day representing when the schedule starts
end_minute
A 0 based minute of the day representing when the schedule ends
days
Array of ints representing which days the schedule is active. Valid values are 0-6 with 0 representing Sunday, 1 representing Monday, ... and 6 representing Saturday.
timezone_type
USER
attribution_spec
Conversion attribution spec used for attributing conversions for optimization. Supported window lengths differ by optimization goal and campaign objective.
event_type
window_days
bid_amount
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 optimization_goal
. The target cost used in a target cost bid strategy
lets Facebook bid to meet your target on average and keep costs stable as you spend. If an ad level bid_amount
is specified, updating this value will overwrite the previous ad level bid. Unless you are using Reach and Frequency
, bid_amount
is required if bid_strategy
is set to LOWEST_COST_WITH_BID_CAP
or COST_CAP
.
The bid amount's unit is cents for currencies like USD, EUR, and the basic unit for currencies like JPY, KRW. The bid amount for ads with IMPRESSION
or REACH
as billing_event
is per 1,000 occurrences, and has to be at least 2 US cents or more. For ads with other billing_event
s, 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.
Choose bid strategy for this ad set to suit your specific business goals.
Each strategy has tradeoffs and may be available for certain optimization_goal
s:
LOWEST_COST_WITHOUT_CAP
: Designed to get the most results for your budget based on
your ad set optimization_goal
without limiting your bid amount. This is the best strategy
if you care most about cost efficiency. However with this strategy it may be harder to get
stable average costs as you spend. This strategy is also known as automatic bidding
.
Learn more in Ads Help Center, About bid strategies: Lowest cost
.
LOWEST_COST_WITH_BID_CAP
: Designed to get the most results for your budget based on
your ad set optimization_goal
while limiting actual bid to your specified
amount. With a bid cap you have more control over your
cost per actual optimization event. However if you set a limit which is too low you may
get less ads delivery. If you select this, you must provide
a bid cap with the bid_amount
field.
Note: during creation this bid strategy is set if you provide bid_amount
only.
This strategy is also known as manual maximum-cost bidding
.
Learn more in Ads Help Center, About bid strategies: Lowest cost
.
Notes:
If you enable campaign budget optimization, you should set bid_strategy
at the parent campaign level.
TARGET_COST
bidding strategy has been deprecated with Marketing API v9
.
billing_event
The billing event that this ad set is using:
APP_INSTALLS: Pay when people install your app.
CLICKS: Deprecated.
IMPRESSIONS: Pay when the ads are shown to people.
LINK_CLICKS: Pay when people click on the link of the ad.
OFFER_CLAIMS: Pay when people claim the offer.
PAGE_LIKES: Pay when people like your page.
POST_ENGAGEMENT: Pay when people engage with your post.
VIDEO_VIEWS: Pay when people watch your video ads for at least 10 seconds.
THRUPLAY: Pay for ads that are played to completion, or played for at least 15 seconds.
budget_schedule_specs
Initial high demand periods to be created with the ad set.
Provide list of time_start
, time_end
, budget_value
, and budget_value_type
.
For example,
-F 'budget_schedule_specs=[{
"time_start":1699081200,
"time_end":1699167600,
"budget_value":100,
"budget_value_type":"ABSOLUTE"
}]'
See High Demand Period
for more details on each field.
id
time_start
time_end
budget_value
budget_value_type
recurrence_type
weekly_schedule
days
minute_start
minute_end
timezone_type
campaign_attribution
campaign_attribution
campaign_id
The ad campaign you wish to add this ad set to.
campaign_spec
Provide name
, objective
and buying_type
for a campaign you want to create. Otherwise you need to provide campaign_id
for an existing ad campaign. For example:
-F 'campaign_spec={
"name": "Inline created campaign",
"objective": "CONVERSIONS",
"buying_type": "AUCTION"
}'
Please refer to the Outcome-Driven Ads Experiences mapping table
to find new objectives and their corresponding destination types, optimization goals and promoted objects.
contextual_bundling_spec
settings of Contextual Bundle to support ads serving in Facebook contextual surfaces
status
creative_sequence
Order of the adgroup sequence to be shown to users
daily_budget
The daily budget defined in your account currency
, allowed only for ad sets with a duration (difference between end_time
and start_time
) longer than 24 hours.
Either daily_budget
or lifetime_budget
must be greater than 0.
daily_imps
Daily impressions. Available only for campaigns with buying_type=FIXED_CPM
daily_min_spend_target
Daily minimum spend target of the ad set defined in your account currency. To use this field, daily budget must be specified in the Campaign. This target is not a guarantee but our best effort.
daily_spend_cap
Daily spend cap of the ad set defined in your account currency. To use this field, daily budget must be specified in the Campaign. Set the value to 922337203685478 to remove the spend cap.
destination_type
Destination of ads in this Ad Set. Options include: Website, App, Messenger, INSTAGRAM_DIRECT
, INSTAGRAM_PROFILE
.
dsa_beneficiary
dsa_beneficiary
dsa_payor
dsa_payor
end_time
End time, required when lifetime_budget
is specified. e.g. 2015-03-12 23:59:59-07:00
or 2015-03-12 23:59:59 PDT
. When creating a set with a daily budget, specify end_time=0
to set the set to be ongoing and have no end date. UTC UNIX timestamp
execution_options
Set
An execution setting
validate_only
: when this option is specified, the API call will not perform the mutation but will run through the validation rules against values of each field.
include_recommendations
: this option cannot be used by itself. When this option is used, recommendations for ad object's configuration will be included. A separate section recommendations
will be included in the response, but only if recommendations for this specification exist.
If the call passes validation or review, response will be {"success": true}
. If the call does not pass, an error will be returned with more details. These options can be used to improve any UI to display errors to the user much sooner, e.g. as soon as a new value is typed into any field corresponding to this ad object, rather than at the upload/save stage, or after review.
existing_customer_budget_percentage
existing_customer_budget_percentage
frequency_control_specs
An array of frequency control specs for this ad set. As there is only one event type currently supported, this array has no more than one element. Writes to this field are only available in ad sets where REACH
is the objective.
event
Event name, only IMPRESSIONS
currently.
interval_days
Interval period in days, between 1 and 90 (inclusive)
max_frequency
The maximum frequency, between 1 and 90 (inclusive)
Indicates the ad set must only be used for dynamic creatives. Dynamic creative ads can be created in this ad set. Defaults to false
lifetime_budget
Lifetime budget, defined in your account currency
. If specified, you must also specify an end_time
.
Either daily_budget
or lifetime_budget
must be greater than 0.
lifetime_imps
Lifetime impressions. Available only for campaigns with buying_type=FIXED_CPM
lifetime_min_spend_target
Lifetime minimum spend target of the ad set defined in your account currency. To use this field, lifetime budget must be specified in the Campaign. This target is not a guarantee but our best effort.
lifetime_spend_cap
Lifetime spend cap of the ad set defined in your account currency. To use this field, lifetime budget must be specified in the Campaign. Set the value to 922337203685478 to remove the spend cap.
max_budget_spend_percentage
max_budget_spend_percentage
min_budget_spend_percentage
min_budget_spend_percentage
multi_optimization_goal_weight
multi_optimization_goal_weight
name
Ad set name, max length of 400 characters.
optimization_goal
What the ad set is optimizing for.
APP_INSTALLS
: Will optimize for people more likely to install your app.
ENGAGED_USERS
: Will optimize for people more likely to take a particular action in your app.
EVENT_RESPONSES
: Will optimize for people more likely to attend your event.
IMPRESSIONS
: Will show the ads as many times as possible.
LEAD_GENERATION
: Will optimize for people more likely to fill out a lead generation form.
LINK_CLICKS
: Will optimize for people more likely to click in the link of the ad.
OFFER_CLAIMS
: Will optimize for people more likely to claim the offer.
OFFSITE_CONVERSIONS
: Will optimize for people more likely to make a conversion in the site
PAGE_ENGAGEMENT
: Will optimize for people more likely to engage with your page.
PAGE_LIKES
: Will optimize for people more likely to like your page.
POST_ENGAGEMENT
: Will optimize for people more likely to engage with your post.
REACH
: Optimize to reach the most unique users of each day or interval specified in frequency_control_specs
.
SOCIAL_IMPRESSIONS
: Increase the number of impressions with social context. For example, with the names of one or more of the user's friends attached to the ad who have already liked the page or installed the app.
VALUE
: Will optimize for maximum total purchase value within the specified attribution window.
THRUPLAY
: Will optimize delivery of your ads to people are more likely to play your ad to completion, or play it for at least 15 seconds.
AD_RECALL_LIFT
: Optimize for people more likely to remember seeing your ads.
VISIT_INSTAGRAM_PROFILE
: Optimize for visits to the advertiser's instagram profile.
optimization_sub_event
Optimization sub event for a specific optimization goal (ex: Sound-On event for Video-View-2s optimization goal)
pacing_type
Defines the pacing type, standard by default or using ad scheduling
promoted_object
The object this ad set is promoting across all its ads. Required with certain campaign objectives. CONVERSIONS
pixel_id
(Conversion pixel ID)pixel_id
(Facebook pixel ID) and custom_event_type
pixel_id
(Facebook pixel ID) and pixel_rule
and custom_event_type
event_id
(Facebook event ID) and custom_event_type
application_id
, object_store_url
, and custom_event_type
for
mobile app eventsoffline_conversion_data_set_id
(Offline dataset ID) and custom_event_type
for offline conversionspage_id
page_id
application_id
and object_store_url
for mobile app or Canvas app engagement link clicksapplication_id
and object_store_url
optimization_goal
is OFFSITE_CONVERSIONS
application_id
, object_store_url
, and custom_event_type
(Standard Events)application_id
, object_store_url
, custom_event_type = OTHER
and custom_event_str
(Custom Events)product_set_id
product_set_id
and custom_event_type
optimization_goal
is LEAD_GENERATION
, page_id
needs to be passed as promoted_object.application_id
The ID of a Facebook Application. Usually related to mobile or canvas games being promoted on Facebook for installs or engagement
pixel_id
The ID of a Facebook conversion pixel. Used with offsite conversion campaigns.
custom_event_type
The event from an App Event of a mobile app, not in the standard event list.
object_store_url
The uri of the mobile / digital store where an application can be bought / downloaded. This is platform specific. When combined with the "application_id" this uniquely specifies an object which can be the subject of a Facebook advertising campaign.
offer_id
The ID of an Offer from a Facebook Page.
page_id
The ID of a Facebook Page
product_catalog_id
The ID of a Product Catalog. Used with Dynamic Product Ads .
product_item_id
The ID of the product item.
instagram_profile_id
The ID of the instagram profile id.
product_set_id
The ID of a Product Set within an Ad Set level Product Catalog. Used with Dynamic Product Ads .
event_id
The ID of a Facebook Event
offline_conversion_data_set_id
The ID of the offline dataset.
fundraiser_campaign_id
The ID of the fundraiser campaign.
custom_event_str
The event from an App Event of a mobile app, not in the standard event list.
mcme_conversion_id
The ID of a MCME conversion.
conversion_goal_id
The ID of a Conversion Goal.
offsite_conversion_event_id
The ID of a Offsite Conversion Event
boosted_product_set_id
The ID of the Boosted Product Set within an Ad Set level Product Catalog. Should only be present when the advertiser has opted into Product Set Boosting.
lead_ads_form_event_source_type
The event source of lead ads form.
value_semantic_type
The semantic of the event value to be using for optimization
omnichannel_object
app
pixel
onsite
whatsapp_phone_number
rf_prediction_id
Reach and frequency prediction ID
source_adset_id
The source adset id that this ad is copied from (if applicable).
start_time
The start time of the set, e.g. 2015-03-12 23:59:59-07:00
or 2015-03-12 23:59:59 PDT
. UTC UNIX timestamp
status
Only ACTIVE
and PAUSED
are valid for creation. The other statuses
can be used for update. If it is set to PAUSED
, all its active ads
will be paused and have an effective status ADSET_PAUSED
.
targeting
An ad set's targeting structure. "countries" is required. See targeting .
time_based_ad_rotation_id_blocks
Specify ad creative that displays at custom date ranges in a campaign
as an array. A list of Adgroup IDs. The list of ads to display for each
time range in a given schedule. For example display first ad in Adgroup
for first date range, second ad for second date range, and so on. You
can display more than one ad per date range by providing more than
one ad ID per array. For example set time_based_ad_rotation_id_blocks
to [[1], [2, 3], [1, 4]]. On the
first date range show ad 1, on the second date range show ad 2 and ad 3
and on the last date range show ad 1 and ad 4. Use with time_based_ad_rotation_intervals
to specify date ranges.
time_based_ad_rotation_intervals
Date range when specific ad creative displays during a campaign.
Provide date ranges in an array of UNIX timestamps where each
timestamp represents the start time for each date range. For example a
3-day campaign from May 9 12am to May 11 11:59PM PST can have three
date ranges, the first date range starts from May 9 12:00AM to
May 9 11:59PM, second date range starts from May 10 12:00AM to
May 10 11:59PM and last starts from May 11 12:00AM to May 11 11:59PM.
The first timestamp should match the campaign start time. The last
timestamp should be at least 1 hour before the campaign end time. You
must provide at least two date ranges. All date ranges must cover the
whole campaign length, so any date range cannot exceed campaign length.
Use with time_based_ad_rotation_id_blocks
to specify ad creative for
each date range.
time_start
Time start
time_stop
Time stop
tune_for_category
tune_for_category
id
in the return type.id
: numeric string,success
: bool,Error | Description |
---|---|
100 | Invalid parameter |
2695 | The ad set creation reached its campaign group(ios14) limit. |
368 | The action attempted has been deemed abusive or is otherwise disallowed |
200 | Permissions error |
2641 | Your ad includes or excludes locations that are currently restricted |
2635 | You are calling a deprecated version of the Ads API. Please update to the latest version. |
900 | No such application exists. |
80004 | There have been too many calls to this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting#ads-management. |
190 | Invalid OAuth 2.0 Access Token |
curl -X POST \
-F 'billing_event="IMPRESSIONS"' \
-F 'optimization_goal="LINK_CLICKS"' \
-F 'bid_amount=200' \
-F 'targeting={
"geo_locations": {
"countries": [
"US"
]
},
"facebook_positions": [
"feed"
]
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/<AD_SET_ID>/
'use strict';
const bizSdk = require('facebook-nodejs-business-sdk');
const AdSet = bizSdk.AdSet;
const access_token = '<ACCESS_TOKEN>';
const app_secret = '<APP_SECRET>';
const app_id = '<APP_ID>';
const id = '<AD_SET_ID>';
const api = bizSdk.FacebookAdsApi.init(access_token);
const showDebugingInfo = true; // Setting this to true shows more debugging info.
if (showDebugingInfo) {
api.setDebug(true);
}
const logApiCallResult = (apiCallName, data) => {
console.log(apiCallName);
if (showDebugingInfo) {
console.log('Data:' + JSON.stringify(data));
}
};
let fields, params;
fields = [
];
params = {
'billing_event' : 'IMPRESSIONS',
'optimization_goal' : 'LINK_CLICKS',
'bid_amount' : '200',
'targeting' : {'geo_locations':{'countries':['US']},'facebook_positions':['feed']},
};
const sample_code = (new AdSet(id)).update(
fields,
params
);
logApiCallResult('sample_code api call complete.', sample_code);
require __DIR__ . '/vendor/autoload.php';
use FacebookAds\Object\AdSet;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
$access_token = '<ACCESS_TOKEN>';
$app_secret = '<APP_SECRET>';
$app_id = '<APP_ID>';
$id = '<AD_SET_ID>';
$api = Api::init($app_id, $app_secret, $access_token);
$api->setLogger(new CurlLogger());
$fields = array(
);
$params = array(
'billing_event' => 'IMPRESSIONS',
'optimization_goal' => 'LINK_CLICKS',
'bid_amount' => '200',
'targeting' => array('geo_locations' => array('countries' => array('US')),'facebook_positions' => array('feed')),
);
echo json_encode((new AdSet($id))->updateSelf(
$fields,
$params
)->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adset import AdSet
from facebook_business.api import FacebookAdsApi
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_SET_ID>'
FacebookAdsApi.init(access_token=access_token)
fields = [
]
params = {
'billing_event': 'IMPRESSIONS',
'optimization_goal': 'LINK_CLICKS',
'bid_amount': '200',
'targeting': {'geo_locations':{'countries':['US']},'facebook_positions':['feed']},
}
print AdSet(id).update(
fields=fields,
params=params,
)
import com.facebook.ads.sdk.*;
import java.io.File;
import java.util.Arrays;
public class SAMPLE_CODE_EXAMPLE {
public static void main (String args[]) throws APIException {
String access_token = \"<ACCESS_TOKEN>\";
String app_secret = \"<APP_SECRET>\";
String app_id = \"<APP_ID>\";
String id = \"<AD_SET_ID>\";
APIContext context = new APIContext(access_token).enableDebug(true);
new AdSet(id, context).update()
.setBillingEvent(AdSet.EnumBillingEvent.VALUE_IMPRESSIONS)
.setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_LINK_CLICKS)
.setBidAmount(200L)
.setTargeting(
new Targeting()
.setFieldFacebookPositions(Arrays.asList(\"feed\"))
.setFieldGeoLocations(
new TargetingGeoLocation()
.setFieldCountries(Arrays.asList(\"US\"))
)
)
.execute();
}
}
require 'facebook_ads'
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_SET_ID>'
FacebookAds.configure do |config|
config.access_token = access_token
config.app_secret = app_secret
end
ad_set = FacebookAds::AdSet.get(id)
ad_set.billing_event = 'IMPRESSIONS'ad_set.optimization_goal = 'LINK_CLICKS'ad_set.bid_amount = '200'ad_set.targeting = {'geo_locations':{'countries':['US']},'facebook_positions':['feed']}
ad_set.save
To update the end_time
of an ad set, using ISO-8601 date-time format
use FacebookAds\Object\AdSet;
$adset = new AdSet('<AD_SET_ID>');
$adset->end_time = '2013-10-02T00:00:00-0700';
$adset->update();
from facebookads.objects import AdSet
adset = AdSet('<AD_SET_ID>')
adset[AdSet.Field.end_time] = '2013-10-02T00:00:00-0700'
adset.remote_update()
curl \
-F "end_time=2013-10-02T00:00:00-0700" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<AD_SET_ID>"
To update the status of an ad set to paused
use FacebookAds\Object\AdSet;
$adset = new AdSet('<AD_SET_ID>');
$adset->campaign_status = AdSet::STATUS_PAUSED;
$adset->update();
from facebookads.objects import AdSet
adset = AdSet('<AD_SET_ID>')
adset[AdSet.Field.status] = AdSet.Status.paused
adset.remote_update()
curl \
-F "campaign_status=PAUSED" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<AD_SET_ID>"
An archived ad set can only update two fields: name
and campaign_status
. The campaign_status
field can only be changed to DELETED
.
A deleted ad set can only change its name
.
There are two considerations to take into account when adjusting an ad set's budget value or budget type:
v2.4
, ad sets have a minimum required budget. Any update must take that into consideration. Check the details at the Create Considerations
section from this page.
curl -X DELETE \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/<AD_SET_ID>/
'use strict';
const bizSdk = require('facebook-nodejs-business-sdk');
const AdSet = bizSdk.AdSet;
const AbstractObject = bizSdk.AbstractObject;
const access_token = '<ACCESS_TOKEN>';
const app_secret = '<APP_SECRET>';
const app_id = '<APP_ID>';
const id = '<AD_SET_ID>';
const api = bizSdk.FacebookAdsApi.init(access_token);
const showDebugingInfo = true; // Setting this to true shows more debugging info.
if (showDebugingInfo) {
api.setDebug(true);
}
const logApiCallResult = (apiCallName, data) => {
console.log(apiCallName);
if (showDebugingInfo) {
console.log('Data:' + JSON.stringify(data));
}
};
let fields, params;
fields = [
];
params = {
};
const sample_code = (new AdSet(id)).delete(
fields,
params
);
logApiCallResult('sample_code api call complete.', sample_code);
require __DIR__ . '/vendor/autoload.php';
use FacebookAds\Object\AdSet;
use FacebookAds\Object\AbstractObject;
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
$access_token = '<ACCESS_TOKEN>';
$app_secret = '<APP_SECRET>';
$app_id = '<APP_ID>';
$id = '<AD_SET_ID>';
$api = Api::init($app_id, $app_secret, $access_token);
$api->setLogger(new CurlLogger());
$fields = array(
);
$params = array(
);
echo json_encode((new AdSet($id))->deleteSelf(
$fields,
$params
)->exportAllData(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.adset import AdSet
from facebook_business.adobjects.abstractobject import AbstractObject
from facebook_business.api import FacebookAdsApi
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_SET_ID>'
FacebookAdsApi.init(access_token=access_token)
fields = [
]
params = {
}
print AdSet(id).delete(
fields=fields,
params=params,
)
import com.facebook.ads.sdk.*;
import java.io.File;
import java.util.Arrays;
public class SAMPLE_CODE_EXAMPLE {
public static void main (String args[]) throws APIException {
String access_token = \"<ACCESS_TOKEN>\";
String app_secret = \"<APP_SECRET>\";
String app_id = \"<APP_ID>\";
String id = \"<AD_SET_ID>\";
APIContext context = new APIContext(access_token).enableDebug(true);
new AdSet(id, context).delete()
.execute();
}
}
require 'facebook_ads'
access_token = '<ACCESS_TOKEN>'
app_secret = '<APP_SECRET>'
app_id = '<APP_ID>'
id = '<AD_SET_ID>'
FacebookAds.configure do |config|
config.access_token = access_token
config.app_secret = app_secret
end
ad_set = FacebookAds::AdSet.get(id)
ad_set.destroy({
})
/{ad_set_id}
. DELETE /v20.0/<AD_SET_ID>/ HTTP/1.1
Host: graph.facebook.com
/* PHP SDK v5.0.0 */
/* make the API call */
try {
// Returns a `Facebook\FacebookResponse` object
$response = $fb->delete(
'/<AD_SET_ID>/',
array (),
'{access-token}'
);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$graphNode = $response->getGraphNode();
/* handle the result */
/* make the API call */
FB.api(
"/<AD_SET_ID>/",
"DELETE",
function (response) {
if (response && !response.error) {
/* handle the result */
}
}
);
/* make the API call */
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"/<AD_SET_ID>/",
null,
HttpMethod.DELETE,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
/* handle the result */
}
}
).executeAsync();
/* make the API call */
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
initWithGraphPath:@"/<AD_SET_ID>/"
parameters:params
HTTPMethod:@"DELETE"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
id result,
NSError *error) {
// Handle the result
}];
curl -X DELETE -G \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v20.0/<AD_SET_ID>/
success
: bool,Error | Description |
---|---|
200 | Permissions error |
100 | Invalid parameter |
190 | Invalid OAuth 2.0 Access Token |
80004 | There have been too many calls to this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting#ads-management. |
Outcome-Driven Ads Experiences (Engagement Outcome + ON_PAGE
destination_type)
curl -i -X POST \ -d "name=New ODAX Adset" \ -d "autobid=true" \ -d "optimization_goal=PAGE_LIKES" \ -d "destination_type=ON_PAGE" \ -d "billing_event=IMPRESSIONS" \ -d "daily_budget=500" \ -d "targeting={\"geo_locations\": {\"countries\": [\"US\"]}}" \ -d "promoted_object={\"page_id\": PAGE_ID}" \ -d "campaign_id=CAMPAIGN_ID" \ -d "status=PAUSED" \ -d "access_token=ACCESS_TOKEN" \ https://graph.facebook.com/v11.0/ act_AD_ACCOUNT_ID/adsets
Legacy
curl -i -X POST \ -d "name=New ODAX Adset" \ -d "autobid=true" \ -d "optimization_goal=PAGE_LIKES" \ -d "billing_event=IMPRESSIONS" \ -d "daily_budget=500" \ -d "targeting={\"geo_locations\": {\"countries\": [\"US\"]}}" \ -d "promoted_object={\"page_id\": PAGE_ID}" \ -d "campaign_id=CAMPAIGN_ID" \ -d "status=PAUSED" \ -d "access_token=ACCESS_TOKEN" \ https://graph.facebook.com/v11.0/ act_AD_ACCOUNT_ID/adsets
There will be new restrictions on Outcome-Driven Ads Experiences (ODAX) campaigns as outlined in the table below. Refer to the Outcome-Driven Ads Experiences mapping table to find the new objectives and their corresponding destination types, optimization goals and promoted objects.
ODAX Objectives | Conversion Location (L2) | Conversion Events (L2) | Optimization Goals (L2) | Legacy Objectives |
---|---|---|---|---|
Awareness Reach the largest number of people who are likely to remember your ad. |
N/A |
N/A |
Ad Recall Lift, Reach, Impressions API enum { |
Reach, Brand Awareness |
Traffic Send people to a destination like your website, app or Shop. |
Facebook Shops (closed beta) |
N/A |
Link Clicks API enum { |
Traffic |
|
Website |
N/A |
Landing Page Views, Link Clicks, Impressions, Daily Unique Reach API enum { |
Traffic |
|
App |
N/A |
Link Clicks, Daily Unique Reach API enum { |
Traffic |
|
Messenger |
N/A |
Link Clicks, Impressions, Daily Unique Reach API enum { |
Traffic |
|
|
N/A |
Link Clicks, Impressions, Daily Unique Reach API enum { |
Traffic |
Engagement Find people likely to interact with your business online, and take actions like starting a conversation or commenting on posts. |
On Video |
N/A |
ThruPlay, 2 second continuous view API enum { |
Video Views |
|
On Post |
N/A |
Post Engagement, Impressions, Daily Unique Reach API enum { |
Post Engagement |
|
On Event |
N/A |
Event Response, Impressions, Post Engagement, Daily Unique Reach API enum { |
Event Responses |
|
Messenger |
N/A |
Conversations, Link Clicks API enum { |
Messages |
|
|
N/A |
Conversations, Link Clicks API enum { |
Messages |
|
|
N/A |
Conversations, Link Clicks API enum { |
Messages |
|
Website |
AddToWishlist, Contact, CustomizeProduct, Donate, FindLocation,, Schedule, Search, StartTrial, SubmitApplication, Subscribe, ViewContent |
Conversions, Landing Page Views, Link Clicks, Impressions, Daily Unique Reach API enum { |
Conversions |
|
App |
Achieve Level, Activate App, Add to Wishlist, Complete Tutorial, Contact, Customize Product, Donate, Find Location, In-App Ad Click, In-App Ad Impression, Rate, Schedule, Search, Spent Credits, Start Trial, Submit Application, Subscribe, Unlock Achievement, View Content |
App Events, Link Clicks, Daily Unique Reach API enum { |
Conversions |
|
On Page |
N/A |
Page Likes API enum { |
Engagement |
Leads Find people interested in your business who are likely to share their contact information. |
Website |
Lead, CompleteRegistration, Contact, FindLocation, Schedule, StartTrial, SubmitApplication, Subscribe |
Conversions, Landing Page Views, Link Clicks, Impressions, Daily Unique Reach API enum { |
Conversions |
|
Instant Forms |
N/A |
Leads API enum { |
Lead Generation |
|
Messenger |
N/A |
Leads API enum { |
Messages |
|
Calls |
N/A |
Calls API enum { |
Lead Generation |
|
App |
Complete Registration, Complete Tutorial, Contact, Find Location, Schedule, Start Trial, Submit Application, Subscribe |
App Events, Link Clicks, Daily Unique Reach API enum { |
Conversions |
App Promotion Find people likely to install your app. |
N/A |
All app events, including all custom events |
Non-AAA: Link Clicks, App Installs, App Events, Value API enum { AAA: App Installs, App Installs w/ App Events, App Events, Value API enum { |
App Installs |
Sales Find people likely to make purchases or take other important actions online or in store. |
Website & Facebook Shops (closed beta) |
Purchase, InitiateCheckout, AddPaymentInfo, AddToCart, CompleteRegistration, Donate, StartTrial, Subscribe, ViewContent |
(source of truth: same as today's Conversions objective + web and shop) API enum { |
Conversions |
|
Website |
Purchase, InitiateCheckout, AddPaymentInfo, AddToCart, CompleteRegistration, Donate, StartTrial, Subscribe, ViewContent |
Conversions, Value, Landing Page Views, Link Clicks, Impressions, Daily Unique Reach API enum { |
Conversions |
|
App |
Purchase, Initiate Checkout, Add Payment Info, Add to Cart, Complete Registration, Donate, In-App Ad Click, In-App Ad Impression, Spent Credits, Start Trial, Subscribe, View Content |
App Events, Link Clicks, Daily Unique Reach API enum { |
Conversions |
|
Website & App |
Purchase, InitiateCheckout, AddPaymentInfo, AddToCart, CompleteRegistration, Donate, StartTrial, Subscribe, ViewContent |
Conversions API enum { |
Conversions |
|
Messenger |
Purchase, InitiateCheckout, AddPaymentInfo, AddToCart, CompleteRegistration, Donate, StartTrial, Subscribe, ViewContent |
Conversations, Conversions, Link Clicks, Impressions, Reach API enum { |
Conversions |
|
|
Purchase, InitiateCheckout, AddPaymentInfo, AddToCart, CompleteRegistration, Donate, StartTrial, Subscribe, ViewContent |
Conversions, Link Clicks, Impressions, Reach API enum { |
Conversions |