跳到內容

限制與錯誤

本頁總結跨 API 的通用規則。單一介面的必填欄位、生命週期和欄位語意仍以對應 API 頁面為準。

專案限制
請求 body 大小最大 32 KiB(32,768 位元組)。
channel_id128 位元 Crockford Base32;規範輸出為 26 位大寫字元。輸入不區分大小寫,忽略 ASCII 空白和連字號,並接受 Crockford 別名 O0I/L1
Gateway 產生的實體 ID32 位小寫十六進位字串;非 create 路由接收的用戶端 Event/Thing ID 也可使用下述通用格式。
Channel 密碼先 trim,再按 8-128 位元組驗證。
op_id客戶端值為 1-128 字元,只允許字母、數字、_:-,且僅 Message 接受。目前產生值由 13 位小寫十六進位時間戳、連字號和 32 位小寫十六進位隨機值組成;呼叫方應將其視為不透明字串。
thing_id / event_id1-64 字元,只允許字母、數字、_:-
images最多 32 項,每項 URL 最大 2048 位元組。
tags最多 32 項,每項最大 64 位元組,trim 後去重。
metadata僅允許標量值;key 最大 64 位元組,非空標量文字最大 512 位元組;不允許巢狀物件、陣列或 null。
ttl 與 API 時間戳文件註明的時間欄位接受 Unix 秒或毫秒,並歸一化為毫秒。
活躍訂閱者每個 Channel 最多 32 個並行訂閱者。
內建密碼請求預算每個 Gateway 程序:公開/密碼敏感介面以及 MCP/OAuth 密碼入口,每 IP 每分鐘 60 次、全域每分鐘 1,200 次。經共享 Bearer Token 驗證的私人請求不受此 limiter 限制。
未知欄位原生 Message、Event、Thing 會忽略擴充欄位;動作明確禁止的已知欄位仍傳回 400。

Message 的 tagsimagesseverity 按對應頁面驗證;Event 和 Thing 的 patch 內容不繼承這些限制。

成功:

{
"success": true,
"data": {
"op_id": "00191f23cc000-0123456789abcdef0123456789abcdef",
"message_id": "8a1fc4b3d9f04fd2857f92f66f7cc5d1"
}
}

失敗:

{
"success": false,
"error": "human readable message",
"error_code": "machine_readable_code",
"problem": {
"code": "machine_readable_code",
"category": "validation",
"status": 400,
"title": "Invalid request",
"detail": "human readable message",
"localized_message": "human readable message",
"locale": "zh-TW",
"retryable": false,
"request_id": "request-id"
}
}

無法提供的可選 problem 成員會被省略;存在請求作用域 ID 時,回應也會透過 x-request-id Header 傳回。

成功 data 包含 op_idmessage_idevent_idthing_id 三者之一,不含 channel_idaccepted 布林值。自動化應結合 HTTP 狀態與 successerror_codeproblem.code

傳送介面的 success=true 表示 Gateway 已持久受理提交,不保證 provider 成功、私人通道投遞、裝置顯示或使用者可見。

它不保證:

  • 每台裝置都已經在線上。
  • APNs 或 FCM 已經展示系統通知。
  • Android 私人通道已經即時送達。
  • 使用者沒有被系統通知許可權、專注模式或省電影響。

使用傳回的 op_id 查詢 GET /send_status/{op_id}。回應包含 op_idstatusmodelentity_idaccepted_atupdated_atexpires_at

狀態值為 acceptedprocessingprovider_queuedsentpartially_failedfailedprovider_queued 只表示進入 Gateway 的 provider worker 佇列,不代表 provider 成功。未知或過期操作傳回 404 send_status_not_found;這些狀態也不是終端顯示回執。

狀態意義
accepted提交已被持久受理。
processing正在處理分發。
provider_queued已進入 Gateway provider worker 佇列;不代表 provider 成功。
sent分發完成,未記錄目標失敗。
partially_failed至少一個分發目標失敗。
failed提交處理失敗。
狀態碼意義典型原因處理建議
200請求已被 Gateway 處理success=true儲存傳回的 ID 和 op_id
400請求校驗失敗必填/格式錯誤,或已知欄位不允許用於目前動作對照 API 欄位表檢查 JSON。
401Gateway 級驗證失敗私人 Gateway 開啟 PUSHGO_TOKEN,Bearer Token 缺失或錯誤檢查 Authorization: Bearer <token>
404目標不存在Channel 或傳送狀態記錄不存在檢查 channel_idop_id
409冪等衝突Message op_id 用於不同的正規化內容或作用域使用新 ID,或重送原始內容。
413請求 body 過大JSON 超過 32 KiB(32,768 位元組)圖片使用 URL;減少 metadata 或 attrs。
429請求過於頻繁超過程序內建的密碼請求預算稍後重試並降低突發請求。
503提交未受理Gateway 接入或持久提交失敗檢視 Gateway 日誌、儲存健康和容量。
  • JSON 是否合法。
  • 是否把 event_id 傳給了 /event/create,或把 thing_id 傳給了 /thing/create
  • Event/Thing 不要傳 op_id,create 路由不要傳 Gateway 產生的實體 ID。
  • Message 的未知 severity 會正規化為 normal
  • 未知擴充欄位會被忽略;可選欄位未生效時先檢查拼寫。
  • 是否在私人 Gateway 設定了 PUSHGO_TOKEN
  • Header 是否是 Authorization: Bearer <token>
  • 是否把 Channel 密碼誤當成 Gateway Token。
  • 反向代理是否剝離了 Authorization Header。
  • 私人 Gateway 設定 PUSHGO_TOKEN 後,/healthz/readyz 也需要 Bearer Token。
  • 用戶端是否已訂閱該 Channel。
  • 裝置通知許可權是否開啟。
  • Apple 裝置是否受 APNs、專注模式或系統通知設定影響。
  • Android 是否能取得正確的 /gateway/profile
  • 私人通道連線埠、憑證和外部位址是否可達。
  • Gateway 日誌裡是否有 provider 或 private dispatch 錯誤。
  • PUSHGO_PRIVATE_TRANSPORTS 是否啟用。
  • WSS 是否能透過同一個 HTTPS 網域連線。
  • QUIC UDP 連線埠是否被防火牆或代理程式阻斷。
  • Raw TCP 是否正確處理 TLS 或 TLS offload。
  • 宣告連線埠和實際監聽連線埠是否被連線埠對映搞混。
  • PUSHGO_MCP_ENABLED 是否開啟。
  • 非 loopback 部署的 PUSHGO_PUBLIC_BASE_URL 是否為外部 HTTPS 位址;僅 loopback 本機開發可以省略。
  • 反向代理是否轉送 /.well-known/*/oauth/*/mcp
  • DCR 是否與用戶端能力相符。
  • 繫結頁面會話是否過期。