OpenAPI 3.1.0 · contract 2.2.0

API reference

Generated from the same contract as the server and official SDK operation manifest. It currently contains 256 method-and-path operations.

Bearer authenticationProduct-first /push/v1Request IDsIdempotent writes

Health

GET/push/v1/healthgetHealth

Public liveness

200 Public liveness

Openapi.Json

GET/push/v1/openapi.jsongetOpenAPI

OpenAPI 3.1 document

200 OpenAPI 3.1 document

Me

GET/push/v1/megetCaller

Authenticated caller and bindings

200 Authenticated caller and bindings

Messages

POST/push/v1/messagessendMessage

Accept a notification

200 Idempotent replay or dry run · 202 Durably queued or scheduled · 422 Validation or policy violation · 503 Committed to the durable outbox but queue production is pending; retry with the same idempotency key
POST/push/v1/messages:sendsendMessageCanonical

Canonical send alias

200 Idempotent replay or dry run · 202 Durably queued or scheduled
POST/push/v1/messages:send-batchsendMessageBatch

Validate and durably accept an idempotent batch of up to 100 messages

202 Every item accepted through a resumable batch job · 207 Partial item results; accepted messages remain durable and safe to replay with the same batch key · 409 Same batch key used with different content · 422 Whole batch rejected before mutation because an item is invalid
POST/push/v1/messages:validatevalidateMessage

Validate without dispatch

200 Validation result · 422 Request does not satisfy message or policy validation
POST/push/v1/messages:previewpreviewMessage

Persist a deterministic no-provider policy and payload preview

200 Canonical APNs, FCM, and Web Push payload previews plus recipient policy decisions; no provider call occurs · 409 Same preview key used with different content
POST/push/v1/messages:estimateestimateMessage

Persist a deterministic no-provider audience and cost estimate

200 Sendable and suppressed recipient counts; cost remains null when no approved rate exists · 409 Same estimate key used with different content
GET/push/v1/messages/{id}getMessage

Tenant-scoped message state

200 Tenant-scoped message state · 404 Not found in caller tenant
POST/push/v1/messages/{id}:cancelcancelMessage

Canceled before provider dispatch

200 Canceled before provider dispatch · 409 Dispatch began; provider recall is not possible
POST/push/v1/messages/{id}:pausepauseMessage

Every still-unsent delivery paused and prior broker generations invalidated

200 Every still-unsent delivery paused and prior broker generations invalidated · 409 Dispatch began; provider recall is not possible
POST/push/v1/messages/{id}:resumeresumeMessage

Paused deliveries re-armed with the current dispatch generation

200 Paused deliveries re-armed with the current dispatch generation · 409 Message is not paused
POST/push/v1/messages/{id}:retryretryMessage

Selected failed deliveries re-armed through accounted replay jobs

202 Selected failed deliveries re-armed through accounted replay jobs · 409 No selected delivery is safely retryable · 422 Selection exceeds the 100-delivery safety bound
GET/push/v1/messages/{id}/tracegetMessageTrace

Delivery decisions and state trace

200 Delivery decisions and state trace
GET/push/v1/messages/{id}/diagnosticsdownloadMessageDiagnostics

Exportable tenant-scoped diagnostic bundle without provider secrets

200 Exportable tenant-scoped diagnostic bundle without provider secrets

Projects

GET/push/v1/projectslistProjects

Projects

200 Projects
POST/push/v1/projectscreateProject

Created

201 Created

Apps

GET/push/v1/appslistApps

Applications

200 Applications
POST/push/v1/appscreateApp

Created

201 Created
GET/push/v1/apps/{id}getApp

Application

200 Application
PATCH/push/v1/apps/{id}updateApp

Updated

200 Updated
GET/push/v1/apps/{id}/vapidgetVapidKey

Public VAPID key

200 Public VAPID key
POST/push/v1/apps/{id}/vapid/rotaterotateVapidKey

Rotated and activated

200 Rotated and activated · 202 Validated encrypted candidate awaits a distinct approver
PUT/push/v1/apps/{id}/credentials/fcmputFCMCredentials

Encrypted, validated, and activated

200 Encrypted, validated, and activated · 202 Validated encrypted candidate awaits a distinct approver
PUT/push/v1/apps/{id}/credentials/apnsputAPNsCredentials

Encrypted, validated, and activated

200 Encrypted, validated, and activated · 202 Validated encrypted candidate awaits a distinct approver
GET/push/v1/apps/{id}/statsgetAppStats

Application statistics

200 Application statistics
GET/push/v1/apps/{id}/insightsgetAppInsights

Delivery analytics with honest state separation

200 Delivery analytics with honest state separation
GET/push/v1/apps/{id}/installationslistInstallations

Installations

200 Installations
GET/push/v1/apps/{id}/sdk-healthlistSDKHealth

Latest secret-free SDK health evidence and stale/missing counts for active installations

200 Latest secret-free SDK health evidence and stale/missing counts for active installations
GET/push/v1/apps/{id}/sdk-configurationlistSDKConfiguration

Immutable SDK configuration versions and active publication pointer

200 Immutable SDK configuration versions and active publication pointer
POST/push/v1/apps/{id}/sdk-configuration/versionscreateSDKConfigurationVersion

Immutable secret-free SDK configuration version created

201 Immutable secret-free SDK configuration version created · 409 Identical configuration or concurrent version conflict · 422 Unsafe or invalid SDK configuration
POST/push/v1/apps/{id}/sdk-configuration/versions/{version}:publishpublishSDKConfigurationVersion

SDK configuration publication pointer moved atomically

