Управление статусами рекламных объектов

Рекламная кампания, группа объявлений и отдельные объявления могут иметь один из следующих статусов:

  • опубликовано;
  • в архиве;
  • удалено.

Подробную информацию см. в блоге для разработчиков.

Опубликовано

Опубликованные рекламные объекты могут иметь следующие статусы:

  • ACTIVE;
  • PAUSED;
  • PENDING_REVIEW;
  • CREDIT_CARD_NEEDED;
  • PREAPPROVED;
  • DISABLED;
  • PENDING_PROCESS;
  • WITH_ISSUES.

В архиве

Чтобы присвоить рекламному объекту статус ARCHIVED, установите для поля status значение ARCHIVED. Если объект имеет статус ARCHIVED, вы сможете и дальше запрашивать информацию и статистику по его ID. Однако количество объектов в архиве ограничено. Учитывайте это ограничение и устанавливайте статус DELETED для объектов, которые вам больше не нужны.

Объекты со статусом ARCHIVED имеют только два изменяемых поля: name и status. Значение поля status можно изменить только на DELETED.

Удалено

Чтобы установить для рекламного объекта статус DELETED, укажите в поле status значение DELETED или отправьте для этого объекта запрос HTTP DELETE. Если объект имеет статус DELETED, для него нельзя восстановить значение ARCHIVED.

Если сохранить ID удаленного объекта, в будущем можно будет выполнять по нему запросы и получать статистику или сведения о нем. При этом извлечь удаленные объекты в виде связи из неудаленного узла или объекта невозможно. Например, <API_VERSION>/<AD_ID>/insights сработает для удаленного объекта, но <API_VERSION>/act_<AD_ACCOUNT_ID>/insights?level=ad не выдаст статистику по нему.

При удалении рекламы помните, что отслеживание показов, кликов и действий для нее продолжается ещё 28 дней после последнего показа. Вы можете запрашивать статистику по объектам со статусом DELETED с помощью фильтра ad.effective_status.

Если у вас есть группа с двумя объявлениями, одно из которых вы удалите, следующие два запроса выдадут разные результаты:

https://graph.facebook.com/v19.0/<AD_SET_ID>/insights
https://graph.facebook.com/v19.0/<AD_ID>/insights

Группа объявлений выдаст статистику как по удаленной, так и по оставшейся рекламе, хотя при выполнении запроса в группе показывается только одно объявление:

https://graph.facebook.com/v19.0/<AD_SET_ID>/ads

Во избежание таких ситуаций рекомендуем удалять рекламу через 28 дней после последнего показа. Кроме того, перед удалением рекомендуется сохранять статистику или ID объектов у себя в системе. Это необязательно в следующих случаях:

  • ваше приложение не показывает разбивку статистики;
  • вам не критично, что сумма отдельных элементов в разбивке не соответствует общему количеству в родительском объекте из-за удаления некоторых дочерних.

У объекта со статусом DELETED можно изменить только поле name.

Управление статусом

Управление статусом объектов обычно происходит следующим образом:

  • когда вы создаете рекламные объекты и запускаете их, начинается их показ;
  • когда вы удаляете объект, мы автоматически удаляем его из системы;
  • когда достигается ограничение на количество объектов в архиве, архивирование рекламных объектов становится невозможным;
  • чтобы устранить эту проблему, измените статус объектов в архиве на deleted.

Правила наследования статуса:

  • если для кампании установлен статус with_issues, paused, archived или deleted, его автоматически наследуют все дочерние объекты;
  • если для кампании установлен статус deleted, для получения ее дочерних объявлений и их групп нужно в явном виде указать их ID;
  • если для кампании установлен статус with_issues, paused, archived или deleted, статус группы объявлений или рекламной кампании, в которые входит это объявление, остается без изменений, и с ними можно работать как обычно.

Ограничения для объектов ARCHIVED в конкретном рекламном аккаунте:

  • 100 000 для рекламных кампаний;
  • 100 000 для групп объявлений;
  • 100 000 для объявлений.

При чтении границ контекста archived для архивных объектов необходимо использовать фильтрацию, так как по умолчанию они не возвращаются. При чтении статистики для рекламного объекта указываются данные обо всех дочерних объектах независимо от их статуса (active, archived или deleted), поэтому фильтрация в этом случае не требуется.

Сравнение различных статусов

Объекты со статусом ACTIVE и PAUSED отличаются от объектов со статусом ARCHIVED и DELETED. Главные различия описаны ниже.

Запрос Опубликовано В АРХИВЕ УДАЛЕНО

Есть в базе данных

Да

Да

Да

Максимальное количество в рекламном аккаунте

С ограничениями

100 000

Без ограничений

Запрос границ контекста без фильтра

Да

Нет

Нет

Запрос границ с фильтрацией статуса

Да для объектов со статусом, указанным в фильтре

Да, если в фильтре статуса указано ARCHIVED

Нет, если в фильтре статуса не указано DELETED, и ошибка, если указано

Запрос по собственному ID

Да

Да

Да

Статистика, собранная в /<PARENT_OBJECT_ID>/insights

Да

Да

Да

Статистика, включенная в список результатов /<PARENT_OBJECT_ID>/insights?level=<OBJECT_LEVEL>

Да

Нет

Нет

Статистика, включенная в список результатов /<PARENT_OBJECT_ID>/insights с фильтрацией delivery_info

Да для объектов со статусом, указанным в фильтре

