Overview
Notifications surface async events from across your buyer workspace — campaign health, creative approvals, agent registrations, optimization suggestions, and more — through three channels: in-app (per-user feed), email (customer-scoped), and Slack (customer-scoped webhook). In-app opt-ins are tuned per user; email and Slack are admin-managed at the customer level. The v2 notification system gives every operator a structured event feed for things they care about — campaign health, creative approvals, agent registrations, optimization suggestions, and more. Each event is delivered to one or more channels (in_app,
email, Slack), and every user opts into the events they want to see.
All endpoints below are mounted under
https://api.agentic.scope3.com/api/buyer/.
The notification feed is filtered server-side by your in_app opt-ins — users who have
not opted into any types see an empty feed.Event taxonomy
Notification types follow aresource.action taxonomy so agents can build workflows
around stable event names. The full enum lives in
apps/api/src/types/notifications.ts. A representative slice:
Campaign lifecycle
campaign.created, campaign.updated, campaign.healthy,
campaign.unhealthy, campaign.completed, campaign.deletedCreative review
creative.approved, creative.rejected, creative.changes_requested,
creative.sync_started, creative.sync_completed, creative.sync_failedAgent registry
salesagent.registered, salesagent.available, signalsagent.registered,
outcomesagent.registered, salesagent.updatedOptimization
optimization.suggestion_received, optimization.suggestion_approved,
optimization.suggestion_applied, optimization.suggestion_failedMeasurement & learning
measurement.received, measurement.stale, learning_cycle.completed,
hypothesis.proven, hypothesis.disprovenSystem & syndication
system.warning, system.error, syndication.completed,
syndication.failed, audience.syncedstatus (success, error, warning, info) and a
data object with resource IDs (campaignId, creativeId, salesAgentId, …) plus a
human-readable message.
Channels
| Channel | Configuration | Best for |
|---|---|---|
in_app | Per-user opt-ins via PUT /notification-preferences | Live operator UI feed |
email | Customer-level opt-ins + a notificationEmail recipient | Critical alerts, audit trail |
| Slack | Customer-level webhook + per-event-type filter | Team channels, war rooms |
Per-user in-app preferences
Operators control which events appear in their personal feed.List the user's current opt-ins
{ "optIns": [{ "notificationType": "campaign.unhealthy", "channel": "in_app" }, ...] }.Customer-level email opt-ins (admin)
Admins set the recipient address and which event types should generate email.PUT /notification-email and PUT /notification-email/opt-ins require the caller to
have the ADMIN or SUPER_ADMIN role. Pass notificationEmail: null to clear the
recipient (the platform will then fall back to the customer billing email).Slack configuration (admin)
Slack delivery uses an Incoming Webhook URL. Webhooks are admin-only and stored at the customer level.Email opt-ins and Slack
enabledEventTypes are independent filters. The customer-level email opt-in list (/notification-email/opt-ins) controls which events generate email; the Slack enabledEventTypes list on /slack-configuration is a separate per-channel filter applied to Slack delivery only. To get a Slack alert for a given event type, that type must be present in enabledEventTypes — the email opt-in list has no effect on Slack. Configure both lists independently to route the same event to the channels you want.Create or update the webhook
https://hooks.slack.com/services/. Provide at least one
event type — only events on this list are forwarded to Slack.Send a test message
Reading the in-app feed
| Query param | Type | Notes |
|---|---|---|
brandAgentId | number | Limit to a single brand agent |
campaignId | string | Limit to a single campaign |
creativeId | string | Limit to a single creative |
status | enum | success / error / warning / info |
types | comma list | One or more NotificationEventType values |
unreadOnly | true / false | Hide already-read items |
limit | 1..100 | Default 50 |
offset | int | Pagination cursor |
totalCount, unreadCount, and
hasMore for pagination.
Mark read / acknowledge
A notification has two completion states:- read — surfaced to the user; safe to demote in the UI.
- acknowledged — the user has acted on it (e.g. approved a suggestion). The feed hides acknowledged items by default.
Endpoint reference
| Method | Path | Purpose |
|---|---|---|
GET | /notifications | List in-app notifications (filtered by user opt-ins) |
POST | /notifications/read-all | Mark all visible notifications read |
POST | /notifications/:id/read | Mark one notification read |
POST | /notifications/:id/acknowledge | Mark one notification acknowledged |
GET | /notification-preferences | List the calling user’s in-app opt-ins |
PUT | /notification-preferences | Replace the user’s in-app opt-ins |
GET | /notification-email | Read the customer’s email recipient |
PUT | /notification-email | Set the email recipient (admin) |
GET | /notification-email/opt-ins | List customer-level email/Slack opt-ins |
PUT | /notification-email/opt-ins | Replace customer-level opt-ins (admin) |
GET | /slack-configuration | Read Slack webhook config (admin, URL masked) |
PUT | /slack-configuration | Create or update Slack webhook (admin) |
POST | /slack-configuration/test | Send a test message to the webhook (admin) |
DELETE | /slack-configuration | Remove Slack webhook (admin) |
All endpoints validate the standard buyer auth context (
customerId, userId,
userRole). Admin-only endpoints reject non-admin callers with ACCESS_DENIED.