200 SDK configuration publication pointer moved atomically · 409 Production publishing actor must differ from creator
GET/push/v1/apps/{id}/deliverieslistDeliveries

Provider and device delivery states

200 Provider and device delivery states
POST/push/v1/apps/{id}/keyscreateAppKey

Key returned once

201 Key returned once
GET/push/v1/apps/{id}/topicslistTopics

Topics

200 Topics
POST/push/v1/apps/{id}/topicsupsertTopic

Topic saved

201 Topic saved
PUT/push/v1/apps/{id}/topics/{key}/members/{user}addTopicMember

Member added

200 Member added
DELETE/push/v1/apps/{id}/topics/{key}/members/{user}removeTopicMember

Member removed

200 Member removed
GET/push/v1/apps/{id}/users/{user}/preferencesgetPreferences

Effective explicit preferences

200 Effective explicit preferences
PUT/push/v1/apps/{id}/users/{user}/preferences/{category}putPreference

Preference saved and audited

200 Preference saved and audited
GET/push/v1/apps/{id}/users/{user}/consentsgetConsents

Consent ledger

200 Consent ledger
POST/push/v1/apps/{id}/users/{user}/consentsrecordConsent

Append-only consent evidence recorded

201 Append-only consent evidence recorded
GET/push/v1/apps/{id}/event-streamlistCanonicalEventStream

Stable tenant sequence cursor, ordering key, schema version, and canonical payload

200 Stable tenant sequence cursor, ordering key, schema version, and canonical payload
GET/push/v1/apps/{id}/event-schemaslistEventSchemas

Immutable versioned schemas and PII classifications

200 Immutable versioned schemas and PII classifications
GET/push/v1/apps/{id}/inbox/feedslistInboxFeeds

Inbox feeds

200 Inbox feeds
POST/push/v1/apps/{id}/inbox/feedsupsertInboxFeed

Versioned feed configuration saved

201 Versioned feed configuration saved
GET/push/v1/apps/{id}/users/{user}/notificationslistInboxNotifications

Cursor-paginated user inbox with cross-device versioned state

200 Cursor-paginated user inbox with cross-device versioned state · 422 Invalid cursor or filter
GET/push/v1/apps/{id}/analytics-policygetAnalyticsPolicy

Retention, minimum aggregation, user-level analytics, IP masking, and deletion-propagation policy

200 Retention, minimum aggregation, user-level analytics, IP masking, and deletion-propagation policy
PUT/push/v1/apps/{id}/analytics-policyputAnalyticsPolicy

Privacy policy saved and audited

200 Privacy policy saved and audited
GET/push/v1/apps/{id}/attribution-modelslistAttributionModels

Versioned draft, published, and retired attribution models

200 Versioned draft, published, and retired attribution models
GET/push/v1/apps/{id}/reportslistReportDefinitions

Saved and scheduled report definitions

200 Saved and scheduled report definitions
GET/push/v1/apps/{id}/report-runslistReportRuns

Latest 200 immutable report run records

200 Latest 200 immutable report run records
GET/push/v1/apps/{id}/digest-ruleslistDigestRules

Latest immutable digest-rule versions

200 Latest immutable digest-rule versions
GET/push/v1/apps/{id}/users/{user}/attentiongetAttentionLedger

Explainable 30-day attention ledger and deterministic fatigue score

200 Explainable 30-day attention ledger and deterministic fatigue score
GET/push/v1/apps/{id}/users/{user}/delivery-profilegetDeliveryProfile

Locale, timezone, channel, device, and business-hours delivery preferences

200 Locale, timezone, channel, device, and business-hours delivery preferences
PUT/push/v1/apps/{id}/users/{user}/delivery-profileputDeliveryProfile

Validated delivery profile saved

200 Validated delivery profile saved
GET/push/v1/apps/{id}/attention-policieslistAttentionPolicies

Effective tenant and application attention policies

200 Effective tenant and application attention policies
PUT/push/v1/apps/{id}/attention-policiesputAttentionPolicy

Frequency and fatigue policy saved

200 Frequency and fatigue policy saved
GET/push/v1/apps/{id}/brand-kitslistBrandKits

Versioned brand kits

200 Versioned brand kits
POST/push/v1/apps/{id}/brand-kitscreateBrandKit

Draft brand kit created

201 Draft brand kit created
GET/push/v1/apps/{id}/media-assetslistMediaAssets

Integrity-addressed media registry

200 Integrity-addressed media registry
POST/push/v1/apps/{id}/media-assetscreateMediaAsset

HTTPS media metadata registered

201 HTTPS media metadata registered
GET/push/v1/apps/{id}/content-bundleslistContentBundles

Localized content bundles

200 Localized content bundles
POST/push/v1/apps/{id}/content-bundlescreateContentBundle

Draft content bundle created

201 Draft content bundle created
GET/push/v1/apps/{id}/channel-connectorslistChannelConnectors

Redacted replaceable channel connectors

200 Redacted replaceable channel connectors
POST/push/v1/apps/{id}/channel-connectorscreateChannelConnector

Validated connector stored with encrypted credentials

201 Validated connector stored with encrypted credentials · 422 Invalid provider, endpoint, or credentials
PUT/push/v1/apps/{id}/users/{user}/destinations/{channel}putChannelDestination

Normalized user channel destination saved

200 Normalized user channel destination saved · 422 Invalid destination
GET/push/v1/apps/{id}/migration-sourceslistMigrationSources

Migration sources with encrypted configuration redacted

200 Migration sources with encrypted configuration redacted
POST/push/v1/apps/{id}/migration-sourcescreateMigrationSource

