Checking the service…

Your status, in plain language.

Service health, your account lifecycle and the state of every notification you have sent — read out as a page instead of a wall of JSON.

Checking the service… —
API
Checking…
GET /health
Database
Checking…
Reachability probe
Version
—
—

Your account

Paste your secret key to see the lifecycle of this registration: how much of the inactivity window is left, how many subscribers you have and what your notifications did.

GET /v1/sites/status

Used for this lookup only: it is kept in this page's memory, never in storage, and is never written to the URL. A secret key authorises sending, so treat it like a password.

One notification

Already have a notification id? See which push services accepted it, who rejected it and what is still pending — as a timeline, not an object.

GET /v1/notifications/:id

The same secret key from the panel above is used for this request. Notification ids are printed on the demo page and returned by every publish call.

Every status, explained

Nothing here is invented: each state below is one the API actually stores or returns. Where a state changes behaviour, the rule is in the sentence next to it.

Registration lifecycle

4 states
activesite.statusnormal

Publishing resets the inactivity clock. Nothing else needs doing.

expiredSITE_EXPIRED403

No successful publish inside the window. POST /v1/sites/reactivate restores it with the same key.

suspendedSITE_SUSPENDED403

The key was revoked. Rotating the key or operator intervention re-enables it.

blockedSITE_BLOCKED403

The website was registered too many times. Permanent, and only an operator can reverse it.

Notification

5 states
queuednotification.status

Accepted, waiting for the delivery pass to pick it up.

processingnotification.status

A delivery pass is currently talking to the push services.

completednotification.status

Every subscription was attempted and none failed.

partialnotification.status

Sent, but at least one subscription failed or was invalidated.

failednotification.status

Nothing could be handed to a push service. Check the delivery attempts.

Subscription

3 states
activesubscriptions.status

Included in the next publish for this site.

invalidsubscriptions.status

The push service answered 404 or 410. Excluded from future sends; the browser must re-subscribe.

unsubscribedsubscriptions.status

The visitor turned notifications off, or your page called unsubscribe().

API errors

19 codes
INVALID_REQUEST400

Malformed JSON, missing field or failed validation. error.details.field says which.

INVALID_API_KEY401

No bearer token, or a key that is unknown or was rotated.

SITE_NOT_FOUND404

The public identifier is unknown, or the Origin does not match the registration.

SITE_EXPIRED403

The inactivity window elapsed. Reactivate to keep the same key.

SITE_SUSPENDED403

The key was revoked and the account must be re-enabled.

SITE_BLOCKED403

Repeated registrations for this website. Operator-only reversal.

INVALID_SUBSCRIPTION400

Malformed endpoint, p256dh or auth. Re-subscribe from the browser.

PUSH_ENDPOINT_NOT_ALLOWED400

The endpoint host is not an accepted push service for this deployment.

NOTIFICATION_PAYLOAD_TOO_LARGE413

The body or the encrypted payload is over the ceiling. Shorten body, image or data.

RATE_LIMIT_EXCEEDED429

Window budget spent. Honour retry-after.

PUSH_DELIVERY_FAILED502

No push service could be reached at all for this publish.

INTERNAL_SERVER_ERROR500

Unexpected failure. Details are logged, never returned — quote x-request-id.

NOT_FOUND404

Unknown route or documentation page.

METHOD_NOT_ALLOWED405

Known path, wrong verb — the allow header lists the valid ones.

NOTIFICATION_NOT_FOUND404

Unknown id, or one that belongs to a different registration.

DUPLICATE_SITE409

This website already has an account. details.attempts counts attempts so far.

SITE_LIMIT_REACHED409

The subscription cap for this registration is full. Prune dead endpoints.

REGISTRATION_DISABLED403

New registrations are switched off on this deployment; an operator must enable them.

SERVICE_UNAVAILABLE503

The instance is missing secrets or a valid VAPID configuration.

SDK errors

8 codes
MISSING_WEBSITE_ID

No public key was passed to the SDK.

UNSUPPORTED

The browser has no Push API, or the page is not a secure context.

PERMISSION_DENIED

The visitor blocked notifications for the site.

PERMISSION_ERROR

The prompt failed — usually because it was not triggered by a click.

SERVICE_WORKER_ERROR

The Service Worker could not register or is out of scope.

NETWORK_ERROR

The subscription upload did not reach the API.

SUBSCRIPTION_CHANGED

The browser replaced the subscription; re-register it.

UNKNOWN

Anything the SDK could not classify. The original error is attached.

This page is the API, drawn.

Every number above comes from an authenticated call — GET /v1/sites/status for the account, GET /v1/notifications/:id for a delivery. Wire the same calls into your own admin panel and you get the same page.