All docs

Docs

Sending messages

Anything that can make an HTTP request can send a notification: a one-line curl, a cron job, or your own app. Each app has a token; whatever you send with it goes to everyone the app reaches.

Two ways to send

The app's webhook URL

The token is part of the URL, so it's all a service or script needs. Post a form, JSON, or plain fields:

curl https://api.bzzd.io/v1/hooks/APP_TOKEN \
  -d title="Backup" \
  -d message="Backup finished on nas-01"

The API, with the token in a header

For your own code, where the token can stay out of URLs and logs:

curl https://api.bzzd.io/v1/messages \
  -H "Authorization: Bearer APP_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Deploy", "message": "shop/web is live", "link": "https://shop.example.com"}'

Both take the same fields. Webhook URLs also understand the formats of the services in the integrations.

Fields

As JSON, a form, or query parameters. Only message is required.

Things that look like passwords or tokens in the text, title or link (in URLs, Bearer headers, or keys from GitHub, GitLab, Slack, AWS, Stripe and others) are replaced with ••• before the message is saved.

Priorities

Urgent messages

An urgent message alerts again every repeat_every seconds (at least 30) until someone taps Acknowledge, deletes it, or repeat_for seconds have passed (at most 10,800, three hours). Both are required:

curl https://api.bzzd.io/v1/hooks/APP_TOKEN \
  -d message="Database is down" \
  -d priority=urgent -d repeat_every=60 -d repeat_for=3600

The answer has the message's id. With the app token in the Authorization header, the app can then:

  • GET https://api.bzzd.io/v1/messages/id: whether it was acknowledged (acknowledged_at), and whether it's still repeating.
  • POST https://api.bzzd.io/v1/messages/id/stop-repeating: stop the repeats, for example once the problem is fixed.

Images

A JPEG, PNG, WebP or GIF of up to 5 MB, sent as a file in a multipart form, or as base64 text in image (with or without a data:image/…;base64, prefix). It's shown in the notification on Android and desktop, and in the inbox everywhere, scaled to at most 1,280 pixels.

curl https://api.bzzd.io/v1/hooks/APP_TOKEN \
  -F message="Someone is at the door" \
  -F image=@snapshot.jpg

Answers and errors

A message that was accepted answers 200 with its id:

{"id": "0199e3a4-5f7e-7b1e-9c2d-3a4b5c6d7e8f"}

Anything else answers with a list of errors, naming the field when one is wrong:

{"errors": [{"field": "priority", "message": "Use one of: silent, quiet, normal, high, urgent."}]}

A service event that isn't worth a notification, like a GitHub star, answers {"skipped": true}, so the service doesn't retry it.

Limits

  • Each app can send 60 messages a minute.
  • Free: 1,000 messages a month per account, kept in the inbox for 7 days.
  • Pro: 10,000 messages a month per account, kept in the inbox for 30 days.
  • Each copy counts: a message to a shared app with three members counts four times, against the owner's plan.

Coming from Pushover

Tools that only speak Pushover's API can post to bzzd with Pushover's fields (token, user, message, title, url, priority, attachment and the rest) and get Pushover's answer:

Pushover-compatible endpoint
https://api.bzzd.io/1/messages.json

Tools with an ntfy or Gotify option work too: see ntfy and Gotify.

Try it on your phone

Free for 1 app, 3 devices and 1,000 messages a month. No card needed, and your real URLs come with your tokens filled in.

Create your free account