Get Started

With Marketing API you can create, measure, and optimize ads on Instagram, in the main Stream, in the Stories, and in the Explore tab. To start creating ads:

Be aware that:

  • Instagram ads do not support all Facebook ads objectives.
  • Not all creative formats supported by Facebook work on Instagram.

Step 1: Get Instagram Account ID

To run ads on Instagram, you need an Instagram account ID. There are three ways to set that up:

[Recommended] Business Manager

In this case, the business you want to advertise needs to have an Instagram account. We recommend that you use Business Manager to claim the ownership of that account. Then, you can use the Business Manager or Facebook Marketing APIs to assign agency or to assign ad accounts.

Once the initial setup is done, you can get the Instagram account IDs for all accounts connected to a Business or an Ad Account. Save that ID to use in your ads.

If you have more than one Instagram accounts, this is the best choice.

Page's Instagram Account

In this case, the business you want to advertise needs to have an Instagram account. You can connect an Instagram account to a Facebook Page using Page UI. Once the connection is made, call the Pages Instagram Accounts API to get the Instagram account ID. Save that ID to use in your ads.

This is a simple option for small businesses.

Page-Backed Instagram Account

In this case:

  • You do not have an Instagram account
  • You do not want to create an Instagram account for organic content
  • You do have a Facebook Page

If you met the previous criteria, you can create a "shadow" Instagram account backed by your Facebook Page. See how to create this specific type of account and how to get the related account ID.

Implementation Requirements

If you need help picking your implementation, see the requirements bellow:

Requirements Business Manager Setup Page's Instagram Account Page-Backed Instagram Account

Advertiser needs to have an IG account

Yes

Yes

No

Advertiser needs to have Business Manager set up

Yes

No

No

Require some manual steps on Facebook interfaces

Yes, to claim an IG account to BM.

Yes, to claim an IG account to Page.

No

Can add post (media)

Yes, with App

Yes, with App

No

Can comment as the Instagram profile

Yes, with App or Marketing APIs

Yes, with App or Marketing APIs

No

Can read or delete comments for ad posts (media) using APIs

Yes

Yes

Yes

Can run ads with an ad account owned by a user

No

Yes

Yes

Can run ads with an ad account owned by a business

Yes

Yes

Yes

Page and Instagram Account IDs

As seen above, you need to supply the Instagram account's ID to create ad creative for Instagram. You also need provide the Facebook Page ID. Both of these IDs are required when you use Instagram only or mixed placements. If the Instagram account is connected to a Page, or is a Page-backed Instagram Account, the same Page needs to be used.

You can specify the Instagram account ID as:

  • The creative's instagram_actor_id, along with object_story_id or object_story_spec.
  • Or instagram_actor_id field of object_story_spec.

Connection Objects

Once you create an Instagram account, you cannot use Connection Objects to view these accounts. You should use {business_id}/{assets} endpoints over connectionobjects.

The act_adaccount_id/connectionobjects endpoint includes user-based and ad account-based objects, and may be confusing. For Instagram, use the following endpoints:

  • {business_id}/instagram_accounts
  • act_{adaccount_id}/instagram_accounts
  • {page id}/instagram_accounts

Step 2: Create Ad Campaign

Creating ad objects for Instagram is the same is it is for Facebook ads. See Ad, Reference.

To get started, create a Facebook Ad Campaign. Instagram compatible objectives vary according to the ad placement:

Ad PlacementCompatible Objectives

Stream Ads

BRAND_AWARENESS, REACH, LINK_CLICKS, POST_ENGAGEMENT, APP_INSTALLS, VIDEO_VIEWS, LEAD_GENERATION, MESSAGES, CONVERSIONS, PRODUCT_CATALOG_SALES, and STORE_TRAFFIC.

Story Ads

BRAND_AWARENESS, REACH, LINK_CLICKS, APP_INSTALLS, VIDEO_VIEWS, LEAD_GENERATION, MESSAGES, CONVERSIONS, PRODUCT_CATALOG_SALES, and STORE_TRAFFIC.

Explore Ads

BRAND_AWARENESS, REACH, LINK_CLICKS, POST_ENGAGEMENT, APP_INSTALLS, VIDEO_VIEWS, LEAD_GENERATION, MESSAGES, CONVERSIONS, and PRODUCT_CATALOG_SALES.

The minimum spend budget on Instagram is same as Facebook self-serve ads, with different limits per currency and limits based on bid_amount.

Reach and Frequency

For predictable reach, create a Reach & Frequency campaign with buying_type set to RESERVED.

