MethodPathSummaryAuth
GET/v1/admin/notifications/channelsRead global notification channel settingsSession
PUT/v1/admin/notifications/channelsUpdate global notification channel settingsSession
GET/v1/admin/notifications/deliveriesList redacted notification delivery settlementsSession
GET/v1/admin/notifications/deliveries/{outbox_id}/attemptsList redacted attempts for one notification deliverySession
GET/v1/admin/notifications/delivery-historyList redacted immutable notification delivery factsSession
GET/v1/admin/notifications/messagesList the compatibility message projectionSession
GET/v1/admin/notifications/policyRead notification delivery window and event policiesSession
PUT/v1/admin/notifications/policyUpdate notification delivery window and event policiesSession
GET/v1/admin/notifications/templatesList immutable notification template versionsSession
PUT/v1/admin/notifications/templates/{template_id}/versions/{version}/{channel}Create an immutable notification template versionSession

Contract file:api/control-notifications.openapi.yaml api/control-notification-delivery-history.openapi.yaml

Operation details

GET /v1/admin/notifications/channels

Read global notification channel settings

operationId
getNotificationChannels
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.read

Responses

getNotificationChannels Responses
StatusDescription
200Current global channel switches and capability facts.

Fields:sms_enabled: boolean email_enabled: boolean sms_supported: boolean email_supported: boolean revision: integer(int64) changed: boolean

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

PUT /v1/admin/notifications/channels

Update global notification channel settings

operationId
updateNotificationChannels
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.manage

Parameters

updateNotificationChannels Parameters
NameInTypeRequiredDescription
If-MatchheaderstringYes—
X-Request-IDheaderstringNoCorrelation identifier and retry key for this write. Reusing the same value for the same authenticated actor and operation requires the exact original path, revision, and body; an exact retry replays the original response, while changed semantics return 409.

Request body

application/json · Required:Yes

updateNotificationChannels Request body
NameTypeRequiredDescription
sms_enabledbooleanYesEnables the configured SMS provider for this channel or subscription.
email_enabledbooleanYes—

Responses

updateNotificationChannels Responses
StatusDescription
200Current global channel switches and capability facts.

Fields:sms_enabled: boolean email_enabled: boolean sms_supported: boolean email_supported: boolean revision: integer(int64) changed: boolean

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
409Stable error envelope. Clients map code through locale resources and do not render message directly.
415Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/notifications/deliveries

List redacted notification delivery settlements

operationId
listNotificationDeliveries
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.read

Description (from the contract)

Lists durable delivery state without recipient contacts, subject, body, deduplication keys, lease tokens, provider response bodies, or credentials. The cursor is stable for the selected filters.

Parameters

listNotificationDeliveries Parameters
NameInTypeRequiredDescription
scope_idquerystring(uuid)No—
channelquerystring: email / smsNo—
statequerystring: pending / dispatching / retry_wait / accepted / unknown / delivered / permanent_failed / exhausted / cancelledNo—
limitqueryintegerNo—
cursorquerystring(uuid)No—

Responses

listNotificationDeliveries Responses
StatusDescription
200Redacted delivery settlement page.

Fields:items: array<DeliveryLog> next_cursor?: string(uuid)

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/notifications/deliveries/{outbox_id}/attempts

List redacted attempts for one notification delivery

operationId
listNotificationDeliveryAttempts
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.read

Parameters

listNotificationDeliveryAttempts Parameters
NameInTypeRequiredDescription
outbox_idpathstring(uuid)Yes—

Responses

listNotificationDeliveryAttempts Responses
StatusDescription
200Redacted delivery attempt facts for one outbox item.

Fields:outbox_id: string(uuid) items: array<DeliveryAttempt>

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
404Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/notifications/delivery-history

List redacted immutable notification delivery facts

operationId
listNotificationDeliveryHistory
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:system_configuration.read platform.admin

Description (from the contract)

Platform administrators with system_configuration.read or platform.admin may query all scopes or one exact scope. Session, membership and current permissions are revalidated before query validation and lookup. One row identifies one immutable outbox sequence, including anonymous recipients and replay generations. Filters combine with AND. Without from/to the complete history is queried. Each optional bound is inclusive; when both are supplied, to must be greater than from and the window at most 31 days. The current request uses one consistent database view for cursor validation, total_count and rows. Pages are ordered by observed_at, outbox_id and sequence descending. Cursors identify persisted facts and are validated against the current filters; they do not promise a snapshot across requests. Delivery history never includes message titles, bodies, full recipient contacts, provider response bodies, deduplication keys, lease tokens or credentials. New transport calls record only a masked recipient address and provider_call_started_at. A row sees only an observation in the same attempt through its own sequence; dispatch_started never reads a future settlement observation. Historical rows without observations remain null and are never backfilled from current user contacts. Message content retains its separate administrator message-query contract.

Parameters

listNotificationDeliveryHistory Parameters
NameInTypeRequiredDescription
scope_idquerystring(uuid)NoOptional exact scope; omitted means all scopes for an authorized platform administrator.
channelquerystring: email / smsNo—
statequerystring: pending / dispatching / retry_wait / accepted / unknown / delivered / permanent_failed / exhausted / cancelledNo—
resultquerystring: success / failureNosuccess means only delivered; failure means retry_wait, permanent_failed or exhausted. accepted, unknown, lease_unknown and cancelled are neither success nor failure. When state is also supplied, both filters must match; a contradiction returns an empty page.
event_typequerystringNoExact persisted notification event type, not a legacy UI alias.
user_idquerystringNoCanonical lowercase nonzero UUID or positive decimal display ID, at most signed int64 maximum; filters recipients, not actors.
message_idquerystring(uuid)NoExact immutable notification_events.id, shared by original and replay outboxes.
fromquerystring(date-time)NoInclusive observed_at lower bound, RFC3339 with optional fractional seconds.
toquerystring(date-time)NoInclusive observed_at upper bound, RFC3339 with optional fractional seconds.
limitqueryintegerNo—
cursorquerystringNoReturned outbox UUID and positive int32 fact sequence; must identify a fact satisfying the current filters.

