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

# Set per-buyer auto-approve

> Enable or disable automatic media-buy approval for one trusted buyer

`PUT /api/v2/storefront/buyer-auto-approvals/{buyerCustomerId}`

Opts one buyer into (`enabled: true`) or out of (`enabled: false`) automatic
approval for their media buys. This is an idempotent upsert keyed on
`(storefront, buyerCustomerId)` — calling it again updates the existing override.
The storefront is resolved from your authenticated identity, never the request
body.

While enabled, that buyer's media buys skip **both** your review queue and your
acceptance-policy screen. It affects **media buys only** (creative review is a
separate gate) and only takes effect while `mediaBuyApproval` is `manual`.

## Request

```bash curl theme={null}
curl -X PUT https://api.interchange.io/api/v2/storefront/buyer-auto-approvals/804 \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true,
    "reason": "Coke — pre-cleared 2026 always-on."
  }'
```

To revoke trust, send `{"enabled": false}`. The override row is **kept** for your
audit trail — there is no delete.

## Parameters

| Field             | Type           | Required | Notes                                                                                      |
| ----------------- | -------------- | -------- | ------------------------------------------------------------------------------------------ |
| `buyerCustomerId` | path, number   | Yes      | Account id of the buyer. Must be a buyer that has submitted a media buy to this storefront |
| `enabled`         | boolean        | Yes      | `true` to auto-approve this buyer's media buys; `false` to revoke                          |
| `reason`          | string \| null | No       | Operator note. Omit to keep the existing note; `null` to clear it. Max 2000 chars          |

## Response

```json theme={null}
{
  "id": "42",
  "storefrontId": "1234",
  "buyerCustomerId": 804,
  "buyerName": "Coca-Cola",
  "autoApproveEnabled": true,
  "reason": "Coke — pre-cleared 2026 always-on.",
  "createdAt": "2026-06-28T15:00:00.000Z",
  "updatedAt": "2026-06-28T15:00:00.000Z",
  "createdBy": "11",
  "createdByCustomerId": 1234,
  "updatedByCustomerId": 1234,
  "policyBypassCount": 0,
  "lastPolicyBypassAt": null
}
```

Returns `200` with the override. `buyerName` is the resolved buyer company/name for
your confirmation; the actor fields record who armed and last changed the override.
`policyBypassCount` / `lastPolicyBypassAt` track how often this buyer's auto-forwarded
buys would have been held by your acceptance policy (see
[Watching the trust](/v2/storefront/buyer-auto-approvals/overview#watching-the-trust)).

## Errors

* `400 VALIDATION_ERROR` — `enabled` missing or not a boolean, or a non-numeric
  `buyerCustomerId`.
* `404 NOT_FOUND` — no storefront exists for the caller, **or** the buyer has no
  media buys on this storefront (fail-closed: you can't opt in a buyer that hasn't
  submitted a media buy to you).
* `401 UNAUTHORIZED` — missing or invalid bearer token.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Per-buyer auto-approve" href="/v2/storefront/buyer-auto-approvals/overview" icon="user-check">
    What the override does, and what it deliberately doesn't.
  </Card>

  <Card title="List per-buyer auto-approvals" href="/v2/storefront/buyer-auto-approvals/tasks/list-buyer-auto-approvals" icon="list">
    Read every override on the storefront.
  </Card>
</CardGroup>
