광고 개체 상태 관리

광고 캠페인, 광고 세트 및 광고는 다음 상태 유형 중 하나에 해당됩니다.

  • Live
  • 보관됨
  • 삭제됨

배경 정보는 광고 개발자 블로그, 삭제됨 vs. 보관됨을 참조하세요.

Live

라이브 광고 개체는 다음 상태로 구성될 수 있습니다.

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

보관됨

status 필드를 ARCHIVED로 설정하여 광고 개체를 ARCHIVED로 설정합니다. 개체 상태가 ARCHIVED로 설정되면 개체 ID를 기반으로 상세 정보와 통계를 계속 검색할 수 있습니다. 그러나 보관할 수 있는 개체 수에는 제한이 있습니다. 따라서 더 이상 개체가 필요하지 않으면 이 제한을 존중하고 상태를 DELETED로 변경해야 합니다.

ARCHIVED 개체에는 변경할 수 있는 필드가 두 개(namestatus)만 있습니다. statusDELETED로만 변경할 수도 있습니다.

삭제됨

status 필드를 DELETED로 설정하거나 해당 개체로 HTTP DELETE를 전송하여 광고 개체 상태를 DELETED로 설정할 수 있습니다. 개체 상태가 DELETED로 설정되면 ARCHIVED로 다시 설정할 수 없습니다.

삭제된 개체 ID를 보관하는 경우 개체 ID를 검색하여 통계 또는 개체 상세 정보를 가져올 수 있습니다. 그러나 삭제되지 않은 노드나 개체에서 삭제된 개체를 연결 개체로 검색할 수 없습니다. 예를 들어 <API_VERSION>/<AD_ID>/insights는 삭제된 개체에 대해 작동하지만 <API_VERSION>/act_<AD_ACCOUNT_ID>/insights?level=ad는 삭제된 개체에 대한 통계를 반환하지 않습니다.

광고를 삭제한 뒤에도 마지막 게재 이후 28일 동안 발생한 노출, 클릭 및 행동을 추적할 수 있습니다. ad.effective_status 필터를 사용하여 DELETED 개체에 대한 인사이트를 쿼리할 수 있습니다.

두 개의 광고가 포함된 광고 세트에서 광고 중 하나를 삭제하는 경우 다음 두 쿼리에서는 동일한 결과를 반환하지 않습니다.

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

광고 세트는 광고 세트 내에서 삭제된 광고와 삭제되지 않은 광고에 대한 통계를 모두 반환합니다. 하지만 광고 세트에서 광고를 쿼리하면 광고 하나만 보입니다.

https://graph.facebook.com/v21.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 상태가 포함된 개체와 다릅니다. 주요한 차이점은 다음과 같습니다.

쿼리 Live 보관됨 삭제됨

데이터베이스에 있음

광고 계정당 최대 개수

제한 있음

100,000

제한 없음

필터가 없는 에지로 쿼리

아니요

아니요

상태 필터가 있는 에지로 쿼리

예(필터에 포함된 상태의 개체인 경우)

예(ARCHIVED를 포함하는 상태 필터인 경우)

아니요(DELETED를 포함하지 않는 상태 필터인 경우), 오류(이를 포함하는 경우)

자체 ID로 쿼리

/<PARENT_OBJECT_ID>/insights에서 집계된 통계

/<PARENT_OBJECT_ID>/insights?level=<OBJECT_LEVEL>의 결과 리스트에 포함된 통계

아니요

아니요

delivery_info 필터링을 사용하는 /<PARENT_OBJECT_ID>/insights의 결과 리스트에 포함된 통계

예(필터에 포함된 상태의 개체인 경우)

예(필터에 포함된 상태의 개체인 경우)

아니요

/<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/v21.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/v21.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'], })