Docs
Ads

Change an ad launch's budget, schedule or name

PATCHhttps://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.

⚠ ads:spendRole must allow: ads.spendSupports dry_runOperation id: update_ad_launch
PATCH/ad-launches/{id}
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"
  }
}'
Change an ad launch's budget, schedule or name
{
  "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

Authorizationstringheaderrequired

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

idstring (uuid)pathrequired

An id (UUID).

Query parameters

dry_runbooleanquery

Run every check and return what would happen, changing nothing.

Headers

Idempotency-Keystringheader

Any unique string (≤ 255). The same key with the same request returns the first answer for 24 hours.

Body

application/json

namestring

The launch's name in NorReach.

daily_budget_per_ad_setobject

The daily budget of each ad set, in the ad account's currency. Must keep the whole launch within its daily cap.

Show child attributes
daily_budget_per_ad_set.amount_minorintegerrequired

Integer minor units (öre, cents).

daily_budget_per_ad_set.currencystringrequired

ISO-4217 code.

scheduleobject | object

continuous, or a range from start to end (null = no end).

Response

200application/json— Change an ad launch's budget, schedule or name

idstring (uuid)required

An id (UUID).

object"ad_launch"required
namestringrequired
networkenumrequired
One of:metatiktokredditchatgpt
network_namestringrequired
statusenumrequired

draft → generating → ready → publishing → published (or failed). Only ready waits for a person's yes.

One of:draftgeneratingreadypublishingpublishedfailed
plan_idstring (uuid) | nullrequired

The plan whose cards Nora built this launch from.

ad_account_idstring (uuid) | nullrequired
objectivestring | nullrequired
landing_urlstring | nullrequired
budgetobjectrequired
Show child attributes
budget.daily_per_ad_setobject | nullrequired

Per ad set (ad group) per day. Editable with PATCH while draft, ready or failed.

budget.daily_capobject | nullrequired

The most the whole launch may spend per day (set by the plan). A budget above it is refused.

budget.campaignobject | nullrequired

A campaign-level budget, on networks that use one.

ad_setsintegerrequired

How many ad sets (ad groups) publishing creates.

adsintegerrequired

How many ads publishing creates.

scheduleobjectrequired

When the ads run once switched on.

Show child attributes
schedule.modeenumrequired

continuous = runs until switched off; range = between start and end.

One of:continuousrange
schedule.startstring | nullrequired

YYYY-MM-DD (range only).

schedule.endstring | nullrequired

YYYY-MM-DD, or null for no end date.

published_atstring | nullrequired
problemstring | nullrequired

A plain sentence when something went wrong (details are in the app).

created_atstring | nullrequired
updated_atstring | nullrequired

Errors

Errors are application/problem+json with a stable code.

StatusCodeMeaning
400bad_requestThe request couldn't be read.
400unknown_fieldThe request has a field this operation doesn't know.
401unauthorizedA valid API key is required.
403insufficient_scopeThis API key doesn't have the scope this operation needs.
403feature_not_enabledThe API isn't switched on for this workspace.
403role_forbiddenThe key's creator's role can't do this.
404not_foundThat doesn't exist.
409idempotency_in_progressA request with this Idempotency-Key is still running.
409conflictThat conflicts with the current state.
413too_largeThe request body is too large.
422validation_failedThe request has invalid fields.
422idempotency_mismatchThis Idempotency-Key was used with a different request.
429rate_limitedToo many requests. Slow down and try again.
500server_errorSomething went wrong on our side.
503unavailableThe API isn't available right now. Try again shortly.