Data and Call To Action Requirements

Instagram Stream

The available creative types for each support objective. More creative types and objective combinations will be supported in the future.








For a LINK_CLICKS or CONVERSIONS ads, you can provide a call_to_action (CTA) in the link_data or video_data field to define the action button below the ad.

  • If you use link_data, and if call_to_action is not specified, a default call_to_action appears. Its link value is from the link field of the link_data above, and the default CTA type is "LEARN_MORE".

  • If you define a call_to_action explicitly, link value must be the same as link value for link_data above. You can provide caption as the displayed URL.

  • If you use video_data, the call_to_action is required.

For a MOBILE_APP_INSTALLS or MOBILE_APP_ENGAGEMENT ads, the call_to_action field in the link_data or video_datais required. The links must point to an app's Apple App Store or Google Play URL. Deep linking is also supported. If link_data is used, the link in call_to_action must be the same as the link of the link_data above.

For a VIDEO_VIEWS ads, the description and video_data field is optional. Either the image_hash or image_url fields must be provided.

For a POST_ENGAGEMENT ads, if you use link_data, a CTA would be shown, either specified by you, or defaulted to LEARN_MORE. If you do not want a CTA, you can use photo_data instead.

message in link_data, description in video_data, and caption in photo_data for Instagram ad creative cannot be longer than 2200 characters. The caption field in link_data also displays as one-tap overlay. Other title and caption fields are only used by Facebook, not Instagram.

Any hyperlink contained in these message fields will not be active on Instagram. For a POST_ENGAGEMENT ad, if you specify a message with a hyperlink using photo_data, or video_data without CTA, a default CTA with type LEARN_MORE and a link from the message displays.

As a best practice, use #hashtags in the message of Instagram ads. No more than 30 hashtags can be used in each message.

use FacebookAds\Object\AdCreative;
use FacebookAds\Object\AdCreativeLinkData;
use FacebookAds\Object\Fields\AdCreativeLinkDataFields;
use FacebookAds\Object\AdCreativeObjectStorySpec;
use FacebookAds\Object\Fields\AdCreativeObjectStorySpecFields;
use FacebookAds\Object\Fields\AdCreativeFields;

$link_data = new AdCreativeLinkData();
  AdCreativeLinkDataFields::IMAGE_CROPS => array(
    '100x100'=> array(array(200,90),array(900,790)), 
    '191x100'=> array(array(0,200),array(1146,800))
  AdCreativeLinkDataFields::MESSAGE => 'Great looking SXT handbags in store. #prettybag',
  AdCreativeLinkDataFields::LINK => '',
  AdCreativeLinkDataFields::IMAGE_HASH => '<IMAGE_HASH>',
  AdCreativeLinkDataFields::CALL_TO_ACTION => array(
    'type' => 'LEARN_MORE',
    'value' =>array(
      'link' => '',

$object_story_spec = new AdCreativeObjectStorySpec();
  AdCreativeObjectStorySpecFields::PAGE_ID => <PAGE_ID>,
  AdCreativeObjectStorySpecFields::INSTAGRAM_ACTOR_ID => <IG_ACCOUNT_FBID>,
  AdCreativeObjectStorySpecFields::LINK_DATA => $link_data,

$creative = new AdCreative(null, 'act_<AD_ACCOUNT_ID>');

  AdCreativeFields::NAME => 'Instagram only creative',
  AdCreativeFields::OBJECT_STORY_SPEC => $object_story_spec,

from facebookads.objects import AdCreative
from facebookads.specs import ObjectStorySpec, LinkData

link_data = LinkData()
link_data[LinkData.Field.message] = 'Great looking SXT handbags in store. #prettybag'
link_data[] = ''
link_data[LinkData.Field.caption] = ''
link_data[LinkData.Field.image_hash] = '<IMAGE_HASH>'
link_data[LinkData.Field.image_crops] = {

call_to_action = {
    'type': 'LEARN_MORE',
call_to_action['value'] = {

link_data[LinkData.Field.call_to_action] = call_to_action

object_story_spec = ObjectStorySpec()
object_story_spec[ObjectStorySpec.Field.page_id] = <PAGE_ID>
object_story_spec[ObjectStorySpec.Field.instagram_actor_id] = <IG_ACCOUNT_FBID>
object_story_spec[ObjectStorySpec.Field.link_data] = link_data

creative = AdCreative(parent_id='act_<AD_ACCOUNT_ID>')
creative[] = 'Instagram only creative'
creative[AdCreative.Field.object_story_spec] = object_story_spec
curl \
-F 'name=Instagram only creative' \
-F 'object_story_spec={
              "100x100": [ [200,90], [900, 790] ], 
              "191x100": [ [0,200], [1146, 800] ],
          "message":"Great looking SXT handbags in store. #prettybag",
          }}' \
-F 'access_token=<ACCESS_TOKEN>' \<API_VERSION>/act_<AD_ACCOUNT_ID>/adcreatives

Link Ads Image Overlay

Instagram link ads with objective set to LINK_CLICKS or CONVERSIONS show your Facebook Page name and "display url" on a one-tap image overlay. This appears when a user click on an ad's image. If a link ad uses video creative, this overlay does not display.

For MOBILE_APP_INSTALLS and MOBILE_APP_ENGAGEMENT ad ads, we show an advertisers Facebook Page name and “View in App Store” for iOS ads or “View in Play Store” for Android ads.

The "display url" for a link ad is the the link value in the link_data, unless you provide caption in the link_data. If the link is not user friendly, such as "", you should set caption to, which displays in the overlay instead of the link.

Instagram Stories

Ads creative for Instagram Stories only allow photo_data, video_data, and link_data. Among them photo_data can be used for only REACH objective, link_data can be used for only LINK_CLICKS objective, and video_data can be used for all the REACH, VIDEO_VIEWS, or LINK_CLICKS objective.

As branding ads (REACH and VIDEO_VIEWS) in Instagram Stories only show an advertiser's Instagram account name and profile picture, you cannot set all other visible fields, including message, title, link, caption, and so on. If link is specified in video_data, a CTA button will also be shown.

Direct response ads (LINK_CLICKS, CONVERSIONS, and APP_INSTALLS) shows a CTA button. You can specify the call_to_action of the link_data or video_data. If the call_to_action is not specified in link_data, Instagram will show a Learn More button with the link value of link_data. Certain CTA types are not supported, including Donate, Donate Now, Save, Call Now, and Get Directions. Other fields like message and title are still not used for Instagram Stories DR ads.

Clicking an ad in Instagram stories displays the next story, and clicking on the CTA button goes to the destination URL.