Create ad (adsap_create_ad)
Platform: Meta · Read or write: Write · Plan: All plans · Consumes a task: Yes · Preview supported: Yes
What it does
Creates a single image or single video ad inside an existing Meta ad set. You supply the creative: the asset, primary text, headline, description, call to action and destination URL. The ad starts paused. Ask for a preview first: the copilot validates the ad and shows a launch review card where you confirm, create and activate.
When to use it
- Use it to add one image or video ad to an ad set that already exists.
ad_formatisSINGLE_IMAGEorSINGLE_VIDEO. - The creative is named by filename in
feed_creative_name, and it must already be in the creative library. Find it withadsap_list_creative_assetsor add it withadsap_upload_creative. creative_specneeds apage_id, 1 to 5primary_texts, 1 to 5headlinesand acall_to_action. Pages come fromadsap_list_meta_assets.instagram_user_idis optional. Leave it out when the brand has no Instagram account, and the Facebook Page represents it on Instagram.- It supports a preview call with
dry_runset totrue. To turn an existing Instagram post into an ad, useadsap_create_ad_from_ig_post.
Worked example
You ask
“Create an image ad in the Prospecting US ad set with spring-sale-square.jpg, headline ‘New season styles’, a Shop Now button, linking to our spring page. Preview it first.”
The assistant calls adsap_create_ad
{
"ad_set_id": "120210000000001",
"ad_account_id": "act_1234567890",
"name": "Spring sale, image 1",
"ad_format": "SINGLE_IMAGE",
"creative_spec": {
"page_id": "100000000000001",
"feed_creative_name": "spring-sale-square.jpg",
"primary_texts": ["Our spring collection is here."],
"headlines": ["New season styles"],
"link_url": "https://www.example.com/spring",
"call_to_action": "SHOP_NOW"
},
"dry_run": true
}Adsap returns
The field names are the ones Adsap returns. The values are examples.
{
"dry_run": true,
"validation_passed": true,
"ad_format": "SINGLE_IMAGE",
"resolved_payload": {
"ad_account_id": "act_1234567890",
"adset_id": "120210000000001",
"ad_name": "Spring sale, image 1",
"status": "PAUSED",
"creative_square_name": "spring-sale-square.jpg",
"creative_vertical_name": "",
"primary_texts": ["Our spring collection is here."],
"headlines": ["New season styles"],
"url": "https://www.example.com/spring",
"cta_type": "SHOP_NOW",
"page_id": "100000000000001",
"instagram_user_id": "",
"multi_advertiser_opt_in": true,
"campaign_objective": "OUTCOME_SALES",
"destination_type": "WEBSITE",
"tracking_specs": []
},
"campaign_objective": "OUTCOME_SALES",
"destination_type": "WEBSITE"
}How to read it
resolved_payload is what Adsap would send to build the ad. status is PAUSED because the call did not ask for ACTIVE. campaign_objective and destination_type are read from Adsap’s cache of the ad set. They show (not found in cache) when the ad set is not cached yet. An empty instagram_user_id means the Facebook Page stands in on Instagram. The example shows part of resolved_payload and leaves out request_echo, which repeats your input.
The response also has a warnings list. It always carries a reminder that creative files and permissions are checked during creation, not in the preview, and that Meta reviews every ad. The preview opens a launch review card where you confirm the create.
Parameters
Descriptions are shortened from the tool schema. Your assistant sees the full text.
| Name | Type | Required | Description |
|---|---|---|---|
ad_set_id | string | Yes | |
ad_account_id | string | Yes | |
name | string | Yes | |
ad_format | one of SINGLE_IMAGE, SINGLE_VIDEO | Yes | |
creative_spec | object | Yes | |
creative_spec.page_id | string | No | Facebook Page id. REQUIRED when building a new creative (feed_creative_name / image_hash / video_id); not needed when reusing creative_id / object_story_id: the identity comes from the reused creative. |
creative_spec.instagram_user_id | string | No | Instagram account id for Instagram placements. OPTIONAL: omit it when the brand has no Instagram account. Adsap then represents the brand on Instagram through its Facebook Page (Meta page-backed Instagram account), exactly like the Use Facebook Page option in Ads Manager. |
creative_spec.feed_creative_name | string | No | Feed creative filename (1080x1080) from the Adsap creative library (adsap_list_creative_assets). Pass exactly ONE of feed_creative_name, image_hash or video_id. |
creative_spec.image_hash | string | No | Reuse an EXISTING Meta image by its image hash (e.g. from adsap_get_ad’s creative_summary.images, to build a new ad with the same image). SINGLE_IMAGE only. The image must be in the Adsap creative library: if it is not found, run adsap_import_account_creatives once (imports the account’s full existing image/video library) and retry. |
creative_spec.video_id | string | No | Reuse an EXISTING Meta video by its video id (e.g. from adsap_get_ad’s creative_summary.videos). SINGLE_VIDEO only. The video must be in the Adsap creative library: if it is not found, run adsap_import_account_creatives once and retry. |
creative_spec.creative_id | string | No | Reuse a WHOLE existing adcreative as-is (id from adsap_get_ad’s creative_id or adsap_list_ads). The new ad shows the exact same content AND keeps the underlying post with its likes/comments (social proof). Copy fields (primary_texts, headlines, call_to_action, link_url, page_id) are not used: the creative already contains them. |
creative_spec.object_story_id | string | No | Reuse an existing Facebook Page post as the ad, form <page_id>_<post_id> (from adsap_get_ad’s object_story_id / effective_object_story_id). Keeps the post and its social proof. Copy fields are not used. |
creative_spec.vertical_creative_name | string | No | 1080x1920 filename. |
creative_spec.horizontal_creative_name | string | No | 1200x628 filename. |
creative_spec.primary_texts | array of string | No | 1-5 primary texts. REQUIRED when building a new creative; not used when reusing creative_id / object_story_id. |
creative_spec.headlines | array of string | No | 1-5 headlines. REQUIRED when building a new creative; not used when reusing creative_id / object_story_id. |
creative_spec.description | string | No | |
creative_spec.link_url | string | No | Destination URL (https). Required unless awareness/engagement or lead gen. |
creative_spec.display_link | string | No | |
creative_spec.call_to_action | one of SHOP_NOW, LEARN_MORE, SIGN_UP, BOOK_NOW, CONTACT_US, DOWNLOAD, GET_OFFER, GET_QUOTE and 11 more | No | CTA button. For profile visit ad sets (destination_type INSTAGRAM_PROFILE / FACEBOOK_PAGE / INSTAGRAM_PROFILE_AND_FACEBOOK_PAGE) the CTA is dictated by the destination: VIEW_INSTAGRAM_PROFILE (Instagram), VISIT_PROFILE (Facebook)… |
creative_spec.url_parameters | string | No | UTM tags. |
creative_spec.deep_link | string | No | Mobile deep link (e.g. myapp://product/123). App-promotion ads only: sent as the CTA’s app_link with app-store fallback (applink_treatment). Requires App Links / the Meta SDK configured in the promoted app. |
creative_spec.partnership_page_id | string | No | |
creative_spec.partnership_instagram_user_id | string | No | |
creative_spec.threads_page_id | string | No | |
creative_spec.ad_template_id | string | No | |
creative_spec.product_tags | array of string | No | |
creative_spec.catalog_id | string | No | |
creative_spec.catalog_name | string | No | |
creative_spec.product_set_id | string | No | |
creative_spec.product_set_name | string | No | |
creative_spec.leadgen_form_id | string | No | Id of the Instant Form of a lead ad, from adsap_manage_instant_form or adsap_list_meta_assets (asset_type instant_forms). The form must belong to the same Facebook Page as the ad. |
creative_spec.multi_advertiser_opt_in | boolean | No | Default true. |
creative_spec.account_enhancements | any | No | |
creative_spec.ad_schedule_start | string | No | |
creative_spec.ad_schedule_end | string | No | |
status | one of PAUSED, ACTIVE | No | |
dry_run | boolean | No | Preview only: the request is validated and the resolved payload returned, nothing is created or changed. |
idempotency_key | string | No |
Example prompts
- “Create a video ad in the Retargeting ad set using the summer-hero clip, headline ‘Free shipping this week’, linking to our sale page.”
- “Make an image ad from the blue-sneaker asset with three primary text variations and a Shop Now button.”
- “Preview an ad for the App Installs ad set that sends people to the App Store listing.”
Notes
For App promotion ad sets, the link is the app store URL and the call to action is Install Mobile App.
Related tools
adsap_duplicate_ad_set: Duplicate an existing Meta ad set into 1-10 copies, keeping ALL its ads (including ads with no delivery yet).adsap_get_ad: Read ONE ad in full, live from Meta: its creative content (primary texts, headlines, descriptions, CTA, destination link, URL parameters…adsap_get_ad_review_status: Check review and policy status of all active (optionally paused) ads in an account.adsap_get_ad_set: Read ONE ad set in full, live from Meta: complete targeting spec (geo incl. regions/cities, age, genders, custom audiences…adsap_get_ad_status: Check the current delivery, review, and effective status of a single Meta ad.adsap_list_ad_accounts: List Meta ad accounts the user manages.
Guide
Read Building the ads for the workflow around this tool, and the Tool reference for every tool.
The Meta Ads MCP server page shows how to connect Meta Ads to Claude, ChatGPT or Perplexity.