Operation details
GET /v1/admin/announcements
List tenant announcements
- operationId
listAnnouncements- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
listAnnouncements Parameters| Name | In | Type | Required | Description |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | — |
|---|
status | query | string: draft / scheduled / published / withdrawn / archived | No | — |
|---|
Responses
listAnnouncements Responses| Status | Description |
|---|
200 | Announcement page Fields:items: array<Announcement> next_cursor?: string |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
500 | Stable API error |
|---|
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
POST /v1/admin/announcements
Create an announcement draft
- operationId
createAnnouncementDraft- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
createAnnouncementDraft Parameters| Name | In | Type | Required | Description |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
createAnnouncementDraft Request body| Name | Type | Required | Description |
|---|
title | string | Yes | — |
|---|
body | string | Yes | Required for format=content; empty for format=link. UTF-8 encoded body must not exceed 65536 bytes; only the documented safe Markdown subset is accepted. |
|---|
format | string: content / link | No | — |
|---|
link_url | string(uri) | No | Required for format=link and limited to http(s). |
|---|
sort_order | integer | No | — |
|---|
visible | boolean | No | — |
|---|
popup | boolean | No | — |
|---|
red | boolean | No | — |
|---|
bold | boolean | No | — |
|---|
all | boolean | Yes | — |
|---|
user_ids | array<string(uuid)> | Yes | — |
|---|
group_ids | array<string(uuid)> | Yes | — |
|---|
withdrawal_visibility | string: retain / hide | Yes | — |
|---|
Responses
createAnnouncementDraft Responses| Status | Description |
|---|
201 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
422 | Stable API error |
|---|
500 | Stable API error |
|---|
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/announcements/audience-directory
Search the current tenant's users or roles by name for an announcement audience
- operationId
searchAnnouncementAudience- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Read-only; authorized by announcements.manage in the current tenant. ids resolves stored targets back to names and returns only those that still exist.
Parameters
searchAnnouncementAudience Parameters| Name | In | Type | Required | Description |
|---|
kind | query | string: user / role | Yes | — |
|---|
search | query | string | No | Case-insensitive name substring; mutually exclusive with ids. |
|---|
ids | query | string | No | Comma-separated IDs to resolve to names (at most 100). |
|---|
limit | query | integer | No | — |
|---|
Responses
searchAnnouncementAudience Responses| Status | Description |
|---|
200 | Audience directory entries Fields:items: array<AudienceDirectoryEntry> |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
500 | Stable API error |
|---|
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/announcements/global
List platform global announcements
- operationId
listGlobalAnnouncements- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
listGlobalAnnouncements Parameters| Name | In | Type | Required | Description |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | — |
|---|
status | query | string: draft / published / withdrawn / archived | No | — |
|---|
Responses
listGlobalAnnouncements Responses| Status | Description |
|---|
200 | Platform global announcement page Fields:items: array<GlobalAnnouncement> next_cursor?: string |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
500 | Stable API error |
|---|
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
POST /v1/admin/announcements/global
Create a platform global announcement draft
- operationId
createGlobalAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
createGlobalAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
createGlobalAnnouncement Request body| Name | Type | Required | Description |
|---|
all_tenants | boolean | Yes | — |
|---|
tenant_scope_ids | array<string(uuid)> | Yes | — |
|---|
role_targets | array<GlobalRoleTarget> | Yes | — |
|---|
user_targets | array<GlobalUserTarget> | Yes | — |
|---|
title | string | Yes | — |
|---|
body | string | Yes | Required for format=content; empty for format=link. HTML content is rendered in a script-disabled sandbox with remote resource loading blocked. |
|---|
format | string: content / link | No | — |
|---|
link_url | string(uri) | No | Required for format=link and limited to http(s). |
|---|
sort_order | integer | No | — |
|---|
visible | boolean | No | — |
|---|
popup | boolean | No | — |
|---|
red | boolean | No | — |
|---|
bold | boolean | No | — |
|---|
withdrawal_visibility | string: retain / hide | Yes | — |
|---|
Responses
createGlobalAnnouncement Responses| Status | Description |
|---|
201 | Platform global announcement Fields:id: string(uuid) platform_scope_id: string(uuid) version: integer revision: integer status: string: draft / published / withdrawn title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: GlobalAudience withdrawal_visibility: string: retain / hide recipient_count: integer published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
422 | Stable API error |
|---|
500 | Stable API error |
|---|
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/announcements/global/audience-directory
Search tenants, or one tenant's roles and users, by name for a platform global announcement audience
- operationId
searchGlobalAnnouncementAudience- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Read-only; authorized by announcements.manage (or platform.admin) in the platform scope. Role and user searches require scope_id. ids resolves stored targets back to names and returns only those that still exist.
Parameters
searchGlobalAnnouncementAudience Parameters| Name | In | Type | Required | Description |
|---|
kind | query | string: tenant / role / user | Yes | — |
|---|
search | query | string | No | Case-insensitive name substring; mutually exclusive with ids. |
|---|
ids | query | string | No | Comma-separated IDs to resolve to names (at most 100). |
|---|
limit | query | integer | No | — |
|---|
scope_id | query | string(uuid) | No | Tenant scope for role and user searches. |
|---|
Responses
searchGlobalAnnouncementAudience Responses| Status | Description |
|---|
200 | Audience directory entries Fields:items: array<AudienceDirectoryEntry> |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
500 | Stable API error |
|---|
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/announcements/global/{id}
Get a platform global announcement
- operationId
getGlobalAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
getGlobalAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Responses
getGlobalAnnouncement Responses| Status | Description |
|---|
200 | Platform global announcement Fields:id: string(uuid) platform_scope_id: string(uuid) version: integer revision: integer status: string: draft / published / withdrawn title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: GlobalAudience withdrawal_visibility: string: retain / hide recipient_count: integer published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
500 | Stable API error |
|---|
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
PATCH /v1/admin/announcements/global/{id}
Update a platform global announcement draft
- operationId
updateGlobalAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
updateGlobalAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
updateGlobalAnnouncement Request body| Name | Type | Required | Description |
|---|
all_tenants | boolean | Yes | — |
|---|
tenant_scope_ids | array<string(uuid)> | Yes | — |
|---|
role_targets | array<GlobalRoleTarget> | Yes | — |
|---|
user_targets | array<GlobalUserTarget> | Yes | — |
|---|
title | string | Yes | — |
|---|
body | string | Yes | Required for format=content; empty for format=link. HTML content is rendered in a script-disabled sandbox with remote resource loading blocked. |
|---|
format | string: content / link | No | — |
|---|
link_url | string(uri) | No | Required for format=link and limited to http(s). |
|---|
sort_order | integer | No | — |
|---|
visible | boolean | No | — |
|---|
popup | boolean | No | — |
|---|
red | boolean | No | — |
|---|
bold | boolean | No | — |
|---|
withdrawal_visibility | string: retain / hide | Yes | — |
|---|
expected_revision | integer | Yes | — |
|---|
Responses
updateGlobalAnnouncement Responses| Status | Description |
|---|
200 | Platform global announcement Fields:id: string(uuid) platform_scope_id: string(uuid) version: integer revision: integer status: string: draft / published / withdrawn title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: GlobalAudience withdrawal_visibility: string: retain / hide recipient_count: integer published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
422 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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
POST /v1/admin/announcements/global/{id}/archive
Archive a global announcement in management; published messages remain available
- operationId
archiveGlobalAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
archiveGlobalAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
archiveGlobalAnnouncement Request body| Name | Type | Required | Description |
|---|
expected_lifecycle_revision | integer | Yes | — |
|---|
Responses
archiveGlobalAnnouncement Responses| Status | Description |
|---|
200 | Platform global announcement Fields:id: string(uuid) platform_scope_id: string(uuid) version: integer revision: integer status: string: draft / published / withdrawn title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: GlobalAudience withdrawal_visibility: string: retain / hide recipient_count: integer published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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/announcements/global/{id}/audience/count
Count the recipients a platform global announcement would be delivered to now
- operationId
countGlobalAnnouncementAudience- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Read-only; resolves recipients with the same query publication uses and writes nothing.
Parameters
countGlobalAnnouncementAudience Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Responses
countGlobalAnnouncementAudience Responses| Status | Description |
|---|
200 | Audience recipient count Fields:announcement_id: string(uuid) version?: integer recipient_count: integer |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
500 | Stable API error |
|---|
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
POST /v1/admin/announcements/global/{id}/publish
Publish a platform global announcement and freeze recipients
- operationId
publishGlobalAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
publishGlobalAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
publishGlobalAnnouncement Request body| Name | Type | Required | Description |
|---|
expected_revision | integer | Yes | — |
|---|
Responses
publishGlobalAnnouncement Responses| Status | Description |
|---|
200 | Platform global announcement Fields:id: string(uuid) platform_scope_id: string(uuid) version: integer revision: integer status: string: draft / published / withdrawn title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: GlobalAudience withdrawal_visibility: string: retain / hide recipient_count: integer published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
422 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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
POST /v1/admin/announcements/global/{id}/restore
Restore a global announcement to management
- operationId
restoreGlobalAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
restoreGlobalAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
restoreGlobalAnnouncement Request body| Name | Type | Required | Description |
|---|
expected_lifecycle_revision | integer | Yes | — |
|---|
Responses
restoreGlobalAnnouncement Responses| Status | Description |
|---|
200 | Platform global announcement Fields:id: string(uuid) platform_scope_id: string(uuid) version: integer revision: integer status: string: draft / published / withdrawn title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: GlobalAudience withdrawal_visibility: string: retain / hide recipient_count: integer published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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
POST /v1/admin/announcements/global/{id}/withdraw
Withdraw a platform global announcement
- operationId
withdrawGlobalAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
withdrawGlobalAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
withdrawGlobalAnnouncement Request body| Name | Type | Required | Description |
|---|
expected_revision | integer | Yes | — |
|---|
Responses
withdrawGlobalAnnouncement Responses| Status | Description |
|---|
200 | Platform global announcement Fields:id: string(uuid) platform_scope_id: string(uuid) version: integer revision: integer status: string: draft / published / withdrawn title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: GlobalAudience withdrawal_visibility: string: retain / hide recipient_count: integer published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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/announcements/{id}
Get the current announcement version
- operationId
getAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
getAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Responses
getAnnouncement Responses| Status | Description |
|---|
200 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
500 | Stable API error |
|---|
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
PATCH /v1/admin/announcements/{id}
Update an announcement draft
- operationId
updateAnnouncementDraft- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
updateAnnouncementDraft Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
updateAnnouncementDraft Request body| Name | Type | Required | Description |
|---|
title | string | Yes | — |
|---|
body | string | Yes | Required for format=content; empty for format=link. UTF-8 encoded body must not exceed 65536 bytes; only the documented safe Markdown subset is accepted. |
|---|
format | string: content / link | No | — |
|---|
link_url | string(uri) | No | Required for format=link and limited to http(s). |
|---|
sort_order | integer | No | — |
|---|
visible | boolean | No | — |
|---|
popup | boolean | No | — |
|---|
red | boolean | No | — |
|---|
bold | boolean | No | — |
|---|
all | boolean | Yes | — |
|---|
user_ids | array<string(uuid)> | Yes | — |
|---|
group_ids | array<string(uuid)> | Yes | — |
|---|
withdrawal_visibility | string: retain / hide | Yes | — |
|---|
version | integer | Yes | — |
|---|
expected_revision | integer | Yes | — |
|---|
Responses
updateAnnouncementDraft Responses| Status | Description |
|---|
200 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
422 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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
POST /v1/admin/announcements/{id}/archive
Archive a tenant announcement for reversible deletion
- operationId
archiveAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
archiveAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
archiveAnnouncement Request body| Name | Type | Required | Description |
|---|
expected_lifecycle_revision | integer | Yes | — |
|---|
Responses
archiveAnnouncement Responses| Status | Description |
|---|
200 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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/announcements/{id}/audience/count
Count the recipients the head version of an announcement would be delivered to now
- operationId
countAnnouncementAudience- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Read-only; resolves recipients with the same query publication uses and writes nothing.
Parameters
countAnnouncementAudience Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Responses
countAnnouncementAudience Responses| Status | Description |
|---|
200 | Audience recipient count Fields:announcement_id: string(uuid) version?: integer recipient_count: integer |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
500 | Stable API error |
|---|
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
POST /v1/admin/announcements/{id}/publish
Publish an announcement
- operationId
publishAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
publishAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
publishAnnouncement Request body| Name | Type | Required | Description |
|---|
version | integer | Yes | — |
|---|
expected_revision | integer | Yes | — |
|---|
Responses
publishAnnouncement Responses| Status | Description |
|---|
200 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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
POST /v1/admin/announcements/{id}/restore
Restore an archived tenant announcement
- operationId
restoreAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
restoreAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
restoreAnnouncement Request body| Name | Type | Required | Description |
|---|
expected_lifecycle_revision | integer | Yes | — |
|---|
Responses
restoreAnnouncement Responses| Status | Description |
|---|
200 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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
POST /v1/admin/announcements/{id}/revise
Create a revised announcement draft
- operationId
reviseAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
reviseAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
reviseAnnouncement Request body| Name | Type | Required | Description |
|---|
title | string | Yes | — |
|---|
body | string | Yes | Required for format=content; empty for format=link. UTF-8 encoded body must not exceed 65536 bytes; only the documented safe Markdown subset is accepted. |
|---|
format | string: content / link | No | — |
|---|
link_url | string(uri) | No | Required for format=link and limited to http(s). |
|---|
sort_order | integer | No | — |
|---|
visible | boolean | No | — |
|---|
popup | boolean | No | — |
|---|
red | boolean | No | — |
|---|
bold | boolean | No | — |
|---|
all | boolean | Yes | — |
|---|
user_ids | array<string(uuid)> | Yes | — |
|---|
group_ids | array<string(uuid)> | Yes | — |
|---|
withdrawal_visibility | string: retain / hide | Yes | — |
|---|
expected_head_version | integer | Yes | — |
|---|
Responses
reviseAnnouncement Responses| Status | Description |
|---|
201 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
422 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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
POST /v1/admin/announcements/{id}/schedule
Schedule an announcement
- operationId
scheduleAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
scheduleAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
scheduleAnnouncement Request body| Name | Type | Required | Description |
|---|
version | integer | Yes | — |
|---|
expected_revision | integer | Yes | — |
|---|
publish_at | string(date-time) | Yes | — |
|---|
Responses
scheduleAnnouncement Responses| Status | Description |
|---|
200 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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
POST /v1/admin/announcements/{id}/withdraw
Withdraw an announcement
- operationId
withdrawAnnouncement- 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
The contract has no separate permission annotation; see the description below and the 403 response.
Parameters
withdrawAnnouncement Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Idempotency-Key | header | string | Yes | — |
|---|
If-Match | header | string | Yes | — |
|---|
Request body
application/json · Required:Yes
withdrawAnnouncement Request body| Name | Type | Required | Description |
|---|
version | integer | Yes | — |
|---|
expected_revision | integer | Yes | — |
|---|
Responses
withdrawAnnouncement Responses| Status | Description |
|---|
200 | Announcement Fields:id: string(uuid) scope_id: string(uuid) version: integer head_version: integer revision: integer status: string: draft / scheduled / published / withdrawn / archived title: string body: string format: string: content / link link_url?: string(uri) sort_order: integer visible: boolean popup: boolean red: boolean bold: boolean audience: Audience withdrawal_visibility: string: retain / hide scheduled_at?: string(date-time) published_at?: string(date-time) withdrawn_at?: string(date-time) created_at: string(date-time) state_changed_at: string(date-time) archived: boolean lifecycle_revision: integer archived_at?: string(date-time) replayed?: boolean |
|---|
400 | Stable API error |
|---|
401 | Stable API error |
|---|
403 | Stable API error |
|---|
404 | Stable API error |
|---|
409 | Stable API error |
|---|
415 | Stable API error |
|---|
500 | Stable API error |
|---|
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.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