Encrypted migration source created

201 Encrypted migration source created · 422 Unsupported source or invalid configuration
GET/push/v1/apps/{id}/shadow-evaluationslistMigrationShadowEvaluations

Recent persisted shadow comparison evidence

200 Recent persisted shadow comparison evidence
GET/push/v1/apps/{id}/dual-run-configgetDualRunConfig

Deterministic migration allocation, rollback generation, and latest readiness evidence

200 Deterministic migration allocation, rollback generation, and latest readiness evidence
PUT/push/v1/apps/{id}/dual-run-configputDualRunConfig

Dual-run allocation saved without changing existing cohort assignments

200 Dual-run allocation saved without changing existing cohort assignments · 422 Invalid allocation or completion state
POST/push/v1/apps/{id}/dual-run:rollbackrollbackDualRun

New routes atomically switched to the source provider; existing delivery ownership is unchanged

200 New routes atomically switched to the source provider; existing delivery ownership is unchanged · 409 Migration is already completed or not configured
POST/push/v1/apps/{id}/dual-run:readinesscreateDualRunReadiness

Persisted cohort sample, duplicate, stale-route, and success-rate readiness gates

200 Persisted cohort sample, duplicate, stale-route, and success-rate readiness gates
GET/push/v1/apps/{id}/dual-run-routeslistDualRunRoutes

Recent delivery-owner assignments and cross-provider evidence

200 Recent delivery-owner assignments and cross-provider evidence
GET/push/v1/apps/{id}/provider-credentialslistProviderCredentialMetadata

Redacted active credential and candidate approval metadata

200 Redacted active credential and candidate approval metadata

Installations

POST/push/v1/installationsregisterInstallation

Idempotently registered installation and receipt token

200 Idempotently registered installation and receipt token
PATCH/push/v1/installations/{id}updateInstallation

Identity, permission, capability, or version updated

200 Identity, permission, capability, or version updated
DELETE/push/v1/installations/{id}revokeInstallation

Installation and subscriptions revoked

200 Installation and subscriptions revoked
POST/push/v1/installations/{id}:negotiatenegotiateSDKCapabilities

Compatible protocol and checksum-aware remote configuration, or an explicit fail-closed upgrade status

200 Compatible protocol and checksum-aware remote configuration, or an explicit fail-closed upgrade status · 409 SDK identity does not match the registered installation
POST/push/v1/installations/{id}:rotate-tokenrotateInstallationToken

Provider token or Web Push subscription rotated with append-only hashed evidence

200 Provider token or Web Push subscription rotated with append-only hashed evidence · 409 Idempotency key reused with different token material
POST/push/v1/installations/{id}/sdk-healthreportSDKHealth

Append-only secret-free SDK health evidence accepted

202 Append-only secret-free SDK health evidence accepted · 409 Idempotency or negotiated-version mismatch
GET/push/v1/installations/{id}/preferencesgetInstallationPreferences

Installation-authorized explicit consent preferences, including anonymous state

200 Installation-authorized explicit consent preferences, including anonymous state
PUT/push/v1/installations/{id}/preferences/{category}putInstallationPreference

Replay-safe explicit preference and append-only consent evidence stored

200 Replay-safe explicit preference and append-only consent evidence stored · 409 Idempotency or optimistic state-version conflict

Subscriptions

POST/push/v1/subscriptionsupsertSubscription

Token rotated

200 Token rotated · 201 Subscription created

Users

POST/push/v1/usersupsertUser

User upserted

201 User upserted

Receipts

POST/push/v1/receiptsrecordReceipt

Authenticated monotonic device or engagement receipt

200 Authenticated monotonic device or engagement receipt · 409 Invalid state transition

Stream

GET/push/v1/streamopenInboxStream

Server-sent event stream

200 Server-sent event stream

Webhooks

GET/push/v1/webhookslistWebhooks

Webhooks

200 Webhooks
POST/push/v1/webhookscreateWebhook

SSRF-validated webhook and signing secret

201 SSRF-validated webhook and signing secret
DELETE/push/v1/webhooks/{id}deleteWebhook

Deleted

200 Deleted
POST/push/v1/webhooks/{id}/testtestWebhook

Test queued

200 Test queued

Templates

GET/push/v1/templateslistTemplates

Templates

200 Templates
POST/push/v1/templatespublishTemplateVersion

Immutable template version published

201 Immutable template version published

Events

POST/push/v1/eventsingestEvent

Idempotently ingest a customer event

202 Durably accepted
POST/push/v1/events:batchingestEventBatch

Ingest up to 100 events atomically

202 Durably accepted

Event Destinations

GET/push/v1/event-destinationslistEventDestinations

Bound destinations with encrypted configuration redacted and honest activation state

200 Bound destinations with encrypted configuration redacted and honest activation state
POST/push/v1/event-destinationscreateEventDestination

Executable signed HTTPS destination created; generated secret is shown once

201 Executable signed HTTPS destination created; generated secret is shown once · 202 External cloud or warehouse adapter recorded as pending_external, not falsely activated
POST/push/v1/event-destinations/{id}:pausepauseEventDestination

Destination paused with an audited reason

200 Destination paused with an audited reason
POST/push/v1/event-destinations/{id}:resumeresumeEventDestination

Validated signed HTTPS destination resumed

200 Validated signed HTTPS destination resumed · 409 Adapter is not executable or state is invalid
POST/push/v1/event-destinations/{id}:rotate-secretrotateEventDestinationSecret

Signing secret envelope rotated and new secret shown once

