Webhooks 概述

了解 Listings API 如何将账户事件推送到您的服务器、支持哪些事件,以及每次投递必须通过的 5 项检查。

通过轮询 API 来检测变更成本较高,而且总会有些延迟。Webhook 则采用相反的方式:当您的账户中发生事件(收到评价、地点被编辑、Google Business 帖子上线)时,Listings API 会在几秒内向您控制的 URL 发送带有 JSON 正文的 HTTP POST 请求。

每个账户只有 1 个 webhook URL,且不支持按事件订阅。如果您的账户已启用 webhook,且您的端点已通过验证,本页列出的所有事件都会发送到该 URL。根据 event 字段分别处理,忽略您不需要的事件。

投递流程

每个事件都经过相同的流程。系统会依次执行 5 项投递检查,任何一项未通过都不会发出 HTTP 请求,但仍会记录此次尝试。

您可以接收的事件

共 6 个类别、18 个事件。每个事件都对应您已通过 REST API 管理的某种资源,因此 webhook 告知您何时发生变更,端点则告知您变更内容。

类别事件相关 REST 资源
listing.submission1商家信息
profile.*3 个:created、updated、deleted地点
connection.*6 个:connected、disconnected、reauth、inaccessible,以及 2 个 Google 验证事件已连接的账户
interaction.*2 个:review、response评价
local_post.*4 个:created、published、rejected、deleted帖子
review_analytics.*2 个:每日快照和每周快照分析

完整的字段表和载荷示例见事件参考。

不在支持范围内

平台还会发出其他类别的事件,但 Listings API 不为这些事件提供文档或支持,因为此处没有公开的 REST 端点与之对应。为避免被误认为是遗漏,现将这些类别列出:

  • 评价活动:campaign.*
  • 排名:rankings.*
  • Social 帖子及推广:social_post.*
  • Social 连接:social_connection.*
  • AI 帖子创意:idea.*、idea_series.*、idea_pipeline.*、idea_image.*
  • Google Business Profile 所有权:gbp_ownership.*

开发前需要了解的 2 项注意事项

投递检查条件

投递前会按顺序检查 5 个条件。任何一个条件不满足,都会停止投递,不再检查后续条件。

#检查条件不满足时的处理
1您的套餐包含 webhook。这是账户的一项使用权限。不记录任何内容。该事件不会被路由到您的账户。
2账户已配置 webhook URL。不记录任何内容。
3端点验证已通过:仅在存在签名密钥后才强制执行此检查。记录为 endpoint_unverified。
4URL 可解析为公共地址(使用 HTTPS,主机可通过公共 DNS 解析)。记录为 blocked_url。
5您未超出套餐的 webhook 限额。记录为 rate_limited。事件会被丢弃,不会排队。

套餐与限额

所有套餐均包含 webhook 使用权限:Launch、Growth 和 Enterprise。试用使用您选择的套餐,因此试用账户从第 1 天起就可以使用 webhook,并受该套餐的限额约束。此权限与您的套餐关联,因此会在套餐变更处理过程中授予或移除,而非立即生效:请以您的下一次套餐变更或注册同步完成时为生效时间,而不是点击升级的那一刻。控制台的 Webhooks 页面会显示您当前的使用权限和限额。

投递量还受每分钟和每天的限额约束,两项限额均由您的套餐决定。

套餐每分钟每天
Launch107,200
Growth5036,000
Enterprise无限制无限制

Webhook 限额与您套餐的 API 请求限额相同:我们向您发送事件的配额,等于您向我们发送请求的配额。

只有在您套餐的限额同步到投递流程后,限额才开始对您的账户生效。在此之前,没有可供检查的限额,因此不会计量,也不会丢弃事件。所以,新账户可能会先经历一段不计量的投递期,之后才受到套餐限额约束。不要因为没有出现 rate_limited 就认定您未超出限额。

计量规则如下:

  • 两个独立的固定窗口:一个按分钟计量,一个按天计量。Webhook 没有按小时计量的窗口。(请求速率限制器是另一套系统,使用不同的窗口;两者不共享配额。)
  • 窗口按自然时间边界对齐,而非滑动窗口:分钟计数器在每分钟开始时重置,每日计数器在 UTC 每天开始时重置。
  • 超出限额时,事件会被丢弃。不会排队、延迟或重试:整个出站投递流程中都没有重试队列,也没有可接收 429 返回值的调用方。此次尝试会以投递状态 rate_limited 记录,因此事件丢失可查,不会悄无记录。
  • 限流器故障时会放行。如果限流器本身无法返回判断结果,仍会投递事件,不会丢弃。您不会因为计量器故障而丢失事件。

事件产生端唯一内置的数量控制是对 profile.updated 进行防抖:每个地点每 60 秒最多投递 1 次,在窗口开始时触发。对同一地点的快速连续编辑会合并为一个事件,而您收到的 changed_fields 仅描述开启该窗口的那次编辑。其他事件均不进行防抖。

由于投递在窗口开始时触发,您会在 60 秒窗口的开始时收到事件:如果收到事件后立即回读,只能看到第一次编辑。请在窗口关闭后,也就是事件发生至少 60 秒后,安排第二次回读,并定时核对地点数据,因为事件本身只尝试投递 1 次,不会重试。请参阅遗漏事件后的恢复处理。

配置

  1. 部署 HTTPS 端点。该端点必须可通过公网解析,具有有效证书,接受 POST,并在不到 5 秒内返回 2xx。私有地址和内部地址(环回地址、RFC-1918 地址、链路本地地址、云元数据 IP 地址)均不被接受。
  2. 在控制台的 Webhooks 页面上保存您的 webhooks URL。每个账户使用 1 个 URL,接收所有事件。
  3. 生成签名密钥并将其存储在您的服务器上。密钥仅显示 1 次。从此刻起,投递将附带签名,并且必须完成验证。
  4. 验证端点。平台会发送带签名的质询;您的端点需返回 nonce 的十六进制 HMAC。验证成功后,端点状态将变为已验证,并开始投递。有关确切的交互规范和可运行的代码,请参阅签名与验证。
  5. 处理事件。验证签名,将有效负载加入队列,然后返回 200。实际业务处理应在请求处理流程之外执行。有关超时时间、仅尝试 1 次的策略,以及重复投递和顺序方面的行为,请参阅投递行为。

后续阅读

  • 签名与验证:X-ListingsAPI-Signature 请求头、原始请求体规则和握手流程。
  • 投递行为:标准有效负载、5 秒超时时间、不进行重试的原因,以及所有投递状态。
  • 事件参考:全部 18 种事件的逐字段说明。