Cancel a scheduled notification
Cancels a scheduled broadcast (future schedule_at) whose fan-out has not started yet. Sets status: "cancelled".
An immediate (non-scheduled) broadcast is queued for delivery the moment it is accepted and can never be cancelled - even a call made seconds later returns 409 broadcast_not_cancellable. The same 409 applies to a scheduled broadcast whose fan-out has already started, and to one whose send time is less than a minute away (a job that is about to run can no longer be stopped). Repeating the cancel of a broadcast that is already cancelled returns 200. There is no recall once delivery begins; the pushes are already at the providers.
Authorizations
Your secret API key as a Bearer token: Authorization: Bearer vxn_sk_.... Keys are created and scoped in the dashboard - see Authentication.
Headers
Path Parameters
Response
Cancelled notification (full object, status: "cancelled").
A broadcast push notification. Created via POST /v1/notifications, delivered asynchronously to wallet passes (Apple Wallet + Google Wallet). The stored DTO always shows the UNRENDERED template - per-recipient rendered text is not retrievable after the fact.
Localized title keyed by language code (en, sk, cs, de). At least one locale required. Per-locale value is plain text, 1-60 characters (Apple Wallet's lock-screen banner truncates around 60). Template variables are supported. Card-mechanics variables ({{card.balance}}, {{stamps_remaining}}, ...) require a card-scoped audience (card_ids).
Localized body keyed by language code (en, sk, cs, de). At least one locale required. Per-locale value is plain text, 1-240 characters (worst-case room after banner chrome on Apple + Google). Template variables are supported. Card-mechanics variables ({{card.balance}}, {{stamps_remaining}}, ...) require a card-scoped audience (card_ids).
Broadcast lifecycle:
queued- accepted, fan-out imminentscheduled- accepted with a futureschedule_at; cancellable until it firesprocessing- worker batches drainingcompleted- every per-recipient attempt finished (provider ack'd or retries exhausted; does NOT mean the human saw it)partial- finished with failure rate above the warning threshold (~5%)failed- catastrophic failure before deliveries (rare; safe to retry with a fresh Idempotency-Key). Reserved: NOT emitted by v1 today (see note below).cancelled- cancelled while queued/scheduled
failed is declared but NOT emitted by v1 today. status is DERIVED per read from four raw signals (schedule flag + fire time, fan-out start, drain completion, delivery counters); nothing records a crash that happened before any delivery was attempted, so no code path can produce failed. GET /v1/notifications?status=failed is accepted and returns an empty page rather than an error, so branching over the full enum stays safe. The other six are all live, including cancelled, which is backed by a real cancelledAt timestamp set by DELETE /v1/notifications/{id} and takes precedence over every other signal.
queued, scheduled, processing, completed, partial, failed, cancelled "completed"
Unix seconds when a scheduled broadcast fires. Null for immediate sends. While in the future, the broadcast is normally status: "scheduled" and cancellable via DELETE. EXCEPTION: if the audience resolved to zero recipients at accept time there is nothing to deliver now or later, so the broadcast is accepted as already finished - status is completed with every counter at 0 and audience_resolved_count: 0, it never appears under ?status=scheduled, and DELETE returns 409 broadcast_not_cancellable even though this value is still in the future. Poll on status, not on schedule_at.
null
The request id of the request that ACCEPTED this broadcast. Include it in support requests: it identifies the exchange where the fan-out actually happened. On an idempotent replay (a repeat call with the same Idempotency-Key, answered with Idempotent-Replayed: true) this deliberately differs from the Vexion-Request-Id response header: the body keeps the original accept id, while the header carries the id of the replay exchange you are holding.
"req_01J9P0G7K9C0RYHXJ2K7A4N5MZ"