傳送行為
標準承載資料、5 秒時限、不重試的原因,以及各種傳送狀態的含義。
Webhook 傳送機制刻意採用簡單的設計,而這種設計會影響您的接收端:只嘗試 1 次 HTTP 請求,限時 5 秒,不重試。請先閱讀本頁,再決定處理常式要同步執行多少工作。
標準承載資料
除了 listing.submission 之外,每個事件傳入時都使用相同的最上層結構,事件專屬欄位則巢狀存放在 data 下。
{ "event": "connection.location_connected", "timestamp": "2026-08-25T14:32:10Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": "ba03bc4b-9f8c-4d3b-8e93-9628034c63cc" }}data 內的選填欄位為空時會省略,而不會以 null 傳送。撰寫程式碼時請考量這種情況:以相同方式處理缺少的索引鍵與明確設為 null 的索引鍵,並且絕不要假設文件中標示為選填的索引鍵一定會存在。
2 個例外情況
5 秒時限
每次傳送只會發出 1 次 POST,連線逾時與讀取逾時皆為 5 秒。如果您的端點未在時限內回應,就會放棄這次嘗試,並記錄為 timeout。
此時限涵蓋整個處理常式。唯一安全的設計如下:
- 驗證簽章。
- 將承載資料寫入可持久儲存的位置:佇列、資料表或記錄檔。
- 回傳
200。
其他所有工作(補充資料、分送、回呼 REST API,以及任何涉及第三方的作業)都應在從該佇列取出資料後執行。
不會重試
每次傳送只會嘗試 1 次。沒有退避機制、重試佇列或無法處理訊息佇列。如果您的端點停機 2 分鐘,這 2 分鐘內觸發的事件就會遺失。它們之後也不會送達。
有 2 個影響需要明確說明:
- 不會跟隨重新導向。重新導向功能完全停用,因此端點回傳的
301或302會被記錄為傳送失敗,不會繼續前往第 2 個 URL。請將您的 webhooks URL 設為最終 URL。請注意,許多網頁伺服器預設會加入從裸網域到www的重新導向,以及與尾端斜線相關的重新導向。 - 只有
2xx才算傳送成功。3xx、4xx和5xx都會被記錄為失敗。
重複事件與順序
- 您可能會收到同一事件 2 次,也可能在 2 次不同的變更中收到相同的 id。
data中的識別碼(互動 id、貼文項目 id、已連結帳戶 id)識別的是資源,而非變更。每次評論變更時,interaction.review都會以相同的互動 id 再次觸發,而且所有承載資料都不含版本或更新時間欄位,因此,若處理常式根據 id +event永久排除後續事件,就會在沒有任何提示的情況下捨棄實際的編輯。請改為偵測完全相同的重複事件:計算原始本文位元組的雜湊值,並在有明確期限的短時間範圍內(以分鐘計,而非永久)忽略雜湊值相同的重複事件。同一 id 若有不同的本文,就代表新的變更,而非重複事件。接著從 REST API 重新讀取資源,並以該次讀取結果為準;使用資源 id 作為寫入的索引鍵,而非略過寫入。 - 不保證事件順序,而且
timestamp無法解決這個問題。事件來自多個獨立管道,並依抵達順序傳送,因此local_post.published可能會比您預期先收到的local_post.created更早抵達。請勿依timestamp排定同一資源的 2 次變更順序:它記錄的是建立傳送內容的時間,而非變更發生的時間,且承載資料中完全沒有版本或序號。若順序很重要,請重新讀取資源,並使用 API 傳回的資料。 profile.updated採用去彈跳處理,每個地點每 60 秒只傳送 1 次,並在時間範圍開始時傳送。這會確實捨棄後續事件,而非延遲傳送:第一次編輯會開啟時間範圍並觸發傳送,此範圍內的每次編輯都會被捨棄,永遠不會送達,而changed_fields只描述開啟此時間範圍的那次編輯。因此,您會在時間範圍的開始時收到事件,所以收到事件時立即觸發的重新讀取,只能看到第一次編輯。請安排在時間範圍結束後再次讀取,也就是事件發生至少 60 秒後,並且也要定時核對地點資料,因為通知本身也可能遺失:只嘗試傳送 1 次,不會重試。其他事件皆不採用去彈跳處理。
漏接事件後的復原
系統不會重試,也不會重播事件,因此每個事件類別都需要有可作為備援的權威資料讀取方式。請定期核對資料,不要只在發現異常時才核對。
傳送結果
每次傳送嘗試都會記錄狀態,包括尚未發出請求的嘗試。以下是實際使用的狀態字串。
接收端檢查清單
- 驗證每個請求的簽章;若不符,則回傳
401,且不進行任何處理。 - 對原始主體位元組計算雜湊值,絕不可使用重新序列化的物件。
- 在遠短於 5 秒的時間內回傳
2xx;將工作排入佇列。 - 以
data內的 ID 作為處理函式每次寫入的索引鍵,讓重複處理產生相同的結果,但絕不可因為 id 重複就認為無須處理。 - 不要根據抵達順序推斷先後順序,也不要依
timestamp排序。 - 接收時,將
location_id統一轉換為字串。 - 忽略無法識別的
event值,並仍然回傳200。 - 讓 webhooks URL 直接提供服務,作為最終 URL,不要使用重新導向。
- 定期與 REST API 核對資料;系統不會重試,無法藉此補回遺漏的資料。