REST API · Launches
Confirm launch plan
Launch a prepared plan, after the user said yes to its recap
POSThttps://api.apogee.ad/api/v1/launch-plans/{id}/confirm
What it does
A plan launches once (409 plan_already_launched), within 24 hours of being prepared (410 plan_expired). Answers 202 as soon as the launch started: follow it with GET /launches/{launch_id}.
Request
POST /launch-plans/{id}/confirm on https://api.apogee.ad/api/v1.
Path parameters
-
idstring path requiredLaunch plan id
Headers
-
Authorizationstring header requiredBearer apk_…: an API key with the scope of this route. -
Idempotency-Keystring header requiredA unique key per request, e.g. a UUID, reused when you retry it: the first answer comes back instead of a second write (idempotency).
-
Content-Typestring header requiredapplication/json
Body
-
confirmconstant requiredtrue = the user said yes to the recap
Response
202.
-
plan_idstring -
statusstring -
launch_idstring or null
Every answer carries X-Request-Id (give it to support), Apogee-Version: 2026-10-06, and the RateLimit and RateLimit-Policy headers; a replayed answer also carries Idempotent-Replayed: true.
Errors
Errors are application/problem+json with a stable code to switch on (all the codes).
| Status | Possible codes |
|---|---|
| 400 Bad request | idempotency_key_required, not_supported, request_refused, validation_failed |
| 401 Unauthorized | invalid_api_key |
| 403 Forbidden | account_not_connected, forbidden, insufficient_scope, meta_permission_denied, platform_permission_denied, upgrade_required |
| 404 Not found | not_found |
| 409 Conflict | action_already_ran, idempotency_in_progress, plan_already_launched |
| 410 Gone | action_expired, plan_expired |
| 412 Precondition failed | drive_not_connected, meta_not_connected, platform_not_connected |
| 422 Unprocessable content | budget_above_cap, idempotency_key_reused, launch_refused, missing_answers |
| 429 Too many requests | daily_read_cap, meta_rate_limited, platform_rate_limited, quota_exceeded, rate_limited |
| 500 Internal server error | internal_error |
| 502 Bad gateway | drive_error, launch_failed, meta_error, platform_error, upstream_error |
Example
With your key in APOGEE_API_KEY (create one):
curl -X POST 'https://api.apogee.ad/api/v1/launch-plans/120200000000000001/confirm' \
-H "Authorization: Bearer $APOGEE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"confirm": true
}' {
"plan_id": "7b0f3c52-4d1e-4c8a-9f61-2a5e8d3c1b90",
"launch_id": "9a4c1e7d-2f58-4b3a-8e60-1d5b7c9e3f20",
"status": "started"
} Access and cost
| Plans | Pro and Scale. |
|---|---|
| Scope | launch (scopes). |
| Credits | 15 credits per ad created, counted at the end (an ad that failed is free). A request that fails costs nothing, a replayed one neither (credits). |
| Rate limit | Confirmation: 30 per 15 minutes on Pro, 60 on Scale (rate limits). |
| Meta budget | Reads Meta: spends 1 unit of the account's Meta budget (1,800 per 15 minutes, 900 per ad account). |
| Daily cap | Counts 10 units toward the 2,000 units one API key can use in 24 hours. |
In the MCP
An AI assistant does the same with this tool of the MCP server:
launch: Launches a prepared plan (Meta, TikTok or Snapchat: the plan knows), once, after your explicit yes to its recap.
Related operations
- Get launch questions:
POST /ad-accounts/{acc}/launch-questions - Create launch plan:
POST /launch-plans - Get launch plan:
GET /launch-plans/{id} - Get launch plan status:
GET /launch-plans/{id}/status - List launches:
GET /launches - Get launch:
GET /launches/{id}