> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apostra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Approve campaign suggestion set

> Accept a whole campaign's budget transfer

`POST /api/v2/buyer/campaign-suggestion-sets/:campaignSuggestionSetId/approve`

Approves the entire set — every media buy it moves budget between. There is no
per-media-buy approval: the members are two sides of one transfer, so approving
part of it would either create budget the campaign never freed or strand budget it
did. See [campaign suggestion sets](/v2/buyer/campaigns/campaign-suggestion-sets) for why.

<Warning>
  Only a set in `AWAITING_APPROVAL` can be approved. A set that has since been
  superseded by a newer run, expired because one of its media buys changed, or
  already been decided returns `409` — the decision is refused rather than applied
  to a recommendation that no longer describes your campaign.
</Warning>

## Request

```bash theme={null}
curl -X POST https://api.apostra.com/api/v2/buyer/campaign-suggestion-sets/77/approve \
  -H "Authorization: Bearer $SCOPE3_API_KEY"
```

No request body. Approval takes no reason — only
[rejection](/v2/buyer/campaigns/tasks/reject-campaign-suggestion-set) does. A body
sent here is ignored rather than rejected.

## Parameters

| Field                     | Type   | Required | Notes                                                                    |
| ------------------------- | ------ | -------- | ------------------------------------------------------------------------ |
| `campaignSuggestionSetId` | string | Yes      | Set id (path parameter) — digits only, no leading zero, up to 18 digits. |

## Response

```json theme={null}
{
  "campaignSuggestionSetId": "77",
  "status": "APPROVED"
}
```

The approval is recorded against every member suggestion at once, so the set and
its members can never disagree about whether the transfer was accepted.

`APPROVED` means the transfer is cleared to run, not that it has run. Apostra
then sends the changes to your sellers and confirms each one, moving the set to
`APPLYING` and on to `APPLIED` — or reversing the whole transfer if a change
cannot be made. If the reversal itself cannot complete, the set stops at
`NEEDS_RECONCILIATION` and a person puts the budgets right. How long that takes is up to your sellers: the decreases are
confirmed before any increase is sent, and a reversal waits on them the same way.
Poll
[get campaign suggestion set](/v2/buyer/campaigns/tasks/get-campaign-suggestion-set) for
the outcome, and see [what happens after you
approve](/v2/buyer/campaigns/campaign-suggestion-sets#what-happens-after-you-approve).

## Errors

| Status | When                                                                                     |
| ------ | ---------------------------------------------------------------------------------------- |
| `404`  | No such set, or it belongs to another account.                                           |
| `409`  | The set is not in `AWAITING_APPROVAL` — already decided, superseded, expired, or parked. |
| `400`  | Malformed set id.                                                                        |
