Docs menu

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.

Prepares Scope: launch Pro and Scale plans Credits: Free*

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_id string required

    Meta ad account id (act_…), from list_ad_accounts

    Matches ^(act_)?\d{1,32}$

  • name string required

    1 to 255 characters

  • objective string required

    One of OUTCOME_SALES, OUTCOME_LEADS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_AWARENESS, OUTCOME_APP_PROMOTION

  • budget_type string required

    abo = budget per ad set; cbo = campaign budget

    One of abo, cbo

  • budget number optional

    CBO only: daily campaign budget, in the account currency

    > 0

  • bid_strategy string optional

    CBO: 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.

    One of LOWEST_COST_WITHOUT_CAP, COST_CAP, LOWEST_COST_WITH_BID_CAP, LOWEST_COST_WITH_MIN_ROAS

Example

Your assistant calls it for you when you ask in your own words. What it sends (MCP tools/call, JSON-RPC 2.0):

tools/call
{
  "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
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

PlansPro and Scale.
Scopelaunch: a connection or an API key without it does not see this tool (scopes).
EffectStores a plan or an action and says what it will do. Nothing changes on the ad account until it is confirmed.
CreditsFree 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 limit600 MCP requests per 15 minutes on Pro, 1,200 on Scale (rate limits).
Daily capCounts 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:

Launch: The interview, the recap, your yes, then the launch.

Last updated on . The parameters, limits, credits and error codes of these pages are generated from the code of the Apogee API (contract 2026-10-06).

A question, something missing? Write to hello@apogee.ad.

Book a demo

Pick the time that suits you.

Open in a new tab

Loading the calendar…

Talk to Founder