Riferimento degli eventi
Tutti i 26 eventi webhook di Listings API, raggruppati per risorsa, con i campi esatti e un payload di esempio per ciascuno.
Ventisei eventi, raggruppati per la risorsa REST a cui si riferiscono. Ogni evento di questa pagina viene inviato al tuo unico URL per i webhook. Non sono previste sottoscrizioni per singolo evento, quindi gestisci gli eventi in base a event e ignora quelli che non ti servono.
Tutti usano il payload standard tranne listing.submission, descritto di seguito. I campi facoltativi all'interno di data vengono omessi quando sono vuoti, anziché essere inviati come null.
Indice
Schede
È associato agli endpoint delle schede, in particolare a GET /locations/{locationId}/listings/premium, che restituisce, per ogni citazione, i valori di syncStatus e listingUrl comunicati da questo evento.
listing.submission
Attivazione: l'invio di una citazione per una sede su un sito di directory raggiunge uno stato finale.
Livello principale:
All'interno di data:
{ "event": "listing.submission", "data": { "business_id": 279381, "v4_business_id": "TG9jYXRpb246Mjc5Mzgx", "location_id": "TG9jYXRpb246Mjc5Mzgx", "site": { "id": 42, "name": "Yelp", "url": "https://www.yelp.com" } }, "status": "success", "live_link": "https://www.yelp.com/biz/acme-dental-downtown"}Sedi
Ciclo di vita della sede, in corrispondenza 1:1 con createLocation, updateLocation e archiveLocations. L'ambito è la singola sede: location_id è sempre una stringa numerica.
profile.created
Attivazione: viene creata una nuova sede.
{ "event": "profile.created", "timestamp": "2026-08-25T10:04:00Z", "account_id": 11073, "location_id": "901234", "data": { "source": "api" }}profile.updated
Attivazione: vengono modificati i dettagli di una sede esistente.
Il debounce limita l'invio a una volta per sede ogni 60 secondi, all'inizio dell'intervallo. Le modifiche all'interno dell'intervallo vengono accorpate, non ritardate. Non vengono mai inviate. Considera changed_fields un'indicazione della modifica che ha aperto l'intervallo, non un diff completo.
L'evento arriva all'inizio dell'intervallo, quindi una lettura della sede al suo arrivo mostra solo la prima modifica. Pianifica una seconda lettura dopo la chiusura dell'intervallo, almeno 60 secondi dopo, ed esegui anche una riconciliazione periodica delle sedi, poiché per questo evento viene effettuato un solo tentativo di invio, senza ulteriori tentativi. Vedi come recuperare un evento mancato.
{ "event": "profile.updated", "timestamp": "2026-08-25T10:06:12Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user", "changed_fields": ["name", "phone"] }}profile.deleted
Attivazione: viene archiviata una sede. Si tratta di un'eliminazione logica. Non è prevista un'eliminazione definitiva e l'archiviazione può essere annullata con cancelArchiveLocations, che non genera alcun evento.
{ "event": "profile.deleted", "timestamp": "2026-08-25T10:20:44Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user" }}Account collegati
Ciclo di vita e stato delle connessioni a Google e Facebook, insieme agli endpoint Account collegati. Ambito limitato alla singola sede. platform è sempre google o facebook; gli altri provider non emettono questi eventi.
connected_account_id è sempre presente come chiave, ma ha valore null nei due eventi di verifica di Google.
connection.location_connected
Attivazione: una scheda Google o Facebook viene collegata a una sede.
{ "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" }}connection.location_disconnected
Attivazione: una scheda Google o Facebook viene scollegata da una sede.
{ "event": "connection.location_disconnected", "timestamp": "2026-08-25T14:35:02Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": "ba03bc4b-9f8c-4d3b-8e93-9628034c63cc" }}connection.reauth_required
Attivazione: le credenziali dell'account collegato sono state invalidate. Non verrà sincronizzato nulla per questa connessione finché qualcuno non la autorizzerà nuovamente.
{ "event": "connection.reauth_required", "timestamp": "2026-08-25T14:40:18Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": "ba03bc4b-9f8c-4d3b-8e93-9628034c63cc", "reason": "Google credentials are invalid. Please reconnect." }}connection.listing_inaccessible
Attivazione: l'account collegato non può più accedere alla scheda della sede. È un evento distinto da reauth_required: le credenziali possono essere ancora pienamente valide, ma l'accesso a quella specifica scheda è stato rimosso.
{ "event": "connection.listing_inaccessible", "timestamp": "2026-08-25T14:42:55Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "facebook", "connected_account_id": "cf12de77-2211-4a09-b7c1-0a6f3b2e91aa", "reason": "No longer has access to this listing." }}connection.google_verification_verified
Attivazione: il profilo Google Business Profile di una sede supera la verifica.
{ "event": "connection.google_verification_verified", "timestamp": "2026-08-25T14:50:00Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": null }}connection.google_verification_failed
Attivazione: una verifica di Google Business Profile raggiunge uno stato di errore definitivo. Nessuna chiamata REST avvia una verifica; lo stato stesso può essere letto, come indicato sopra.
Solo gli stati finali emettono un evento: VERIFIED genera l'evento _verified, mentre SUSPENDED o DUPLICATE (failure_type rejected) e ERROR_WHILE_FETCHING (transient) generano questo evento. Gli stati in corso (PENDING_VERIFICATION, UNDER_REVIEW, NOT_VERIFIED, NOT_CONNECTED) non producono alcun evento, quindi l'assenza di un evento non fornisce indicazioni. Leggi periodicamente googleVerificationStatus tramite una lettura della sede mentre una verifica è in corso.
{ "event": "connection.google_verification_failed", "timestamp": "2026-08-25T14:52:31Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": null, "failure_type": "rejected", "reason": "This profile is suspended." }}Recensioni
Recensioni e risposte, insieme agli endpoint Recensioni, inclusi rispondi, modifica risposta e archivia risposta.
Le recensioni nella categoria Social vengono escluse e non vengono mai consegnate.
interaction.review
Attivazione: una recensione viene acquisita o modificata.
{ "event": "interaction.review", "timestamp": "2026-08-25T09:12:44Z", "account_id": 11073, "location_id": "279381", "data": { "interaction": { "id": "6f8a1d20-3e11-4a55-9f7d-2b0c9e5a4471", "type": "Review", "content": "Friendly staff and no waiting.", "rating": 5, "title": null, "author_name": "Dana R.", "author_avatar": "https://lh3.googleusercontent.com/a/example", "date": "2026-08-25T08:58:02Z", "source": "google.com", "permalink": "https://maps.google.com/example-review", "category": "Review", "interaction_status": "unread", "parent_id": null, "interaction_request_id": "3c1e9b74-88a2-4d0e-9c31-77a1f0be5d92" } }}interaction.response
Attivazione: una risposta a una recensione viene pubblicata, modificata o archiviata. La struttura è la stessa di interaction.review, con due differenze: type è Response e parent_id fa riferimento alla recensione a cui si risponde.
Tutti gli altri campi elencati sotto interaction.review sono presenti con lo stesso significato.
{ "event": "interaction.response", "timestamp": "2026-08-25T09:30:07Z", "account_id": 11073, "location_id": "279381", "data": { "interaction": { "id": "b2d7c095-5f43-4e21-8a10-6d9c3f77e208", "type": "Response", "content": "Thanks Dana, see you next time!", "rating": null, "author_name": "Acme Dental Downtown", "date": "2026-08-25T09:29:55Z", "source": "google.com", "permalink": "https://maps.google.com/example-review", "category": "Review", "interaction_status": "responded", "parent_id": "6f8a1d20-3e11-4a55-9f7d-2b0c9e5a4471", "interaction_request_id": "3c1e9b74-88a2-4d0e-9c31-77a1f0be5d92" } }}Post
Post locali di Google Business Profile, insieme agli endpoint Post. L'ambito è la singola sede e location_id è una stringa numerica.
I quattro eventi condividono la stessa struttura data; i campi facoltativi variano. Tutti i campi facoltativi vengono omessi quando sono vuoti.
local_post.created
Attivazione: un elemento del post viene creato e messo in coda per l'invio a Google. Non è ancora pubblicato.
{ "event": "local_post.created", "timestamp": "2026-08-25T11:02:00Z", "account_id": 11073, "location_id": "279381", "data": { "post_id": 88421, "post_item_id": 5512309, "post_type": "STANDARD" }}local_post.published
Attivazione: Google ha accettato il post, che ora è pubblicato.
{ "event": "local_post.published", "timestamp": "2026-08-25T11:06:41Z", "account_id": 11073, "location_id": "279381", "data": { "post_id": 88421, "post_item_id": 5512309, "post_type": "STANDARD", "post_external_id": "accounts/123/locations/456/localPosts/789" }}local_post.rejected
Attivazione: Google ha rifiutato il post oppure l'invio non è riuscito.
{ "event": "local_post.rejected", "timestamp": "2026-08-25T11:07:15Z", "account_id": 11073, "location_id": "279381", "data": { "post_id": 88421, "post_item_id": 5512310, "post_type": "OFFER", "rejection_reason": "Rejected" }}local_post.deleted
Attivazione: l'elemento del post viene eliminato.
{ "event": "local_post.deleted", "timestamp": "2026-08-25T15:40:09Z", "account_id": 11073, "location_id": "279381", "data": { "post_id": 88421, "post_item_id": 5512309, "post_type": "STANDARD", "post_external_id": "accounts/123/locations/456/localPosts/789" }}Social
Pubblicazione sui social a livello di brand e ciclo di vita delle connessioni, insieme agli endpoint Social. Nove eventi: cinque per i post, quattro per le connessioni.
account_id e timestamp sono presenti come di consueto. Gli ID all'interno di data sono gli stessi UUID semplici usati dall'API REST, inviati come stringhe.
social_post.created
Attivazione: viene creato un post social. Solo alla creazione: la modifica di un post esistente non genera nuovamente l'evento.
{ "event": "social_post.created", "timestamp": "2026-09-28T14:02:11Z", "account_id": 62570, "location_id": null, "data": { "post_id": "c47a1e58-2b93-4f10-a6d7-58e0c9b12345", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "scheduled", "created_by": 40122, "platform_ids": [1, 2, 4] }}social_post.published
Attivazione: il post è stato pubblicato con esito completamente positivo. Questo evento viene emesso solo se l'operazione riesce completamente: almeno un canale ha pubblicato il post e nessun canale ha riscontrato errori. Una pubblicazione parziale non genera questo evento: in quel caso viene invece emesso social_post.failed.
{ "event": "social_post.published", "timestamp": "2026-10-02T13:30:07Z", "account_id": 62570, "location_id": null, "data": { "post_id": "c47a1e58-2b93-4f10-a6d7-58e0c9b12345", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "published", "published_on": "2026-10-02T13:30:04", "items": [ { "platform": "instagram", "social_platform_id": 2, "connected_account_id": "b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7", "published_url": "https://www.instagram.com/p/CxYz1234abc/", "vendor_post_id": "18029384756012345", "status": "success" } ] }}social_post.failed
Attivazione: la pubblicazione non è riuscita. Si tratta di un errore di consegna, distinto da un rifiuto editoriale. L'evento viene generato all'ultimo tentativo, quindi non viene emesso finché restano altri tentativi per il post.
items contiene solo i canali che hanno riscontrato errori, quindi un post pubblicato su due piattaforme ma non su una terza arriva qui con un solo elemento.
{ "event": "social_post.failed", "timestamp": "2026-10-02T13:34:55Z", "account_id": 62570, "location_id": null, "data": { "post_id": "c47a1e58-2b93-4f10-a6d7-58e0c9b12345", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "failed", "items": [ { "platform": "linkedin", "social_platform_id": 4, "status": "error", "reason": "Authorization expired", "vendor_error": "The access token is no longer valid." } ] }}social_post.rejected
Attivazione: un flusso di approvazione ha rifiutato il post. Si tratta di un rifiuto editoriale, non di un errore di consegna: il post non ha mai raggiunto una piattaforma.
{ "event": "social_post.rejected", "timestamp": "2026-09-29T09:11:03Z", "account_id": 62570, "location_id": null, "data": { "post_id": "e08b2d97-6f14-4c22-b7a5-9d3e1f6c4a70", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "rejected", "rejection_reason": "Please use the updated product name." }}social_post.deleted
Attivazione: il post è stato archiviato tramite POST /social/posts/cancel o dalla procedura di archiviazione pianificata. L'evento viene generato solo quando lo stato cambia effettivamente, quindi archiviare di nuovo un post già archiviato non genera alcun evento.
{ "event": "social_post.deleted", "timestamp": "2026-09-30T16:20:41Z", "account_id": 62570, "location_id": null, "data": { "post_id": "e08b2d97-6f14-4c22-b7a5-9d3e1f6c4a70", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "archived", "archived_at": "2026-09-30T16:20:39" }}social_connection.connected
Attivazione: un canale del brand è diventato attivo, tramite una prima connessione o la riconnessione di un canale precedentemente archiviato. is_reconnect distingue i due casi.
{ "event": "social_connection.connected", "timestamp": "2026-09-27T11:05:22Z", "account_id": 62570, "location_id": null, "data": { "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "connected_account_id": "b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7", "platform": "instagram", "display_name": "Jenny Home", "is_reconnect": false }}social_connection.disconnected
Attivazione: il canale è stato rimosso intenzionalmente con una chiamata a disconnect. L'evento viene emesso solo quando il canale è stato effettivamente archiviato, quindi una disconnessione non riuscita non genera un falso evento.
{ "event": "social_connection.disconnected", "timestamp": "2026-10-04T08:47:10Z", "account_id": 62570, "location_id": null, "data": { "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "connected_account_id": "b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7", "platform": "instagram", "display_name": "Jenny Home" }}social_connection.archived
Attivazione: la connessione al canale è stata persa involontariamente: la piattaforma ha invalidato il token oppure una procedura di riconciliazione ha rilevato che il canale non era più raggiungibile. Nessuno ha richiesto questa disconnessione, ed è questo che la distingue da disconnected.
{ "event": "social_connection.archived", "timestamp": "2026-10-06T02:15:33Z", "account_id": 62570, "location_id": null, "data": { "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "connected_account_id": "2d4e6f80-1c33-4b7a-8e05-9a1b2c3d4e5f", "platform": "facebook", "display_name": "Jenny Home & Co.", "reason": "Access token has been invalidated by the platform." }}Analisi delle recensioni
Riepiloghi programmati delle recensioni, un evento per sede per periodo.
Entrambi gli eventi condividono la stessa struttura di data:
Una sede senza attività nel periodo non genera alcun evento, ma non ne ricevi nemmeno per una sede la cui istantanea non è mai arrivata. L'assenza di un'istantanea è ambigua e, per questa famiglia di eventi, l'interpretazione innocua è la meno probabile. Può significare: nessuna attività; una consegna non riuscita o scaduta per timeout (è previsto un solo tentativo, senza ulteriori tentativi); una consegna disabilitata perché l'account non dispone dell'abilitazione ai webhook, non ha un URL configurato, non è verificato o è bloccato; oppure, come è più probabile in questo caso, il limite al minuto che scarta parte della raffica come rate_limited.
Non registrare mai uno zero basandoti sull'assenza di un'istantanea. Verifica i dati tramite GET /locations/{locationId}/review-analytics-overview per lo stesso periodo e, se anche quella lettura non riesce, indica il periodo come non disponibile anziché come zero.
review_analytics.daily_snapshot
Attivazione: il processo di riepilogo giornaliero, una volta per sede al giorno.
{ "event": "review_analytics.daily_snapshot", "timestamp": "2026-08-25T02:00:00Z", "account_id": 11073, "location_id": "279381", "data": { "period": "2026-08-24", "granularity": "daily", "total_reviews": 1240, "new_reviews_in_period": 3, "average_rating": 4.6667, "previous_average_rating": 5.0 }}review_analytics.weekly_snapshot
Attivazione: il processo di riepilogo settimanale, una volta per sede alla settimana. period è il primo giorno della settimana riepilogata.
{ "event": "review_analytics.weekly_snapshot", "timestamp": "2026-08-24T02:00:00Z", "account_id": 11073, "location_id": "279381", "data": { "period": "2026-08-17", "granularity": "weekly", "total_reviews": 1237, "new_reviews_in_period": 18, "average_rating": 4.6123, "previous_average_rating": 4.5901 }}Eventi che potresti ricevere ma su cui non dovresti basare la tua integrazione
La piattaforma genera altre famiglie di eventi: campagne di recensioni, posizionamenti, promozioni di post sui social, modifiche dello stato degli account pubblicitari sui social, idee per post generate dall'IA e proprietà di Google Business Profile. Non hanno un endpoint REST pubblicato nella Listings API, non sono documentate qui e le loro strutture non sono coperte da alcuna garanzia di compatibilità. Poiché esiste un solo URL e non è prevista una sottoscrizione per singolo evento, il tuo gestore dovrebbe ignorare qualsiasi event che non riconosce e restituire comunque 200.