200 Signing secret envelope rotated and new secret shown once
GET/push/v1/event-destinations/{id}/deliverieslistEventDestinationDeliveries

Delivery, retry, dead-letter, response, cursor, and payload-checksum evidence

200 Delivery, retry, dead-letter, response, cursor, and payload-checksum evidence
POST/push/v1/event-destinations/{id}/replaysreplayEventDestination

Confirmed bounded replay queued

202 Confirmed bounded replay queued · 409 Replay idempotency key reused with changed input

Event Replays

GET/push/v1/event-replayslistEventReplays

Caller-app-bound replay and backfill jobs

200 Caller-app-bound replay and backfill jobs

Event Schemas

POST/push/v1/event-schemascreateEventSchema

New immutable active schema version; prior version retired

201 New immutable active schema version; prior version retired

Inbox

GET/push/v1/inbox/notificationslistDeviceInboxNotifications

Authenticated cursor-paginated device inbox, feed counts, unread count, and masked sensitive content

200 Authenticated cursor-paginated device inbox, feed counts, unread count, and masked sensitive content · 422 Invalid cursor or filter
POST/push/v1/inbox/notificationscreateInboxNotification

Inbox notification durably queued

202 Inbox notification durably queued · 422 Invalid or duplicate action declaration
POST/push/v1/inbox/notifications/{id}:readmarkInboxRead

Marked read with authoritative state version

200 Marked read with authoritative state version · 409 Optimistic state conflict
POST/push/v1/inbox/notifications/{id}:unreadmarkInboxUnread

Marked unread with authoritative state version

200 Marked unread with authoritative state version · 409 Optimistic state conflict
POST/push/v1/inbox/notifications/{id}:archivearchiveInboxNotification

Archived with authoritative state version

200 Archived with authoritative state version · 409 Optimistic state conflict
POST/push/v1/inbox/notifications/{id}:restorerestoreInboxNotification

Restored with authoritative state version

200 Restored with authoritative state version · 409 Optimistic state conflict
POST/push/v1/inbox/notifications/{id}:snoozesnoozeInboxNotification

Snoozed until a validated future time

200 Snoozed until a validated future time · 409 Optimistic state conflict
POST/push/v1/inbox/notifications/{id}:pinpinInboxNotification

Pinned

200 Pinned
POST/push/v1/inbox/notifications/{id}:unpinunpinInboxNotification

Unpinned

200 Unpinned
POST/push/v1/inbox/notifications/{id}:savesaveInboxNotification

Saved

200 Saved
POST/push/v1/inbox/notifications/{id}:unsaveunsaveInboxNotification

Unsaved

200 Unsaved
POST/push/v1/inbox/notifications/{id}:deletedeleteInboxNotification

Soft-deleted for this user

200 Soft-deleted for this user
POST/push/v1/inbox/notifications:read-allmarkAllInboxRead

Replay-safe mark-all result and remaining unread count

200 Replay-safe mark-all result and remaining unread count
POST/push/v1/inbox/notifications/{id}:actionperformInboxAction

Declared action accepted or identically replayed

202 Declared action accepted or identically replayed · 409 Same action replay key used with different action or input · 422 Action was not declared or replay key is missing
POST/push/v1/inbox/threads:mutemuteInboxThread

Thread muted with authoritative state version

200 Thread muted with authoritative state version · 409 Optimistic state or replay conflict
POST/push/v1/inbox/threads:unmuteunmuteInboxThread

Thread unmuted with authoritative state version

200 Thread unmuted with authoritative state version · 409 Optimistic state or replay conflict
POST/push/v1/inbox/objects:followfollowInboxObject

Object followed with authoritative state version

200 Object followed with authoritative state version · 409 Optimistic state or replay conflict
POST/push/v1/inbox/objects:unfollowunfollowInboxObject

Object unfollowed with authoritative state version

200 Object unfollowed with authoritative state version · 409 Optimistic state or replay conflict
GET/push/v1/inbox/attachments/{id}downloadInboxAttachment

Short-lived installation-bound redirect to the validated active asset

307 Short-lived installation-bound redirect to the validated active asset · 401 Grant invalid or expired · 404 Attachment unavailable

Workflows

GET/push/v1/workflowslistWorkflows

Workflows

200 Workflows
POST/push/v1/workflowsupsertWorkflow

Workflow shell saved

201 Workflow shell saved
GET/push/v1/workflows/{id}getWorkflow

Workflow and immutable version history

200 Workflow and immutable version history
PATCH/push/v1/workflows/{id}updateWorkflow

Mutable workflow name or pause state updated

200 Mutable workflow name or pause state updated · 404 Not found or archived
DELETE/push/v1/workflows/{id}archiveWorkflow

Workflow archived

204 Workflow archived · 409 Active runs prevent archival
POST/push/v1/workflows/{id}/versionscreateWorkflowVersion

Immutable validated version created

201 Immutable validated version created · 409 Idempotency mismatch
GET/push/v1/workflows/{id}/versions/{version}getWorkflowVersion

Exact immutable workflow-as-code specification and qualification state

200 Exact immutable workflow-as-code specification and qualification state · 404 Not found
POST/push/v1/workflows/{id}/versions/{version}:publishpublishWorkflowVersion

Published

200 Published · 409 Four-eyes approval required for P0
POST/push/v1/workflows/{id}/versions/{version}:request-approvalrequestWorkflowApproval

Approval requested

202 Approval requested
POST/push/v1/workflows/{id}/versions/{version}:approveapproveWorkflowVersion

Approved by a distinct authenticated subject

200 Approved by a distinct authenticated subject
POST/push/v1/workflows/{id}:triggertriggerWorkflow