Да для объектов со статусом, указанным в фильтре

Нет

Статистика, показанная с /<OBJECT_ID>/insights

Да

Да

Да

Статус можно изменить на

Любой допустимый статус

DELETED

Нельзя изменить

Отправка рекламы в архив:

use FacebookAds\Object\Ad;

$ad = new Ad(<AD_ID>);
$ad->archive();
from facebookads.adobjects.ad import Ad

ad = Ad(ad_id)
ad.remote_archive()
new Ad(<AD_ID>, context).update()
  .setStatus(Ad.EnumStatus.VALUE_ARCHIVED)
  .execute();
curl \
  -F 'status=ARCHIVED' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/<AD_ID>

Удаление рекламы:

use FacebookAds\Object\Ad;

$ad = new Ad(<AD_ID>);
$ad->deleteSelf();
from facebookads.adobjects.ad import Ad

ad = Ad(<AD_ID>)
ad.remote_delete()
new Ad(<AD_ID>, context).update()
  .setStatus(Ad.EnumStatus.VALUE_DELETED)
  .execute();
curl -X DELETE \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/<AD_ID>/

Извлечение опубликованных дочерних объектов (например, всех опубликованных объявлений рекламной кампании), кроме ARCHIVED и DELETED:

curl -X GET \ -d 'fields="name"' \ -d 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v19.0/<AD_CAMPAIGN_ID>/ads
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const Campaign = bizSdk.Campaign; const Ad = bizSdk.Ad; const access_token = '<ACCESS_TOKEN>'; const app_secret = '<APP_SECRET>'; const app_id = '<APP_ID>'; const id = '<AD_CAMPAIGN_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', ]; params = { }; const adss = (new Campaign(id)).getAds( fields, params ); logApiCallResult('adss api call complete.', adss);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\Campaign; use FacebookAds\Object\Ad; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_CAMPAIGN_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( 'name', ); $params = array( ); echo json_encode((new Campaign($id))->getAds( $fields, $params )->getResponse()->getContent(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.campaign import Campaign from facebook_business.adobjects.ad import Ad from facebook_business.api import FacebookAdsApi access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_CAMPAIGN_ID>' FacebookAdsApi.init(access_token=access_token) fields = [ 'name', ] params = { } print Campaign(id).get_ads( 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_CAMPAIGN_ID>\"; APIContext context = new APIContext(access_token).enableDebug(true); new Campaign(id, context).getAds() .requestNameField() .execute(); } }
require 'facebook_ads' access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_CAMPAIGN_ID>' FacebookAds.configure do |config| config.access_token = access_token config.app_secret = app_secret end campaign = FacebookAds::Campaign.get(id) adss = campaign.ads({ fields: { 'name' }, })

Чтобы извлечь из опубликованного объекта его дочерние объекты со статусом ARCHIVED (например, все объявления со статусом ARCHIVED из группы), требуется фильтр статуса:

curl -X GET \ -d 'effective_status=[ "ARCHIVED" ]' \ -d 'fields="name"' \ -d 'access_token=<ACCESS_TOKEN>' \ https://graph.facebook.com/v19.0/<AD_CAMPAIGN_ID>/ads
'use strict'; const bizSdk = require('facebook-nodejs-business-sdk'); const Campaign = bizSdk.Campaign; const Ad = bizSdk.Ad; const access_token = '<ACCESS_TOKEN>'; const app_secret = '<APP_SECRET>'; const app_id = '<APP_ID>'; const id = '<AD_CAMPAIGN_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', ]; params = { 'effective_status' : ['ARCHIVED'], }; const adss = (new Campaign(id)).getAds( fields, params ); logApiCallResult('adss api call complete.', adss);
require __DIR__ . '/vendor/autoload.php'; use FacebookAds\Object\Campaign; use FacebookAds\Object\Ad; use FacebookAds\Api; use FacebookAds\Logger\CurlLogger; $access_token = '<ACCESS_TOKEN>'; $app_secret = '<APP_SECRET>'; $app_id = '<APP_ID>'; $id = '<AD_CAMPAIGN_ID>'; $api = Api::init($app_id, $app_secret, $access_token); $api->setLogger(new CurlLogger()); $fields = array( 'name', ); $params = array( 'effective_status' => array('ARCHIVED'), ); echo json_encode((new Campaign($id))->getAds( $fields, $params )->getResponse()->getContent(), JSON_PRETTY_PRINT);
from facebook_business.adobjects.campaign import Campaign from facebook_business.adobjects.ad import Ad from facebook_business.api import FacebookAdsApi access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_CAMPAIGN_ID>' FacebookAdsApi.init(access_token=access_token) fields = [ 'name', ] params = { 'effective_status': ['ARCHIVED'], } print Campaign(id).get_ads( 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_CAMPAIGN_ID>\"; APIContext context = new APIContext(access_token).enableDebug(true); new Campaign(id, context).getAds() .setEffectiveStatus(\"[\\"ARCHIVED\\"]\") .requestNameField() .execute(); } }
require 'facebook_ads' access_token = '<ACCESS_TOKEN>' app_secret = '<APP_SECRET>' app_id = '<APP_ID>' id = '<AD_CAMPAIGN_ID>' FacebookAds.configure do |config| config.access_token = access_token config.app_secret = app_secret end campaign = FacebookAds::Campaign.get(id) adss = campaign.ads({ fields: { 'name' }, effective_status: ['ARCHIVED'], })