campaigns:write scope and work on wallet-funded campaigns only.
Which campaigns can you manage?
Campaign list and detail responses include ageneration field:
Calling a management endpoint on a non-generation-
3 campaign returns 400 invalid_request (for example, “Stopping is only supported for wallet campaigns.”).
TypeScript:
soundlink.campaigns.increaseBudget / decreaseBudget / tiers / stop —
see TypeScript SDK.Stop, budget, and auto-renew endpoints require the same
Idempotency-Key
header as campaign creation: unique string up to 255
characters, honored for 24 hours, same key + same body replays the original response.Increase budget
POST /v1/campaigns/{campaignId}/budget/increase
Adds budget using credits already in your wallet — there is no new card payment.
amountis the total USD debit for the current cycle. Withmode: next_renewalyou may sendamount: 0together withtargetDailyBudgetto set an absolute next-cycle daily budget.- The wallet is debited whenever the current cycle is increased. If the balance is too low, you get
402 insufficient_creditwithdetails.availableanddetails.required.
Decrease budget
POST /v1/campaigns/{campaignId}/budget/decrease
Lowers the campaign’s daily budget to targetDailyBudget and refunds unused budget to your wallet.
400 invalid_request):
targetDailyBudgetmust be at least $10/day and lower than the current daily budget- More than 3 days must remain in the current billing cycle
- Modes:
current_cycleorcurrent_and_renewals(default) —next_renewalis not supported for decreases
accepted: true. The refund of unused budget is applied to your wallet asynchronously after acceptance — it may take a moment to appear in your balance.
Update geographic tiers
GET /v1/campaigns/{campaignId}/tiers (requires campaigns:read) returns the current allocation and each tier’s learningStatus (LEARNING, FAIL, SUCCESS, or null):
PATCH /v1/campaigns/{campaignId}/tiers enables/disables tiers and reallocates budget shares:
- Include all of the campaign’s tiers in
items— not just the ones you change newAllocationPercentvalues must sum to exactly 100- At least one tier must have
isEnabled: true acknowledgeLearningWarningis optional. Omit it or sendfalseto leave the warning unacknowledged. Onlytrueacknowledges it.
Toggle auto-renew
PUT /v1/campaigns/{campaignId}/auto-renew
Turns auto-renew on or off. Wallet campaigns only. Allowed when status is active or renew_failed.
200):
Read wallet balance
GET /v1/wallet · scope wallet:read
Returns the organization wallet. available is what POST /v1/campaigns checks before reserving. reserved is the sum of active reservations. Existing keys do not include wallet:read until that scope is granted.
200):
Stop a campaign
POST /v1/campaigns/{campaignId}/stop
Stops delivery and refunds the unspent budget to your wallet.
200):
stopped: active, inactive, restarting, restart_failed, renew_failed, and renew_awaiting_charge.
stopped and ended succeed without changing status. The response status stays stopped or ended, and a second stop does not refund again.
creating and renewing return 400 invalid_request. Retry after the campaign leaves that status.
Stopped campaigns cannot be restarted via the API — create a new campaign instead.
Activity
GET /v1/campaigns/{campaignId}/activity
POST /v1/campaigns/activity/batch
Requires campaigns:read. Returns a page of creative adds, creative pause/resume (user request or Meta sync), budget changes, tier updates, country updates, playlist redirect heals, and auto-renew changes. Each item has event_type, timestamp, and summary.
Replacing a creative shows up as a pause of the old creative plus CAMPAIGN_AD_CREATIVES_ADDED for the new one. The list does not include campaign creation. Fee amounts, Stripe ids, and internal file URIs are left out. Apply any waiting rule, such as 72 hours after a change, on your side. This endpoint does not block the next change.
startDate keeps events at or after that date (YYYY-MM-DD, from 00:00:00Z) or ISO-8601 timestamp. Omit it to page the full history. page defaults to 1. pageSize defaults to 20 and maxes at 100.
data.items[].campaignId, items, pagination). Shared page, pageSize, and startDate apply to every ID. Up to 50 campaignIds, one rate-limit unit. Unauthorized or unknown IDs are omitted. Batch reads must be enabled for your organization — otherwise the route returns 404.
Common management errors
See Errors for the full list.