Saltar al contenido principal

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 respuestano
Campo nuevo y opcional en una peticiónno
Endpoint nuevono
Valor nuevo en un enumno — trata los valores desconocidos con un caso por defecto
Campo eliminado de una respuestasí
Campo opcional que pasa a obligatoriosí
Cambio del tipo de un camposí
Cambio de un código de estadosí

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/me trae parent: la agencia que gestiona y paga la cuenta cuando es el workspace de un cliente.
  • Dentro de un workspace, /wallet y /affiliate responden 409 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, con GET /flows y GET /flows/{id}. Ver Flujos por la API.
  • Campañas y públicos — /broadcasts y /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 /affiliate y GET /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 /messages acepta Idempotency-Key. Ver Reintentar sin duplicar.
  • Todo 402 trae action, 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 el 429 trae error.scope. Ver Límites de uso.
  • GET /billing trae subscriptions, una por suscripción de la cuenta. El campo antiguo subscription sigue, marcado como obsoleto.
  • Los planes ganaron stackable, currencyPrices, rateLimits y los techos de contactos, campañas y bandeja de entrada.

2.0.0​

Versión mayor — exige cambios en tu código

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.

AntesAhora
POST /messages/send/textPOST /messages con {"type":"text"}
POST /messages/send/templatePOST /messages con {"type":"template"}
POST /messages/send/testPOST /messages con {"type":"test"}
POST /messages/text, /template, /testigual: 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/logout pasó a ser DELETE /auth/session.
  • Los dos /revoke de invitación pasaron a ser DELETE sobre el propio recurso.
  • Un método incorrecto en una ruta existente responde 405 con cabecera Allow, donde antes respondía 404.
  • 402 ahora trae reason, incluido el nuevo license_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.