MCP tool · Launch
create_campaign
Prepares a new campaign, always created paused: name, objective, budget per ad set (ABO) or per campaign (CBO, with its bid strategy). execute_action creates it after your OK.
What it does
Prepare a new Meta campaign (always created PAUSED): returns an action_id and what will be created. Nothing is created until execute_action, after the user explicitly approved its name, objective and budget type. execute_action returns the new campaign id (details) for prepare_launch campaign_id.
Parameters
-
ad_account_idstring requiredMeta ad account id (act_…), from list_ad_accounts
-
namestring required -
objectivestring required -
budget_typestring requiredabo = budget per ad set; cbo = campaign budget
-
budgetnumber optionalCBO only: daily campaign budget, in the account currency
-
bid_strategystring optionalCBO: the bid strategy shared by all ad sets; each new ad set then gets its own bid_amount / roas_floor (prepare_launch adset_variants). ABO: leave it out and use adset_settings.bid_strategy.
Example
Your assistant calls it for you when you ask in your own words. What it sends (MCP tools/call, JSON-RPC 2.0):
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_campaign",
"arguments": {
"ad_account_id": "act_1234567890",
"name": "Nordlicht | Prospecting",
"objective": "OUTCOME_SALES",
"budget_type": "cbo",
"budget": 100,
"bid_strategy": "LOWEST_COST_WITHOUT_CAP"
}
}
} The same call over HTTP with an API key, for an MCP client of your own (an assistant that signs in sends its OAuth token instead):
curl -X POST https://app.apogee.ad/mcp \
-H "Authorization: Bearer $APOGEE_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"create_campaign","arguments":{"ad_account_id":"act_1234567890","name":"Nordlicht | Prospecting","objective":"OUTCOME_SALES","budget_type":"cbo","budget":100,"bid_strategy":"LOWEST_COST_WITHOUT_CAP"}}}' Access and cost
| Plans | Pro and Scale. |
|---|---|
| Scope | launch: a connection or an API key without it does not see this tool (scopes). |
| Effect | Stores a plan or an action and says what it will do. Nothing changes on the ad account until it is confirmed. |
| Credits | Free up to the daily free reads (5,000 a day on Pro, 10,000 on Scale), then 1 credit per read. A call that fails costs nothing (credits). |
| Rate limit | 600 MCP requests per 15 minutes on Pro, 1,200 on Scale (rate limits). |
| Daily cap | Counts 2 units toward the 2,000 units one API key or assistant connection can use in 24 hours. |
In the REST API
The same thing for your own code, with an API key:
- Create action:
POST /actions
Related tools
Launch: The interview, the recap, your yes, then the launch.
get_launch_questions: The questions the app asks before every launch, in order, with the choices read from your account and a recommended answer (TikTok's and Snapchat's own withplatform). Called again with the files (it reads their names with your naming convention and proposes the ads) and with the answers so far.prepare_launch: Prepares the launch without creating anything: the whole recap and aplan_id, valid 24 hours. Refuses while a question is open. Starts from scratch, a copied ad set and ad, or saved templates; the ads are new files (grouped by your naming convention or by hand), or existing ads reused with their post ID.launch: Launches a prepared plan (Meta, TikTok or Snapchat: the plan knows), once, after your explicit yes to its recap.launch_status: Follows a launch until it is finished.interruptedmeans an Apogee deploy cut it: check Ads Manager before launching again.