Changelog
Cambios que afectan a quien integra. Las novedades sin impacto en el contrato no entran aquí.
Qué consideramos un cambio que rompe
| Cambio | ¿Rompe? |
|---|---|
| Campo nuevo y opcional en una respuesta | no |
| Campo nuevo y opcional en una petición | no |
| Endpoint nuevo | no |
| Valor nuevo en un enum | no — trata los valores desconocidos con un caso por defecto |
| Campo eliminado de una respuesta | sí |
| Campo opcional que pasa a obligatorio | sí |
| Cambio del tipo de un campo | sí |
| Cambio de un código de estado | sí |
Los cambios que rompen solo ocurren en una versión mayor de la API, avisados por correo a todas las cuentas activas.
2.2.0
Todo en esta versión es aditivo.
Agencias y workspaces
GET /workspaces— el grupo de una agencia, con lo que consumió cada cliente en el período de facturación. Solo con la clave sin restricción de la cuenta de la agencia.GET /account/metraeparent: la agencia que gestiona y paga la cuenta cuando es el workspace de un cliente.- Dentro de un workspace,
/wallety/affiliateresponden409 billed_by_parent.
Mira Agencias y workspaces.
2.1.0
Todo en esta versión es aditivo: nada que ya funcionaba deja de funcionar.
Endpoints nuevos
- Contactos y consentimiento —
/contacts, campos personalizados, etiquetas, importación por lotes y/suppressions. Ver Contactos y consentimiento. - Disparo de flujos —
POST /flows/{id}/trigger, conGET /flowsyGET /flows/{id}. Ver Flujos por la API. - Campañas y públicos —
/broadcastsy/audiences. Ver Campañas. - Bandeja de entrada —
/inbox, con el stream en tiempo real. Ver Bandeja de entrada. GET /plans/quote,GET /audit/operator-access,GET /wallet,GET /wallet/entries,GET /affiliateyGET /affiliate/referrals.
Eventos nuevos
contact.created, contact.opted_in, contact.opted_out, broadcast.completed,
broadcast.paused, flow.run.completed, flow.answer.captured,
conversation.assigned y conversation.closed. Ver
Catálogo de eventos.
Campos y cabeceras nuevos
POST /messagesaceptaIdempotency-Key. Ver Reintentar sin duplicar.- Todo
402traeaction, con qué hacer y dónde. Ver Errores. - El límite de solicitudes pasó a ser por clave, bajo un techo de la cuenta. Las
respuestas traen
X-RateLimit-Scope, y el429traeerror.scope. Ver Límites de uso. GET /billingtraesubscriptions, una por suscripción de la cuenta. El campo antiguosubscriptionsigue, marcado como obsoleto.- Los planes ganaron
stackable,currencyPrices,rateLimitsy los techos de contactos, campañas y bandeja de entrada.
2.0.0
Las rutas antiguas ya no responden. No hay alias: la ruta antigua devuelve 404,
o 405 cuando sobrevive con otro método.
Un endpoint de envío
Lo que cambiaba entre un texto y una plantilla era el tipo del mensaje, que es un
campo del cuerpo, no una ruta. Las rutas por tipo se convirtieron en una, con type.
| Antes | Ahora |
|---|---|
POST /messages/send/text | POST /messages con {"type":"text"} |
POST /messages/send/template | POST /messages con {"type":"template"} |
POST /messages/send/test | POST /messages con {"type":"test"} |
POST /messages/text, /template, /test | igual: los atajos no documentados se fueron |
El resto del cuerpo no cambia: to, from, body, name, language y
components siguen igual. Las respuestas de éxito y de error, también.
Programación
El mismo POST /messages acepta sendAt (instante ISO 8601) o delaySeconds y
responde 202. Nuevos: GET /messages/scheduled, GET /messages/scheduled/{id} y
DELETE /messages/scheduled/{id}. Ver Enviar mensajes.
Paginación uniforme
Todo listado acepta ahora ?limit= y ?offset= y responde
{ data, total, limit, offset }. Quien leía res.data sigue funcionando; quien
contaba con la ausencia de total, no.
Endpoints nuevos
GET /account/senders, GET /account/usage, DELETE /account/wabas/{id},
GET /audit, GET /plans (público, sin credencial), GET /billing,
GET /billing/invoices, GET /billing/license y POST /templates/media.
Eventos de facturación
billing.past_due, billing.blocked y billing.restored: los primeros eventos que
originamos nosotros en lugar de reenviar de Meta. Ver Catálogo de eventos.
Otros cambios de contrato
POST /auth/logoutpasó a serDELETE /auth/session.- Los dos
/revokede invitación pasaron a serDELETEsobre el propio recurso. - Un método incorrecto en una ruta existente responde
405con cabeceraAllow, donde antes respondía404. 402ahora traereason, incluido el nuevolicense_expired.
Salieron de la documentación
Los endpoints marcados como «próximamente» se retiraron de la referencia: respondían
404 y la referencia pasa a describir solo lo que existe. Imagen, vídeo, documento,
botones, lista, CTA, carrusel, ubicación, contacto, reacción, sticker, «escribiendo…» y
«marcar como leído» siguen disponibles por el espejo
POST /v1/{phone_number_id}/messages, que acepta el payload completo de la Cloud API:
ver Los otros tipos de mensaje.
1.0.0
Primera versión pública.
API simplificada — envío por tipo de mensaje, con el número de origen resuelto a partir del token. Listado, creación y eliminación de plantillas con validación previa de variables y ejemplos. Claves de API con creación y revocación inmediata.
Espejo /v1 — el contrato de la Meta Cloud API, byte a byte. Basta con cambiar el
dominio y el token de una integración existente.
Webhooks — entrega firmada con HMAC-SHA256 sobre "{timestamp}.{cuerpo}", seis
intentos con backoff de 60s a 6h, registro de entregas y reenvío manual.
Coexistencia — número compartido entre la aplicación WhatsApp Business y la Cloud API, con sincronización de historial y contactos en las primeras 24 horas.
Límites de uso — 500 envíos por minuto, 60 subidas de medios por minuto, 60 consultas
por minuto, con las cabeceras X-RateLimit-* en cada respuesta.