MethodPathSummaryAuth
GET/v1/admin/announcementsList tenant announcementsSession
POST/v1/admin/announcementsCreate an announcement draftSession
GET/v1/admin/announcements/audience-directorySearch the current tenant's users or roles by name for an announcement audienceSession
GET/v1/admin/announcements/globalList platform global announcementsSession
POST/v1/admin/announcements/globalCreate a platform global announcement draftSession
GET/v1/admin/announcements/global/audience-directorySearch tenants, or one tenant's roles and users, by name for a platform global announcement audienceSession
GET/v1/admin/announcements/global/{id}Get a platform global announcementSession
PATCH/v1/admin/announcements/global/{id}Update a platform global announcement draftSession
POST/v1/admin/announcements/global/{id}/archiveArchive a global announcement in management; published messages remain availableSession
GET/v1/admin/announcements/global/{id}/audience/countCount the recipients a platform global announcement would be delivered to nowSession
POST/v1/admin/announcements/global/{id}/publishPublish a platform global announcement and freeze recipientsSession
POST/v1/admin/announcements/global/{id}/restoreRestore a global announcement to managementSession
POST/v1/admin/announcements/global/{id}/withdrawWithdraw a platform global announcementSession
GET/v1/admin/announcements/{id}Get the current announcement versionSession
PATCH/v1/admin/announcements/{id}Update an announcement draftSession
POST/v1/admin/announcements/{id}/archiveArchive a tenant announcement for reversible deletionSession
GET/v1/admin/announcements/{id}/audience/countCount the recipients the head version of an announcement would be delivered to nowSession
POST/v1/admin/announcements/{id}/publishPublish an announcementSession
POST/v1/admin/announcements/{id}/restoreRestore an archived tenant announcementSession
POST/v1/admin/announcements/{id}/reviseCreate a revised announcement draftSession
POST/v1/admin/announcements/{id}/scheduleSchedule an announcementSession
POST/v1/admin/announcements/{id}/withdrawWithdraw an announcementSession

Contract file:api/control-announcements.openapi.yaml

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
NameInTypeRequiredDescription
limitqueryintegerNo—
cursorquerystringNo—
statusquerystring: draft / scheduled / published / withdrawn / archivedNo—

Responses

listAnnouncements Responses
StatusDescription
200Announcement page

Fields:items: array<Announcement> next_cursor?: string

400Stable API error
401Stable API error
403Stable API error
500Stable 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
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

createAnnouncementDraft Request body
NameTypeRequiredDescription
titlestringYes—
bodystringYesRequired for format=content; empty for format=link. UTF-8 encoded body must not exceed 65536 bytes; only the documented safe Markdown subset is accepted.
formatstring: content / linkNo—
link_urlstring(uri)NoRequired for format=link and limited to http(s).
sort_orderintegerNo—
visiblebooleanNo—
popupbooleanNo—
redbooleanNo—
boldbooleanNo—
allbooleanYes—
user_idsarray<string(uuid)>Yes—
group_idsarray<string(uuid)>Yes—
withdrawal_visibilitystring: retain / hideYes—

Responses

createAnnouncementDraft Responses
StatusDescription
201Announcement

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

400Stable API error
401Stable API error
403Stable API error
409Stable API error
415Stable API error
422Stable API error
500Stable 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
NameInTypeRequiredDescription
kindquerystring: user / roleYes—
searchquerystringNoCase-insensitive name substring; mutually exclusive with ids.
idsquerystringNoComma-separated IDs to resolve to names (at most 100).
limitqueryintegerNo—

Responses

searchAnnouncementAudience Responses
StatusDescription
200Audience directory entries

Fields:items: array<AudienceDirectoryEntry>

400Stable API error
401Stable API error
403Stable API error
500Stable 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
NameInTypeRequiredDescription
limitqueryintegerNo—
cursorquerystringNo—
statusquerystring: draft / published / withdrawn / archivedNo—

Responses

listGlobalAnnouncements Responses
StatusDescription
200Platform global announcement page

Fields:items: array<GlobalAnnouncement> next_cursor?: string

400Stable API error
401Stable API error
403Stable API error
500Stable 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
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

createGlobalAnnouncement Request body
NameTypeRequiredDescription
all_tenantsbooleanYes—
tenant_scope_idsarray<string(uuid)>Yes—
role_targetsarray<GlobalRoleTarget>Yes—
user_targetsarray<GlobalUserTarget>Yes—
titlestringYes—
bodystringYesRequired for format=content; empty for format=link. HTML content is rendered in a script-disabled sandbox with remote resource loading blocked.
formatstring: content / linkNo—
link_urlstring(uri)NoRequired for format=link and limited to http(s).
sort_orderintegerNo—
visiblebooleanNo—
popupbooleanNo—
redbooleanNo—
boldbooleanNo—
withdrawal_visibilitystring: retain / hideYes—

Responses

createGlobalAnnouncement Responses
StatusDescription
201Platform 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

400Stable API error
401Stable API error
403Stable API error
409Stable API error
415Stable API error
422Stable API error
500Stable 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
NameInTypeRequiredDescription
kindquerystring: tenant / role / userYes—
searchquerystringNoCase-insensitive name substring; mutually exclusive with ids.
idsquerystringNoComma-separated IDs to resolve to names (at most 100).
limitqueryintegerNo—
scope_idquerystring(uuid)NoTenant scope for role and user searches.

