Pasar al contenido principal
osky
Cómo manejar el endpoint de lista de conferencias de Twilio en tu bot de WhatsApp (antes de septiembre 2026)
Tema Twilio Conferencias + WhatsApp Bot

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.

Comparación visual del endpoint de conferencias antes y después del cambio de septiembre 2026


¿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:

  1. Cuenta de Twilio activa con al menos un número habilitado para voz.
  2. Node.js 20+ o Python 3.11+ instalado (los snippets cubren ambos).
  3. Twilio Helper Library: npm install twilio o pip install twilio.
  4. Variables de entorno configuradas: TWILIO_ACCOUNT_SID y TWILIO_AUTH_TOKEN.
  5. Tu bot de WhatsApp ya integrado con Twilio (vía Twilio API for WhatsApp o Sandbox).
  6. 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 pageSize y nextPageUrl.
  • El parámetro dateCreatedAfter en 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.