Responses

listNotificationDeliveryHistory Responses
StatusDescription
200A consistent current-request page and filtered total, with no cross-request snapshot guarantee.

Fields:schema: string items: array<DeliveryHistoryFact> total_count: integer(int64) next_cursor?: string

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/notifications/messages

List the compatibility message projection

operationId
listNotificationMessages
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.read

Description (from the contract)

Event-centric administrator view of member notification facts. Fields that are not backed by durable facts are returned as null. Site and package use the subject recorded when the event was raised; older package-monitor rows fall back to the monitor transition's exact subscription. Events raised without a site subject never match a site filter, and ownership is never inferred from current bindings. Titles, channel bodies and email_state/sms_state come from original generation-1 outbox facts (null = that channel was not generated); delivery replay does not duplicate message rows.

Parameters

listNotificationMessages Parameters
NameInTypeRequiredDescription
scope_idquerystring(uuid)No—
typequerystringNo—
user_idquerystring(uuid)No—
package_idquerystringNoExact user subscription ID from a monitor transition; product IDs do not match. Unknown IDs return an empty page.
site_idquerystringNoSite recorded when the event was raised (notification_events.subject_site_id); events without a site subject never match.
userquerystringNoRecipient user by exact display ID or case-insensitive substring of username / display name (current values).
packagequerystringNoUser subscription by exact display ID or case-insensitive substring of the package name; events whose subscription no longer exists never match.
sitequerystringNoEvent-time site by exact display ID or case-insensitive substring of its current domain; events whose site no longer exists never match.
limitqueryintegerNo—
cursorquerystring(uuid)No—

Responses

listNotificationMessages Responses
StatusDescription
200Versioned, event-centric compatibility projection of member notification facts.

Fields:schema: string items: array<Message> next_cursor?: string(uuid) total: integer

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/notifications/policy

Read notification delivery window and event policies

operationId
getNotificationDeliveryPolicy
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.read

Responses

getNotificationDeliveryPolicy Responses
StatusDescription
200Versioned global delivery window and per-event execution policy. System-required identity messages bypass these timing and subscription controls.

Fields:window_mode: string: all_day / custom window_start: string window_end: string timezone: string events: array<DeliveryPolicyEvent> schema: string revision: integer(int64) changed: boolean

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

PUT /v1/admin/notifications/policy

Update notification delivery window and event policies

operationId
updateNotificationDeliveryPolicy
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.manage

Parameters

updateNotificationDeliveryPolicy Parameters
NameInTypeRequiredDescription
If-MatchheaderstringYes—
X-Request-IDheaderstringNoCorrelation identifier and retry key for this write. Reusing the same value for the same authenticated actor and operation requires the exact original path, revision, and body; an exact retry replays the original response, while changed semantics return 409.

Request body

application/json · Required:Yes

updateNotificationDeliveryPolicy Request body
NameTypeRequiredDescription
window_modestring: all_day / customYes—
window_startstringYes—
window_endstringYes—
timezonestringYes—
eventsarray<DeliveryPolicyEvent>Yes—

Responses

updateNotificationDeliveryPolicy Responses
StatusDescription
200Versioned global delivery window and per-event execution policy. System-required identity messages bypass these timing and subscription controls.

Fields:window_mode: string: all_day / custom window_start: string window_end: string timezone: string events: array<DeliveryPolicyEvent> schema: string revision: integer(int64) changed: boolean

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
409Stable error envelope. Clients map code through locale resources and do not render message directly.
415Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/notifications/templates

List immutable notification template versions

operationId
listNotificationTemplates
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.read

Responses

listNotificationTemplates Responses
StatusDescription
200Immutable notification template versions.

Fields:items: array<Template>

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

PUT /v1/admin/notifications/templates/{template_id}/versions/{version}/{channel}

Create an immutable notification template version

operationId
putNotificationTemplateVersion
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

All of:system_configuration.manage

Parameters

putNotificationTemplateVersion Parameters
NameInTypeRequiredDescription
template_idpathstringYes—
versionpathinteger(int64)Yes—
channelpathstring: email / smsYes—
X-Request-IDheaderstringNoCorrelation identifier and retry key for this write. Reusing the same value for the same authenticated actor and operation requires the exact original path, revision, and body; an exact retry replays the original response, while changed semantics return 409.

Request body

application/json · Required:Yes

putNotificationTemplateVersion Request body
NameTypeRequiredDescription
subjectstringYesRequired and non-empty for email; must be empty for SMS. Maximum source size is 2048 UTF-8 bytes.
bodystringYesMaximum source size is 131072 UTF-8 bytes for email and 8192 UTF-8 bytes for SMS.
variablesarray<string>Yes—

Responses

putNotificationTemplateVersion Responses
StatusDescription
200Created template version or an identical natural replay.

Fields:template_id: string version: integer(int64) channel: string: email / sms subject: string body: string variables: array<string> created_at: string(date-time) changed: boolean

400Stable error envelope. Clients map code through locale resources and do not render message directly.
401Stable error envelope. Clients map code through locale resources and do not render message directly.
403Stable error envelope. Clients map code through locale resources and do not render message directly.
405Stable error envelope. Clients map code through locale resources and do not render message directly.
409Stable error envelope. Clients map code through locale resources and do not render message directly.
415Stable error envelope. Clients map code through locale resources and do not render message directly.
500Stable error envelope. Clients map code through locale resources and do not render message directly.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list