回呼(Webhook)
建立任務時帶上 callback_url(需以 https:// 開頭),任務完成或失敗時,系統會主動用 POST 通知你的伺服器,不需要一直查詢任務狀態。
什麼時候會通知
- 任務完成(
status = 20)時通知一次。 - 任務失敗(
status = 30)時通知一次。失敗的任務積分已自動退回,見〈積分與計費〉。 - 任務被取消時不會通知。
通知內容
POST {你的 callback_url}
Content-Type: application/json
X-Signature: <HMAC-SHA256 簽名,見下方>
X-Timestamp: 1799999999
{
"public_id": "01JABCXYZULID",
"status": 20,
"error_code": null,
"payload": null
}
通知只包含任務狀態(status 的意思請見〈任務查詢與取件〉),不包含 result 和 files。收到通知後,請呼叫 GET /api/tasks/{public_id} 取得完整結果。
payload 是你建立任務時送出的 payload,原樣帶回,沒帶的話是 null。可以用來放訂單編號這類你自己的資料。
例外:人臉年齡偵測的通知會多帶 result,直接附上偵測結果,詳見〈人臉年齡偵測〉。其他任務的通知就是上面這四個欄位。
驗證簽名
X-Signature 是用你帳號的 Webhook 密鑰,對原始 request body 做 HMAC-SHA256 計算出來的十六進位字串:
X-Signature = hash_hmac('sha256', <raw request body>, <your webhook_secret>)
Node.js 驗證範例:
const crypto = require('crypto')
function isValidSignature(rawBody, signatureHeader, webhookSecret) {
const expected = crypto.createHmac('sha256', webhookSecret).update(rawBody).digest('hex')
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signatureHeader))
}
請用收到的原始 body 字串計算簽名,不要用重新轉換過的 JSON,否則欄位順序或空白不同就會對不上。
X-Timestamp 是送出當下的 Unix 時間戳記。要不要檢查時間來防止重放攻擊,由你自行決定,系統不會檢查。
查看與更換 Webhook 密鑰
Webhook 密鑰是帳號層級的設定,同一個帳號的所有任務共用一組,可以在後台的Webhook頁面查看或更換。
更換後舊密鑰會立即失效,沒有過渡期。新密鑰在更換當下才會產生,所以請在更換後馬上更新你伺服器上的設定。從更換到更新設定之間收到的通知會驗證失敗,但系統會自動重送(見下方〈重送規則〉),更新完成後就能用新密鑰收到這些通知。
重送規則
通知送出失敗(逾時、連線失敗,或你的伺服器回應不是 2xx)時,系統會自動重送,間隔會逐次拉長:
| 第幾次重送 | 與上一次的間隔 |
|---|---|
| 1 | 1 分鐘 |
| 2 | 5 分鐘 |
| 3 | 30 分鐘 |
| 4 | 2 小時 |
| 5 | 6 小時 |
重送 5 次仍失敗就會停止。同一個 public_id 和 status 的通知可能會收到不只一次,請確保重複收到時不會重複處理。