Durable idempotent run queued

202 Durable idempotent run queued
GET/push/v1/workflows/{id}/canvasgetJourneyCanvas

Latest revisioned visual journey canvas

200 Latest revisioned visual journey canvas
PUT/push/v1/workflows/{id}/canvassaveJourneyCanvas

New optimistic-concurrency canvas revision saved

201 New optimistic-concurrency canvas revision saved · 409 Revision conflict · 422 Canvas saved with validation errors
POST/push/v1/workflows/{id}/canvas:validatevalidateJourneyCanvas

Exact graph, layout, and workflow validation result

200 Exact graph, layout, and workflow validation result
POST/push/v1/workflows/{id}/canvas:compilecompileJourneyCanvas

Valid canvas compiled idempotently to an immutable workflow version

201 Valid canvas compiled idempotently to an immutable workflow version
POST/push/v1/workflows/{id}/canvas:simulatesimulateJourneyCanvas

Bounded deterministic trace with no external side effects

200 Bounded deterministic trace with no external side effects

Workflow Runs

GET/push/v1/workflow-runs/{id}getWorkflowRun

Run and step trace

200 Run and step trace
POST/push/v1/workflow-runs/{id}:cancelcancelWorkflowRun

Canceled

200 Canceled
POST/push/v1/workflow-runs/{id}:approveapproveWorkflowRun

Distinct authenticated approver resumed run

202 Distinct authenticated approver resumed run

Segments

GET/push/v1/segmentslistSegments

Versioned audience segments

200 Versioned audience segments
POST/push/v1/segmentscreateSegment

Segment created

201 Segment created
PUT/push/v1/segments/{id}/members/{user}addSegmentMember

Membership activated

200 Membership activated
DELETE/push/v1/segments/{id}/members/{user}removeSegmentMember

Membership exited

200 Membership exited

Campaigns

GET/push/v1/campaignslistCampaigns

Campaigns

200 Campaigns
POST/push/v1/campaignscreateCampaign

Campaign shell created

201 Campaign shell created
GET/push/v1/campaigns/{id}getCampaign

Campaign and immutable versions

200 Campaign and immutable versions
POST/push/v1/campaigns/{id}/versionscreateCampaignVersion

Validated immutable campaign version

201 Validated immutable campaign version
POST/push/v1/campaigns/{id}/versions/{version}:previewpreviewCampaignVersion

Canonical render and policy warnings

200 Canonical render and policy warnings
POST/push/v1/campaigns/{id}/versions/{version}:estimateestimateCampaignVersion

Live recipient and dispatch estimate; cost is never fabricated

200 Live recipient and dispatch estimate; cost is never fabricated
POST/push/v1/campaigns/{id}/versions/{version}:request-approvalrequestCampaignApproval

Approval requested

202 Approval requested
POST/push/v1/campaigns/{id}/versions/{version}:approveapproveCampaignVersion

Approved by a distinct subject

200 Approved by a distinct subject
POST/push/v1/campaigns/{id}/versions/{version}:publishpublishCampaignVersion

Qualified campaign published

200 Qualified campaign published
POST/push/v1/campaigns/{id}:launchlaunchCampaign

Idempotent durable run queued

202 Idempotent durable run queued

Campaign Runs

GET/push/v1/campaign-runs/{id}getCampaignRun

Snapshot and dispatch counters

200 Snapshot and dispatch counters
POST/push/v1/campaign-runs/{id}:pausepauseCampaignRun

Unsent fan-out paused

200 Unsent fan-out paused
POST/push/v1/campaign-runs/{id}:resumeresumeCampaignRun

Durable fan-out resumed

200 Durable fan-out resumed
POST/push/v1/campaign-runs/{id}:cancelcancelCampaignRun

Unsent fan-out canceled; provider-accepted messages cannot be recalled

200 Unsent fan-out canceled; provider-accepted messages cannot be recalled

Experiments

GET/push/v1/experimentslistExperiments

Experiments and assignment counts

200 Experiments and assignment counts
POST/push/v1/experimentscreateExperiment

Weighted deterministic experiment created

201 Weighted deterministic experiment created · 409 A non-draft definition is immutable · 422 Invalid allocation, control, metric, stop rule, or safeguard
POST/push/v1/experiments/{id}:startstartExperiment

Experiment started after weight, control, metric, and collision validation

200 Experiment started after weight, control, metric, and collision validation · 409 State conflict or mutually exclusive experiment is already running
POST/push/v1/experiments/{id}:pausepauseExperiment

Experiment assignment paused; existing evidence remains immutable

200 Experiment assignment paused; existing evidence remains immutable
POST/push/v1/experiments/{id}:resumeresumeExperiment

Experiment resumed after mutual-exclusion check

200 Experiment resumed after mutual-exclusion check · 409 State or collision conflict
POST/push/v1/experiments/{id}:completecompleteExperiment

Experiment manually completed without automatic winner rollout

200 Experiment manually completed without automatic winner rollout
POST/push/v1/experiments/{id}:assignassignExperimentSubject

Stable user- or organization-level assignment; this does not record exposure

200 Stable user- or organization-level assignment; this does not record exposure
POST/push/v1/experiments/{id}/exposuresrecordExperimentExposure

Privacy-safe exposure durably recorded

202 Privacy-safe exposure durably recorded · 409 Idempotency key reused with different evidence
POST/push/v1/experiments/{id}/observationsrecordExperimentObservation

Declared metric observation recorded after a proven exposure

202 Declared metric observation recorded after a proven exposure · 409 Idempotency key reused with different evidence
POST/push/v1/experiments/{id}:analyzeanalyzeExperiment

