Mide el rendimiento de las reseñas

Consulta KPI de reseñas por ubicación, grafica la evolución diaria, compara fuentes, extrae frases comunes y recibe resúmenes diarios/semanales por webhook

Tres endpoints relacionados describen las reseñas de una ubicación en cifras: un resumen de KPI, una serie temporal diaria y un desglose por fuente. Un cuarto enumera las frases que repiten los clientes. Juntos bastan para una tarjeta de indicadores, un gráfico de tendencias y un panel de quejas.

1. Consulta los KPI de una ubicación

GET /locations/{locationId}/review-analytics-overview devuelve cuatro estadísticas en data.interactionsAnalyticsStats.stats. El intervalo de fechas es opcional aquí; acota el período sobre el que se calculan los valores y las variaciones.

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 un período anterior registra un delta de 100, así que no interpretes las variaciones del primer mes como crecimiento.

2. Obtén la serie temporal diaria para un gráfico

GET .../review-analytics-timeline devuelve una entrada por día en data.interactionsChartData.data. Pasa siempre startDate y endDate; de lo contrario, el servicio elige su propio período. Añade site (un nombre de host como maps.google.com) para representar una sola fuente por separado.

Timeline
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-timeline?startDate=2026-08-01&endDate=2026-08-31" \-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. averageRating es la media de ese día, no una media acumulada, y su valor es null en los días sin reseñas, así que deja un hueco en lugar de representar un cero.

3. Desglosa los datos por fuente

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

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",          "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 incluyen cada uno un value y un delta. Un averageRating.delta negativo mientras los demás se mantienen estables apunta a una plataforma; si todos son negativos, apunta al establecimiento. Un newInteractions de 0 con un recency de hace meses suele indicar que la conexión de la fuente ha dejado de actualizarse, así que consulta Listar las fuentes de reseñas de una ubicación y vuelve a añadir la fuente con Editar la configuración de reseñas si ya no aparece.

4. Encuentra las frases que usan los clientes

GET /review-phrases devuelve un array simple en data.newReviewPhrases, con una entrada por frase recurrente y la misma estructura de estadísticas que el resumen, calculadas únicamente sobre las reseñas que contienen esa frase. Añade ratingFilters=[1,2] para un panel de quejas. locationIds y ratingFilters son arrays JSON en la cadena de consulta, por lo que deben codificarse para URL; los SDK lo hacen por ti.

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": "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 indica con qué frecuencia aparece la frase, overall-rating indica si esas reseñas expresan satisfacción y delta indica si la situación está empeorando. abs es la variación absoluta que acompaña al porcentaje. Los métodos de frases de los SDK no exponen ratingFilters ni phraseCount, así que usa la llamada REST cuando los necesites.

5. Recibe resúmenes diarios y semanales mediante webhooks

Con una URL de webhooks configurada, review_analytics.daily_snapshot y review_analytics.weekly_snapshot se emiten una vez por ubicación y por período. Interpreta cada uno como el resultado del endpoint de resumen calculado para un período fijo: total_reviews es total-reviews, new_reviews_in_period es new-reviews y average_rating es overall-rating para ese período, con previous_average_rating para el anterior. La tasa de respuesta, la serie temporal y el desglose por fuente no se incluyen en el payload; llama a los endpoints anteriores cuando llegue el evento si los necesitas.

JSON
{  "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  }}

El volumen de esta familia de eventos aumenta con el número de ubicaciones: 400 ubicaciones generan 400 eventos diarios en una ráfaga, y los eventos que superan el límite por minuto de tu plan se descartan, no se ponen en cola. Por tanto, la ausencia de un resumen es ambigua. Nunca registres un cero en su lugar; vuelve a consultar el resumen de ese período. La configuración se explica en Reaccionar a eventos con webhooks.

Próximos pasos