Reseñas

Cada endpoint de reseñas con ejemplos cURL, Python y Node: fuentes, ajustes, lista, resumen, detalles, responder, editar, archivar, frases y analítica.

Las reseñas son las valoraciones con estrellas y los comentarios que los clientes dejan en Google, Facebook y Yelp. La API almacena una copia de cada reseña, te permite responder y calcula analíticas de reseñas. Las rutas REST usan reviews; las claves de respuesta y los títulos de las páginas de referencia usan interactions, el antiguo nombre interno del mismo objeto. Esta guía usa el término reseña en todo momento. Las operaciones de lectura necesitan una clave Read (lectura). Responder, editar, archivar y cambiar la configuración requieren una clave Write (escritura); usar una clave Read en una operación de escritura devuelve 400 con SY90016.

Resumen de endpoints

MétodoRutaQué haceReferencia
GET/reviews/site-configFuentes de reseñas permitidas por el plan de la cuenta.Lista las fuentes de reseñas de una cuenta
GET/locations/{locationId}/reviews/settingsFuentes configuradas para una ubicación.Lista las fuentes de reseñas de una ubicación
POST/locations/reviews/settings/editEstablece las fuentes de una ubicación y el umbral de valoración positiva.Edita la configuración de reseñas
GET/locations/{locationId}/reviewsLista paginada mediante cursor de las reseñas de una ubicación.Lista las reseñas
GET/rollup_interactionsLista paginada mediante cursor que abarca todas las ubicaciones.Obtén las reseñas de todas las ubicaciones
GET/reviewDetailsCopias actualizadas de reseñas por id, con sus respuestas.Obtén reseñas por sus ids
Referencia de campos de los objetos de reseña y respuesta.Atributos de las reseñas
POST/locations/reviews/respondPublica una respuesta del propietario.Responde a una reseña
POST/locations/reviews/respond/editCambia el texto de una respuesta.Edita una respuesta
POST/locations/reviews/respond/archiveDeja de hacer seguimiento de una respuesta.Archiva una respuesta
GET/review-phrasesFrases que los clientes repiten, con estadísticas.Lista las frases de las reseñas
GET/locations/{locationId}/review-analytics-overviewCuatro indicadores clave con variaciones entre períodos.Resumen de la analítica de reseñas
GET/locations/{locationId}/review-analytics-timelineRecuento diario y valoración media.Evolución temporal de la analítica de reseñas
GET/locations/{locationId}/review-analytics-sites-statsValoración, volumen y antigüedad de las reseñas más recientes por fuente.Analítica de reseñas por sitio

Lista las fuentes de reseñas que permite tu plan

GET /reviews/site-config devuelve el catálogo de plataformas de reseñas al que tiene acceso la cuenta. No acepta parámetros y su alcance es la cuenta, así que almacena el resultado en caché en lugar de llamarlo para cada ubicación. Los valores de siteUrl son los nombres de host que acepta cualquier otro filtro de este recurso.

NombreEnObligatorioNotas
ningunoSin parámetros.
Account sources
curl https://listingsapi.com/api/v4/reviews/site-config \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionSiteConfig": [      { "site": "Google", "siteUrl": "maps.google.com" },      { "site": "Facebook", "siteUrl": "facebook.com" },      { "site": "Yelp", "siteUrl": "yelp.com" }    ]  }}

Lee data.interactionSiteConfig[]. El ejemplo corresponde a una cuenta con el plan Launch; el conjunto exacto depende del plan y del sector. Usa siteUrl para el filtro siteUrls en los endpoints de listado y para siteUrls[].name al editar la configuración.

Lista las fuentes configuradas para una ubicación

GET /locations/{locationId}/reviews/settings devuelve una entrada por cada plataforma admitida por el plan, con la URL de la que se obtienen las reseñas. Es la contraparte de lectura del endpoint de edición que aparece a continuación. La ruta acepta el id en base64 o el número sin codificar.

NombreEnObligatorioNotas
locationIdpathSíId Relay en base64 o databaseId numérico.
Location sources
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/reviews/settings \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsSetting": {      "siteSettings": [        { "name": "maps.google.com", "url": null },        { "name": "facebook.com", "url": null },        { "name": "yelp.com", "url": null }      ]    }  }}

