Create ad sets (batch) (adsap_create_ad_sets)
Platform: Meta · Read or write: Write · Plan: All plans · Consumes a task: Yes · Preview supported: Yes
What it does
Creates one or more ad sets under an existing Meta campaign, up to 20 in one call. Each ad set carries its own targeting, placements, optimization goal, budget and schedule. Ad sets start paused. Ask for a preview first: the copilot validates every ad set and shows a launch review card where you confirm and activate.
When to use it
- Use it once the campaign exists, to add 1 to 20 ad sets under it in one call.
- Pass
campaign_objectivewhen the campaign is new. Adsap otherwise looks the objective up in its cache, and the call fails if it is not there yet. - Each ad set needs
targetingwith at least one country, or asaved_audience_id. Get targeting IDs fromadsap_search_detailed_targetingandadsap_search_geo_locations. - Detailed targeting goes in
targeting.flexible_spec, a list of groups as in Ads Manager. People must match at least one item inside a group (or), and every group (and).[{"interests":[Cooking],"behaviors":[Frequent Travelers]},{"family_statuses":[Parents (All)]}]reaches people who like cooking or travel often, and are parents. Up to 25 groups. - Meta combines the separate
targeting.interestsandtargeting.behaviorslists with and: people must match an interest and a behavior. To use or between them, put both in oneflexible_specgroup. - Meta cannot build (A and B) or (C and D) in one ad set. Create two ad sets instead. Size the audience first with
adsap_get_delivery_estimate, using the same groups. OFFSITE_CONVERSIONSandVALUEneed apixel_idand aconversion_event. Pixels come fromadsap_list_meta_assets, events fromadsap_list_pixel_events.- It supports a preview call. With
dry_runset totrue, Adsap validates every ad set and creates nothing.
Worked example
You ask
“Add a Prospecting US ad set to the Spring sale campaign: people 25 to 54 in the US, optimized for purchases. The campaign holds the budget. Preview it first.”
The assistant calls adsap_create_ad_sets
{
"campaign_id": "120210000000002",
"campaign_objective": "OUTCOME_SALES",
"ad_account_id": "act_1234567890",
"ad_sets": [
{
"name": "Prospecting US",
"optimization_goal": "OFFSITE_CONVERSIONS",
"pixel_id": "120210000000009",
"conversion_event": "PURCHASE",
"targeting": {
"countries": ["US"],
"age_min": 25,
"age_max": 54
}
}
],
"dry_run": true
}Adsap returns
The field names are the ones Adsap returns. The values are examples.
{
"dry_run": true,
"validation_passed": true,
"ad_sets_count": 1,
"resolved_payloads": [
{
"ad_account": "act_1234567890",
"campaign": "120210000000002",
"ad_set_name": "Prospecting US",
"objective": "sales",
"campaign_objective": "OUTCOME_SALES",
"optimization_goal": "OFFSITE_CONVERSIONS",
"destination_type": "WEBSITE",
"budget": 0,
"budget_type": "Campaign Budget",
"geo_locations": {
"countries": ["US"]
},
"genders": "All",
"age_min": 25,
"age_max": 54,
"placements": "",
"pixel_id": "120210000000009",
"custom_event_type": "PURCHASE",
"advantage_audience": 0,
"status": "PAUSED",
"click_through": 7,
"view_through": 1
}
],
"warnings": [
"No budget set. Campaign must use CBO (Advantage Campaign Budget), otherwise Meta will reject."
]
}How to read it
resolved_payloads has one entry per ad set, with the defaults filled in. Here destination_type falls back to WEBSITE and status to PAUSED. An empty placements means Advantage+ automatic placements. click_through 7 and view_through 1 are the default attribution windows in days. The example shows part of each entry and leaves out request_echo, which repeats your input.
Read warnings before you confirm. This ad set has no budget, which only works when the campaign holds the budget. The list always ends with a reminder that Meta runs its own checks at creation. That entry is left out here. 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 |
|---|---|---|---|
campaign_id | string | Yes | Parent campaign ID. Call list_campaigns first if needed. |
campaign_objective | one of OUTCOME_SALES, OUTCOME_LEADS, OUTCOME_AWARENESS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_APP_PROMOTION | No | Parent campaign’s objective. Pass it (e.g. from adsap_create_campaign’s response) when the campaign was created recently and may not be cached yet. If omitted, resolved from cache; an unresolvable objective fails with guidance. |
ad_account_id | string | No | Target ad account. Defaults to user’s primary account. |
ad_sets | array of object | Yes | Array of ad set definitions. Max 20 per call. |
ad_sets[].name | string | Yes | Ad set name. |
ad_sets[].daily_budget | number | No | Daily budget in cents. |
ad_sets[].lifetime_budget | number | No | Lifetime budget in cents. |
ad_sets[].daily_min_spend_target | number | No | Min daily spend in cents. |
ad_sets[].daily_spend_cap | number | No | Max daily spend in cents. |
ad_sets[].start_time | string | No | ISO 8601 start time UTC. |
ad_sets[].end_time | string | No | ISO 8601 end time UTC. |
ad_sets[].optimization_goal | one of OFFSITE_CONVERSIONS, LINK_CLICKS, IMPRESSIONS, REACH, LANDING_PAGE_VIEWS, LEAD_GENERATION, VALUE, APP_INSTALLS and 8 more | Yes | Optimization goal for ad delivery. PROFILE_VISIT (traffic) / PROFILE_AND_PAGE_ENGAGEMENT (engagement) drive Instagram profile / Facebook Page visits: pair with an INSTAGRAM_PROFILE / FACEBOOK_PAGE / INSTAGRAM_PROFILE_AND_FACEBOOK_PAGE destination_type and a page_id; not available on Special Ad Category campaigns. AD_RECALL_LIFT / TWO_SECOND_CONTINUOUS_VIDEO_VIEWS are Awareness goals (TWO_SECOND also for Engagement + ON_VIDEO). |
ad_sets[].billing_event | one of IMPRESSIONS, LINK_CLICKS | No | |
ad_sets[].bid_strategy | one of LOWEST_COST_WITHOUT_CAP, COST_CAP, BID_CAP, MINIMUM_ROAS | No | |
ad_sets[].bid_amount | number | No | Bid cap in cents. |
ad_sets[].roas_target | number | No | ROAS target e.g. 2.5. |
ad_sets[].frequency_control_specs | object | No | Frequency cap (hard ceiling). Only supported for REACH and THRUPLAY optimization goals. REACH requires a cap: Meta defaults to 2 impressions per 7 days when omitted. |
ad_sets[].destination_type | one of WEBSITE, APP, ON_AD, WEBSITE_AND_LEAD_FORM, ON_PAGE, ON_VIDEO, ON_POST, INSTAGRAM_PROFILE and 2 more | No | Where users land after clicking. Default WEBSITE. APP is only valid on OUTCOME_APP_PROMOTION campaigns. |
ad_sets[].promoted_object | object | No | |
ad_sets[].attribution_spec | object | No | |
ad_sets[].pixel_id | string | No | |
ad_sets[].conversion_event | string | No | |
ad_sets[].page_id | string | No | |
ad_sets[].instagram_user_id | string | No | |
ad_sets[].advantage_audience | boolean | No | Advantage+ audience (targeting_automation.advantage_audience). Default false. For App promotion, true + broad geo-only targeting + automatic placements is Meta’s modern Advantage+ App setup (legacy smart_promotion_type is dead: Meta derives advantage_state from these settings). |
ad_sets[].saved_audience_id | string | No | Use a SAVED AUDIENCE instead of manual targeting (mirrors the web UI’s Saved Audience picker). When set, the backend takes the entire targeting spec (geo/age/gender/audiences) from the saved audience and IGNORES the targeting object and manual… Get ids from adsap_list_custom_audiences with type_filter SAVED. |
ad_sets[].targeting | object | No | Manual targeting. Required unless saved_audience_id is set (in which case it is ignored). |
ad_sets[].placements | object | No | Placement targeting. Omit entirely (or set use_advantage_placements true) for Advantage+ automatic placements (recommended). Set use_advantage_placements false and provide positions for manual placements. |
ad_sets[].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 | Unique key to prevent duplicate creation from retries. |
Example prompts
- “Add an ad set to the Summer Sale campaign targeting women 25 to 45 in the US, optimized for purchases, $30 a day.”
- “Create three ad sets under this campaign, one each for the UK, Germany and France, same interests, 20 EUR daily each.”
- “Preview a lead ad set with Instant Forms as the destination before creating it.”
- “Create an ad set in France for people who like cooking or travel often, and who are parents.”
Notes
Messaging, calls, event responses, reminders and shop destinations are not supported yet. For those, use Meta Ads Manager. App promotion ad sets need the app store URL and an app in Live mode.
Related tools
adsap_list_ad_sets: List ad sets for a campaign (fast cached list).
Guide
Read Creating an ad set 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.