Obtén analíticas de perfiles de Google, Facebook y Bing

Obtén métricas diarias de perfiles de Google y Facebook y vistas semanales de Bing por ubicación; suma una serie del mes y compara dos períodos.

Las analíticas de perfiles te indican con qué frecuencia se vio una ubicación y se realizaron acciones relacionadas con ella en cada plataforma de publicación: impresiones, solicitudes de indicaciones, llamadas y clics en el sitio web. Cada métrica es una serie temporal de puntos { startTime, value }, por lo que los totales que muestras son los que calculas tú.

1. Consulta las métricas de Google para un intervalo de fechas

GET /locations/{locationId}/google-analytics?fromDate=&toDate= devuelve data.googleInsights con una serie diaria por métrica. total corresponde a las impresiones del perfil, search más maps; no incluye las métricas de acciones.

Google
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/google-analytics?fromDate=2026-08-01&toDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "googleInsights": {      "total": [        { "startTime": "2026-08-01T00:00:00+00:00", "value": 412 },        { "startTime": "2026-08-02T00:00:00+00:00", "value": 388 }      ],      "search": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 300 }],      "maps": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 112 }],      "directionsAction": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 24 }],      "phoneAction": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 8 }],      "websiteAction": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 41 }],      "businessBookings": null,      "businessFoodOrders": null,      "businessFoodMenuClicks": null    }  }}
SeriesSignificado
totalImpresiones, search más maps.
search, mapsImpresiones en Google Search y Google Maps.
directionsAction, phoneAction, websiteActionSolicitudes de indicaciones, clics para llamar y clics en el sitio web.
businessBookings, businessFoodOrders, businessFoodMenuClicksReservas, pedidos de comida y clics en el menú, para los perfiles que los ofrecen.

Un id de ubicación con un formato incorrecto devuelve 200 con googleInsights: null y un array errors, lo que parece indicar un perfil desconectado. Comprueba primero errors.

2. Consulta las métricas de Facebook

GET .../facebook-analytics tiene la misma estructura dentro de data.facebookInsights, con cinco series diarias: views, ctaAction, directionsAction, phoneAction y websiteAction.

Facebook
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/facebook-analytics?fromDate=2026-08-01&toDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "facebookInsights": {      "views": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 120 }],      "ctaAction": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 5 }],      "directionsAction": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 3 }],      "phoneAction": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 2 }],      "websiteAction": [{ "startTime": "2026-08-01T00:00:00+00:00", "value": 9 }]    }  }}

ctaAction cuenta los clics en el botón de llamada a la acción de la página, lo que te permite medir una campaña de "Reserva ahora" o "Llama ahora". No hay ninguna métrica de Me gusta de la página.

3. Consulta las visualizaciones de Bing

GET .../bing-analytics devuelve una única serie, data.bingInsights.views, agrupada por semana en lugar de por día. Los datos se actualizan cada lunes con los de la semana anterior, así que consulta un intervalo de varios meses para obtener una línea de tendencia.

Bing
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/bing-analytics?fromDate=2026-06-01&toDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "bingInsights": {      "views": [        { "startTime": "2026-06-01T00:00:00+00:00", "value": 73 },        { "startTime": "2026-06-08T00:00:00+00:00", "value": 58 }      ]    }  }}

A diferencia de Google y Facebook, Bing indica la ausencia de datos con un array views vacío en lugar de null. Trata ambos casos como "nada que mostrar".

4. Suma una serie para obtener un total mensual

Obtén los datos del mes y luego suma el value de cada punto. Distingue null de cero: un perfil desconectado debe mostrarse como "no disponible", no como un mes sin tráfico. La página de analíticas del Node SDK tiene la misma función auxiliar sumSeries.

Monthly total
# jq: null when the metric is null, otherwise the sum of valuescurl -s "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/google-analytics?fromDate=2026-08-01&toDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY" \| jq '.data.googleInsights | { search: (if .search == null then null else ([.search[].value] | add) end),                               maps: (if .maps == null then null else ([.maps[].value] | add) end) }'

Bing necesita una comprobación adicional: la suma de un array views vacío es 0, así que comprueba si se cumple length == 0 si quieres mostrar "sin datos" también en ese caso.

5. Compara dos períodos

Obtén la misma métrica para dos intervalos de igual duración y calcula la variación a partir de los dos totales. La API no incluye una función de comparación para las analíticas de perfiles; los campos delta solo existen en las analíticas de reseñas.

Two periods
curl -s "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/google-analytics?fromDate=2026-07-01&toDate=2026-07-31" \-H "Authorization: API $LISTINGSAPI_KEY" | jq '[.data.googleInsights.total[].value] | add' curl -s "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/google-analytics?fromDate=2026-08-01&toDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY" | jq '[.data.googleInsights.total[].value] | add'

Controla tres casos: que cualquiera de los períodos sea null (sin conexión), que el período anterior sea 0 (división por cero) y que un intervalo siga en curso, ya que comparar un mes parcial con uno completo siempre parece indicar una caída. Cada llamada cuenta para tu límite de solicitudes, así que guarda en caché el período anterior en lugar de volver a consultarlo en cada renderizado.

Próximos pasos