Lee data.interactionsSetting.siteSettings[]. Un valor de url distinto de null significa que la plataforma está conectada y que se están obteniendo reseñas de esa página. Un valor null en url significa que la plataforma está disponible pero no está configurada. Google y Facebook se rellenan automáticamente cuando conectas esas cuentas mediante OAuth y no se pueden sobrescribir mediante el endpoint de edición. Yelp debe especificarse explícitamente.

Edita la configuración de reseñas de una ubicación

POST /locations/reviews/settings/edit establece en qué fuentes se supervisa una ubicación y la valoración con estrellas que se considera positiva. Los campos van directamente en el cuerpo, no dentro de un contenedor input. Añadir una fuente pone en cola una extracción de datos, por lo que las reseñas del nuevo sitio llegan más tarde, no en esta respuesta.

NombreEnObligatorioNotas
locationIdbodySíSolo id Relay en base64. Un id numérico en el cuerpo provoca un error SY90002.
siteUrlsbodyNoEl conjunto completo de fuentes, como pares de name y url. Sustituye la selección actual.
siteUrls[].namebodyNoClave del sitio obtenida de siteSettings[].name, como maps.google.com o yelp.com.
siteUrls[].urlbodyNoLa página de la ubicación en ese sitio. Usar null u omitir el campo detiene la supervisión de una fuente que necesita una URL.
positiveInteractionThresholdbodyNoValoración a partir de la cual una reseña se considera positiva. Si se envía sola, deja las fuentes sin cambios.
Edit settings
curl -X POST https://listingsapi.com/api/v4/locations/reviews/settings/edit \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "locationId": "TG9jYXRpb246MTgwMDI4OQ==",  "positiveInteractionThreshold": 4,  "siteUrls": [    { "name": "maps.google.com", "url": null },    { "name": "yelp.com", "url": "https://www.yelp.com/biz/blue-bottle-coffee-oakland" }  ]}'
JSON
{  "data": {    "editInteractionsSetting": {      "errors": null,      "interactionSetting": {        "locationId": "1800289",        "positiveInteractionThreshold": 4,        "siteSettings": [          { "name": "maps.google.com", "url": null, "monitored": true, "canRespond": true },          { "name": "yelp.com", "url": "https://www.yelp.com/biz/blue-bottle-coffee-oakland", "monitored": true, "canRespond": false }        ]      }    }  }}

Lee data.editInteractionsSetting.interactionSetting.siteSettings[] para consultar la selección almacenada. monitored indica que la fuente está activa; canRespond indica si se pueden publicar respuestas del propietario allí mediante la API. Una fuente rechazada por la validación, como una URL inaccesible o un sitio no incluido en el plan, se devuelve en errors sin cambios en la configuración, así que comprueba errors cuando recibas un 200. Los SDK lanzan ValidationError en ese caso.

Listar las reseñas de una ubicación

GET /locations/{locationId}/reviews es una conexión con cursores en data.interactions, ordenada de más reciente a más antigua. first tiene un valor predeterminado de 20, por lo que una sola llamada nunca devuelve el historial completo. Los filtros de tipo array son cadenas JSON en la cadena de consulta y deben codificarse para URL; el ejemplo de cURL usa -G con --data-urlencode para ello.

NombreEnObligatorioNotas
locationIdpathSíIdentificador Relay en Base64 o databaseId numérico.
first, afterqueryNoPaginación hacia adelante. Pasa pageInfo.endCursor como after.
last, beforequeryNoPaginación hacia atrás. pageInfo no tiene startCursor, así que pasa el cursor del primer elemento edge.
siteUrlsqueryNoArray JSON de nombres de host, por ejemplo, ["maps.google.com"].
ratingFiltersqueryNoArray JSON de valoraciones en estrellas, por ejemplo, [1,2].
responseStatusqueryNoArray JSON: ["PENDING"] o ["RESPONDED"].
sortOrderqueryNoArray JSON: ["NEWEST_FIRST"], ["OLDEST_FIRST"] o ["LAST_RESPONDED"].
startDate, endDatequeryNoYYYY-MM-DD, cadenas simples.
searchStringqueryNoBúsqueda de texto completo en el cuerpo de la reseña.

Además de los parámetros opcionales category, categories y ratingFilter, este último de un solo valor, que se indican en la página de referencia.

