Webhooks overview
How the Listings API pushes account events to your server, which events exist, and the five gates every delivery has to clear.
Polling an API to find out that something changed is expensive and always a
little late. Webhooks invert it: when something happens on your account — a
review arrives, a location is edited, a Google Business post goes live — the
Listings API sends an HTTP POST with a JSON body to a URL you control, within
seconds.
There is one webhooks URL per account and no per-event subscription. If
webhooks are enabled for your account and your endpoint is verified, every
event listed on this page is delivered to that one URL. Branch on the event
field and ignore what you don't need.
The delivery pipeline
What you can receive
Eighteen events across six families. Each one maps to a resource you already manage through the REST API, so the webhook tells you when and the endpoint tells you what.
| Family | Events | Related REST resource |
|---|---|---|
listing.submission | 1 | Listings |
profile.* | 3 — created, updated, deleted | Locations |
connection.* | 6 — connected, disconnected, reauth, inaccessible, 2 × Google verification | Connected Accounts |
interaction.* | 2 — review, response | Reviews |
local_post.* | 4 — created, published, rejected, deleted | Posts |
review_analytics.* | 2 — daily and weekly snapshot | Analytics |
Full field tables and example payloads live in the event reference.
Not in scope
The platform emits other event families that the Listings API does not document or support, because they have no published REST surface here. They are listed so nothing looks accidentally missing:
- Review campaigns —
campaign.* - Rankings —
rankings.* - Social posts and boosts —
social_post.* - Social connections —
social_connection.* - AI post ideas —
idea.*,idea_series.*,idea_pipeline.*,idea_image.* - Google Business Profile ownership —
gbp_ownership.*
Two caveats worth reading before you build
Delivery gates
Delivery is gated on five things, checked in that order. The first gate that fails stops the delivery; later gates are never reached.
| # | Gate | If it fails |
|---|---|---|
| 1 | Your plan includes webhooks. An entitlement on the account. | Nothing is recorded. The event is simply not routed to you. |
| 2 | A webhooks URL is configured on the account. | Nothing is recorded. |
| 3 | Endpoint verification has passed — only enforced once a signing secret exists. | Recorded as endpoint_unverified. |
| 4 | The URL resolves to a public address (HTTPS, publicly-resolvable host). | Recorded as blocked_url. |
| 5 | You are inside your plan's webhook limit. | Recorded as rate_limited. The event is dropped, not queued. |
Plans and limits
Webhooks are an entitlement on paid plans — Launch, Growth and Enterprise. Trial accounts do not receive webhooks. The entitlement is attached to your plan, so it is granted or removed as part of a plan change rather than instantly: expect it to take effect on your next plan change or signup sync, not the moment you click upgrade. The dashboard's Webhooks page shows your live entitlement and caps.
Deliveries are also metered against a per-minute and a per-day cap, both scoped to your plan.
| Plan | Per-minute | Per-day |
|---|---|---|
| Launch | 10 | 7,200 |
| Growth | 50 | 36,000 |
| Enterprise | Unlimited | Unlimited |
Webhook caps mirror your plan's API request limits: the budget for events we send you equals the budget for requests you send us.
A cap only starts applying to your account once your plan's limits have been
synced to the delivery path. Until that has happened there is no cap to check,
so nothing is metered and nothing is dropped — a brand-new account can
therefore see unmetered delivery before it sees its plan's ceiling. Don't read
an absence of rate_limited as proof you are under the limit.
How the meter behaves:
- Two independent fixed windows — one per minute, one per day. There is no per-hour webhook window. (The request rate limiter is a different system with different windows; the two do not share a budget.)
- Windows are calendar-aligned, not sliding: the minute counter resets on the minute boundary, the daily counter on the UTC day boundary.
- On exceed the event is dropped. Not queued, not delayed, not retried —
there is no retry queue anywhere in the outbound path, and no caller to
return a
429to. The attempt is recorded with the delivery statusrate_limitedso the loss is visible rather than silent. - The limiter fails open. If the limiter itself cannot answer, the delivery goes out rather than being dropped. You will never lose an event to a broken meter.
The only built-in volume control on the producing side is a debounce on
profile.updated: at most one delivery per location per 60 seconds, on the
leading edge. Rapid edits to the same location collapse into a single event,
and the changed_fields you receive describe only the edit that opened the
window. Nothing else is debounced.
Setting it up
- Stand up an HTTPS endpoint. It must be publicly resolvable with a valid
certificate, accept
POST, and reply2xxin under 5 seconds. Private and internal addresses (loopback, RFC-1918, link-local, cloud metadata IPs) are refused. - Save your webhooks URL on the dashboard's Webhooks page. One URL per account, all events.
- Generate a signing secret and store it on your server. It is shown once. From this point deliveries are signed and verification is required.
- Verify the endpoint. The platform sends a signed challenge; your endpoint answers with a hex HMAC of the nonce. On success the endpoint flips to verified and deliveries begin. See signatures and verification for the exact contract and working code.
- Handle the events. Verify the signature, enqueue the payload, return
200. Do the real work off the request path — see delivery behavior for the timeout, the single-attempt policy, and what to expect around duplicates and ordering.
Where to go next
- Signatures and verification — the
X-ListingsAPI-Signatureheader, the raw-body rule, and the handshake. - Delivery behavior — the envelope, the 5-second timeout, why there are no retries, and every delivery status.
- Event reference — all 18 events, field by field.