Skip to content

API overview ​

The public API is served at api.<DOMAIN> and versioned under /v1. It is the same API the dashboard uses — there is no private surface behind it.

bash
curl http://api.localhost/v1/contacts \
  -H "X-API-Key: $NOTIFYZR_API_KEY"

Base URLs ​

EnvironmentBase URL
Developmenthttp://api.localhost
Self-hostedhttps://api.<your-domain>

Authentication ​

Every authenticated call needs exactly one header:

X-API-Key: <your key>

A key belongs to exactly one organization, and there is no parameter that changes which — so everything below is implicitly scoped to that organization. Mint keys in the dashboard under API keys; see Authentication for how they are scoped, revoked and expired.

Three surfaces are not authenticated this way:

SurfaceAuth
POST /v1/forms/{id}/submissionsNone. HTML forms post here directly; it is rate-limited instead.
GET /healthNone.
The hosted unsubscribe pageThe signed ?t= token in the link is the authorisation.

Reference ​

Start with Conventions — the response envelope, status codes, pagination and rate limits are the same everywhere, and are not repeated on each page.

ResourceCovers
Sending and messages/send, /messages, /emails, channel messages
ContactsContacts, properties, CSV imports, the suppression list
SegmentsSaved filters and live membership
BroadcastsOne email to a whole segment
TemplatesTemplates and folders
FormsHosted forms and their submissions
AutomationsEvent-triggered graphs, runs and metrics
DomainsSender domains and DNS verification
ChannelsDiscord, Telegram and ntfy.sh
WebhooksSigned event callbacks
Usage and healthPlan, quotas, current usage, liveness
Error codesEvery error.code the API returns
EndpointsThe whole route table on one page

Health ​

GET /health is unauthenticated and returns the service's status. It is what the status page at status.<DOMAIN> probes.

Released under the Apache 2.0 License.