Skip to content

Limits & Errors

This page summarizes rules shared across APIs. Required fields, lifecycle behavior, and model-specific semantics still belong to each API page.

ItemLimit
Request body sizeMax 32KB.
Gateway-generated IDs32 lowercase hex characters.
Channel passwordUsually 8-128 characters.
op_id1-128 characters; letters, digits, _, :, -.
imagesUp to 32 URLs, max 2048 characters each.
tagsUp to 32 tags, max 64 characters each, trimmed and deduplicated.
metadataScalar values only; key max 64, value max 512.
attrsObject patch; null removes a key; avoid complex nesting.
ttlUnix-millisecond timestamp; provider delivery TTL is capped around 28 days.
Unknown fieldsNative Message, Event, Thing, and MCP tool arguments are strict; unknown fields return 400.

Success:

{
"success": true,
"data": {
"accepted": true
},
"error": null,
"error_code": null
}

Failure:

{
"success": false,
"data": null,
"error": "human readable message",
"error_code": "machine_readable_code"
}

Automation should prefer success and error_code over natural-language error text.

success=true means the Gateway processed the request. accepted=true means it entered dispatch.

It does not guarantee:

  • Every device is online.
  • APNs or FCM has displayed a notification.
  • Android private transport delivered in real time.
  • The user is unaffected by notification permissions, Focus mode, or battery policy.

Treat accepted as Gateway acceptance and dispatch status, not as an end-device display receipt.

StatusMeaningTypical reasonWhat to do
200Gateway processed the requestsuccess=true, but still check acceptedStore returned IDs and op_id.
400Validation failedMissing required field, unknown field, bad formatCompare the JSON with the API field table.
401Gateway authentication failedPrivate Gateway uses PUSHGO_TOKEN; Bearer token missing or wrongCheck Authorization: Bearer <token>.
404Target missingChannel, event, or thing does not existCheck channel_id, event_id, thing_id.
413Request body too largeJSON exceeds 32KBUse image URLs; reduce metadata or attrs.
503Dispatch not fully acceptedProvider, private transport, queue, or downstream unavailableInspect Gateway logs, stats, and queue capacity.
  • JSON must be valid.
  • Do not send event_id to /event/create or thing_id to /thing/create.
  • Remove unknown fields.
  • severity must be critical, high, normal, or low.
  • attrs must be an object patch, not an array or deeply nested structure.
  • Check whether the private Gateway has PUSHGO_TOKEN.
  • Header must be Authorization: Bearer <token>.
  • Do not confuse channel password with Gateway token.
  • Ensure the reverse proxy does not strip Authorization headers.

Request Succeeds but Device Does Not Notify

Section titled “Request Succeeds but Device Does Not Notify”
  • The client must be subscribed to the channel.
  • Device notification permission must be enabled.
  • Apple delivery can be affected by APNs, Focus modes, and system settings.
  • Android clients must be able to fetch the correct /gateway/profile.
  • Private transport ports, certificates, and external addresses must be reachable.
  • Gateway logs may show provider or private dispatch errors.
  • PUSHGO_PRIVATE_TRANSPORTS must be enabled.
  • WSS must be reachable through the HTTPS domain.
  • QUIC UDP port may be blocked by firewall or proxy.
  • Raw TCP must handle TLS or TLS offload correctly.
  • Advertised ports and actual bind ports may differ behind NAT or port mapping.
  • PUSHGO_MCP_ENABLED must be enabled.
  • PUSHGO_PUBLIC_BASE_URL must be an external HTTPS URL.
  • Reverse proxy must forward /.well-known/*, /oauth/*, and /mcp.
  • DCR must match client capability.
  • Bind page sessions can expire.