Change an ad launch's budget, schedule or name
https://api.norreach.app/v1/ad-launches/{id}Changes ONLY the name, the daily budget per ad set (integer minor units in the ad account's currency; the whole launch must stay within its daily cap) and the schedule — through the app's own review save, while the launch is a draft, ready or failed (the name can change any time). Audiences, ads, words and pictures are Nora's: ask for changes in the plan. Budgets and schedules of launches on networks other than Meta publish as Nora prepared them (409). dry_run=true answers the launch as it would be and changes nothing. Owners, admins and managers.
curl -X PATCH "https://api.norreach.app/v1/ad-launches/{id}" \
-H "Authorization: Bearer $NORREACH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"daily_budget_per_ad_set": {
"amount_minor": 12000,
"currency": "SEK"
},
"schedule": {
"mode": "range",
"start": "2026-11-10",
"end": "2026-11-30"
}
}'{
"id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
"object": "ad_launch",
"name": "Nurses in Stockholm — lead ads",
"network": "meta",
"network_name": "Meta",
"status": "ready",
"plan_id": "6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c9d",
"ad_account_id": "7d8e9f0a-1b2c-4d3e-8f4a-5b6c7d8e9f0a",
"objective": "leads",
"landing_url": "https://example-care.norreach.dev/nurses",
"budget": {
"daily_per_ad_set": {
"amount_minor": 12000,
"currency": "SEK"
},
"daily_cap": {
"amount_minor": 50000,
"currency": "SEK"
},
"campaign": null
},
"ad_sets": 3,
"ads": 6,
"schedule": {
"mode": "range",
"start": "2026-11-10",
"end": "2026-11-30"
},
"published_at": null,
"problem": null,
"created_at": "2026-11-04T09:12:33.120Z",
"updated_at": "2026-11-04T10:02:11.000Z"
}Authorizations
Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. The key needs the scope ads:spend. API keys and scopes
Path parameters
An id (UUID).
Query parameters
Run every check and return what would happen, changing nothing.
Headers
Any unique string (≤ 255). The same key with the same request returns the first answer for 24 hours.
Body
application/json
The launch's name in NorReach.
The daily budget of each ad set, in the ad account's currency. Must keep the whole launch within its daily cap.
Show child attributesHide child attributes
Integer minor units (öre, cents).
ISO-4217 code.
continuous, or a range from start to end (null = no end).
Response
200application/json— Change an ad launch's budget, schedule or name
An id (UUID).
metatiktokredditchatgptdraft → generating → ready → publishing → published (or failed). Only ready waits for a person's yes.
draftgeneratingreadypublishingpublishedfailedThe plan whose cards Nora built this launch from.
Show child attributesHide child attributes
Per ad set (ad group) per day. Editable with PATCH while draft, ready or failed.
The most the whole launch may spend per day (set by the plan). A budget above it is refused.
A campaign-level budget, on networks that use one.
How many ad sets (ad groups) publishing creates.
How many ads publishing creates.
When the ads run once switched on.
Show child attributesHide child attributes
continuous = runs until switched off; range = between start and end.
continuousrangeYYYY-MM-DD (range only).
YYYY-MM-DD, or null for no end date.
A plain sentence when something went wrong (details are in the app).
Errors
Errors are application/problem+json with a stable code.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | The request couldn't be read. |
| 400 | unknown_field | The request has a field this operation doesn't know. |
| 401 | unauthorized | A valid API key is required. |
| 403 | insufficient_scope | This API key doesn't have the scope this operation needs. |
| 403 | feature_not_enabled | The API isn't switched on for this workspace. |
| 403 | role_forbidden | The key's creator's role can't do this. |
| 404 | not_found | That doesn't exist. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. |
| 409 | conflict | That conflicts with the current state. |
| 413 | too_large | The request body is too large. |
| 422 | validation_failed | The request has invalid fields. |
| 422 | idempotency_mismatch | This Idempotency-Key was used with a different request. |
| 429 | rate_limited | Too many requests. Slow down and try again. |
| 500 | server_error | Something went wrong on our side. |
| 503 | unavailable | The API isn't available right now. Try again shortly. |