Append-only frequentist and Bayesian sequential analysis created

201 Append-only frequentist and Bayesian sequential analysis created · 409 Experiment state or evidence is not analyzable
GET/push/v1/experiments/{id}/resultsgetExperimentResults

Latest append-only result with samples, lift, confidence intervals, p-values, Bayesian probability and guardrails

200 Latest append-only result with samples, lift, confidence intervals, p-values, Bayesian probability and guardrails
POST/push/v1/experiments/{id}:request-winner-approvalrequestExperimentWinnerApproval

Evidence-backed winner sent for four-eyes approval

200 Evidence-backed winner sent for four-eyes approval
POST/push/v1/experiments/{id}:approve-winnerapproveExperimentWinner

Different actor approved the recommended winner; no rollout is performed automatically

200 Different actor approved the recommended winner; no rollout is performed automatically · 409 Recommendation mismatch or four-eyes violation

Conversions

POST/push/v1/conversionsrecordConversion

Idempotent conversion and revenue attribution accepted

202 Idempotent conversion and revenue attribution accepted

Attribution Models

POST/push/v1/attribution-modelscreateAttributionModel

Exact idempotent replay

200 Exact idempotent replay · 201 Draft attribution model version created · 409 Idempotency mismatch
POST/push/v1/attribution-models/{id}:publishpublishAttributionModel

Published by an actor different from the author; prior published version retired

200 Published by an actor different from the author; prior published version retired · 409 Four-eyes, state, or idempotency conflict

Reports

POST/push/v1/reportscreateReportDefinition

Exact definition replay

200 Exact definition replay · 201 Saved report definition created · 409 Report key exists with different content
POST/push/v1/reports:runrunAdHocReport

Exact idempotent report replay

200 Exact idempotent report replay · 201 Bounded privacy-filtered report completed · 422 Invalid report or retention range
POST/push/v1/reports/{id}:runrunSavedReport

Exact idempotent replay

200 Exact idempotent replay · 201 Saved report completed

Report Runs

GET/push/v1/report-runs/{id}getReportRun

Report columns, bounded rows, summary, and checksum

200 Report columns, bounded rows, summary, and checksum · 404 Not found in an app bound to the caller

Exports

POST/push/v1/exportscreateDataExport

Exact idempotent replay

200 Exact idempotent replay · 201 Checksum-addressed bounded export generated · 422 Report is not ready
GET/push/v1/exports/{id}getDataExport

Export lifecycle, size, expiry, and SHA-256 metadata

200 Export lifecycle, size, expiry, and SHA-256 metadata
GET/push/v1/exports/{id}/downloaddownloadDataExport

CSV or JSON Lines artifact

200 CSV or JSON Lines artifact · 410 Export expired or unavailable

Digest Rules

POST/push/v1/digest-rulespublishDigestRule

Identical definition replay

200 Identical definition replay · 201 Immutable digest rule version published
PUT/push/v1/digest-rules/{id}/users/{user}/preferenceputDigestPreference

User-controlled digest schedule saved

200 User-controlled digest schedule saved
POST/push/v1/digest-rules/{id}:previewpreviewDigest

Deterministic non-delivering digest preview with overflow evidence

200 Deterministic non-delivering digest preview with overflow evidence

Digest Items

POST/push/v1/digest-itemsenqueueDigestItem

Idempotent digest item enqueued

202 Idempotent digest item enqueued

Digest Batches

GET/push/v1/digest-batcheslistDigestBatches

Durable materialization, render, and dispatch lifecycle

200 Durable materialization, render, and dispatch lifecycle

Routing

POST/push/v1/routing:planplanRouting

Explainably choose channel, device, provider, and delivery time

200 Deterministic routing decision with machine-readable scores, reasons, and evidence · 422 No safe plan or invalid timing inputs

In App Experiences

GET/push/v1/in-app-experienceslistInAppExperiences

Tenant-scoped in-app authoring versions and qualification state

200 Tenant-scoped in-app authoring versions and qualification state
POST/push/v1/in-app-experiencescreateInAppExperience

Immutable validated in-app experience version created for one of the 22 canonical formats

201 Immutable validated in-app experience version created for one of the 22 canonical formats · 422 Unsupported format, unsafe raw HTML/CSS, invalid targeting, or out-of-bounds content
POST/push/v1/in-app-experiences/{id}:previewpreviewInAppExperience

Canonical format, eligibility, frequency, and content preview; records the publish gate

200 Canonical format, eligibility, frequency, and content preview; records the publish gate
POST/push/v1/in-app-experiences/{id}:publishpublishInAppExperience

Previewed experience version published by a distinct actor

200 Previewed experience version published by a distinct actor · 409 Preview or four-eyes qualification missing
GET/push/v1/in-app-experiences:eligiblelistEligibleInAppExperiences

Authenticated device feed with specification and policy, filtered by device, user, bounded runtime context, session/mutual exclusion, terminal state, frequency caps, and cooldown

200 Authenticated device feed with specification and policy, filtered by device, user, bounded runtime context, session/mutual exclusion, terminal state, frequency caps, and cooldown · 400 Unsupported or oversized runtime context
POST/push/v1/in-app-experiences/{id}/eventsrecordInAppEvent

Checksum-bound idempotent eligibility, impression, dismissal, action, completion, or conversion event

202 Checksum-bound idempotent eligibility, impression, dismissal, action, completion, or conversion event · 409 Idempotency key was reused for a different event or payload · 422 Unsupported event or out-of-bounds data

Live Notifications

