Référence des événements
Les 26 événements webhook de Listings API, regroupés par ressource, avec les champs exacts et un exemple de charge utile pour chacun.
Vingt-six événements, regroupés par ressource REST concernée. Chaque événement de cette page est envoyé à votre unique URL de webhooks. Il n'existe pas d'abonnement par événement : adaptez donc le traitement selon event et ignorez ce dont vous n'avez pas besoin.
Tous utilisent la charge utile standard, sauf listing.submission, décrit ci-dessous. Les champs facultatifs dans data sont omis lorsqu'ils sont vides, au lieu d'être envoyés avec la valeur null.
Index
Fiches
S'utilise avec les points de terminaison Fiches, en particulier GET /locations/{locationId}/listings/premium, qui renvoie les valeurs de syncStatus et de listingUrl par citation annoncées par cet événement.
listing.submission
Déclencheur : une soumission de citation pour un établissement sur un site d'annuaire atteint un état final.
Au premier niveau :
Dans 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"}Établissements
Cycle de vie de l'établissement, avec une correspondance 1:1 avec createLocation, updateLocation et archiveLocations. Portée limitée à l'établissement : location_id est toujours une chaîne numérique.
profile.created
Déclencheur : un nouvel établissement est créé.
{ "event": "profile.created", "timestamp": "2026-08-25T10:04:00Z", "account_id": 11073, "location_id": "901234", "data": { "source": "api" }}profile.updated
Déclencheur : les informations d'un établissement existant sont modifiées.
Envoi limité à une fois par établissement par période de 60 secondes, au début de la période. Les modifications effectuées pendant cette période sont regroupées, sans report de leur envoi. Elles ne sont jamais envoyées. Considérez changed_fields comme une indication sur la modification qui a ouvert la période, et non comme un relevé complet des différences.
L'événement arrive au début de la période : si vous relisez les données de l'établissement à sa réception, vous ne verrez donc que cette première modification. Planifiez une deuxième lecture après la fin de la période, au moins 60 secondes plus tard, et effectuez également un rapprochement périodique des données des établissements, car cet événement ne fait l'objet que d'une seule tentative d'envoi, sans nouvelle tentative. Voir récupération après un événement manqué.
{ "event": "profile.updated", "timestamp": "2026-08-25T10:06:12Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user", "changed_fields": ["name", "phone"] }}profile.deleted
Déclencheur : un établissement est archivé. Il s'agit d'une suppression logique. Il n'existe pas de suppression définitive, et un archivage peut être annulé avec cancelArchiveLocations, qui n'émet pas d'événement.
{ "event": "profile.deleted", "timestamp": "2026-08-25T10:20:44Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user" }}Comptes connectés
Cycle de vie et état des connexions Google et Facebook, en complément des endpoints Comptes connectés. Portée limitée à un établissement. platform vaut toujours google ou facebook ; les autres fournisseurs n'émettent pas ces événements.
La clé connected_account_id est toujours présente, mais sa valeur est null pour les deux événements de validation Google.
connection.location_connected
Déclencheur : une fiche Google ou Facebook est associée à un établissement.
{ "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
Déclencheur : une fiche Google ou Facebook est dissociée d'un établissement.
{ "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
Déclencheur : les identifiants du compte connecté ont été invalidés. Aucune synchronisation ne sera effectuée pour cette connexion tant qu'une personne ne l'aura pas autorisée à nouveau.
{ "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
Déclencheur : le compte connecté ne peut plus accéder à la fiche de l'établissement. Ce cas est distinct de reauth_required : les identifiants peuvent toujours être parfaitement valides, mais l'accès à cette fiche précise a été supprimé.
{ "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
Déclencheur : la fiche Google Business Profile d'un établissement est validée.
{ "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
Déclencheur : une validation Google Business Profile se termine par un échec. Aucun appel REST ne lance de validation ; le statut lui-même peut être consulté, comme indiqué ci-dessus.
Seuls les états finaux émettent un événement : VERIFIED déclenche l'événement _verified, et SUSPENDED ou DUPLICATE (failure_type rejected) ainsi que ERROR_WHILE_FETCHING (transient) déclenchent celui-ci. Les états en cours (PENDING_VERIFICATION, UNDER_REVIEW, NOT_VERIFIED, NOT_CONNECTED) ne produisent aucun événement ; l'absence d'événement ne permet donc aucune déduction. Consultez périodiquement googleVerificationStatus en lisant les données de l'établissement pendant qu'une validation est en cours.
{ "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." }}Avis
Avis et réponses, en complément des endpoints Avis, notamment répondre, modifier une réponse et archiver une réponse.
Les avis de la catégorie Social sont exclus par filtrage et ne sont jamais transmis.
interaction.review
Déclencheur : un avis est ingéré ou modifié.
{ "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
Déclencheur : une réponse à un avis est publiée, modifiée ou archivée. La structure est identique à celle de interaction.review, avec deux différences : type vaut Response et parent_id désigne l'avis auquel la réponse est apportée.
Tous les autres champs répertoriés sous interaction.review sont présents et ont la même signification.
{ "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" } }}Publications
Publications locales Google Business Profile, en complément des endpoints Posts. La portée est limitée à un établissement ; location_id est une chaîne numérique.
Les quatre événements partagent la même structure data ; les champs facultatifs diffèrent. Tous les champs facultatifs sont omis lorsqu’ils sont vides.
local_post.created
Déclencheur : un élément de publication est créé et mis en file d’attente pour être envoyé à Google. Il n’est pas encore en ligne.
{ "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
Déclencheur : Google a accepté la publication et elle est en ligne.
{ "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
Déclencheur : Google a rejeté la publication, ou son envoi a échoué.
{ "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
Déclencheur : l’élément de publication est supprimé.
{ "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
Publication sur les réseaux sociaux au niveau de la marque et cycle de vie des connexions, en complément des endpoints Social. Neuf événements : cinq pour les publications, quatre pour les connexions.
account_id et timestamp sont présents comme d’habitude. Les identifiants dans data sont les mêmes UUID sans transformation que ceux utilisés par l’API REST, transmis sous forme de chaînes.
social_post.created
Déclencheur : une publication sur les réseaux sociaux est créée. Uniquement à la création : la modification d’une publication existante ne déclenche pas de nouvelle émission.
{ "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
Déclencheur : la publication a été intégralement mise en ligne. Cet événement est émis uniquement en cas de réussite complète : au moins un canal a publié le contenu et aucun canal n’a rencontré d’erreur. Une mise en ligne partielle ne déclenche pas cet événement ; elle émet social_post.failed à la place.
{ "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
Déclencheur : la mise en ligne a échoué. Il s’agit d’un échec de transmission, distinct d’un rejet éditorial. Cet événement se déclenche lors de la dernière tentative ; il n’est donc pas émis tant qu’il reste des tentatives pour la publication.
items contient uniquement les canaux ayant rencontré une erreur ; ainsi, pour une publication mise en ligne sur deux plateformes et ayant échoué sur une troisième, cet événement contient un seul élément.
{ "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
Déclencheur : un processus d’approbation a rejeté la publication. Il s’agit d’un rejet éditorial, et non d’un échec de transmission : la publication n’a jamais atteint de plateforme.
{ "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
Déclencheur : la publication a été archivée, soit via POST /social/posts/cancel, soit par le traitement d’archivage planifié. Cet événement se déclenche uniquement lors d’un changement effectif d’état ; archiver à nouveau une publication déjà archivée n’émet donc aucun événement.
{ "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
Déclencheur : un canal de marque est devenu actif, à la suite d’une première connexion ou de la reconnexion d’un canal qui avait été archivé. is_reconnect permet de distinguer les deux cas.
{ "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
Déclencheur : le canal a été délibérément supprimé par un appel à disconnect. Cet événement est émis uniquement lorsque le canal a réellement été archivé ; une déconnexion qui a échoué ne produit donc pas d’événement erroné.
{ "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
Déclencheur : la connexion au canal a été perdue involontairement : la plateforme a invalidé le jeton, ou un traitement de rapprochement a constaté que le canal n’était plus accessible. Personne n’a demandé cette déconnexion, ce qui la distingue de 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." }}Analyse des avis
Synthèses planifiées des avis, un événement par établissement et par période.
Les deux événements utilisent la même structure pour data :
Un établissement sans activité pendant la période n’émet rien, mais vous ne recevez rien non plus si l’instantané d’un établissement n’a jamais été livré. L’absence d’un instantané est ambiguë, et pour cette famille, l’explication la moins préoccupante est la moins probable. Elle peut signifier : aucune activité ; une livraison qui a échoué ou dépassé le délai imparti (une seule tentative est effectuée, sans nouvelle tentative) ; une livraison désactivée parce que le compte ne dispose pas du droit d’accès aux webhooks, n’a aucune URL configurée, n’est pas vérifié ou est bloqué ; ou, cas le plus probable ici, le rejet d’une partie de la rafale par la limite par minute avec le statut rate_limited.
N’enregistrez jamais un zéro sur la seule base d’un instantané absent. Vérifiez les données auprès de GET /locations/{locationId}/review-analytics-overview pour la même période et, si cette lecture échoue également, indiquez que la période est indisponible plutôt que de lui attribuer la valeur zéro.
review_analytics.daily_snapshot
Déclencheur : la tâche de synthèse quotidienne, une fois par établissement et par jour.
{ "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
Déclencheur : la tâche de synthèse hebdomadaire, une fois par établissement et par semaine. period est le premier jour de la semaine couverte par la synthèse.
{ "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 }}Événements que vous pouvez recevoir, mais sur lesquels vous ne devez pas vous appuyer
La plateforme émet d’autres familles d’événements : campagnes de collecte d’avis, classements, promotions de publications sur les réseaux sociaux, changements de statut des comptes publicitaires sur les réseaux sociaux, idées de publications générées par l’IA et propriété des fiches Google Business Profile. Aucun endpoint REST n’est publié pour ces familles dans Listings API, elles ne sont pas documentées ici et leurs structures ne sont couvertes par aucune garantie de compatibilité. Comme il n’existe qu’une seule URL et aucun abonnement par événement, votre gestionnaire doit ignorer toute valeur de event qu’il ne reconnaît pas et renvoyer quand même 200.