Skip to main content
osky
How to Handle Twilio's Conference List Endpoint Change in Your WhatsApp Bot (Before September 2026)

How to Handle Twilio's Conference List Endpoint Change in Your WhatsApp Bot (Before September 2026)

If you have a WhatsApp bot that uses the Twilio API to manage voice conferences — whether for live support, meeting rooms, or call transfers — you need to read this now. Twilio announced in their changelog that, based on customer feedback, they extended until September 30, 2026 the rollout of the change to the Conference list endpoint. The implication is direct: after that date, the /2010-04-01/Accounts/{AccountSid}/Conferences.json endpoint will only return conferences with in-progress status. If your code assumes it also returns completed, pending, or failed conferences, you're going to get a nasty surprise in production. This tutorial walks you through everything you need so the deadline doesn't catch you off guard.

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


What Exactly Changed?

Before the change (and during the extension, until September 30, 2026), the conference list endpoint returned all statuses: init, in-progress, and completed. After the deadline, the default behavior will change to return only in-progress conferences, regardless of whether you send the Status parameter in your request or not.

This affects any bot or system that:

  • Queries the conference list without filtering by status.
  • Uses pagination over conference lists assuming it includes full history.
  • Displays dashboards or call reports by pulling directly from this endpoint without parameters.

Prerequisites

Before starting, make sure you have:

  1. Active Twilio account with at least one voice-enabled number.
  2. Node.js 20+ or Python 3.11+ installed (snippets cover both).
  3. Twilio Helper Library: npm install twilio or pip install twilio.
  4. Environment variables configured: TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN.
  5. Your WhatsApp bot already integrated with Twilio (via Twilio API for WhatsApp or Sandbox).
  6. Access to your conference query code — the one we're going to audit and fix.

Step 1: Audit Your Current Code

Before touching anything, locate every place where you call the conferences endpoint. Search your codebase:

grep -r "Conferences" ./src --include="*.js" --include="*.py" -n

Any call that does not include the status: 'in-progress' filter is a candidate to break after September 30.


Step 2: Add Explicit Status Filter

Node.js (with Twilio SDK):

const twilio = require('twilio');
const client = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);

// BAD: assumes all statuses (behavior will change)
const allConferences = await client.conferences.list();

// GOOD: explicitly request the status you need
const activeConferences = await client.conferences.list({
  status: 'in-progress',
  limit: 50
});

// If you need completed ones for history/reports, request separately
const completedConferences = await client.conferences.list({
  status: 'completed',
  dateCreatedAfter: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
  limit: 100
});

Python (with 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'])

# BAD: no filter
# conferences = client.conferences.list()

# GOOD: explicit filter
active_conferences = client.conferences.list(
    status='in-progress',
    limit=50
)

# For last week's history
completed_conferences = client.conferences.list(
    status='completed',
    date_created_after=(datetime.utcnow() - timedelta(days=7)).isoformat() + 'Z',
    limit=100
)

Step 3: Separate "Live Monitoring" vs "History" Logic

This change is a good opportunity to do what you probably should have done already: separate responsibilities in your 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 };

In your WhatsApp handler:

const { getActiveConferences, getConferenceHistory } = require('./conferenceService');

bot.onMessage(async (msg) => {
  if (msg.body === 'active conferences') {
    const active = await getActiveConferences();
    const response = active.length
      ? active.map(c => `- ${c.friendlyName} (${c.participantCount} participants)`).join('\n')
      : 'No active conferences right now.';
    await msg.reply(response);
  }

  if (msg.body === 'conference history') {
    const history = await getConferenceHistory(7);
    const response = history.length
      ? `Last ${history.length} conferences from this week.`
      : 'No conferences in the last 7 days.';
    await msg.reply(response);
  }
});

Step 4: Add Error Handling and Fallback

Don't be overconfident. Twilio can return rate limit errors or timeouts. Add proper try/catch with decent logging:

async function getActiveConferencesSafe() {
  try {
    return await client.conferences.list({ status: 'in-progress', limit: 50 });
  } catch (err) {
    console.error('[Twilio Conferences] Error fetching active conferences:', err.message);
    // Return empty array to avoid crashing the entire bot
    return [];
  }
}

Step 5: Test in Staging Before September

Don't wait until September 30 to test. Simulate the new behavior today:

// test/conferenceEndpoint.test.js
const { getActiveConferences, getConferenceHistory } = require('../conferenceService');

test('getActiveConferences only returns in-progress', async () => {
  const conferences = await getActiveConferences();
  conferences.forEach(c => {
    expect(c.status).toBe('in-progress');
  });
});

test('getConferenceHistory only returns completed', async () => {
  const history = await getConferenceHistory(30);
  history.forEach(c => {
    expect(c.status).toBe('completed');
  });
});

Production Warnings

  • Do not use the list endpoint for billing or critical reporting. For that, use Twilio logs or export via Insights.
  • The default limit is 50 records. If you have operations with many simultaneous conferences, implement pagination with pageSize and nextPageUrl.
  • The dateCreatedAfter parameter in the Node.js SDK accepts ISO 8601. Do not feed it a Unix timestamp or you'll get weird results without an explicit error.
  • After September 30 there's no going back. Twilio will not revert the previous behavior, so don't postpone this.
  • If you use status callback webhooks for conferences, those are not changing. Only the GET list endpoint is affected.

Action Plan Summary

Task Suggested Deadline
Audit calls to the conferences endpoint Today
Add explicit status filters This week
Separate active vs history logic This week
Tests in staging Before August 15
Production deploy Before September 1

Don't wait for the deadline. Twilio already extended it once due to customer pressure, but don't count on them doing it again. You have until September 30 — use that time to do things right, not to procrastinate.