For the complete documentation index, see llms.txt. This page is also available as Markdown.

Programmable Push Notifications

Sending push notifications

In order to send a push notification, you must have an active Push Notifications channel installed in your workspace with valid credentials for the gateway(s) you intend to use (Firebase Cloud Messaging for Android, APNs for iOS, or VAPID for Web Push). Send a push by performing an HTTP request to the channel's messages endpoint with a valid access key.

Send a message

Send a message

post

Send a message to a channel

Authorizations
HTTPRequired

Uses the Authorization header: 'AccessKey ' followed by your access key token

Path parameters
workspaceIdstring · uuidRequired

The unique identifier of the workspace.

channelIdstring · uuidRequired

The ID for a channel

Body
and
anyOptional
object · ChannelMessageCreateWithTemplateOptional
or
object · ChannelMessageCreateWithBodyOptional
Responses
202

Message was accepted for processing

application/json
bodyone ofOptional
or
or
or
or
or
or
or
or
or
or
bodyIdstring · uuidOptional
channelIdstring · uuidRequired
chargeableUnitsinteger · uint32Optional
createdAtstring · date-timeRequired
detailsstringOptional

This field is used to store additional information related to the message status.

directionstring · enumOptionalPossible values:
idstring · uuidRequired
ignorePersistedEventhooksbooleanOptional
lastStatusAtstring · date-timeRequired
platformIdstringOptional
platformReferenceIdstringOptional
reasonstringOptional
referencestringOptional

A reference to the message. This can be used to identify the message in the channel.

scheduledForstring · date-timeOptional

Scheduled message send time (RFC3339). Messages scheduled within 10 minutes may be sent immediately; messages scheduled more than 35 days out will be rejected.

sendAtstring · date-timeOptional
statusstring · enumRequiredPossible values:
tagIdsstring · uuid[]Optional
tagsstring[]Optional

Tags to associate with the message. Tags are converted to lower case and automatically created if they don't exist. Up to 10 tags per message.

updatedAtstring · date-timeRequired
post/workspaces/{workspaceId}/channels/{channelId}/messages

Receiver identifier

Push notifications use a channel-scoped identifier key and a gateway-prefixed identifier value. This differs from SMS/WhatsApp where the identifier key is phonenumber and the value is a raw E.164 number.

  • identifierKey must be push-{channelId} — the literal string push- followed by the UUID of the push channel you are sending through. This is the same channel UUID that appears in the request URL.

  • identifierValue must be {gateway}:{deviceToken} where {gateway} is one of:

    • firebase — for Android devices registered with Firebase Cloud Messaging (FCM v1)

    • apns — for iOS devices registered with Apple Push Notification service

    • web — for browsers registered with the Web Push protocol via VAPID

A bare device token without the gateway prefix is rejected.

Example receiver block:

Note: FCM tokens contain : characters internally — only the first colon (separating the gateway from the token) is parsed by Bird. The rest of the value is treated as one opaque token string.


Push notification body

Push messages use body.type: "list" with title and text fields. The text body type used by SMS, WhatsApp, and email is not supported by the push platform.

Field
Description

body.type

Must be "list".

body.list.title

The notification title that appears in bold at the top of the system notification.

body.list.text

The notification body text below the title.

Example:

Full request examples

Send to an Android device (Firebase)

Send to an iOS device (APNs)

Send to a browser (Web Push)


Troubleshooting

If a send fails, the failure.reason field on the message contains the underlying error. Fetch the message via GET /workspaces/{workspaceId}/channels/{channelId}/messages/{messageId} and check that field.

The three most common failure modes are payload-shape mismatches. Match the symptom to the fix:

failure.reason contains

Fix

invalid identifier value format, missing gateway type prefix

The identifierValue is missing the gateway prefix. Prepend firebase:, apns:, or web: to the device token.

PlatformAddress does not match any selector (visible in worker logs) / message stuck in sending_failed with no token-shaped value

The identifierKey is wrong. It must be push-{channelId}, not pushtoken, user_id, emailaddress, etc.

message body is empty

The body.type is something other than list (most commonly text). Switch to list with list.title and list.text.

Other failures (expired device tokens, FCM/APNs auth errors, throttling) are surfaced from the gateway response and should be self-explanatory.

Last updated

Was this helpful?