POST/push/v1/live-notificationsstartLiveNotification

Cross-platform live object and fallback dispatch started

202 Cross-platform live object and fallback dispatch started
POST/push/v1/live-notifications/{id}:updateupdateLiveNotification

Monotonic rate-protected live update

202 Monotonic rate-protected live update
POST/push/v1/live-notifications/{id}:endendLiveNotification

Terminal live state and final fallback dispatched

202 Terminal live state and final fallback dispatched

Brand Kits

POST/push/v1/brand-kits/{id}/versionscreateBrandKitVersion

Immutable validated brand version created

201 Immutable validated brand version created
POST/push/v1/brand-kits/{id}/versions/{version}:publishpublishBrandKitVersion

Brand version published by a distinct actor

200 Brand version published by a distinct actor · 409 Four-eyes approval required

Content Bundles

POST/push/v1/content-bundles/{id}/versionscreateContentBundleVersion

Immutable content version with strict variables created

201 Immutable content version with strict variables created
PUT/push/v1/content-bundles/{id}/versions/{version}/localizations/{locale}putContentLocalization

Locale overlay saved as draft

200 Locale overlay saved as draft
POST/push/v1/content-bundles/{id}/versions/{version}/localizations/{locale}:approveapproveContentLocalization

Localization approved by a distinct actor

200 Localization approved by a distinct actor · 409 Four-eyes approval required
POST/push/v1/content-bundles/{id}/versions/{version}:publishpublishContentBundleVersion

Content version published after translation approval

200 Content version published after translation approval
POST/push/v1/content-bundles/{id}:renderrenderContentBundle

Strict variable-safe localized render, fallback trace, direction, and warnings

200 Strict variable-safe localized render, fallback trace, direction, and warnings · 422 Invalid variables or content schema

Channel Connectors

DELETE/push/v1/channel-connectors/{id}disableChannelConnector

Connector disabled and encrypted configuration erased

204 Connector disabled and encrypted configuration erased
POST/push/v1/channel-connectors/{id}:reset-circuitresetConnectorCircuit

Confirmed audited circuit reset for a tenant connector

200 Confirmed audited circuit reset for a tenant connector

Channel Messages

POST/push/v1/channel-messagessendChannelMessage

Durably accept an email, SMS, WhatsApp, RCS, collaboration, or custom-channel message

200 Idempotent replay · 202 Queued, scheduled, or policy-suppressed; cost is null unless provider-reported · 409 Idempotency mismatch · 422 Missing connector, verified destination, consent, or valid content
GET/push/v1/channel-messages/{id}getChannelMessage

Tenant-scoped channel state; provider acceptance is not confirmed delivery

200 Tenant-scoped channel state; provider acceptance is not confirmed delivery · 404 Not found
POST/push/v1/channel-messages/{id}:receiptrecordChannelReceipt

Idempotent monotonic provider receipt recorded

200 Idempotent monotonic provider receipt recorded · 409 Invalid state transition

Migration Sources

POST/push/v1/migration-sources/{id}/jobscreateMigrationJob

Idempotent replay

200 Idempotent replay · 201 Validation or apply job started · 409 Idempotency mismatch

Migration Jobs

POST/push/v1/migration-jobs/{id}/records:batchimportMigrationRecords

Records normalized, secret fields redacted from staging, and optionally applied transactionally

202 Records normalized, secret fields redacted from staging, and optionally applied transactionally · 409 Job is terminal · 422 Batch size invalid
POST/push/v1/migration-jobs/{id}:completecompleteMigrationJob

Readiness score, gates, counts, and remediation recommendations

200 Readiness score, gates, counts, and remediation recommendations · 409 Job is already terminal
GET/push/v1/migration-jobs/{id}getMigrationJob

Import counts and redacted record evidence

200 Import counts and redacted record evidence · 404 Not found

Shadow

POST/push/v1/shadow:evaluateevaluateMigrationShadow

Persisted no-delivery audience, suppression, channel, and render comparison; unknown cost and latency remain null

200 Persisted no-delivery audience, suppression, channel, and render comparison; unknown cost and latency remain null · 409 Idempotency mismatch

Dual Run

POST/push/v1/dual-run:routerouteDualRun

Assign exactly one delivery owner using a stable deterministic cohort

200 Replay-safe source-or-Bolrach ownership decision and required caller action · 409 Idempotency mismatch or dual-run not configured

Dual Run Routes

POST/push/v1/dual-run-routes/{id}:source-resultrecordDualRunSourceResult

Idempotent monotonic source-provider outcome recorded

200 Idempotent monotonic source-provider outcome recorded · 409 Event idempotency mismatch or invalid state transition

Roles

GET/push/v1/roleslistRoles

Built-in and tenant custom roles with effective permissions

200 Built-in and tenant custom roles with effective permissions
POST/push/v1/rolescreateCustomRole

Custom role created by tenant owner

201 Custom role created by tenant owner · 422 Unsupported permission
PUT/push/v1/roles/{id}updateCustomRole

Custom role replaced and assigned sessions revoked

200 Custom role replaced and assigned sessions revoked
DELETE/push/v1/roles/{id}deleteCustomRole

Custom role and assignments removed; assigned sessions revoked

204 Custom role and assignments removed; assigned sessions revoked

Role Assignments

PUT/push/v1/role-assignmentsassignCustomRole

Custom role assigned and existing subject sessions revoked

200 Custom role assigned and existing subject sessions revoked
DELETE/push/v1/role-assignments/{id}removeCustomRoleAssignment

Assignment removed and existing subject sessions revoked

204 Assignment removed and existing subject sessions revoked

