Create campaign (adsap_create_campaign)
Platform: Meta · Read or write: Write · Plan: All plans · Consumes a task: Yes · Preview supported: Yes
What it does
Creates a Meta campaign in the ad account you name. You set the objective, the budget model and any special ad category. The campaign starts paused unless you ask for it to go live. Ask for a preview first: the copilot validates the setup and shows a launch review card where you confirm, create and activate.
When to use it
- Use it as the first step of a Meta launch. Ad sets and ads need a campaign to sit in, and
adsap_create_ad_setscomes next. - It needs three things:
ad_account_id,nameandobjective. The objective is one of six Meta values, fromOUTCOME_AWARENESStoOUTCOME_SALES. - A campaign-level
daily_budgetorlifetime_budgetneedscampaign_budget_optimizationset totrue. Without it, set budgets on each ad set.lifetime_budgetalso needsstart_timeandstop_time. - For Catalog or Collection ads, set
advantage_catalog_adstotrueand pass acatalog_idfromadsap_list_catalogs. This works onOUTCOME_SALESonly. - It supports a preview call. With
dry_runset totrue, Adsap validates the setup and creates nothing.
Worked example
You ask
“Set up a sales campaign called Spring sale in act_1234567890 with a $100 daily budget at the campaign level. Preview it first.”
The assistant calls adsap_create_campaign
{
"ad_account_id": "act_1234567890",
"name": "Spring sale",
"objective": "OUTCOME_SALES",
"campaign_budget_optimization": true,
"daily_budget": 10000,
"dry_run": true
}Adsap returns
The field names are the ones Adsap returns. The values are examples.
{
"dry_run": true,
"validation_passed": true,
"resolved_payload": {
"ad_account_id": "act_1234567890",
"campaign_name": "Spring sale",
"objective": "sales",
"status": "PAUSED",
"advantage_catalog_ads": "off",
"catalog_id": null,
"budget_strategy": "campaign",
"budget_type": "daily_budget",
"budget_amount": 100,
"share_budget": "off",
"bid_strategy": "highest_volume",
"special_ad_categories": "none",
"spend_cap": null,
"start_time": null,
"stop_time": null,
"buying_type": "AUCTION"
},
"request_echo": {
"ad_account_id": "act_1234567890",
"name": "Spring sale",
"objective": "OUTCOME_SALES",
"campaign_budget_optimization": true,
"daily_budget": 10000
},
"warnings": ["No end date set. The campaign will run until you pause it."]
}How to read it
validation_passed means the setup passed Adsap’s checks. resolved_payload is what Adsap would send to create the campaign. You send daily_budget in cents, and budget_amount shows it in currency units: 10000 becomes 100. status is PAUSED because the call did not ask for ACTIVE. request_echo repeats your input. The example leaves out a few resolved_payload fields, such as internal IDs.
Read warnings before you confirm. The list always ends with a reminder that Meta runs its own checks at creation and can still reject the campaign. 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 |
|---|---|---|---|
ad_account_id | string | Yes | |
name | string | Yes | |
objective | one of OUTCOME_AWARENESS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_LEADS, OUTCOME_APP_PROMOTION, OUTCOME_SALES | Yes | |
buying_type | one of AUCTION, RESERVED | No | |
daily_budget | number | No | In cents. Mutually exclusive with lifetime_budget. |
lifetime_budget | number | No | In cents. Mutually exclusive with daily_budget. |
spend_cap | number | No | In cents. |
start_time | string | No | Required with lifetime_budget. |
stop_time | string | No | Required with lifetime_budget. |
special_ad_categories | array of one of NONE, HOUSING, EMPLOYMENT, CREDIT, FINANCIAL_PRODUCTS_SERVICES, ISSUES_ELECTIONS_POLITICS, ONLINE_GAMBLING_AND_GAMING | No | Meta Special Ad Category. Required for ads about financial products and services (FINANCIAL_PRODUCTS_SERVICES; CREDIT is the retired name), employment, housing, social issues/elections/politics, or online gambling and gaming. Housing, employment and financial categories lock ad set targeting to 18-65+, all genders and a 15 mi / 25 km radius floor… |
special_ad_category_country | array of string | No | ISO country codes, one or several. Required when special_ad_categories is set; ad sets under the campaign must target inside this list. |
campaign_budget_optimization | boolean | No | Enable CBO. |
share_budget_with_ad_sets | boolean | No | Campaign-level toggle for Meta’s “Share some of your budget with other ad sets” (is_adset_budget_sharing_enabled). Only valid on ABO campaigns (no campaign-level budget) whose ad sets use DAILY budgets; rejected on CBO campaigns (Meta error 4834002). Worth considering for ABO campaigns with multiple ad sets. |
bid_strategy | one of LOWEST_COST_WITHOUT_CAP, COST_CAP, BID_CAP, LOWEST_COST_WITH_MIN_ROAS | No | Campaign-level bid strategy. Only applied under CBO (campaign_budget_optimization: true) or when share_budget_with_ad_sets is true (budget sharing requires a campaign bid strategy: Meta error 4834005); ignored for plain ad-set-budget campaigns. Cap and ROAS values are set per ad set via adsap_create_ad_sets (bid_amount / roas_target), not at the campaign level. |
status | one of PAUSED, ACTIVE | No | |
promoted_object | object | No | OUTCOME_APP_PROMOTION + iOS apps ONLY: campaign-level app binding for iOS/SKAdNetwork campaigns (is_skadnetwork_attribution is set automatically). Meta treats any campaign with a campaign-level promoted_object as an iOS-14 SKAN campaign: Android apps are rejected there (2446632)… The app must be in Live mode and advertisable by the ad account. |
promoted_object.application_id | string | Yes | |
promoted_object.object_store_url | string | Yes | |
advantage_catalog_ads | boolean | No | Enable Advantage+ Catalog Ads (catalog-based advertising). OUTCOME_SALES only, and requires catalog_id. REQUIRED for any campaign that will host Catalog or Collection ads: Meta binds the catalog at the CAMPAIGN level, so a plain sales campaign cannot host them. |
catalog_id | string | No | Meta product catalog id to bind to the campaign. Required when advantage_catalog_ads is true, ignored otherwise. Get ids from adsap_list_catalogs. |
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 sales campaign called Summer Sale with a $50 daily budget and campaign budget optimization on.”
- “Set up a leads campaign for the French account, paused, with a lifetime budget of 2,000 EUR ending June 30.”
- “Preview a catalog sales campaign using my main product catalog before you create anything.”
Notes
Catalog and Collection ads need the catalog bound at the campaign level. Say so when you create the campaign, or those ads fail later.
Related tools
adsap_get_campaign: Read ONE campaign in full, live from Meta: effective_status, objective, buying_type, bid strategy, budgets (campaign budget present =…adsap_list_apps: List the apps an ad account can promote: use to pick application_id + object_store_url for App promotion (OUTCOME_APP_PROMOTION)…adsap_list_campaigns: List Meta campaigns in an ad account (fast cached list).
Guide
Read Creating a campaign 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.