List reviews
curl -G "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/reviews" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'ratingFilters=[1,2]' \--data-urlencode 'responseStatus=["PENDING"]' \--data-urlencode 'sortOrder=["NEWEST_FIRST"]' \--data-urlencode 'first=25'
JSON
{  "data": {    "interactions": {      "pageInfo": { "hasNextPage": true, "endCursor": "SW50ZXJhY3Rpb246MV8xNTU0..." },      "edges": [        {          "node": {            "id": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",            "source": "maps.google.com",            "content": "nice place for family together",            "authorName": "vaibhav nakate",            "rating": 5,            "date": "2019-04-02T22:11:13.036997+00:00",            "type": "Review",            "responded": false,            "responseCount": 0,            "canRespond": true,            "permalink": "https://maps.google.com/maps?cid=..."          },          "cursor": "SW50ZXJhY3Rpb246MV8xNTU0..."        }      ],      "totalCount": 425    }  }}

Lee edges[].node. id es lo que pasas al responder, y canRespond indica si esa fuente acepta respuestas del propietario. totalCount es el número de coincidencias en todo el conjunto de resultados, no en esta página. Deja de paginar cuando hasNextPage sea false o una página devuelva edges vacío; si un límite coincide con la reseña más antigua, le sigue una página vacía.

FiltroValores
responseStatusRESPONDED, PENDING
sortOrderNEWEST_FIRST, OLDEST_FIRST, LAST_RESPONDED
categoryREVIEW, además de otras categorías disponibles para cada cuenta

Recorrer todas las ubicaciones con el agregado

GET /rollup_interactions es la misma conexión con cursores para todas las ubicaciones a las que la clave tiene acceso, en data.rollupInteractions, con un locationId numérico en cada nodo. Acepta los mismos filtros que la lista por ubicación. No hay ningún filtro de ubicación; un argumento locationIds se ignora, no se rechaza. Ninguno de los 2 SDK ofrece todavía un método para este endpoint, así que los ejemplos usan requests y fetch.

NombreEnObligatorioNotas
tagqueryNoEtiqueta de ubicación a la que limitar el alcance. El valor predeterminado es all. Omítela salvo que etiquetes las ubicaciones.
first, after, last, beforequeryNoPaginación con cursores, como en el endpoint de listado.
siteUrls, ratingFilters, responseStatus, sortOrderqueryNoArrays JSON codificados para URL, con los mismos valores que el endpoint de listado.
startDate, endDate, searchStringqueryNoIgual que en el endpoint de listado.
Account rollup
curl -G "https://listingsapi.com/api/v4/rollup_interactions" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'responseStatus=["PENDING"]' \--data-urlencode 'sortOrder=["NEWEST_FIRST"]' \--data-urlencode 'first=50'
JSON
{  "data": {    "rollupInteractions": {      "pageInfo": { "hasNextPage": true, "hasPreviousPage": false },      "edges": [        {          "node": {            "id": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",            "source": "maps.google.com",            "content": "Excellent service, highly recommend.",            "rating": 5,            "responded": false,            "canRespond": true,            "locationId": 1800289          },          "cursor": "SW50ZXJhY3Rpb246OWUyNmQyYTg="        }      ],      "totalCount": 1284    }  }}

Agrupa los nodos por locationId, el databaseId del establecimiento. El pageInfo del agregado puede omitir endCursor, así que usa el cursor del último elemento edge como after; los 2 valores son equivalentes. Limita las ejecuciones programadas con startDate y endDate en lugar de volver a leer el historial, y respeta Retry-After cuando recibas un 429.

Obtener reseñas por id

GET /reviewDetails devuelve copias actualizadas de las reseñas almacenadas sin paginación. La respuesta es un array simple en data.interactionDetails.interactions, sin edges ni pageInfo, y cada reseña incluye su responses. Úsalo para volver a cargar los datos de una lista de seguimiento y para encontrar el responseId que necesitas para editar o archivar.

NombreEnObligatorioNotas
interactionIdsquerySíArray JSON de UUID de reseñas, codificado para URL. Si lo omites, se devuelve SY90006.
Details by id
curl -G "https://listingsapi.com/api/v4/reviewDetails" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'interactionIds=["b2fa765e-c62b-4e0b-b1d6-1c67c855f5e0"]'
JSON
{  "data": {    "interactionDetails": {      "interactions": [        {          "id": "b2fa765e-c62b-4e0b-b1d6-1c67c855f5e0",          "source": "maps.google.com",          "content": "Great place for dessert!",          "rating": 5,          "responded": true,          "responseCount": 1,          "canRespond": true,          "responses": [            {              "id": "2090753a-ece6-4837-8336-8494ad308523",              "content": "Thank you so much for the kind words!",              "interactionStatus": "CONFIRMED",              "editedResponse": false            }          ]        }      ]    }  }}

responses[].id es el responseId para los endpoints de edición y archivado. Si pasas un id de otra cuenta, el endpoint devuelve 200 con interactionDetails: null y un error SY90001, así que comprueba si hay null antes de acceder por índice.

Campos de reseñas y respuestas

La referencia de atributos es una página exclusivamente de documentación que enumera todos los campos de los objetos de reseña y de respuesta. Los campos que más usarás:

CampoTipoSignificado
id, interactionIdstringEl mismo UUID; pásalo como interactionId al responder.
sourcestringNombre de host del sitio, como maps.google.com.
content, authorName, rating, datemixedTexto del cuerpo, autor de la reseña, de 1 a 5 estrellas, marca de tiempo ISO 8601.
typestringReview, Question, Comment, Recommendation, Post, Photo, Message o Response.
categorystringCategoría general, Review o Social.
responded, responseCount, responsesmixedSi existe una respuesta del propietario, cuántas hay y los objetos de respuesta.
canRespondbooleanSi se puede publicar una respuesta en esta fuente a través de la API.
permalinkstringEnlace a la reseña en el sitio de origen.
locationIdintegerdatabaseId numérico de la ubicación.

Cada respuesta en responses[] incluye id, content, authorName, date, interactionStatus, editedResponse, respondedWith (id de la plantilla) y remarks (detalle del fallo). interactionStatus pasa por estos estados:

EstadoSignificado
CREATEDAceptada y puesta en cola para la plataforma de publicación.
COMPLETEDPublicada en la plataforma de publicación. Algunas plataformas se detienen aquí.
CONFIRMEDPublicada y confirmada por la plataforma de publicación.
FAILEDLa plataforma de publicación la rechazó. remarks indica el motivo.

Publicar una respuesta del propietario

POST /locations/reviews/respond publica una respuesta pública en la plataforma de origen. Los campos van directamente en el cuerpo. La respuesta se acepta de inmediato y se entrega de forma asíncrona, por lo que interactionStatus comienza en CREATED. Comprueba primero canRespond en la reseña.

NombreEnObligatorioNotas
interactionIdbodySíEl id de la reseña.
responseContentbodySíTexto de la respuesta.
respondedWithbodyNoid de la plantilla de respuesta, si la respuesta procede de una plantilla.
Respond
curl -X POST https://listingsapi.com/api/v4/locations/reviews/respond \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "interactionId": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",  "responseContent": "Thank you for visiting Jenny Home: we are glad you enjoyed your experience!"}'
JSON
{  "data": {    "respondToInteraction": {      "interaction": {        "id": "2090753a-ece6-4837-8336-8494ad308523",        "interactionId": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",        "content": "Thank you for visiting Jenny Home: we are glad you enjoyed your experience!",        "interactionStatus": "CREATED",        "editedResponse": false      },      "errors": null    }  }}

Conserva interaction.id: es el responseId para editar y archivar. Una respuesta rechazada se devuelve como 200 con errors rellenado dentro de data.respondToInteraction, así que lee el cuerpo; los SDK lanzan ValidationError. Vuelve a leer la reseña por su id tras una breve espera para ver si la respuesta alcanza COMPLETED o CONFIRMED.

Editar una respuesta

POST /locations/reviews/respond/edit cambia el texto de una respuesta existente. La edición se vuelve a enviar a la plataforma, por lo que interactionStatus vuelve a CREATED y editedResponse pasa a ser true una vez que se aplica. Da preferencia a esta opción frente a archivar y volver a publicar en las plataformas que permiten una sola respuesta.

NombreEnObligatorioNotas
reviewIdbodySíEl id de la reseña.
responseIdbodySíEl id de la respuesta obtenido de responses[].
responseContentbodySíNuevo texto de la respuesta.
templateIdbodyNoid de la plantilla de respuesta a la que se debe reasignar la respuesta.
Edit reply
curl -X POST https://listingsapi.com/api/v4/locations/reviews/respond/edit \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "reviewId": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",  "responseId": "2090753a-ece6-4837-8336-8494ad308523",  "responseContent": "Thank you again: we have updated our reply to include our new store hours."}'
JSON
{  "data": {    "editResponse": {      "status": "true",      "reviewId": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",      "responseId": "2090753a-ece6-4837-8336-8494ad308523"    }  }}

status es la cadena "true" cuando se acepta la edición. Confirma el nuevo texto con una llamada de consulta de detalles y comprueba el interactionStatus de la respuesta.

Archivar una respuesta

POST /locations/reviews/respond/archive elimina una respuesta del responses de la reseña que mantenemos en nuestro sistema. Es una eliminación lógica: una respuesta que ya esté publicada en Google, Yelp o Facebook permanece allí. Úsalo para eliminar un borrador que haya fallado o se haya sustituido; usa la edición para cualquier respuesta publicada.

NombreEnObligatorioNotas
responseIdbodySíEl id de la respuesta obtenido de responses[].
Archive reply
curl -X POST https://listingsapi.com/api/v4/locations/reviews/respond/archive \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "responseId": "2090753a-ece6-4837-8336-8494ad308523" }'
JSON
{  "data": {    "archiveResponse": {      "status": "true"    }  }}

Tras archivar, el responseCount de la reseña disminuye y responded refleja las respuestas restantes.

Listar las frases que repiten los clientes

GET /review-phrases devuelve un array simple en data.newReviewPhrases, con una entrada por frase recurrente y estadísticas calculadas únicamente sobre las reseñas que la contienen. No está paginado; limítalo con phraseCount. Todos los filtros son opcionales y se pueden combinar, por lo que ratingFilters=[1,2] con un startDate devuelve las quejas del último trimestre.

NombreEnObligatorioNotas
locationIdsqueryNoArray JSON de ids numéricos de ubicaciones, por ejemplo, [1800289]. Omítelo para incluir todas las ubicaciones que la clave pueda leer.
siteUrlsqueryNoArray JSON de nombres de host.
startDate, endDatequeryNoYYYY-MM-DD.
ratingFiltersqueryNoArray JSON de valoraciones en estrellas.
responseStatusqueryNoArray JSON de RESPONDED o PENDING.
sortOrderqueryNoNEWEST_FIRST, OLDEST_FIRST, LAST_RESPONDED, LOWEST_RATING o HIGHEST_RATING.
phraseCountqueryNoNúmero máximo de frases que se devolverán.
searchStringqueryNoSolo frases que contengan esta subcadena.

Además del parámetro opcional categories y los parámetros obsoletos de un solo valor category y ratingFilter que figuran en la página de referencia.

Phrases
curl -G "https://listingsapi.com/api/v4/review-phrases" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'locationIds=[1800289]' \--data-urlencode 'ratingFilters=[1,2]' \--data-urlencode 'startDate=2026-06-01' \--data-urlencode 'endDate=2026-08-31' \--data-urlencode 'phraseCount=10'
JSON
{  "data": {    "newReviewPhrases": [      {        "reviewPhrase": "friendly staff",        "phraseStats": {          "stats": [            { "name": "total-reviews", "value": 46, "delta": 12.5, "abs": 5 },            { "name": "overall-rating", "value": 4.7, "delta": 1.1, "abs": 0.05 }          ]        }      },      {        "reviewPhrase": "long wait",        "phraseStats": {          "stats": [            { "name": "total-reviews", "value": 11, "delta": 37.5, "abs": 3 },            { "name": "overall-rating", "value": 2.9, "delta": -8.4, "abs": -0.27 }          ]        }      }    ]  }}

total-reviews es la frecuencia con la que aparece la frase, overall-rating es la valoración media de esas reseñas, delta es la variación porcentual respecto al período anterior y abs es la variación absoluta. Un 403 con SY90003 significa que la clave no puede leer una de las ubicaciones solicitadas.

Consultar los KPI de reseñas de una ubicación

GET /locations/{locationId}/review-analytics-overview devuelve cuatro estadísticas en data.interactionsAnalyticsStats.stats. El intervalo de fechas es opcional; acota el período sobre el que se calculan los valores y sus variaciones. Cada delta es la variación porcentual respecto al período anterior de la misma duración.

NombreEnObligatorioNotas
locationIdpathSíid de Relay en Base64 o databaseId numérico.
startDate, endDatequeryNoYYYY-MM-DD. Aquí es opcional, a diferencia de la cronología.
Overview
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-overview?startDate=2026-08-01&endDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsAnalyticsStats": {      "stats": [        { "name": "total-reviews", "value": 128, "delta": 6.67 },        { "name": "new-reviews", "value": 9, "delta": -25 },        { "name": "overall-rating", "value": 4.43, "delta": 2.31 },        { "name": "review-response-rate", "value": 62.5, "delta": 12.5 }      ]    }  }}
namevalueInterprétalo como
total-reviewsrecuentoTodas las reseñas de la ubicación.
new-reviewsrecuentoReseñas recibidas en el período.
overall-ratingDe 1 a 5Valoración media en estrellas.
review-response-rateporcentajeProporción de reseñas con una respuesta del propietario.

Una cuenta nueva sin período anterior muestra un delta de 100, así que no interpretes las variaciones del primer mes como crecimiento.

Obtén la cronología diaria de reseñas

GET /locations/{locationId}/review-analytics-timeline devuelve una entrada por día en data.interactionsChartData.data. Pasa startDate y endDate siempre que el intervalo del gráfico sea importante; si los omites, el servicio elige su propio intervalo. Añade site para representar una sola fuente por separado.

NombreEnObligatorioNotas
locationIdpathSíID Relay en Base64 o databaseId numérico.
startDate, endDatequeryNoYYYY-MM-DD. Pasa ambos para obtener un intervalo predecible.
sitequeryNoUn nombre de host de siteSettings[].name, como maps.google.com. Ninguno de los dos SDK lo expone; usa la llamada REST.
Timeline
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-timeline?startDate=2026-08-01&endDate=2026-08-31&site=maps.google.com" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsChartData": {      "data": [        { "date": "2026-08-01", "interactionCount": 4, "averageRating": 4.5 },        { "date": "2026-08-02", "interactionCount": 0, "averageRating": null },        { "date": "2026-08-03", "interactionCount": 7, "averageRating": 4.285714285714286 }      ]    }  }}

Representa interactionCount con barras y averageRating con una línea. La media corresponde únicamente a ese día, no es acumulada, y es null en los días sin reseñas, así que deja un hueco en lugar de representar un cero.

Desglosa las analíticas de reseñas por fuente

GET /locations/{locationId}/review-analytics-sites-stats devuelve una entrada por fuente de reseñas en data.interactionsSitesStats.stats. Úsalo para averiguar qué plataforma hizo variar la media.

NombreEnObligatorioNotas
locationIdpathSíID Relay en Base64 o databaseId numérico.
startDate, endDatequeryNoYYYY-MM-DD. Las variaciones comparan este período con el anterior de igual duración.
By source
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-sites-stats?startDate=2026-08-01&endDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsSitesStats": {      "stats": [        {          "key": "google",          "siteUrl": "maps.google.com",          "averageRating": { "value": 4.6, "delta": 2.2 },          "totalInteractions": { "value": 412, "delta": 6.1 },          "newInteractions": { "value": 24, "delta": 33.3 },          "recency": "2026-09-06T14:12:00Z",          "baseRating": 4.5,          "baseInteractions": 388,          "humanizedRecency": "3 days ago"        },        {          "key": "facebook",          "siteUrl": "facebook.com",          "averageRating": { "value": 4.1, "delta": -1.4 },          "newInteractions": { "value": 0, "delta": -100 },          "recency": null,          "humanizedRecency": null        }      ]    }  }}

averageRating, totalInteractions y newInteractions contienen cada uno un value y un delta; baseRating y baseInteractions son los valores al inicio del período desde el que se mide la variación. recency es la marca de tiempo de la reseña más reciente, y su valor es null cuando la fuente nunca ha devuelto ninguna. Un valor de 0 en newInteractions junto con un recency de hace meses suele indicar que la conexión con la fuente ha quedado desactualizada, así que comprueba las fuentes de la ubicación.

Errores que verás

CódigoSignificadoSolución
SY90016Se ha usado una clave Read en una operación de escritura.Usa una clave Write.
SY90001Sin autorización: clave incorrecta o ID de reseña de otra cuenta. En /reviewDetails llega como 200 con interactionDetails: null.Comprueba la clave y el ID.
SY90002ID no válido. Un locationId numérico en el cuerpo de la solicitud de edición de ajustes.Envía el ID Relay en base64.
SY90003403, la clave no puede leer ni modificar esta ubicación.Usa una clave con acceso a ella.
SY90006Falta interactionIds en /reviewDetails.Pasa un array JSON de ID.
SY50121Segunda respuesta del propietario a una reseña de Google.Edita la respuesta existente.
429Límite de solicitudes.Espera Retry-After. Consulta Límites de solicitudes.

Las operaciones de escritura también pueden devolver 200 con errors rellenado dentro de data.<op>, así que lee el cuerpo de la respuesta de cada operación de escritura. La lista completa está en Códigos de error.

Siguientes pasos