Skip to content

Message API

The Message API sends top-level transient notifications. Use it for alerts, completion messages, image snapshots, price notifications, and other content that does not need later updates or closing.

POST /message

The request body must be JSON, and unknown fields are rejected. If a private Gateway enables PUSHGO_TOKEN, include Authorization: Bearer <token>.

HeaderRequiredDescription
Content-Type: application/jsonYesRequest body format.
Authorization: Bearer <token>Gateway-dependentRequired only when a private Gateway enables PUSHGO_TOKEN.
FieldTypeRequiredDescription
channel_idstringYesTarget channel ID.
passwordstringYesChannel password, usually 8-128 characters.
titlestringYesMessage title, must not be empty.
bodystringNoMessage body, Markdown is supported.
op_idstringNoIdempotency key, 1-128 chars, letters/digits/_/:/-.
thing_idstringNoAssociate the message with an existing Thing; 1-64 chars, letters/digits/_/:/-.
occurred_atnumberNoWhen the message occurred; Unix seconds or milliseconds accepted. Required when thing_id is present.
severitystringNocritical, high, normal, low; unknown values normalize to normal.
ttlnumberNoUnix-millisecond expiration time; provider TTL is capped around 28 days.
urlstringNoOptional click-through URL.
imagesstring[]NoUp to 32 image URLs, max 2048 chars each.
tagsstring[]NoUp to 32 tags, max 64 chars each, trimmed and deduplicated.
ciphertextstringNoOptional E2EE ciphertext payload.
metadataobjectNoCustom scalar key-values; key <= 64, non-empty scalar value <= 512; nested objects and arrays are rejected.
severityAPNs interruption levelFCM priority
criticalcriticalHIGH
hightime-sensitiveHIGH
normalactiveHIGH
lowpassiveNORMAL
Terminal window
curl -X POST https://gateway.pushgo.dev/message \
-H "Content-Type: application/json" \
-d '{
"channel_id": "YOUR_CHANNEL_ID",
"password": "YOUR_CHANNEL_PASSWORD",
"title": "Backup completed",
"body": "The daily NAS backup has finished.",
"severity": "normal"
}'

If the alert belongs to a persistent entity, pass thing_id and an explicit occurred_at.

{
"channel_id": "YOUR_CHANNEL_ID",
"password": "YOUR_CHANNEL_PASSWORD",
"thing_id": "8a1fc4b3d9f04fd2857f92f66f7cc5d1",
"title": "Home NAS disk warning",
"body": "volume1 usage has reached 92%.",
"severity": "high",
"tags": ["nas", "disk"]
}
{
"success": true,
"data": {
"channel_id": "YOUR_CHANNEL_ID",
"op_id": "op-20260422-001",
"message_id": "8a1fc4b3d9f04fd2857f92f66f7cc5d1",
"accepted": true
},
"error": null,
"error_code": null
}

success=true means the Gateway processed the request. accepted=true means the request entered dispatch; final display still depends on platform push services, device state, and private transports.

StatusTypical reason
400Missing required field, unknown field, empty title, invalid op_id.
401Private Gateway requires a Bearer token, but the header is missing or wrong.
404Channel does not exist or credentials do not match.
413Request body exceeds 32KB.
503Gateway could not fully enter dispatch; response may include accepted=false.

See Limits & Errors for shared limits.

PushGo also provides ntfy, Bark, and ServerChan compatibility endpoints for migration. Their field coverage is limited; use native /message when you need thing_id, E2EE, or full PushGo semantics. See Migration Guide.