Cómo manejar el endpoint de lista de conferencias de Twilio en tu bot de WhatsApp (antes de septiembre 2026)
Si tienes un bot de WhatsApp que usa la API de Twilio para gestionar conferencias de voz — ya sea para soporte en vivo, salas de reunión o transferencias de llamada — necesitas leer esto ahora. Twilio anunció en su changelog que, basándose en retroalimentación de clientes, extendió hasta el 30 de septiembre de 2026 el rollout del cambio al endpoint Conference list. La implicación es directa: después de esa fecha, el endpoint /2010-04-01/Accounts/{AccountSid}/Conferences.json solo va a regresar conferencias con estado in-progress. Si tu código asume que también vienen las completadas, pendientes o fallidas, te vas a llevar un susto en producción. Este tutorial te lleva de la mano para que no te agarre el toro.

¿Qué cambió exactamente?
Antes del cambio (y durante la extensión, hasta el 30 de sept de 2026), el endpoint de lista de conferencias regresaba todos los estados: init, in-progress y completed. Después de la fecha límite, el comportamiento por defecto cambiará para regresar únicamente las conferencias in-progress, sin importar si no mandas el parámetro Status en tu request.
Esto afecta a cualquier bot o sistema que:
- Consulte el historial de conferencias sin filtrar por estado.
- Use paginación sobre listas de conferencias asumiendo que incluye todo el historial.
- Muestre dashboards o reportes de llamadas pasadas jalando directo de este endpoint sin parámetros.
Requisitos previos
Antes de empezar, asegúrate de tener:
- Cuenta de Twilio activa con al menos un número habilitado para voz.
- Node.js 20+ o Python 3.11+ instalado (los snippets cubren ambos).
- Twilio Helper Library:
npm install twilioopip install twilio. - Variables de entorno configuradas:
TWILIO_ACCOUNT_SIDyTWILIO_AUTH_TOKEN. - Tu bot de WhatsApp ya integrado con Twilio (vía Twilio API for WhatsApp o Sandbox).
- Acceso a tu código de consulta de conferencias — el que vamos a auditar y corregir.
Paso 1: Audita tu código actual
Antes de tocar nada, localiza todos los lugares donde llamas al endpoint de conferencias. Busca en tu codebase:
grep -r "Conferences" ./src --include="*.js" --include="*.py" -n
Cualquier llamada que no incluya el filtro status: 'in-progress' (o Status=in-progress en Python) es candidata a romperse después del 30 de septiembre.
Paso 2: Agrega el filtro explícito de estado
Node.js (con Twilio SDK):
const twilio = require('twilio');
const client = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
// MAL: asume todos los estados (va a cambiar de comportamiento)
const todasLasConferencias = await client.conferences.list();
// BIEN: solicita explícitamente el estado que necesitas
const conferenciaActivas = await client.conferences.list({
status: 'in-progress',
limit: 50
});
// Si necesitas las completadas para historial/reportes, pídelas por separado
const conferenciaCompletadas = await client.conferences.list({
status: 'completed',
dateCreatedAfter: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
limit: 100
});
Python (con Twilio SDK):
from twilio.rest import Client
import os
from datetime import datetime, timedelta
client = Client(os.environ['TWILIO_ACCOUNT_SID'], os.environ['TWILIO_AUTH_TOKEN'])
# MAL: sin filtro
# conferencias = client.conferences.list()
# BIEN: filtro explícito
conferencias_activas = client.conferences.list(
status='in-progress',
limit=50
)
# Para historial de la última semana
conferencias_completadas = client.conferences.list(
status='completed',
date_created_after=(datetime.utcnow() - timedelta(days=7)).isoformat() + 'Z',
limit=100
)
Paso 3: Separa la lógica de "monitoreo en vivo" vs "historial"
Este cambio es una buena oportunidad para hacer lo que probablemente ya debías haber hecho: separar responsabilidades en tu bot.
// conferenceService.js
async function getActiveConferences() {
return client.conferences.list({ status: 'in-progress', limit: 50 });
}
async function getConferenceHistory(days = 7) {
const since = new Date(Date.now() - days * 86400000).toISOString();
return client.conferences.list({
status: 'completed',
dateCreatedAfter: since,
limit: 200
});
}
module.exports = { getActiveConferences, getConferenceHistory };
En tu handler de WhatsApp:
const { getActiveConferences, getConferenceHistory } = require('./conferenceService');
bot.onMessage(async (msg) => {
if (msg.body === 'conferencias activas') {
const activas = await getActiveConferences();
const respuesta = activas.length
? activas.map(c => `- ${c.friendlyName} (${c.participantCount} participantes)`).join('\n')
: 'No hay conferencias activas ahorita.';
await msg.reply(respuesta);
}
if (msg.body === 'historial conferencias') {
const historial = await getConferenceHistory(7);
const respuesta = historial.length
? `Últimas ${historial.length} conferencias de la semana.`
: 'Sin conferencias en los últimos 7 días.';
await msg.reply(respuesta);
}
});
Paso 4: Agrega manejo de errores y fallback
No te confíes. Twilio puede regresar errores de rate limit o timeouts. Ponle un try/catch con logging decente:
async function getActiveConferencesSafe() {
try {
return await client.conferences.list({ status: 'in-progress', limit: 50 });
} catch (err) {
console.error('[Twilio Conferences] Error al consultar conferencias activas:', err.message);
// Regresa array vacío para no tronar el bot completo
return [];
}
}
Paso 5: Prueba en staging antes de septiembre
No esperes al 30 de septiembre para probar. Simula el nuevo comportamiento hoy:
// test/conferenceEndpoint.test.js
const { getActiveConferences, getConferenceHistory } = require('../conferenceService');
test('getActiveConferences solo regresa in-progress', async () => {
const conferencias = await getActiveConferences();
conferencias.forEach(c => {
expect(c.status).toBe('in-progress');
});
});
test('getConferenceHistory solo regresa completed', async () => {
const historial = await getConferenceHistory(30);
historial.forEach(c => {
expect(c.status).toBe('completed');
});
});
Advertencias de producción
- No uses el endpoint de lista para billing o reportes críticos. Para eso usa los logs de Twilio o exporta via Insights.
- El límite por defecto es 50 registros. Si tienes operaciones con muchas conferencias simultáneas, implementa paginación con
pageSizeynextPageUrl. - El parámetro
dateCreatedAfteren el SDK de Node.js acepta ISO 8601. No le metas un timestamp Unix o te va a dar resultados raros sin error explícito. - Después del 30 de septiembre no hay vuelta atrás. Twilio no va a regresar el comportamiento anterior, así que no postergues esto.
- Si usas webhooks de status callback para conferencias, esos no cambian. Solo el endpoint de listado GET es el afectado.
Resumen del plan de acción
| Tarea | Fecha límite sugerida |
|---|---|
| Auditar llamadas al endpoint de conferencias | Hoy |
Agregar filtros explícitos de status |
Esta semana |
| Separar lógica activo vs historial | Esta semana |
| Pruebas en staging | Antes del 15 de agosto |
| Deploy a producción | Antes del 1 de septiembre |
No te esperes al deadline. Twilio ya lo extendió una vez por presión de clientes, pero no cuentes con que lo haga de nuevo. Tienes hasta el 30 de septiembre — úsalo para hacer las cosas bien, no para procrastinar.