Ryan
Ryan

Reputation: 24083

Retrieve Facebook Insights for all active ads within an account?

My code allows me to retrieve all ads that between certain dates, but this includes ads that are no longer active.

I want to show insights only for ACTIVE ads. How can I retrieve Facebook Insights for all active ads within an account?

public function getInsights($levelType, $id, $aggLevel, $start, $end) {
    if ($levelType) {
        if ($id == null) {
            abort(400, 'You must provide the ID for the object you want to retrieve.');
        }
    } else {
        $levelType = \AdAccount::class;
        $id = ACT_PREPEND . $this->fbConfig['account_id'];
        $aggLevel = AdsInsightsLevelValues::CAMPAIGN;
    }
    $variableClassWithNamespace = '\FacebookAds\Object\\' . $levelType; //TODO: avoid hard-coding class paths as strings
    $level = new $variableClassWithNamespace($id);
    $fields = [
        InsightsFields::SPEND,
        InsightsFields::CAMPAIGN_ID,
        InsightsFields::CAMPAIGN_NAME,
        InsightsFields::ADSET_ID,
        InsightsFields::ADSET_NAME,
        InsightsFields::AD_ID,
        InsightsFields::AD_NAME,
        InsightsFields::UNIQUE_IMPRESSIONS,
        InsightsFields::INLINE_LINK_CLICKS,
        InsightsFields::INLINE_LINK_CLICK_CTR,
        InsightsFields::COST_PER_INLINE_LINK_CLICK,
        InsightsFields::ACTIONS,
        InsightsFields::COST_PER_ACTION_TYPE,
        InsightsFields::CPM,
    ];
    $params = [
        AdReportRunFields::LEVEL => $aggLevel,
    ];
    if ($start) {
        $params[AdReportRunFields::TIME_RANGE]['since'] = $start;
        if (!$end) {
            $params[AdReportRunFields::TIME_RANGE]['until'] = (new \DateTime("+2 year"))->format('Y-m-d');
        }
    }
    if ($end) {
        $params[AdReportRunFields::TIME_RANGE]['until'] = $end;
        if (!$start) {
            $params[AdReportRunFields::TIME_RANGE]['since'] = (new \DateTime("-1 year"))->format('Y-m-d');
        }
    }
    if (!$start && !$end) {
        $params[AdReportRunFields::DATE_PRESET] = InsightsPresets::LIFETIME;
    }
    $insights = $level->getInsights($fields, $params);
    return $insights->getResponse()->getBody();
}

I'm using the Facebook PHP Ads SDK 2.8 ("facebook/php-ads-sdk": "2.8.*" in composer.json). The documentation is here.

Upvotes: 0

Views: 3193

Answers (3)

Luke Peters
Luke Peters

Reputation: 1

For anyone not being able to get the filtering to work for /act_123456/insights, when you are using 'level' = 'ad' you need to have the following filtering:

{'field':'ad.effective_status','operator':'IN','value':['ACTIVE', 'PAUSED', 'DELETED', 'ARCHIVED']}

Now it does apply the filtering for me!

Upvotes: 0

Simon_Weaver
Simon_Weaver

Reputation: 146190

This works, you are actually requesting all the ads that are ACTIVE and then providing insights as a 'nested' list of fields.

Replace 123456 with your ad account (but leave the 'act_' which is needed)

act_123456/ads?fields=effective_status,name,insights{total_action_value,total_actions,actions},adset_id,campaign_id&filtering=[{'field':'effective_status','operator':'IN','value':['ACTIVE']}]

This also works for /campaigns and /adsets

This is the only way I figured out how to do it. I couldn't get any filtering to work for /act_123456/insights at the root level.

Upvotes: 0

Cloud Xu
Cloud Xu

Reputation: 3337

You should use filtering on delivery_info to Active. It would be looks like the following in your http request

filtering:[{"field":"campaign.delivery_info","operator":"IN","value":["active"]}]

Please refer to the filtering section in the document.

https://developers.facebook.com/docs/marketing-api/insights/parameters/v2.8

filtering
list<Filter Object>
Default value: Array
Filters on the report data. This parameter is an array of filter objects.
field
string
Required
operator
enum {EQUAL, NOT_EQUAL, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, IN_RANGE, NOT_IN_RANGE, CONTAIN, NOT_CONTAIN, IN, NOT_IN, STARTS_WITH, ANY, ALL, AFTER, BEFORE, NONE}
Required
value
string

If you want to see the code, please check this filtering field in the PHP SDK. It's just mirroring the actual API fields

https://github.com/facebook/facebook-php-ads-sdk/blob/53bee21251a9d898591708b96d1afa9e13516e3d/src/FacebookAds/Object/Campaign.php#L220

Also, we recently launched a scenario based codegen wizard tool. You can walk through the "Create Ad Report" wizard, and it will generate code for you. (Although it only support Java for now)

The URL of the tool is: (replace your own app ID) https://developers.facebook.com/apps/your_app_id/marketing-api/quickstart/

Upvotes: 2

Related Questions