BluNotify Partner API

Quick-start guide: trigger notification-light effects and read device state. Version v1.

This guide covers predefined lighting/sound effects on light2, light3, and sound, plus reading device state — the capabilities most partners have. If your account also has raw-command, health-read, automation-control, configuration/alert-profile, or System-API access, see the full API reference instead.

Overview

Base URL: https://api.blunotify.com. All requests and responses are JSON. Every endpoint is under /v1 and requires authentication. HTTPS is mandatory. A machine-readable description of the complete API is available at /openapi.json, and the reference lists every route, parameter and field from it. For BluEM energy monitors, start with the BluEM quick start. Changes after launch are listed in the changelog.

Authentication

Authenticate with a bearer API key issued by BluNotify staff:

Authorization: Bearer bnp_3f8a2c91d0_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Treat the key like a password. Never put it in a URL, page, or client-side code. TLS protects it in transit; BluNotify never logs it.

Permissions

Your account is granted specific permission flags; confirm yours at GET /v1/account. This guide covers two of them:

FlagGrants
Predefined commands
predefined_commands
Trigger named effects (e.g. flash_white) via POST …/effects.
State read
state_read
Read current light/sound state via GET …/state.

A request that lacks the required flag, targets a device outside your scope, or targets a channel you aren't permitted returns 403 (or 404 for an out-of-scope device). When your key lacks a flag the request needs, the 403 names it as required_permission, by its GET /v1/account key (shown under each flag above).

Devices & channels

You can only see and control devices in your scope — devices inside an organization subtree granted to your account, plus any device at all if your account has the access-all-devices scope flag (see the full API reference for how scope is granted). Your account is scoped to these channels:

ChannelMeaning
light2Secondary overlay (auto-wrapped with repeat timing). Never touched by BluNotify's own automation.
light3Tertiary overlay (highest priority). Never touched by automation.
soundBuzzer.

Your allowed channels are configured per partner, across your whole scope. GET /v1/devices lists your devices and their permitted channels.

Endpoints

GET /v1/account

Your partner name, permissions, allowed channels, and rate limits.

GET /v1/devices

Devices in your scope. Each: device_id, name, product (blunotify for a notification light) and channels. ?product=blunotify lists only those.

GET /v1/devices/{id}

A single device in your scope.

GET /v1/commands

Predefined commands available to you, with each parameter's min/max/default after your limits. This is the authoritative parameter reference for your account.

POST /v1/devices/{id}/channels/{channel}/effects

Trigger a predefined command with optional parameters, on light2, light3, or sound. Requires the predefined-commands flag, channel access, and that the command is granted to you.

curl -X POST https://api.blunotify.com/v1/devices/DEV123/channels/light2/effects \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"command":"flash_white","params":{"period_s":0.25,"duration_s":3,"interval_s":60}}'

202 {"command":"flash_white","channel":"light2"}

On light2/light3, effects are automatically wrapped as repeating overlays; pass duration_s (how long each occurrence lasts) and interval_s (how often it repeats). The response never includes the underlying encoded command string for this permission level — just 202 Accepted, confirming that it was sent.

GET /v1/devices/{id}/state

Latest command per permitted channel, with a decoded label. Requires state read.

{"device_id":"DEV123","state":{"light2":{"label":"White (Flashing)","updated_at":"2026-07-04T12:00:00+00:00"}}}

Each channel returns a human-readable label and updated_at — not the raw encoded command string.

Command parameters

Parameterized effects accept fields such as period_s, duty_ratio, duration_s, interval_s, and volume. Every value is validated against a configurable min/max; an out-of-range value is rejected (not clamped) with 400. Your exact allowed ranges are in GET /v1/commands. To protect device availability, the API also caps effect duration, minimum flash period, and repeat interval.

Error codes

HTTPcodeMeaning
400validation_errorBad channel, command, or parameter value.
401unauthorizedMissing/invalid/revoked key.
403forbiddenAuthenticated but not permitted for this flag/channel/command.
404not_foundDevice outside your scope (or doesn't exist — indistinguishable by design).
429rate_limitedToo many requests. Honor the Retry-After header.
503publish_failedCommand was valid but could not be delivered to the device.

Errors are JSON: {"error":"…","code":"…","request_id":"…"}. Every response also carries the same id in an X-Request-Id header: quote it when you contact BluNotify support.

Rate limits

Limits apply per partner (requests/minute) and per device (commands/minute), plus a global per-device ceiling shared across partners. Exceeding a limit returns 429 with a Retry-After header (seconds). Build in backoff and avoid tight retry loops. Every response also carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds) for your per-partner request limit, so you can slow down before you reach it.

Conflicts

Temporary policy. If several partners share a device, the API is first-come, first-served: a later valid command overrides an active one. This is intentional for v1 and may change in a future version.

Demo access

Before production access, BluNotify staff provision a demo partner and a demo light, and issue you a key. A typical first session:

  1. GET /v1/account — confirm your permissions.
  2. GET /v1/devices — find your demo device id and channels.
  3. GET /v1/commands — see the commands and parameter ranges granted to you.
  4. POST /v1/devices/{id}/channels/light2/effects with {"command":"flash_white"} — trigger a visible overlay.

Contact your BluNotify representative to arrange demo credentials.

Extending predefined commands

New named commands are added by BluNotify developers at management's request (they are implemented in code, reviewed, and tested, then granted to your account). If you need a specific effect, describe the behavior to your representative and it can be added as a new command without changing your integration — it simply appears in GET /v1/commands once granted.