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.

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:
- Active Twilio account with at least one voice-enabled number.
- Node.js 20+ or Python 3.11+ installed (snippets cover both).
- Twilio Helper Library:
npm install twilioorpip install twilio. - Environment variables configured:
TWILIO_ACCOUNT_SIDandTWILIO_AUTH_TOKEN. - Your WhatsApp bot already integrated with Twilio (via Twilio API for WhatsApp or Sandbox).
- 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
pageSizeandnextPageUrl. - The
dateCreatedAfterparameter 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.