Skip to main content
POST
/
v1
/
send
Send a notification to your paired devices
curl --request POST \
  --url https://api.reflecto.dev/v1/send \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "message": "Backup finished in 12m",
  "title": "Backup",
  "priority": "default",
  "tags": [
    "ops"
  ],
  "url": "https://example.com/backup/123",
  "url_title": "View report",
  "actions": [
    {
      "label": "Acknowledge",
      "url": "https://example.com/ack"
    }
  ],
  "device": "all",
  "markdown": false,
  "ttl": 259200
}
'
{
  "id": "msg_3f6e2a7c9b1d4f8e8a5b6c1d2e3f4a5b",
  "delivered_to": [
    {
      "device_id": "dev_9af3",
      "type": "android"
    },
    {
      "device_id": "dev_2bc1",
      "type": "extension"
    }
  ],
  "warnings": []
}

Documentation Index

Fetch the complete documentation index at: https://docs.reflecto.dev/llms.txt

Use this file to discover all available pages before exploring further.

Authorizations

Authorization
string
header
required

Opaque bearer token created on your paired Android phone. The format is rfk_live_ followed by 32 URL-safe alphanumeric characters (≥160 bits of entropy). Test tokens use the rfk_test_ prefix.

Body

Canonical send payload. Form-encoded and text/plain bodies are documented in the guides — the server normalises them to this shape.

message
string
required

Notification body. Required. 1–1500 bytes (UTF-8). maxLength is omitted from the schema because JSON Schema measures characters, not bytes — server enforces a byte cap to keep the 2 KB envelope budget honest across CJK / emoji content.

Minimum string length: 1
Example:

"Backup finished in 12m"

title
string

Headline rendered above the body. 1–100 bytes (UTF-8). Schema omits maxLength because JSON Schema measures characters, not bytes.

Minimum string length: 1
Example:

"Backup"

priority
enum<string>
default:default

Notification priority. min/low use normal FCM; rest use high.

Available options:
min,
low,
default,
high,
urgent
Example:

"default"

tags
string[]

Up to 5 tags rendered as labels. Oversize / overcount entries are truncated with a warning rather than rejected — maxItems is deliberately omitted so SDK generators don't client-side-reject valid-but-overcount inputs that the server will accept and trim.

Tag string. Oversize / overcount entries are truncated with a warning rather than rejected.

url
string<uri>

Clickable URL attached to the notification. http(s) only, ≤ 512 bytes.

Example:

"https://example.com/backup/123"

url_title
string

Display text for url. ≤ 32 bytes (UTF-8). Schema omits maxLength because JSON Schema measures characters, not bytes.

Example:

"View report"

actions
object[]

Up to 3 action buttons. Each button opens its url when tapped. Overcount entries are truncated with a warning — maxItems is deliberately omitted so SDK generators don't client-side-reject.

device
string
default:all

Target device(s). all (default), mobile (alias phone), desktop, or a comma-separated list of device labels. Unknown labels become warnings.

Maximum string length: 256
Example:

"all"

markdown
boolean
default:false

Render the body as Markdown on the extension. Ignored on Android in MVP.

Example:

false

ttl
integer
default:259200

Seconds the message stays in the per-device queue if not delivered live. Out-of-range values are silently clamped to the [0, 259200] range (72 hours, matching the Redis queue TTL).

Required range: 0 <= x <= 259200
Example:

259200

Response

Accepted and enqueued. Body contains the msg_* id + delivery list.

id
string
required
Example:

"msg_3f6e2a7c9b1d4f8e8a5b6c1d2e3f4a5b"

delivered_to
object[]
required
warnings
string[]
required