Languages: every operation supports cURL, Node.js (TypeScript), Python, Go, Ruby, and PHP. The first 15 operations on this page show all six languages; the remaining 12 show cURL and TypeScript — the two most-used.
Push API
Mobile push notification delivery and device registration Base path:/api/v1/push
Endpoint count: 27
title: “Worked push samples” description: “Worked samples for the push integrator’s chain: register a device token, send to explicit device_token_ids with per-device acceptance, read the delivery receipt from the notifications log, and the registration and send errors to handle.”
Worked push samples
The operation list below documents each endpoint with its parameters, but an integrator runs one chain: register a device token → send a push → read the delivery receipt → retire the token. These samples render that chain as ordered calls with the real response envelopes you branch on. The end-to-end guide is Push integration — client SDK setup is out of scope here; this section adds the per-operation worked bodies the operations list below doesn’t carry. Copy a request as written, substitute your own ids, and compare the response envelope. Every sample shows cURL and TypeScript, matching this page’s language note. Errors follow Devotel Orbit’s{ error, meta } envelope.
1. Register the device
A device becomes reachable once it registers a token against an Orbit user. Re-registering the same token upserts (idempotent), and passingapp_install_id retires the previous token on a reinstall.
cURL
TypeScript
201
id — the send below targets devices by it. For
platform: "web", supply the subscription envelope
(PushSubscription.toJSON()) instead of token. Once your first token
lands, fire POST /api/v1/push/test-send to validate the provider
credential chain against the calling user’s own devices.
2. Send a push
POST /api/v1/push/send takes one of two targeting shapes:
device_token_ids (specific devices, as here) or user_ids (everywhere a
user registered; ["*"] broadcasts to every opted-in device, capped at
100,000 deliverable tokens). An immediate send returns 201; read
notifications[] per device — a top-level success does not mean every
device accepted.
cURL
TypeScript
201
status is sent (provider accepted), failed (provider
rejected — read the error string; permanent failures retire the token), or
skipped (frequency cap or suppression gated it). Supply a future
send_at (ISO-8601) to hold the send for a later instant; a scheduled send
answers 202 instead, and GET /api/v1/push/scheduled/{id} reads the
queued row back until DELETE cancels it while still scheduled (409
once it has left).
3. Read send status
GET /api/v1/push/notifications is the delivery log: every per-device row
carries its status, the delivered_at / opened_at receipts the client
SDK acks, and any provider error. Poll it (or listen for the
push.delivered / push.opened webhooks) to reconcile the send above to a
delivered / failed / skipped breakdown.
cURL
TypeScript
200
?cursor=<last-row-created_at>&limit=<page-size> when it
grows past one screen. A skipped row never leaves the send-time status —
no receipt arrives for a gated device.
4. Errors
Two error classes show up on every integration — read theissues list on
422s and map 404s on ids your tenant has never seen.
422 — malformed registration. A device registers with an unknown
platform (must be ios, android, huawei, or web), or with no
token / subscription for the platform it claims:
device_token_ids nor
user_ids supplied. A send that resolves to zero deliverable tokens answers
NO_DEVICE_TOKENS (422), and user_ids: ["*"] over the recipient cap
answers BROADCAST_TOO_LARGE (422).
404 — unknown device id. A token id not known to this tenant — a deleted
record, a typo, or another tenant’s id:
DELETE /api/v1/push/device-tokens/{id} on logout retires the current one.
See also
- Push integration guide — the full lifecycle, client SDK setup, and the production credential checklist (explicitly out of scope here)
- Push Live Activities — ActivityKit start / update / end payloads
- Push channel page — provider credential setup for APNs, FCM, HMS, and VAPID
- Webhook event payloads —
push.delivered/push.openedwire shapes
List push notification categories
GET /api/v1/push/categoriesstring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get push notification category by ID
GET /api/v1/push/categories/{id}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get web push configuration
GET /api/v1/push/configPushSubscription, or to re-subscribe after a VAPID key rotation.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List registered device tokens
GET /api/v1/push/device-tokensuser_id query parameter. Each row carries the platform, canonical token, install identifiers and whether delivery is currently enabled. Use it to render a user’s registered devices or to audit which installs will receive a push. Capped at 200 rows.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List Live Activities
GET /api/v1/push/live-activitiesstring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List sent push notifications
GET /api/v1/push/notificationscursor (the created_at of the last row you already hold) and limit query parameters. Use it to render the notifications log or to reconcile delivery outcomes.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List scheduled push notifications
GET /api/v1/push/scheduledstatus (scheduled, sent, cancelled, failed). Use it to review or manage pushes waiting for the scheduler to dispatch them. Capped at 200 rows.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get a scheduled push notification
GET /api/v1/push/scheduled/{id}send_at, current status, attempt count and last error. Use it to inspect a queued push before it is dispatched, or to check why a scheduled send failed. Returns 404 when no such scheduled push exists for this tenant.
string
required
Scheduled push id.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Summarize device push telemetry
GET /api/v1/push/telemetry/summaryuser_id.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List registered VoIP call-push devices
GET /api/v1/push/voip-devicesstring
Filter the list to a single user’s devices.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Clear a user’s push badge count
POST /api/v1/push/badge/clearbadge: 0) so the springboard badge updates without showing an alert; send silent_push: false to only record the reset. Call it after the user has read their notifications — for example when they open the Inbox. When user_id is omitted it clears for the authenticated caller.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Create a push notification category
POST /api/v1/push/categoriesidentifier is wire-bound — the iOS / Android client matches on it — so it cannot be modified after create.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Register a device token
POST /api/v1/push/device-tokensios / android / huawei, or a Web Push subscription envelope for platform: web. Re-registering the same token updates its last-seen time and owner instead of creating a duplicate, and passing an app_install_id retires the install’s previous token on reinstall. Call it once the client obtains a push token from the OS.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Start a Live Activity
POST /api/v1/push/live-activitiesactivity_token vended by Activity.pushToken, an activity_type and the initial content_state; Orbit tracks the activity so it can be updated and ended later. Use it to begin a live, lock-screen experience such as order tracking or a live score.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Acknowledge a push notification
POST /api/v1/push/notifications/{id}/ackdelivered_at or opened_at timestamp. The update is idempotent, so repeated acks are safe and the matching push.delivered / push.opened webhook fires only on the first genuine transition. Send event: delivered when the device receives the push and event: opened when the user taps it; returns 404 when the notification id is unknown.
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Register a device token (alias)
POST /api/v1/push/registerPOST /api/v1/push/device-tokens that registers or refreshes a device for push delivery with the identical request and response. Prefer POST /push/device-tokens in new integrations; this path exists for older SDK clients that still call /push/register.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Send a push notification
POST /api/v1/push/senduser_ids, device tokens or a broadcast, and Orbit applies per-user frequency caps and suppression before delivery. Provide a future send_at to schedule the notification instead of sending immediately — it is persisted and dispatched by the scheduler at that time. Returns 201 with the per-device delivery results for an immediate send, or 202 with the scheduled push id when send_at is in the future.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Report device-side push wake telemetry
POST /api/v1/push/telemetrystring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Send a push configuration test
POST /api/v1/push/test-sendstring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Register a VoIP (PushKit) / high-priority FCM call token
POST /api/v1/push/voip-devicesstring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.string
Agent/user id this device belongs to; defaults to the authenticated user when omitted.
string (enum: ios|android)
required
—
string
required
iOS: the raw PushKit (PKPushRegistry) token. Android: the FCM registration token used for the high-priority call channel.
string
iOS app bundle id — the APNs apns-topic for a VoIP push is
<bundle_id>.voip. Falls back to the server-configured bundle id when omitted.Update a Live Activity
PUT /api/v1/push/live-activities/{id}content_state to a running Live Activity so its lock-screen and Dynamic Island presentation updates in place, identified by the activity’s Orbit id. Use it to advance a tracked activity — for example moving an order from Preparing to Out for delivery. Returns 404 when the activity is unknown or has already ended.
string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Enable or disable a device token
PATCH /api/v1/push/device-tokens/{id}enabled: true or enabled: false. A disabled token is skipped by the send path but kept on file, so you can pause a noisy device and re-enable it later. Returns the updated token row, or 404 when the id is unknown in this tenant.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Delete push notification category
DELETE /api/v1/push/categories/{id}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.204 No Content
Delete a device token
DELETE /api/v1/push/device-tokens/{id}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.204 No Content
End a Live Activity
DELETE /api/v1/push/live-activities/{id}end push, optionally with a closing content_state and a dismissal_date telling iOS when to remove it from the lock screen. Identified by the activity’s Orbit id. Call it when the tracked task completes; returns 404 when the activity is unknown.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Cancel a scheduled push notification
DELETE /api/v1/push/scheduled/{id}scheduled status is cancelled. Returns 404 when the id is unknown, and 409 when the push has already been sent or failed and can no longer be cancelled.
string
required
Scheduled push id.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Unregister a VoIP call-push device
DELETE /api/v1/push/voip-devices/{id}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.204 No Content