REST API · Launches
Get launch questions
The launch interview: every question the app asks before a launch, with the choices read from the account
POSThttps://api.apogee.ad/api/v1/ad-accounts/{acc}/launch-questions
What it does
Send files (names, refs, formats) once the creatives are known: the account's naming convention reads them and the ads are proposed (one creative in 9:16 / 4:5 / 1:1 = one ad). Send the answers so far to get the choices that depend on them.
Request
POST /ad-accounts/{acc}/launch-questions on https://api.apogee.ad/api/v1.
Path parameters
-
accstring path requiredThe ad account (list_ad_accounts): Meta act_…, a TikTok advertiser id, a Snapchat ad account id
Headers
-
Authorizationstring header requiredBearer apk_…: an API key with the scope of this route. -
Content-Typestring header requiredapplication/json
Body
-
platformstring optionalDefault meta. tiktok / snapchat: the same interview and arguments where they mean the same, their own settings under
tiktok/snapchat, groups made by hand underadgroups/adsquads -
filesarray of objects optionalFields of each item (7)
-
namestring requiredFile name with its extension
-
refstring optionaldrive:<id> or the URL of the file in Apogee storage
-
mimeTypestring optional -
kindstring optional -
formatstring optionalMeasured format (list_drive_folder, ffprobe): 9:16, 4:5, 1:1, 16:9
-
folderstring optionalSubfolder (list_drive_folder)
-
durationSnumber optionalLength in seconds (list_drive_folder durationS, ffprobe): files of one length in different formats are flagged as maybe one creative
-
-
answersone of optionalThe answers so far, with prepare_launch's argument names
option 1(12 fields)-
campaign_idstring or integer or null optionalQuestion "campaign"
-
existing_adset_idsarray of strings or integers or null optional -
copy_adset_fromstring or integer or null optionalAn ad set to duplicate
-
copy_ad_fromstring or integer or null optionalAn ad to duplicate
-
adset_settingsobject or null optionalFields (3)
-
pixel_idstring or integer or null optionalA pixel
-
custom_conversion_idstring or integer or null optionalA custom conversion
-
application_idstring or integer or null optionalapp_installs
-
-
ad_settingsobject or null optionalFields (4)
-
page_idstring or integer or null optionalA Facebook page
-
instagram_idstring or integer or null optionalAn Instagram account
-
lead_form_idstring or integer or null optionalAn instant form
-
partnershipobject or null optionalFields (2)
-
creator_ig_idstring or integer or null optionalAn approved creator
-
creator_fb_page_idstring or integer or null optionalThe creator's Facebook page (alone: a Facebook creator)
-
-
-
productsobject or null optionalFields (2)
-
catalog_idstring or integer or null optionalA catalog
-
product_set_idstring or integer or null optionalA product set
-
-
adsarray of objects or null optionalFields of each item (1)
-
source_ad_idstring or integer or null optionalAn existing ad to reuse with its post
-
-
adset_variantsarray of objects or null optional -
source_campaign_idstring or integer or null optionalLists the existing ads of this campaign only
-
nomenclatureobject or null optionalFields (1)
-
config_idstring or null optional
-
-
grouping_modestring optionalThe app's switch: "names" reads the file names with a saved convention, "by_hand" groups the files by hand (formats of one creative linked by name, every other file its own ad). Default: names only when a convention reads every file, else by hand
option 2(4 fields)-
campaign_idstring or null optionalQuestion "campaign"
-
copy_adset_fromstring or null optionalAn ad group / ad squad to copy, or "latest"
-
copy_ad_fromstring or null optionalAn ad to copy, or "latest"
-
existing_adset_idsarray of strings or null optional
-
Response
200.
-
questionsarray of objectsFields of each item (7)
-
idstring -
topicstring -
statusstring -
askstring -
choicesany -
recommendedany -
answer_withstring
-
-
read_errorsarray of strings
Every answer carries X-Request-Id (give it to support), Apogee-Version: 2026-10-06, and the RateLimit and RateLimit-Policy headers.
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 |
| 412 Precondition failed | drive_not_connected, meta_not_connected, platform_not_connected |
| 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/ad-accounts/act_1234567890/launch-questions' \
-H "Authorization: Bearer $APOGEE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "meta",
"files": [
{
"name": "Nordlicht | Spring launch"
}
]
}' {
"questions": [
{
"id": "120200000000000001",
"topic": "120200000000000001",
"status": "to_ask",
"ask": "120200000000000001",
"choices": "120200000000000001",
"recommended": "120200000000000001",
"answer_with": "120200000000000001"
}
],
"read_errors": [
"120200000000000001"
]
} Access and cost
| Plans | Pro and Scale. |
|---|---|
| Scope | read (scopes). |
| Credits | Free up to the daily free reads (5,000 a day on Pro, 10,000 on Scale), then 1 credit per read. A request that fails costs nothing, a replayed one neither (credits). |
| Rate limit | Read: 600 per 15 minutes on Pro, 1,200 on Scale (rate limits). |
| Meta budget | Reads Meta: spends 15 units of the account's Meta budget (1,800 per 15 minutes, 900 per ad account). |
| Daily cap | Counts 1 unit 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:
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.
Related operations
- Create launch plan:
POST /launch-plans - Get launch plan:
GET /launch-plans/{id} - Confirm launch plan:
POST /launch-plans/{id}/confirm - Get launch plan status:
GET /launch-plans/{id}/status - List launches:
GET /launches - Get launch:
GET /launches/{id}