Currently, REACH, LINK_CLICKS, POST_ENGAGEMENT, APP_INSTALLS, VIDEO_VIEWS, and BRAND_AWARENESS objectives are supported for Instagram Reach and Frequency ads.

Reach estimates in Ads Manager and the API can give partners guidance on what they can reasonably expect. The Instagram community comes first, we try to achieve reach objectives conservatively, and expect to evolve over time. All policies that apply to using reach and frequency estimate for Facebook also apply to Instagram.

Dynamic Ads

Dynamic Ads are available for Instagram. You can use custom audiences targeting to reach people who visited or engaged on your website.

Step 3: Create Ad Set

Create an Ad Set with desired targeting options, budget, billing, schedule, and optimization.

If you create a Reach and Frequency ad set, set rf_prediction_id. The destination_ids of the Reach Frequency Prediction must contain the Instagram account ID.

Optimization and Billing

Instagram's optimization_goal and billing_event follow the same guidelines as Facebook's. The optimization_goal depends on objective, and follow these validation rules. The billing_event depends on which optimization_goal you choose.

For APP_INSTALLS and CONVERSIONS objectives, a promoted_object is required.

Targeting and Placement

You can use all Facebook targeting options for Instagram campaigns, including:

To deliver ads to Instagram, include instagram under publisher_platforms. You can use Instagram stream, story, and explore placements, or you can enable multiple platforms including Instagram's placements. If you choose multiple platforms, Facebook optimizes delivery based on your target audience on each platform with Placement Optimization.

To show ads exclusively in Stream or Stories, provide this in the instagram_positions field. If you want to display your ads in Instagram's Explore tab, you must select both stream and explore as placements. You cannot pick just explore. If instagram_positions is not specified, we deliver ads to all three possible Instagram placements.

To deliver ads only to Instagram Stories, use story only inside instagram_positions. In this case, you should also have instagram as the only value for publisher_platforms.

use FacebookAds\Object\AdSet;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\Fields\TargetingFields;
use FacebookAds\Object\Targeting;
use FacebookAds\Object\Values\AdSetBillingEventValues;
use FacebookAds\Object\Values\AdSetOptimizationGoalValues;

$adset = new AdSet(null, 'act_<AD_ACCOUNT_ID>');
$adset->setData(array(
  AdSetFields::NAME => 'Instagram Adset',
  AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::LINK_CLICKS,
  AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS,
  AdSetFields::BID_AMOUNT => 2,
  AdSetFields::DAILY_BUDGET => 1000,
  AdSetFields::CAMPAIGN_ID => <CAMPAIGN_ID>,
  AdSetFields::TARGETING => (new Targeting())->setData(array(
    TargetingFields::GEO_LOCATIONS => array(
      'countries' => array('US'),
    ),
    TargetingFields::USER_OS => array('iOS'),
    TargetingFields::PUBLISHER_PLATFORMS => array('instagram'),
  )),
));

$adset->create();
from facebookads.adobjects.adset import AdSet
from facebookads.adobjects.targeting import Targeting

adset = AdSet(parent_id='act_<AD_ACCOUNT_ID>')
adset.update({
    AdSet.Field.name: 'Instagram Adset',
    AdSet.Field.optimization_goal: AdSet.OptimizationGoal.link_clicks,
    AdSet.Field.billing_event: AdSet.BillingEvent.impressions,
    AdSet.Field.bid_amount: 2,
    AdSet.Field.daily_budget: 1000,
    AdSet.Field.campaign_id: <CAMPAIGN_ID>,
    AdSet.Field.targeting: {
        Targeting.Field.geo_locations: {
            Targeting.Field.countries: ['US'],
        },
        Targeting.Field.user_os: ['iOS'],
        Targeting.Field.publisher_platforms: ['instagram'],
    },
})

adset.remote_create()
AdSet adSet = new AdAccount(act_<AD_ACCOUNT_ID>, context).createAdSet()
  .setName("Instagram Adset")
  .setOptimizationGoal(AdSet.EnumOptimizationGoal.VALUE_LINK_CLICKS)
  .setBillingEvent(AdSet.EnumBillingEvent.VALUE_IMPRESSIONS)
  .setBidAmount(2L)
  .setDailyBudget(1000L)
  .setCampaignId(<CAMPAIGN_ID>)
  .setTargeting(
    new Targeting()
      .setFieldGeoLocations(
        new TargetingGeoLocation()
          .setFieldCountries(Arrays.asList("US"))
      )
      .setFieldPublisherPlatforms(Arrays.asList("instagram"))
      .setFieldUserOs(Arrays.asList("iOS"))
  )
  .execute();
