API reference
Plugin Notices API
Independent notice capabilities, campaign authoring, resources and delivery reporting.
A message cannot unlock or install a product
Notice tokens are independent, short-lived capabilities. A notice response does not activate a device, refresh offline grace, authorize audio or create a paid entitlement. Licensing controls, serial fields, passwords and payment controls cannot be registered as notice triggers.
Content downloads use current ownership checks and private expiring links. The maintained companion saves the selected file and checks its available size/checksum; it never automatically installs, extracts, imports or executes it. Import remains a deliberate customer action. A selected Windows or macOS instruction set is shown, otherwise General; the sets are not concatenated.
SoundSync
Client delivery and developer authoring
/api/notices/sessions
Create or renew an explicitly public notice session
- Auth
- Public request; operation-specific verification still applies
- Scope
- Product notice channel and public audience must both be enabled.
- Request fields
- productId: integer (required)
- existingToken: string
- Returns
- HTTP 200: token, expiresAt, private, productId, recipientKey.
- Notes
- This is anonymous notice identity, never a license or customer session. Reuse a valid existingToken to preserve the anonymous recipient. Missing/expired local state can reset anonymous frequency history. Keep tokens private and out of URLs.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"productId": {
"type": "integer",
"minimum": 1
},
"existingToken": {
"type": "string"
}
},
"additionalProperties": true,
"required": [
"productId"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"private": {
"type": "boolean"
},
"productId": {
"type": "integer",
"minimum": 1
},
"recipientKey": {
"type": "string"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/notices/native-sessions
Exchange current native proof for an independent notice token
- Auth
- Public request; operation-specific verification still applies
- Scope
- Valid existing native credential or signed validation proof bound to this product/device and live activation.
- Request fields
- productId: integer (required)
- instanceId: string (required)
- credential: string
- validationToken: string
- Returns
- HTTP 200: token, expiresAt, private, productId, recipientKey.
- Notes
- Send existing in-memory native proof, not a developer secret. The exchange only reads licensing identity and issues a separate notice token; it does not activate, refresh licensing, write grace timestamps or unlock audio.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"productId": {
"type": "integer",
"minimum": 1
},
"instanceId": {
"type": "string",
"maxLength": 256
},
"credential": {
"type": "string"
},
"validationToken": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"productId",
"instanceId"
],
"anyOf": [
{
"required": [
"credential"
]
},
{
"required": [
"validationToken"
]
}
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"private": {
"type": "boolean"
},
"productId": {
"type": "integer",
"minimum": 1
},
"recipientKey": {
"type": "string"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/notices/authorize
Authorize notices using a verified shared customer account session
- Auth
- Account Bearer JWT
- Scope
- Live shared customer account session and an explicit account-linked product/serial relationship. Store-only credentials are not shared account authority.
- Request fields
- productId: integer (required)
- Returns
- HTTP 200: token, expiresAt, private, productId, recipientKey.
- Notes
- Client customer IDs and email do not establish ownership. The account session and product association are rechecked on private notice requests. This does not create an entitlement.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"productId": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": true,
"required": [
"productId"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"private": {
"type": "boolean"
},
"productId": {
"type": "integer",
"minimum": 1
},
"recipientKey": {
"type": "string"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/notices/events
Record a permitted editor event and evaluate notice eligibility
- Auth
- Notice-only Bearer capability
- Scope
- Notice-only bearer capability, matching product, recipient and editor instance; current campaign eligibility is rechecked.
- Request fields
- id: string (required)
- sessionId: string (required)
- kind: editor_opened | editor_available | control_clicked (required)
- occurredAt: string (required)
- controlId: string
- productId: integer
- Returns
- HTTP 200: eligible, duplicate.
- Notes
- Use a fresh semantic event UUID; retry it with the same ID. Events must be within five minutes of server time. A named control must be registered and cannot be a licensing/password/payment control. Eligibility is not actual display. Limits are 30 events per minute per product/recipient and 120 new sessions per minute per product.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"sessionId": {
"type": "string",
"format": "uuid"
},
"kind": {
"type": "string",
"enum": [
"editor_opened",
"editor_available",
"control_clicked"
]
},
"occurredAt": {
"type": "string",
"format": "date-time"
},
"controlId": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": false,
"required": [
"id",
"sessionId",
"kind",
"occurredAt"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"eligible": {
"type": "integer",
"minimum": 0
},
"duplicate": {
"type": "boolean"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/notices/next
Lease the next eligible notice to this editor instance
- Auth
- Notice-only Bearer capability
- Scope
- Notice-only bearer capability, matching product, recipient and editor instance; current campaign eligibility is rechecked.
- Request fields
- instanceId: string (required)
- resourceKinds: array
- productId: integer
- contentDownloads: boolean
- Returns
- HTTP 200: review the response schema below.
- Notes
- null means no eligible due delivery. Fetching or showing the collapsed badge is not a shown receipt. Revalidate before display/actions and release ownership when destroying the editor. Unsupported download clients receive a public details-page fallback, not a file grant.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"instanceId": {
"type": "string",
"format": "uuid"
},
"resourceKinds": {
"type": "array",
"items": {
"type": "string",
"enum": [
"product",
"release",
"content",
"download"
]
}
},
"productId": {
"type": "integer",
"minimum": 1
},
"contentDownloads": {
"type": "boolean"
}
},
"additionalProperties": true,
"required": [
"instanceId"
]
}
HTTP 200 response (application/json)
{
"anyOf": [
{
"type": "object",
"properties": {
"productId": {
"type": "integer",
"minimum": 1
},
"deliveryId": {
"type": "string",
"format": "uuid"
},
"campaignId": {
"type": "string",
"format": "uuid"
},
"version": {
"type": "integer",
"minimum": 1
},
"validUntil": {
"type": "string",
"format": "date-time"
},
"shown": {
"type": "boolean"
},
"completedActions": {
"type": "array",
"items": {
"type": "string"
}
},
"content": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"brand": {
"type": "string"
},
"color": {
"type": "string"
},
"audience": {
"type": "string",
"enum": [
"public",
"customers"
]
},
"noticeType": {
"type": "string",
"enum": [
"announcement",
"content",
"plugin_update",
"download",
"promotion"
]
},
"trigger": {
"type": "string",
"enum": [
"editor_opened",
"editor_available",
"control_clicked"
]
},
"controlId": {
"type": "string"
},
"timezone": {
"type": "string"
},
"startAt": {
"type": "string",
"format": "date-time"
},
"endAt": {
"type": "string",
"format": "date-time"
},
"delaySeconds": {
"type": "integer",
"minimum": 0,
"maximum": 86400
},
"priority": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"maxDisplays": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cooldownSeconds": {
"type": "integer",
"minimum": 60,
"maximum": 2592000
},
"actions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"maxItems": 4
},
"action": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true,
"description": "Legacy single-action input; prefer actions for new integrations."
},
"resourceId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"const": ""
}
]
},
"linkedProductId": {
"anyOf": [
{
"type": "integer",
"minimum": 1
},
{
"type": "null"
}
]
},
"productUrl": {
"type": "string"
}
},
"additionalProperties": true,
"required": [
"name",
"title",
"body",
"audience",
"trigger",
"timezone",
"startAt",
"endAt",
"delaySeconds",
"priority",
"maxDisplays",
"cooldownSeconds"
],
"anyOf": [
{
"required": [
"actions"
]
},
{
"required": [
"action"
]
}
]
}
},
"additionalProperties": true
},
{
"type": "null"
}
]
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/notices/deliveries/{id}/current
Recheck eligibility and optionally renew this editor lease
- Auth
- Notice-only Bearer capability
- Scope
- Notice-only bearer capability, matching product, recipient and editor instance; current campaign eligibility is rechecked.
- Request fields
- instanceId: string (required)
- keepAlive: boolean
- Returns
- HTTP 200: valid, validUntil.
- Notes
- A valid lease can be renewed with keepAlive:true. This records no display. Remove a revoked/expired notice; an offline partition cannot instantly retract already displayed pixels.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"instanceId": {
"type": "string",
"format": "uuid"
},
"keepAlive": {
"type": "boolean"
}
},
"additionalProperties": true,
"required": [
"instanceId"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"valid": {
"type": "boolean"
},
"validUntil": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/notices/deliveries/{id}/release
Release editor-instance ownership without dismissing a campaign
- Auth
- Notice-only Bearer capability
- Scope
- Notice-only bearer capability, matching product, recipient and editor instance; current campaign eligibility is rechecked.
- Request fields
- instanceId: string (required)
- Returns
- HTTP 200: released.
- Notes
- Best-effort release on editor destruction; another eligible instance can reclaim after release or lease expiry.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"instanceId": {
"type": "string",
"format": "uuid"
}
},
"additionalProperties": true,
"required": [
"instanceId"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"released": {
"type": "boolean"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/notices/deliveries/{id}/receipts
Record actual display, dismissal or action outcome
- Auth
- Notice-only Bearer capability
- Scope
- Notice-only bearer capability, matching product, recipient and editor instance; current campaign eligibility is rechecked.
- Request fields
- instanceId: string (required)
- kind: shown | clicked | dismissed | failed | action_succeeded | action_failed (required)
- actionId: string
- Returns
- HTTP 200: accepted, duplicate, reason.
- Notes
- shown follows actual card paint, not fetch/badge arrival. Click/dismiss requires display; action outcomes require a click. Dismiss suppresses this campaign for the recipient across selected products and later versions. A new campaign is independent. Inspect accepted:false rather than treating HTTP 200 as a recorded receipt.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"instanceId": {
"type": "string",
"format": "uuid"
},
"kind": {
"type": "string",
"enum": [
"shown",
"clicked",
"dismissed",
"failed",
"action_succeeded",
"action_failed"
]
},
"actionId": {
"type": "string"
}
},
"additionalProperties": true,
"required": [
"instanceId",
"kind"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"accepted": {
"type": "boolean"
},
"duplicate": {
"type": "boolean"
},
"reason": {
"type": "string"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/notices/deliveries/{id}/content
Read import instructions or request an authorized content download
- Auth
- Notice-only Bearer capability
- Scope
- Notice-only bearer capability, matching product, recipient and editor instance; current campaign eligibility is rechecked.
- Request fields
- instanceId: string (required)
- actionId: string (required)
- operation: details | download
- Returns
- HTTP 200: resourceId, name, version, filename, sha256, instructions, supportUrl, url, sizeBytes, expiresIn.
- Notes
- Details may omit url/sizeBytes/expiresIn. Download mode needs the download action, actual display, a current lease, managed file and current content ownership. Private signed URLs expire; never publish or retain them as permanent links. A notice does not grant paid content. The native companion saves the file, verifies length/available checksum and shows one platform instruction set. It never installs, extracts, imports or executes it.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"instanceId": {
"type": "string",
"format": "uuid"
},
"actionId": {
"type": "string"
},
"operation": {
"type": "string",
"enum": [
"details",
"download"
]
}
},
"additionalProperties": true,
"required": [
"instanceId",
"actionId"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"filename": {
"type": "string"
},
"sha256": {
"type": "string"
},
"instructions": {
"type": "object",
"properties": {
"common": {
"type": "string"
},
"windows": {
"type": "string"
},
"mac": {
"type": "string"
}
},
"additionalProperties": true
},
"supportUrl": {
"type": "string"
},
"url": {
"type": "string"
},
"sizeBytes": {
"type": "integer",
"minimum": 0
},
"expiresIn": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 429, 500, 503.
Operation errors: notice_auth_required, notice_auth_expired, notice_auth_revoked, notice_product_mismatch, delivery_instance_mismatch, notice_no_longer_available, notices_disabled.
/api/developer/notices/products
List permitted product notice channels
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Returns
- HTTP 200: review the response schema below.
Request, response and error reference
HTTP 200 response (application/json)
{
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"name": {
"type": "string"
},
"enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"public_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"control_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
},
"navigation_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
}
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/products/{id}
Save the independent product channel and registered host controls
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Request fields
- enabled: boolean (required)
- publicEnabled: boolean (required)
- controlIds: array (required)
- navigationIds: array (required)
- Returns
- HTTP 200: product_id, enabled, public_enabled, control_ids, navigation_ids.
- Notes
- Defaults are disabled. The host must register the same permitted IDs. These controls are unrelated to licensing settings or offline grace.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"publicEnabled": {
"type": "boolean"
},
"controlIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 32
},
"navigationIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 32
}
},
"additionalProperties": true,
"required": [
"enabled",
"publicEnabled",
"controlIds",
"navigationIds"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"product_id": {
"type": "integer",
"minimum": 1
},
"enabled": {
"type": "boolean"
},
"public_enabled": {
"type": "boolean"
},
"control_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"navigation_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/schema
Read authoring capabilities, branding and companion version
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Returns
- HTTP 200: types, triggers, canManage, installerIncluded, contentDownloadsIncluded, deliveryEnabled, packageVersion, branding.
Request, response and error reference
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"types": {
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": true
}
},
"triggers": {
"type": "array",
"items": {
"type": "string"
}
},
"canManage": {
"type": "boolean"
},
"installerIncluded": {
"const": false
},
"contentDownloadsIncluded": {
"type": "boolean"
},
"deliveryEnabled": {
"type": "boolean"
},
"packageVersion": {
"type": "string"
},
"branding": {
"type": "object",
"properties": {
"brand": {
"type": "string"
},
"color": {
"type": "string"
}
},
"additionalProperties": true
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/products/{id}/content-files
List managed files eligible for notice content downloads
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Returns
- HTTP 200: review the response schema below.
- Notes
- Private object keys are omitted. Refresh before selecting a file; a content-file hash identifies this exact managed file rather than an arbitrary external URL.
Request, response and error reference
HTTP 200 response (application/json)
{
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"sha256": {
"type": "string"
},
"sizeBytes": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
}
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/companion
Download independent notice-companion source
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Returns
- HTTP 200: application/zip.
- Notes
- Authenticated source ZIP, not a precompiled plugin or installer. The complete JUCE source package already integrates the maintained companion. Regenerate, rebuild and distribute your actual plugin to update existing binaries.
Request, response and error reference
HTTP 200 response (application/zip)
{
"type": "string",
"format": "binary"
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/resources
List immutable release/content/download references
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Request fields
- query resourceId: string
- query offset: integer
- Returns
- HTTP 200: review the response schema below.
- Notes
- Returns at most 200 rows at the requested offset. Team scope covers the resource product and every compatible product.
Request, response and error reference
Query and header parameters
[
{
"name": "resourceId",
"in": "query",
"required": false,
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 0
}
}
]
HTTP 200 response (application/json)
{
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"product_id": {
"type": "integer",
"minimum": 1
},
"kind": {
"type": "string",
"enum": [
"release",
"content",
"download"
]
},
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"description": {
"type": "string"
},
"url": {
"type": "string"
},
"compatible_product_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
}
},
"state": {
"type": "string",
"enum": [
"published",
"archived"
]
},
"download": {
"anyOf": [
{
"type": "object",
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
}
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/resources
Create an immutable approved content or release reference
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Request fields
- productId: integer (required)
- kind: release | content | download (required)
- name: string (required)
- version: string
- description: string
- url: string (required)
- compatibleProductIds: array
- deliveryMode: reference | download
- downloadFileId: string
- instructions: object
- supportUrl: string
- Returns
- HTTP 200: id, product_id, kind, name, version, description, url, compatible_product_ids, state, download.
- Notes
- A release requires version. Content/download can reference an existing permitted managed file with deliveryMode:download and at least one nonempty instruction set. Use common, windows and mac keys; show the matching OS set, otherwise common, never concatenate sets. Existing IDs cannot be edited: create a new version. HTTPS destinations must pass server validation.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"productId": {
"type": "integer",
"minimum": 1
},
"kind": {
"type": "string",
"enum": [
"release",
"content",
"download"
]
},
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"description": {
"type": "string"
},
"url": {
"type": "string"
},
"compatibleProductIds": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
}
},
"deliveryMode": {
"type": "string",
"enum": [
"reference",
"download"
]
},
"downloadFileId": {
"type": "string"
},
"instructions": {
"type": "object",
"properties": {
"common": {
"type": "string"
},
"windows": {
"type": "string"
},
"mac": {
"type": "string"
}
},
"additionalProperties": true
},
"supportUrl": {
"type": "string"
}
},
"additionalProperties": true,
"required": [
"productId",
"kind",
"name",
"url"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"product_id": {
"type": "integer",
"minimum": 1
},
"kind": {
"type": "string",
"enum": [
"release",
"content",
"download"
]
},
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"description": {
"type": "string"
},
"url": {
"type": "string"
},
"compatible_product_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
}
},
"state": {
"type": "string",
"enum": [
"published",
"archived"
]
},
"download": {
"anyOf": [
{
"type": "object",
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/resources/{id}/archive
Archive a reference and cancel outstanding dependent deliveries
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Returns
- HTTP 200: id, product_id, kind, name, version, description, url, compatible_product_ids, state, download.
- Notes
- Historical records remain; the archived reference cannot be newly published or served.
Request, response and error reference
No request body fields are read by this operation.
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"product_id": {
"type": "integer",
"minimum": 1
},
"kind": {
"type": "string",
"enum": [
"release",
"content",
"download"
]
},
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"description": {
"type": "string"
},
"url": {
"type": "string"
},
"compatible_product_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
}
},
"state": {
"type": "string",
"enum": [
"published",
"archived"
]
},
"download": {
"anyOf": [
{
"type": "object",
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/campaigns
List scoped notice drafts and publication states
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Request fields
- query productId: integer
- query state: string
- query noticeType: string
- query search: string
- query offset: integer
- Returns
- HTTP 200: review the response schema below.
- Notes
- Returns at most 200 rows. scheduled/expired are date-filtered views of published records. Current Brand Manager values are overlaid on returned draft branding.
Request, response and error reference
Query and header parameters
[
{
"name": "productId",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1
}
},
{
"name": "state",
"in": "query",
"required": false,
"schema": {
"type": "string",
"enum": [
"draft",
"published",
"paused",
"archived",
"scheduled",
"expired"
]
}
},
{
"name": "noticeType",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "search",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 0
}
}
]
HTTP 200 response (application/json)
{
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"product_id": {
"type": "integer",
"minimum": 1
},
"product_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
}
},
"scope_mode": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"state": {
"type": "string",
"enum": [
"draft",
"published",
"paused",
"archived"
]
},
"draft": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"brand": {
"type": "string"
},
"color": {
"type": "string"
},
"audience": {
"type": "string",
"enum": [
"public",
"customers"
]
},
"noticeType": {
"type": "string",
"enum": [
"announcement",
"content",
"plugin_update",
"download",
"promotion"
]
},
"trigger": {
"type": "string",
"enum": [
"editor_opened",
"editor_available",
"control_clicked"
]
},
"controlId": {
"type": "string"
},
"timezone": {
"type": "string"
},
"startAt": {
"type": "string",
"format": "date-time"
},
"endAt": {
"type": "string",
"format": "date-time"
},
"delaySeconds": {
"type": "integer",
"minimum": 0,
"maximum": 86400
},
"priority": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"maxDisplays": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cooldownSeconds": {
"type": "integer",
"minimum": 60,
"maximum": 2592000
},
"actions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"maxItems": 4
},
"action": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true,
"description": "Legacy single-action input; prefer actions for new integrations."
},
"resourceId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"const": ""
}
]
},
"linkedProductId": {
"anyOf": [
{
"type": "integer",
"minimum": 1
},
{
"type": "null"
}
]
},
"productUrl": {
"type": "string"
}
},
"additionalProperties": true,
"required": [
"name",
"title",
"body",
"audience",
"trigger",
"timezone",
"startAt",
"endAt",
"delaySeconds",
"priority",
"maxDisplays",
"cooldownSeconds"
],
"anyOf": [
{
"required": [
"actions"
]
},
{
"required": [
"action"
]
}
]
},
"updated_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": true
}
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/campaigns
Save a versioned draft without publishing or sending email
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Request fields
- id: string
- expectedVersion: integer
- productIds: array
- scopeMode: selected | all_integrated
- content: object (required)
- Returns
- HTTP 200: id, product_id, product_ids, scope_mode, version, state, draft, updated_at.
- Notes
- Selected scope needs productIds. all_integrated snapshots the currently enabled permitted products, not future products. Updating an existing ID requires expectedVersion; saving creates a new immutable version, returns the notice to draft and cancels outstanding deliveries. Brand/color come from Brand Manager and cannot be overridden per notice. Non-announcements need the corresponding product/resource and resource/download actions.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"expectedVersion": {
"type": "integer",
"minimum": 1
},
"productIds": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"minItems": 1,
"maxItems": 100
},
"scopeMode": {
"type": "string",
"enum": [
"selected",
"all_integrated"
]
},
"content": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"brand": {
"type": "string"
},
"color": {
"type": "string"
},
"audience": {
"type": "string",
"enum": [
"public",
"customers"
]
},
"noticeType": {
"type": "string",
"enum": [
"announcement",
"content",
"plugin_update",
"download",
"promotion"
]
},
"trigger": {
"type": "string",
"enum": [
"editor_opened",
"editor_available",
"control_clicked"
]
},
"controlId": {
"type": "string"
},
"timezone": {
"type": "string"
},
"startAt": {
"type": "string",
"format": "date-time"
},
"endAt": {
"type": "string",
"format": "date-time"
},
"delaySeconds": {
"type": "integer",
"minimum": 0,
"maximum": 86400
},
"priority": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"maxDisplays": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cooldownSeconds": {
"type": "integer",
"minimum": 60,
"maximum": 2592000
},
"actions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"maxItems": 4
},
"action": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true,
"description": "Legacy single-action input; prefer actions for new integrations."
},
"resourceId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"const": ""
}
]
},
"linkedProductId": {
"anyOf": [
{
"type": "integer",
"minimum": 1
},
{
"type": "null"
}
]
},
"productUrl": {
"type": "string"
}
},
"additionalProperties": true,
"required": [
"name",
"title",
"body",
"audience",
"trigger",
"timezone",
"startAt",
"endAt",
"delaySeconds",
"priority",
"maxDisplays",
"cooldownSeconds"
],
"anyOf": [
{
"required": [
"actions"
]
},
{
"required": [
"action"
]
}
]
}
},
"additionalProperties": true,
"required": [
"content"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"product_id": {
"type": "integer",
"minimum": 1
},
"product_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
}
},
"scope_mode": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"state": {
"type": "string",
"enum": [
"draft",
"published",
"paused",
"archived"
]
},
"draft": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"brand": {
"type": "string"
},
"color": {
"type": "string"
},
"audience": {
"type": "string",
"enum": [
"public",
"customers"
]
},
"noticeType": {
"type": "string",
"enum": [
"announcement",
"content",
"plugin_update",
"download",
"promotion"
]
},
"trigger": {
"type": "string",
"enum": [
"editor_opened",
"editor_available",
"control_clicked"
]
},
"controlId": {
"type": "string"
},
"timezone": {
"type": "string"
},
"startAt": {
"type": "string",
"format": "date-time"
},
"endAt": {
"type": "string",
"format": "date-time"
},
"delaySeconds": {
"type": "integer",
"minimum": 0,
"maximum": 86400
},
"priority": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"maxDisplays": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cooldownSeconds": {
"type": "integer",
"minimum": 60,
"maximum": 2592000
},
"actions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"maxItems": 4
},
"action": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true,
"description": "Legacy single-action input; prefer actions for new integrations."
},
"resourceId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"const": ""
}
]
},
"linkedProductId": {
"anyOf": [
{
"type": "integer",
"minimum": 1
},
{
"type": "null"
}
]
},
"productUrl": {
"type": "string"
}
},
"additionalProperties": true,
"required": [
"name",
"title",
"body",
"audience",
"trigger",
"timezone",
"startAt",
"endAt",
"delaySeconds",
"priority",
"maxDisplays",
"cooldownSeconds"
],
"anyOf": [
{
"required": [
"actions"
]
},
{
"required": [
"action"
]
}
]
},
"updated_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
Operation errors: campaign_changed, invalid_product_scope, control_not_allowed, content_not_compatible.
/api/developer/notices/campaigns/{id}/state
Publish, pause or archive a reviewed notice version
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Request fields
- state: published | paused | archived (required)
- expectedVersion: integer (required)
- Returns
- HTTP 200: id, product_id, product_ids, scope_mode, version, state, draft, updated_at.
- Notes
- Publishing rechecks enabled channels, scope, references and the end date. A future start remains scheduled. Pausing/archiving cancels outstanding work. Publishing never schedules a marketing email or changes licensing.
Request, response and error reference
Request (application/json)
{
"type": "object",
"properties": {
"state": {
"type": "string",
"enum": [
"published",
"paused",
"archived"
]
},
"expectedVersion": {
"type": "integer",
"minimum": 1
}
},
"additionalProperties": true,
"required": [
"state",
"expectedVersion"
]
}
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"product_id": {
"type": "integer",
"minimum": 1
},
"product_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
}
},
"scope_mode": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"state": {
"type": "string",
"enum": [
"draft",
"published",
"paused",
"archived"
]
},
"draft": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"brand": {
"type": "string"
},
"color": {
"type": "string"
},
"audience": {
"type": "string",
"enum": [
"public",
"customers"
]
},
"noticeType": {
"type": "string",
"enum": [
"announcement",
"content",
"plugin_update",
"download",
"promotion"
]
},
"trigger": {
"type": "string",
"enum": [
"editor_opened",
"editor_available",
"control_clicked"
]
},
"controlId": {
"type": "string"
},
"timezone": {
"type": "string"
},
"startAt": {
"type": "string",
"format": "date-time"
},
"endAt": {
"type": "string",
"format": "date-time"
},
"delaySeconds": {
"type": "integer",
"minimum": 0,
"maximum": 86400
},
"priority": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"maxDisplays": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"cooldownSeconds": {
"type": "integer",
"minimum": 60,
"maximum": 2592000
},
"actions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"maxItems": 4
},
"action": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"https",
"navigate",
"dismiss",
"resource",
"download",
"instructions"
]
},
"label": {
"type": "string"
},
"target": {
"type": "string"
},
"presentation": {
"type": "string",
"enum": [
"button",
"link"
]
},
"resource": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"productId": {
"type": "integer",
"minimum": 1
},
"url": {
"type": "string"
},
"downloadAvailable": {
"type": "boolean"
}
},
"additionalProperties": true
}
},
"additionalProperties": true,
"description": "Legacy single-action input; prefer actions for new integrations."
},
"resourceId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"const": ""
}
]
},
"linkedProductId": {
"anyOf": [
{
"type": "integer",
"minimum": 1
},
{
"type": "null"
}
]
},
"productUrl": {
"type": "string"
}
},
"additionalProperties": true,
"required": [
"name",
"title",
"body",
"audience",
"trigger",
"timezone",
"startAt",
"endAt",
"delaySeconds",
"priority",
"maxDisplays",
"cooldownSeconds"
],
"anyOf": [
{
"required": [
"actions"
]
},
{
"required": [
"action"
]
}
]
},
"updated_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
/api/developer/notices/campaigns/{id}/report
Read delivery, action and actual-display counts
- Auth
- Account Bearer JWT
- Scope
- marketing.view to read; marketing.manage to write. Effective developer and every assigned product in a notice/reference must be permitted.
- Returns
- HTTP 200: states, receipts, actions, fetched.
- Notes
- A report reconciles stale delivery states. fetched, shown, clicked and dismissed are distinct; fetching is not proof the customer saw the card. Exactly-once display across crashes is not guaranteed.
Request, response and error reference
HTTP 200 response (application/json)
{
"type": "object",
"properties": {
"states": {
"type": "array",
"items": {
"type": "object",
"properties": {
"state": {
"type": "string"
},
"count": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": true
}
},
"receipts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"count": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": true
}
},
"actions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"action_id": {
"type": "string"
},
"kind": {
"type": "string"
},
"count": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": true
}
},
"fetched": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": true
}
Documented failures: 400, 401, 403, 404, 409, 500, 503.
SoundSync
Create a public notice identity only for an enabled channel
curl --fail-with-body -sS "$SOUNDSYNC_API_BASE/api/notices/sessions" \
+ -H "Content-Type: application/json" \
+ --data '{"productId":123}'
