Cómo leer métricas de Instagram y Facebook por la API de Waspy
GET /api/v2/social lista posts, comentarios y seguidores desde el cache. El scope es social:read. El conector MCP no tiene esta herramienta.
Respuesta corta: las métricas de Instagram y Facebook de una cuenta conectada a Waspy se leen con GET https://api.waspytech.com/api/v2/social/posts, GET /api/v2/social/posts/:id, GET /api/v2/social/posts/:id/comments y GET /api/v2/social/account/summary. La clave es Authorization: Bearer wspy_... y el scope es social:read. El listado sale de un cache que se refresca cada 6 horas. Estos endpoints no publican, no contestan comentarios y no mandan WhatsApp.
Sirve cuando una tienda quiere bajar a una planilla los posts de la semana, o enterarse de un comentario que pide talle, sin pegarle a Graph en cada refresh de un dashboard. La referencia general está en docs.waspytech.com. Los permisos de la clave están en scopes.
Qué cuenta y qué no
La API mira canales de la cuenta con tipo instagram_business o facebook_page y estado activo. Si Instagram o Facebook no están conectados en el panel, el resumen vuelve con accounts vacío y un refresh=true del listado no encola nada.
El id de cada post es el id de Meta (el de la publicación). El channelId sí es un UUID de Waspy. Para pedir comentarios usás el id de Meta, el mismo que vino en data[].id.
| Método y ruta | Qué devuelve | Cuándo toca a Meta |
|---|---|---|
GET /social/posts | Posts cacheados, con cursor | refresh=true encola un refresco y la respuesta sigue siendo el cache |
GET /social/posts/:id | Un post | refresh=true lo trae en el momento (una o dos llamadas) |
GET /social/posts/:id/comments | Comentarios y respuestas | En vivo, con cache de 10 minutos |
GET /social/account/summary | Seguidores y serie | Lee snapshots guardados. No llama a Meta en el pedido |
El listado
limit va de 1 a 100. Si no lo mandás, el contrato lo deja en 20. network acepta instagram o facebook. type acepta image, carousel, reel, video, story, text o link. since y until filtran por fecha de publicación, en ISO. Una fecha que no parsea responde 400 INVALID_FILTER.
refresh solo es verdadero si mandás true o 1. La cadena "false" queda en falso.
curl -sS "https://api.waspytech.com/api/v2/social/posts?network=instagram&type=reel&since=2026-10-01&limit=20" \
-H "Authorization: Bearer $WASPY_API_KEY"
La respuesta trae data (posts) y meta con requestId, hasMore y cursor. El cursor es opaco: lo devolvés tal cual en el query cursor de la página siguiente. No lo armes a mano.
Cada post incluye permalink, caption, publishedAt, metrics y metricsUpdatedAt. En una historia, expiresAt es la publicación más 24 horas. En el resto viene null.
metrics siempre trae estas claves, y puede sumar otras: likes, comments, saved, shares, reach, impressions, views, video_views, plays, total_interactions, profile_visits, follows, replies, clicks. Null quiere decir que Meta no entregó ese número. Un 0 es un cero de verdad. En un reel o un video, si plays viene null y views es un número, la API copia views en plays.
Con refresh=true, meta.refreshQueued dice si se encoló el refresco. El dato de esa respuesta sigue siendo el cacheado: volvé a pedir el listado alrededor de un minuto después. Pedir refresh dos veces en el mismo minuto, para el mismo canal, no duplica el trabajo.
Un post y sus comentarios
curl -sS "https://api.waspytech.com/api/v2/social/posts/ID-DE-META?refresh=true" \
-H "Authorization: Bearer $WASPY_API_KEY"
refresh=true en el detalle consulta a Meta ahí mismo. Si el post no está en el cache, prueba los canales activos de la cuenta. Si no aparece, la respuesta es 404 SOCIAL_POST_NOT_FOUND, con el mensaje de que puede no estar sincronizado: probá refresh=true en el listado, o esperá el ciclo de 6 horas.
Los comentarios piden que el post ya esté en el cache. Si no está, es el mismo 404. No alcanza con adivinar un id de Instagram.
curl -sS "https://api.waspytech.com/api/v2/social/posts/ID-DE-META/comments?limit=50" \
-H "Authorization: Bearer $WASPY_API_KEY"
limit va de 1 a 300 y, si lo omitís, queda en 100. Cada comentario trae id, text, username, createdAt, likeCount y replies. data.total cuenta los comentarios de primer nivel que volvieron, no las respuestas. El cache dura 10 minutos (600 segundos). meta.cached es true cuando salió de ahí. refresh=true saltea el cache y vuelve a leer Meta.
Si el canal de ese post no está activo, la respuesta es 403 CHANNEL_NOT_CONNECTED.
Cuando Meta no da cupo, la API responde 429 RATE_LIMITED. El mensaje es Too many requests. Retry after N seconds, y N es como mínimo 60. El diseño de este recurso es no gastar el cupo de la bandeja: el comentario del código habla de unas 120 llamadas por hora por cuenta, compartidas con el inbox en vivo. Por eso el listado no va a Meta en cada request.
Seguidores
curl -sS "https://api.waspytech.com/api/v2/social/account/summary?network=instagram" \
-H "Authorization: Bearer $WASPY_API_KEY"
Si no mandás fechas, el período es de 30 días hasta hoy. data.accounts trae, por canal, username, current.followersCount, current.mediaCount y current.capturedAt (la fecha del snapshot, no el instante del request). period.followerGrowth es el último valor de seguidores del rango menos el primero. Queda null hasta que haya dos snapshots con número en ese rango: la serie arranca el día en que la cuenta empezó a guardarlas. Meta no entrega el historial viejo con los permisos actuales.
period.postsPublished, likesTotal y commentsTotal suman lo cacheado de los posts publicados en el rango. insights.reach, insights.profileVisits e insights.websiteClicks pueden venir null mientras esos permisos de Meta no llenen el snapshot.
Apps Script, sin mandar un WhatsApp
La misma lectura entra en una planilla. No envía mensajes: si la clave solo tiene social:read, un POST /messages respondería 403.
function metricasInstagram() {
var url = 'https://api.waspytech.com/api/v2/social/account/summary?network=instagram';
var clave = PropertiesService.getScriptProperties().getProperty('WASPY_API_KEY');
var res = UrlFetchApp.fetch(url, {
headers: { Authorization: 'Bearer ' + clave },
muteHttpExceptions: true,
});
var body = JSON.parse(res.getContentText());
if (res.getResponseCode() !== 200) {
throw new Error(body.error.code + ' ' + body.error.message);
}
var cuenta = body.data.accounts[0];
if (!cuenta) {
Logger.log('No hay un Instagram activo en esta cuenta');
return;
}
Logger.log(cuenta.username + ' seguidores ' + cuenta.current.followersCount);
}
En n8n, Make o Zapier el paso es un HTTP Request a esa URL, con el mismo header. El conector MCP no reemplaza esta llamada: sus scopes son contactos, conversaciones, mensajes y plantillas. social:read está en las claves de la API REST y no en el MCP.
Errores y plan
La autenticación y el sobre de error (error.code, error.message, error.status, meta.requestId) son los de la guía para desarrolladores.
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | INVALID_FILTER | since o until no son una fecha |
| 401 | UNAUTHORIZED | Falta la clave, no existe, está revocada o venció |
| 403 | FORBIDDEN | A la clave le falta social:read |
| 403 | CHANNEL_NOT_CONNECTED | El canal del post no está activo, al pedir comentarios |
| 404 | SOCIAL_POST_NOT_FOUND | Ese id de Meta no está en el cache de tu cuenta |
| 429 | RATE_LIMITED | Meta no dio cupo. El mensaje trae los segundos, mínimo 60 |
social:read, el mensaje es API key missing required scope: social:read.
Leer posts no genera un cargo de mensaje de WhatsApp. Un WhatsApp que mandes después, porque un comentario pidió un talle y la persona te escribió al número, sigue la tarifa de Meta: en Argentina, desde el 1 de octubre de 2026, las respuestas de servicio tienen 1.000 por número y por mes, y después alrededor de ARS 37,68 (~US$0,026).
Al lado de Graph, la Cloud API y un BSP
| Camino | Qué obtenés | Qué administrás vos |
|---|---|---|
| Graph API de Meta, directa | El post y el insight en el momento | El cupo de la cuenta, el token y el cache |
| Cloud API de WhatsApp | Mensajes de WhatsApp. No es este recurso | Token, webhooks y plantillas |
| Twilio, 360dialog o Z-API | Acceso a WhatsApp, cada uno con su contrato | La bandeja, si la querés |
GET /api/v2/social | Cache de los posts y comentarios de las cuentas ya conectadas a Waspy | La clave y el scope |
Si el número de la tienda y las cuentas de Instagram y Facebook ya están en el panel, la clave se crea ahí. Si todavía no, abrí la cuenta: 10 días sin tarjeta, y la API se habilita en Scale.
