Consultar canales y qualityRating por la API de Waspy (GET /channels)
GET /api/v2/channels, con scope channels:read, devuelve el UUID del canal, el id de Meta, qualityRating y el estado. El id de Waspy es el que va en POST /messages. El de Meta no.
Respuesta corta: GET https://api.waspytech.com/api/v2/channels lista los números de WhatsApp de la cuenta. Scope channels:read. El campo id es el UUID de Waspy y es el que va en phoneNumberId cuando hacés POST /messages. El campo phoneNumberId es el id de Meta. qualityRating sale en GREEN, YELLOW o RED.
La referencia está en channels. El semáforo, explicado para quien no integra, está en la calificación del número y en calidad del número.
El pedido
curl -sS https://api.waspytech.com/api/v2/channels \
-H "Authorization: Bearer $WASPY_API_KEY"
No pagina: devuelve los canales del tenant. No lleva query. Sin header, es 401 UNAUTHORIZED. Con una clave que tiene scopes y no incluye channels:read, es 403 FORBIDDEN.
{
"data": [
{
"id": "8f0c1c2e-1111-4222-8333-444444444444",
"phoneNumber": "+5491155654076",
"displayName": "Mi Tienda",
"phoneNumberId": "947831321756793",
"wabaId": "3778403832302005",
"qualityRating": "GREEN",
"status": "active",
"webhookVerified": true
}
],
"meta": { "requestId": "..." }
}
Los dos ids
| Campo | Qué es | Dónde se usa |
|---|---|---|
id | UUID del canal en Waspy | phoneNumberId en POST /messages, y el filtro phoneNumberId de GET /templates |
phoneNumberId | Id del número en Meta | No se manda en el POST de Waspy. Sirve si tu otro sistema habla con Graph |
wabaId | Id de la cuenta de WhatsApp Business en Meta | Tampoco reemplaza al id |
phoneNumber | El número, con código de país | Para mostrarlo. No es el id del POST |
displayName | Nombre visible. Puede venir null | — |
phoneNumberId (el número largo de Meta) al POST. Waspy busca un canal cuyo id sea ese string, no lo encuentra y responde 400 INVALID_CHANNEL.
qualityRating
Meta informa la calidad del número. Los valores que se leen en la operación son:
| Valor | Qué hacés antes de una campaña |
|---|---|
GREEN | Podés seguir. No es un permiso para escribirle a toda la base |
YELLOW | No subas el volumen “para compensar”. Mirá bloqueos y reportes antes del lunes |
RED | No lances el marketing del CyberMonday desde ese número |
unknown o null | Todavía no hay una lectura usable. No lo trates como verde |
unknown hasta que el alta o la sincronización escriben lo que dice Meta. El campo del esquema acepta null.
GREEN no mira el límite de mensajería. Un número verde puede seguir en 250 destinatarios distintos por día. Este GET no trae ese escalón. Cómo se sube está en subir el límite.
status no es connected
La página de channels dice que status es connected o disconnected. La ruta no traduce el valor: devuelve la columna. Los que existen son:
status | POST /messages |
|---|---|
active | Sigue, si el resto del body cierra |
inactive | 403 CHANNEL_NOT_CONNECTED |
banned | 403 CHANNEL_NOT_CONNECTED |
token_expired | 403 CHANNEL_NOT_CONNECTED |
webhookVerified es un booleano aparte: dice si el webhook de Meta quedó verificado. No reemplaza a status.
Antes del lunes 2
El CyberMonday 2026 es el 2, 3 y 4 de noviembre. El sábado 31, o el domingo a la mañana, el chequeo de un script es este:
GET /channels.- Si
statusno esactive, no encoles la campaña: el POST no va a entrar. - Si
qualityRatingesYELLOWoRED, no aumentes el volumen. El marco está en el fin de semana previo. - Guardá
idy usalo comophoneNumberIden elPOST /messagesde la plantilla que ya estáapproved.
El cupo de la API es 120 pedidos por minuto por cuenta, todas las claves juntas. Un GET de canales y un POST de mensaje suman al mismo contador. Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Al pasarte, 429 RATE_LIMITED y Retry-After. La página de rate limits lo describe por cuenta; la de limitaciones todavía dice “por API key”. El tope que aplica es el de la cuenta.
La API está en Scale (US$150 por mes) y Enterprise. Diez días sin tarjeta, en el registro. El alcance del producto está en la página de la API y los planes, en Planes.