Member App Access

PUT/push/v1/member-app-accessreplaceMemberAppAccess

Application and environment access replaced; existing sessions revoked

200 Application and environment access replaced; existing sessions revoked

Security Policy

GET/push/v1/security-policygetTenantSecurityPolicy

IP, mTLS, authentication, credential-approval and session policy

200 IP, mTLS, authentication, credential-approval and session policy
PUT/push/v1/security-policyputTenantSecurityPolicy

Owner-updated policy; prior sessions revoked

200 Owner-updated policy; prior sessions revoked · 422 Invalid CIDR, auth method, or session TTL

Sessions

GET/push/v1/sessionslistConsoleSessions

Current subject sessions or administrator-selected subject sessions

200 Current subject sessions or administrator-selected subject sessions
DELETE/push/v1/sessions/{id}revokeConsoleSession

Session revoked immediately

204 Session revoked immediately

Security Alerts

GET/push/v1/security-alertslistSecurityAlerts

New-session-device and future tenant security evidence

200 New-session-device and future tenant security evidence
POST/push/v1/security-alerts/{id}:acknowledgeacknowledgeSecurityAlert

Alert acknowledged with actor and time evidence

200 Alert acknowledged with actor and time evidence

Support Access

GET/push/v1/support-accesslistSupportAccess

Complete customer-controlled support access trail

200 Complete customer-controlled support access trail
POST/push/v1/support-accessrequestSupportAccess

Bounded support access request awaiting a distinct owner

201 Bounded support access request awaiting a distinct owner
POST/push/v1/support-access/{id}:approveapproveSupportAccess

Distinct owner approved time-limited scopes

200 Distinct owner approved time-limited scopes · 409 Expired, non-pending, or same-actor request
POST/push/v1/support-access/{id}:revokerevokeSupportAccess

Support access revoked immediately

200 Support access revoked immediately

Provider Credential Changes

POST/push/v1/provider-credential-changes/{id}:approveapproveProviderCredentialChange

Distinct actor atomically activates a validated encrypted candidate

200 Distinct actor atomically activates a validated encrypted candidate · 409 Candidate cannot be approved

Audit Events

GET/push/v1/audit-eventslistAuditEvents

Filtered append-only hash-chained tenant audit events

200 Filtered append-only hash-chained tenant audit events
GET/push/v1/audit-events:verifyverifyAuditEvents

Full-row hash and predecessor-link verification for the tenant audit chain

200 Full-row hash and predecessor-link verification for the tenant audit chain
POST/push/v1/audit-events:exportcreateAuditExport

Bounded immutable audit snapshot ready for download

201 Bounded immutable audit snapshot ready for download · 422 Range exceeds export limits

Audit Exports

GET/push/v1/audit-exports/{id}/downloaddownloadAuditExport

Tenant-scoped NDJSON or JSON audit evidence

200 Tenant-scoped NDJSON or JSON audit evidence · 410 Export expired

Customer Key Configuration

GET/push/v1/customer-key-configurationgetCustomerKeyConfiguration

Customer key provider metadata and honest validation status

200 Customer key provider metadata and honest validation status
PUT/push/v1/customer-key-configurationputCustomerKeyConfiguration

KMS/HSM metadata recorded pending external validation; not falsely activated

202 KMS/HSM metadata recorded pending external validation; not falsely activated

Status

GET/push/v1/statusgetPublicStatus

Customer-visible current and recent public incident history

200 Customer-visible current and recent public incident history

Dead Letters

GET/push/v1/dead-letterslistDeadLetters

Tenant-scoped redacted dead-letter ledger

200 Tenant-scoped redacted dead-letter ledger
POST/push/v1/dead-letters/{id}:replayreplayDeadLetter

Confirmed idempotent replay started from authoritative outbox state

202 Confirmed idempotent replay started from authoritative outbox state · 409 Dead letter is not open

Replay Jobs

GET/push/v1/replay-jobslistReplayJobs

Manual replay request and terminal outcome evidence

200 Manual replay request and terminal outcome evidence

Provider Health

GET/push/v1/provider-healthlistProviderHealth

Current circuit state and latest provider health snapshots

200 Current circuit state and latest provider health snapshots

Provider Circuits

POST/push/v1/provider-circuits/{id}:resetresetProviderCircuit

Confirmed audited circuit reset for a bound application

200 Confirmed audited circuit reset for a bound application

Incidents

GET/push/v1/incidentslistIncidents

Tenant-specific and public incident history with updates

200 Tenant-specific and public incident history with updates

Usage

GET/push/v1/usagegetUsage

Live idempotent meter totals, budgets, and null cost when no approved rate exists

200 Live idempotent meter totals, budgets, and null cost when no approved rate exists

Usage Budgets

PUT/push/v1/usage-budgetsputUsageBudget

Application or tenant meter budget and hard limit stored

200 Application or tenant meter budget and hard limit stored

Usage Budget Alerts

POST/push/v1/usage-budget-alerts/{id}:acknowledgeacknowledgeUsageBudgetAlert

Budget threshold alert acknowledged with actor evidence

200 Budget threshold alert acknowledged with actor evidence

Slo Report

GET/push/v1/slo-reportgetSLOReport

Approved SLO definitions, latest measurements, and live backlog evidence

200 Approved SLO definitions, latest measurements, and live backlog evidence

Demo

GET/push/v1/demogetPushDemo

Interactive first-party device test page

200 Interactive first-party device test page

Demo Sw.Js

GET/push/v1/demo-sw.jsgetPushDemoWorker

Service worker for the device test page

200 Service worker for the device test page