Referencia de eventos
Los 26 eventos de webhook de Listings API, agrupados por recurso, con los campos exactos y un ejemplo de carga útil de cada uno.
26 eventos, agrupados por el recurso REST al que corresponden. Todos los eventos de esta página se envían a tu única URL de webhooks. No hay suscripciones por evento, así que selecciona la lógica que se ejecuta según event e ignora lo que no necesites.
Todos usan la carga útil estándar excepto listing.submission, que se describe más abajo. Los campos opcionales dentro de data se omiten cuando están vacíos, en lugar de enviarse como null.
Índice
Fichas
Se complementa con los endpoints de Fichas, en particular GET /locations/{locationId}/listings/premium, que devuelve los valores de syncStatus y listingUrl de cada cita que anuncia este evento.
listing.submission
Desencadenante: el envío de una cita para una ubicación a un sitio de directorio alcanza un estado final.
Nivel superior:
Dentro de 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"}Ubicaciones
Ciclo de vida de la ubicación, con una correspondencia 1:1 con createLocation, updateLocation y archiveLocations. El ámbito es una ubicación: location_id siempre es una cadena numérica.
profile.created
Desencadenante: se crea una ubicación.
{ "event": "profile.created", "timestamp": "2026-08-25T10:04:00Z", "account_id": 11073, "location_id": "901234", "data": { "source": "api" }}profile.updated
Desencadenante: se editan los datos de una ubicación existente.
Se limita a una entrega por ubicación cada 60 segundos, al inicio del intervalo. Las modificaciones dentro del intervalo se agrupan, no se retrasan. Nunca se entregan. Considera changed_fields una indicación sobre la modificación que inició el intervalo, no un conjunto completo de diferencias.
El evento llega al inicio del intervalo, por lo que, si vuelves a consultar la ubicación cuando llega, solo verás esa primera modificación. Programa una segunda consulta una vez que haya terminado el intervalo, al menos 60 segundos después, y reconcilia también las ubicaciones periódicamente, ya que este evento tiene un único intento de entrega y no se reintenta. Consulta cómo recuperarte de un evento perdido.
{ "event": "profile.updated", "timestamp": "2026-08-25T10:06:12Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user", "changed_fields": ["name", "phone"] }}profile.deleted
Desencadenante: se archiva una ubicación. Se trata de una eliminación lógica. No hay eliminación definitiva, y se puede cancelar el archivado con cancelArchiveLocations, que no emite ningún evento.
{ "event": "profile.deleted", "timestamp": "2026-08-25T10:20:44Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user" }}Cuentas conectadas
Ciclo de vida y estado de las conexiones de Google y Facebook, junto con los endpoints de Cuentas conectadas. Ámbito por ubicación. platform siempre es google o facebook; los demás proveedores no emiten estos eventos.
connected_account_id siempre está presente como clave, pero su valor es null en los dos eventos de verificación de Google.
connection.location_connected
Desencadenante: se vincula una ficha de Google o Facebook a una ubicación.
{ "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
Desencadenante: se desvincula una ficha de Google o Facebook de una ubicación.
{ "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
Desencadenante: se han invalidado las credenciales de la cuenta conectada. No se sincronizará nada a través de esta conexión hasta que alguien vuelva a autorizarla.
{ "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
Desencadenante: la cuenta conectada ya no puede acceder a la ficha de la ubicación. Es distinto de reauth_required: las credenciales pueden seguir siendo plenamente válidas, pero se ha retirado el acceso a esa ficha en particular.
{ "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
Desencadenante: el perfil de Google Business Profile de una ubicación supera la verificación.
{ "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
Desencadenante: una verificación de Google Business Profile termina en un fallo definitivo. Ninguna llamada REST inicia una verificación; el estado en sí se puede consultar, como se indica arriba.
Solo los estados finales emiten un evento: VERIFIED genera el evento _verified, y SUSPENDED o DUPLICATE (failure_type rejected) y ERROR_WHILE_FETCHING (transient) generan este evento. Los estados en curso (PENDING_VERIFICATION, UNDER_REVIEW, NOT_VERIFIED, NOT_CONNECTED) no producen ningún evento, por lo que la ausencia de un evento no indica nada. Consulta periódicamente googleVerificationStatus al leer una ubicación mientras haya una verificación en curso.
{ "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." }}Reseñas
Reseñas y respuestas, junto con los endpoints de Reseñas, incluidos responder, editar respuesta y archivar respuesta.
Las reseñas de la categoría Social se excluyen y nunca se entregan.
interaction.review
Desencadenante: se incorpora una reseña o esta cambia.
{ "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
Desencadenante: se publica, edita o archiva una respuesta a una reseña. Tiene la misma estructura que interaction.review, con dos diferencias: type es Response y parent_id apunta a la reseña a la que se responde.
Todos los demás campos indicados en interaction.review están presentes con el mismo significado.
{ "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" } }}Publicaciones
Publicaciones locales de Google Business Profile, junto con los endpoints de Publicaciones. El ámbito es la ubicación y location_id es una cadena numérica.
Los cuatro eventos comparten la misma estructura de data; los campos opcionales varían. Todos los campos opcionales se omiten cuando están vacíos.
local_post.created
Se activa cuando: se crea un elemento de publicación y se pone en cola para enviarlo a Google. Todavía no está publicado.
{ "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
Se activa cuando: Google ha aceptado la publicación y esta ya está disponible.
{ "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
Se activa cuando: Google ha rechazado la publicación o ha fallado el envío.
{ "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
Se activa cuando: se elimina el elemento de publicación.
{ "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
Publicación en redes sociales a nivel de marca y ciclo de vida de las conexiones, junto con los endpoints de Social. Nueve eventos: cinco para publicaciones y cuatro para conexiones.
account_id y timestamp están presentes como de costumbre. Los identificadores dentro de data son los mismos UUID sin formato adicional que usa la API REST, enviados como cadenas.
social_post.created
Se activa cuando: se crea una publicación en redes sociales. Solo se emite al crearla; editar una publicación existente no vuelve a emitir el 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
Se activa cuando: la publicación se ha completado correctamente. Este evento se emite solo si el resultado es completamente satisfactorio: al menos un canal ha publicado y ningún canal ha registrado un error. Una publicación parcial no lo emite; en ese caso se emite 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
Se activa cuando: falla la publicación. Se trata de un fallo de entrega, distinto de un rechazo editorial. Se emite en el último reintento, por lo que no se emite mientras queden intentos para la publicación.
items contiene solo los canales que registraron errores, por lo que una publicación que se haya publicado en dos plataformas y haya fallado en una tercera llega aquí 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
Se activa cuando: un flujo de aprobación ha rechazado la publicación. Es un rechazo editorial, no un fallo de entrega: la publicación nunca llegó a una plataforma.
{ "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
Se activa cuando: se ha archivado la publicación, ya sea mediante POST /social/posts/cancel o mediante el proceso programado de archivado. Solo se emite cuando hay una transición real, por lo que volver a archivar una publicación ya archivada no emite ningún 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
Se activa cuando: se ha activado un canal de una marca, ya sea mediante una primera conexión o al volver a conectar uno que se había archivado. is_reconnect distingue los dos casos.
{ "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
Se activa cuando: el canal se ha eliminado deliberadamente mediante una llamada a desconectar. Solo se emite cuando el canal se ha archivado realmente, por lo que una desconexión fallida no genera un evento falso.
{ "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
Se activa cuando: se ha perdido el canal involuntariamente: la plataforma ha invalidado el token o un proceso de conciliación ha detectado que ya no se puede acceder al canal. Nadie ha solicitado esta acción, lo que 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." }}Análisis de reseñas
Resúmenes programados de reseñas, un evento por ubicación y por período.
Ambos eventos comparten la misma estructura de data:
Una ubicación sin actividad durante el período no emite nada, pero tampoco recibes nada de una ubicación cuya instantánea nunca llegó. La ausencia de una instantánea es ambigua, y en esta familia la interpretación más benigna es la menos probable. Puede significar: ausencia de actividad; una entrega que falló o superó el tiempo de espera (hay un solo intento y ningún reintento); una entrega deshabilitada porque la cuenta no tiene habilitado el acceso a webhooks, no tiene una URL configurada, no está verificada o está bloqueada; o, lo más probable en este caso, que el límite por minuto descarte parte de la ráfaga como rate_limited.
Nunca registres un cero basándote en la ausencia de una instantánea. Contrasta los datos con GET /locations/{locationId}/review-analytics-overview para el mismo período y, si esa consulta también falla, indica que el período está no disponible en lugar de registrar un cero.
review_analytics.daily_snapshot
Desencadenante: la tarea de resumen diario, una vez por ubicación y por día.
{ "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
Desencadenante: la tarea de resumen semanal, una vez por ubicación y por semana. period es el primer día de la semana que se resume.
{ "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 }}Eventos que puedes recibir pero de los que no debes depender
La plataforma emite otras familias de eventos: campañas de reseñas, posiciones en los resultados de búsqueda, promociones de publicaciones en redes sociales, cambios de estado de cuentas publicitarias en redes sociales, ideas de publicaciones generadas por IA y propiedad de Google Business Profile. No tienen ningún endpoint REST publicado en la Listings API, no se documentan aquí y sus estructuras no están cubiertas por ninguna garantía de compatibilidad. Dado que hay una sola URL y no hay suscripciones por evento, tu manejador debe ignorar cualquier event que no reconozca y aun así devolver 200.