String ad_set_id = adSet.getId();
curl \
  -F 'name=Instagram Adset' \
  -F 'optimization_goal=LINK_CLICKS' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'bid_amount=2' \
  -F 'daily_budget=1000' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'targeting={ 
    "geo_locations": {"countries":["US"]}, 
    "publisher_platforms": ["instagram"], 
    "user_os": ["iOS"] 
  }' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/adsets

You can get an estimated number of individuals for your targeting and what bids to make to reach that target group with the /reachestimate API. You can call this API in two ways. By specifying an ad account and a targeting spec:

use FacebookAds\Object\AdAccount;
use FacebookAds\Object\Fields\TargetingFields;
use FacebookAds\Object\Targeting;
use FacebookAds\Object\Values\AdSetOptimizationGoalValues;

$account = new AdAccount('act_<AD_ACCOUNT_ID>');
$targeting = new Targeting();
$targeting->setData(array(
  TargetingFields::GEO_LOCATIONS => array(
    TargetingFields::COUNTRIES => array('US', 'GB'),
  ),
  TargetingFields::USER_OS => array('iOS'),
  TargetingFields::PUBLISHER_PLATFORMS => array('instagram'),
));

$estimate = $account->getReachEstimate(array(), array(
  'targeting_spec' => $targeting,
  'optimize_for' => AdSetOptimizationGoalValues::IMPRESSIONS,
));
from facebookads.adobjects.adaccount import AdAccount
from facebookads.adobjects.adset import AdSet
from facebookads.adobjects.targeting import Targeting

account = AdAccount('act_<AD_ACCOUNT_ID>')

targeting = Targeting()
targeting.set_data({
    Targeting.Field.geo_locations: {
        Targeting.Field.countries: ['US', 'GB'],
    },
    Targeting.Field.user_os: ['iOS'],
    Targeting.Field.publisher_platforms: ['instagram'],
})

estimate = account.get_reach_estimate(params={
    'targeting_spec': targeting,
    'optimize_for': AdSet.OptimizationGoal.impressions,
})
APINodeList<ReachEstimate> reachEstimates = new AdAccount(act_<AD_ACCOUNT_ID>, context).getReachEstimate()
  .setTargetingSpec(
    new Targeting()
      .setFieldGeoLocations(
        new TargetingGeoLocation()
          .setFieldCountries(Arrays.asList("US", "GB"))
      )
      .setFieldPublisherPlatforms(Arrays.asList("instagram"))
      .setFieldUserOs(Arrays.asList("iOS"))
  )
  .setOptimizeFor(ReachEstimate.EnumOptimizeFor.VALUE_IMPRESSIONS)
  .execute();
curl -G \
  --data-urlencode 'targeting_spec={ 
    "geo_locations": {"countries":["US","GB"]}, 
    "publisher_platforms": ["instagram"], 
    "user_os": ["iOS"] 
  }' \
  -d 'optimize_for=IMPRESSIONS' \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.11/act_<AD_ACCOUNT_ID>/reachestimate

Or by specifying an existing ad or ad set:

use FacebookAds\Object\Ad;


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

ad = Ad(<AD_ID>)
reach_estimate = ad.get_reach_estimate()
print(reach_estimate)
APINodeList<ReachEstimate> reachEstimates = new Ad(<AD_ID>, context).getReachEstimate()
  .execute();
curl -G \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v2.8/<AD_ID>/reachestimate

Step 4: Provide Ad Creative and Create Ad

You need to provide a Facebook Page ID for your ad creative, however the page information does not appear anywhere on your Instagram ad. When you provide ad creative, we create an unpublished post. You can see the unpublished post from the page when you query promotable feed using the Page ID.

You can create carousel ads with Ads Manager as well as the API.

Resources

Step 5: Book Ad

With the ad ready, you can book it by setting its status to ACTIVE. First, the ad goes through Ad Review, and has its status changed to PENDING_REVIEW. If the ad passes the review, the status is switched back to ACTIVE.

Ad Review Process

The ad review policies are the same for Facebook and Instagram. However, as we make Instagram available to more businesses, we want the same high-quality ad experience on Instagram that we have on Facebook.

This requires understanding more about how the community interacts with different kinds of advertiser content on Instagram. Since it takes time to build the same kind of models that drive Facebook ads, we currently rely on human review to filter out a small percentage of ads and provide suggestions for improvement.

Our ultimate goal is to make running a campaign across Facebook and Instagram a seamless experience and to make ads a relevant, valuable part of the Instagram product.