> ## 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.

# Update notification preferences

> Replace the authenticated user's notification opt-ins

`PUT /api/v2/notification-preferences`

Sets the notification opt-ins for the authenticated user. This **replaces all existing opt-ins** — send the complete set you want enabled, not a delta. To turn everything off, send an empty `optIns` array.

## Request

```bash curl theme={null}
curl -X PUT https://api.interchange.io/api/v2/notification-preferences \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "optIns": [
      { "notificationType": "media_buy.created", "channel": "email" },
      { "notificationType": "media_buy.updated", "channel": "in_app" },
      { "notificationType": "creative.rejected", "channel": "email" }
    ]
  }'
```

## Parameters

| Field                       | Type  | Required | Notes                                                                                                                                                                                                 |
| --------------------------- | ----- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `optIns`                    | array | Yes      | The full set of opt-ins (max 200). Replaces any existing opt-ins                                                                                                                                      |
| `optIns[].notificationType` | enum  | Yes      | Event to subscribe to. Values include `media_buy.created`, `media_buy.updated`, `creative.approved`, `creative.rejected`, `salesagent.available`, `syndication.completed`, `system.error`, and others |
| `optIns[].channel`          | enum  | Yes      | `email` or `in_app`                                                                                                                                                                                   |

## Response

```json theme={null}
{
  "optIns": [
    { "notificationType": "media_buy.created", "channel": "email" },
    { "notificationType": "media_buy.updated", "channel": "in_app" },
    { "notificationType": "creative.rejected", "channel": "email" }
  ]
}
```

The response echoes the opt-ins now in effect.

## Always-on types

Some operational alert types bypass opt-in and are not managed here. This includes `source.action_required` (your storefront needs something only you can provide — for example, refreshed ad-server credentials) and `source.action_resolved` (that problem is resolved). Always-on types are delivered to the in-app feed and by email regardless of the opt-ins you set on this endpoint. Slack is the exception: they only post to Slack once you add the event type to your Slack configuration's enabled events. See the [notifications guide](/v2/guides/notifications) for the full always-on list.

## Errors

* `400 VALIDATION_ERROR` — unknown `notificationType`, invalid `channel`, or more than 200 opt-ins.
* `401 UNAUTHORIZED` — missing or invalid API key.

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

## Related

<CardGroup cols={2}>
  <Card title="Account tasks" href="/v2/storefront/account/tasks" icon="list-check">
    All account operations
  </Card>

  <Card title="Get notification preferences" href="/v2/storefront/account/tasks/get-notification-preferences" icon="bell">
    Read current opt-ins
  </Card>

  <Card title="Account overview" href="/v2/storefront/account/overview" icon="building">
    Concepts and hierarchy
  </Card>
</CardGroup>
