# Create ad sets (batch) (adsap_create_ad_sets)

Creates one or more ad sets under an existing Meta campaign, up to 20 in one call.

Canonical: https://adsap.ai/docs/tools/adsap_create_ad_sets
Updated: 2026-09-13

**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.

## 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."

## 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`](/tools/adsap_list_ad_sets): List ad sets for a campaign.

## Guide

Read [Creating an ad set](/guides/launch/ad-sets) for the workflow around this tool, and the [Tool reference](/tools) for every tool.