Responses

searchGlobalAnnouncementAudience Responses
StatusDescription
200Audience directory entries

Fields:items: array<AudienceDirectoryEntry>

400Stable API error
401Stable API error
403Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—

Responses

getGlobalAnnouncement Responses
StatusDescription
200Platform 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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

updateGlobalAnnouncement Request body
NameTypeRequiredDescription
all_tenantsbooleanYes—
tenant_scope_idsarray<string(uuid)>Yes—
role_targetsarray<GlobalRoleTarget>Yes—
user_targetsarray<GlobalUserTarget>Yes—
titlestringYes—
bodystringYesRequired for format=content; empty for format=link. HTML content is rendered in a script-disabled sandbox with remote resource loading blocked.
formatstring: content / linkNo—
link_urlstring(uri)NoRequired for format=link and limited to http(s).
sort_orderintegerNo—
visiblebooleanNo—
popupbooleanNo—
redbooleanNo—
boldbooleanNo—
withdrawal_visibilitystring: retain / hideYes—
expected_revisionintegerYes—

Responses

updateGlobalAnnouncement Responses
StatusDescription
200Platform 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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
422Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

archiveGlobalAnnouncement Request body
NameTypeRequiredDescription
expected_lifecycle_revisionintegerYes—

Responses

archiveGlobalAnnouncement Responses
StatusDescription
200Platform 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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—

Responses

countGlobalAnnouncementAudience Responses
StatusDescription
200Audience recipient count

Fields:announcement_id: string(uuid) version?: integer recipient_count: integer

400Stable API error
401Stable API error
403Stable API error
404Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

publishGlobalAnnouncement Request body
NameTypeRequiredDescription
expected_revisionintegerYes—

Responses

publishGlobalAnnouncement Responses
StatusDescription
200Platform 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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
422Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

restoreGlobalAnnouncement Request body
NameTypeRequiredDescription
expected_lifecycle_revisionintegerYes—

Responses

restoreGlobalAnnouncement Responses
StatusDescription
200Platform 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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

withdrawGlobalAnnouncement Request body
NameTypeRequiredDescription
expected_revisionintegerYes—

Responses

withdrawGlobalAnnouncement Responses
StatusDescription
200Platform 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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—

Responses

getAnnouncement Responses
StatusDescription
200Announcement

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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

updateAnnouncementDraft Request body
NameTypeRequiredDescription
titlestringYes—
bodystringYesRequired for format=content; empty for format=link. UTF-8 encoded body must not exceed 65536 bytes; only the documented safe Markdown subset is accepted.
formatstring: content / linkNo—
link_urlstring(uri)NoRequired for format=link and limited to http(s).
sort_orderintegerNo—
visiblebooleanNo—
popupbooleanNo—
redbooleanNo—
boldbooleanNo—
allbooleanYes—
user_idsarray<string(uuid)>Yes—
group_idsarray<string(uuid)>Yes—
withdrawal_visibilitystring: retain / hideYes—
versionintegerYes—
expected_revisionintegerYes—

Responses

updateAnnouncementDraft Responses
StatusDescription
200Announcement

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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
422Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

archiveAnnouncement Request body
NameTypeRequiredDescription
expected_lifecycle_revisionintegerYes—

Responses

archiveAnnouncement Responses
StatusDescription
200Announcement

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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—

Responses

countAnnouncementAudience Responses
StatusDescription
200Audience recipient count

Fields:announcement_id: string(uuid) version?: integer recipient_count: integer

400Stable API error
401Stable API error
403Stable API error
404Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

publishAnnouncement Request body
NameTypeRequiredDescription
versionintegerYes—
expected_revisionintegerYes—

Responses

publishAnnouncement Responses
StatusDescription
200Announcement

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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

restoreAnnouncement Request body
NameTypeRequiredDescription
expected_lifecycle_revisionintegerYes—

Responses

restoreAnnouncement Responses
StatusDescription
200Announcement

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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

reviseAnnouncement Request body
NameTypeRequiredDescription
titlestringYes—
bodystringYesRequired for format=content; empty for format=link. UTF-8 encoded body must not exceed 65536 bytes; only the documented safe Markdown subset is accepted.
formatstring: content / linkNo—
link_urlstring(uri)NoRequired for format=link and limited to http(s).
sort_orderintegerNo—
visiblebooleanNo—
popupbooleanNo—
redbooleanNo—
boldbooleanNo—
allbooleanYes—
user_idsarray<string(uuid)>Yes—
group_idsarray<string(uuid)>Yes—
withdrawal_visibilitystring: retain / hideYes—
expected_head_versionintegerYes—

Responses

reviseAnnouncement Responses
StatusDescription
201Announcement

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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
422Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

scheduleAnnouncement Request body
NameTypeRequiredDescription
versionintegerYes—
expected_revisionintegerYes—
publish_atstring(date-time)Yes—

Responses

scheduleAnnouncement Responses
StatusDescription
200Announcement

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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
500Stable 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
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYes—

Request body

application/json · Required:Yes

withdrawAnnouncement Request body
NameTypeRequiredDescription
versionintegerYes—
expected_revisionintegerYes—

Responses

withdrawAnnouncement Responses
StatusDescription
200Announcement

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

400Stable API error
401Stable API error
403Stable API error
404Stable API error
409Stable API error
415Stable API error
500Stable 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