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

# Notifications

> The in-app and email notifications for campaigns, media buys, creatives, storefronts and asks, and how to choose which ones you get.

Notifications surface things that happen while you aren't looking: a campaign turns unhealthy, a seller
approves a change, a media buy is waiting for your approval. Each one lands in your in-app feed (the
bell), and some also arrive by email.

Notifications are per person. Reading or acknowledging one changes only your own feed.

## Event types

Types follow a `resource.action` pattern, so agents can build on stable names.

| Family                      | Types                                                                                                                                                                  |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `campaign`                  | `healthy`, `unhealthy`, `created`, `updated`, `deleted`, `completed`                                                                                                   |
| `creative`                  | `approved`, `rejected`, `changes_requested`, `sync_started`, `sync_completed`, `sync_failed`, `review_requested`                                                       |
| `media_buy`                 | `created`, `updated`, `deleted`, `forward_failed`, `awaiting_source_moderation`, `source_rejected`, `stuck`, `approval_requested`                                      |
| `media_buy_update_proposal` | `approved`, `rejected`, `expired` (see [Update proposals](/buy/update-proposals))                                                                                      |
| `optimization`              | `suggestion_received`, `suggestion_approved`, `suggestion_rejected`, `suggestion_applied`, `suggestion_failed`                                                         |
| `salesagent`                | `available`, `unavailable`, `registered`, `unregistered`, `updated`, `sync_action_required`                                                                            |
| `audience`                  | `synced`, `sync_failed`                                                                                                                                                |
| `syndication`               | `completed`, `failed` (see [Syndication](/buy/syndication))                                                                                                            |
| `storefront`                | `composition_paused`, `products_not_traffickable`, `supply_nudge`, `liveness_degraded`, `liveness_recovered`, `media_buy_forward_failed`, `media_buy_moderation_aging` |
| `inventory_source`          | `unhealthy`, `recovered`                                                                                                                                               |
| `assistant_room`            | `mentioned`                                                                                                                                                            |
| `ask`                       | `resolved`                                                                                                                                                             |

Each notification has a `status` of `success`, `error`, `warning` or `info`, a `messagePreview`, an
`actionUrl` when there's somewhere to go, `read` and `acknowledged` flags, and a `data` object with the
ids involved.

### Always on

Three types can't be switched off: `media_buy.approval_requested`, `assistant_room.mentioned` and
`ask.resolved`.

## Choose what you get

There are two channels, `in_app` and `email`. By default the more urgent types also send an email:
`media_buy.approval_requested`, `media_buy.forward_failed`, `media_buy.stuck`,
`creative.review_requested`, `creative.rejected`, `campaign.unhealthy`, `campaign.completed`,
`storefront.liveness_degraded`, `storefront.composition_paused`, `inventory_source.unhealthy`,
`assistant_room.mentioned` and `ask.resolved`. The rest are in-app unless you opt in.

Ask Semi ("stop emailing me about completed campaigns"), or call `save_notification_config`:

```json save_notification_config theme={null}
{
  "preferences": [
    { "notificationType": "campaign.completed", "channel": "email", "enabled": false },
    { "category": "optimization", "enabled": true }
  ]
}
```

Each cell names one `notificationType` or a whole `category` (every type in that family), an optional
`channel` (leave it out for both) and `enabled`. The result lists the cells now in effect and any
always-on types that stayed on.

## REST

All paths are under `https://api.semicola.com/api/v2`.

| Method and path                        | What it does                                                                 |
| -------------------------------------- | ---------------------------------------------------------------------------- |
| `GET /notifications`                   | Your feed, newest first (`unreadOnly`, `limit`, `cursor`).                   |
| `POST /notifications/{id}/read`        | Mark one read.                                                               |
| `POST /notifications/{id}/acknowledge` | Acknowledge one.                                                             |
| `POST /notifications/read-all`         | Mark everything read; returns how many changed.                              |
| `GET /notification-preferences`        | The type × channel matrix, with `locked` on always-on types.                 |
| `PUT /notification-preferences`        | Update cells: `{ "preferences": [{ notificationType, channel, enabled }] }`. |

Release history lives separately in **Release notes** (`open_page` with `page: "release_notes"`,
`GET /release-updates`).

## Not available yet

* Slack delivery, including source-health alerts and product updates to a Slack channel. It needs a
  Slack app registration first.
* Webhook delivery of notifications. Buyer [webhooks](/buy/webhooks) carry only `discovery.revision`.

## Related

* [Asks](/concepts/asks)
* [Activity and audit logs](/guides/audit-logs)
