Your agent can now join a meeting. Transcribe, speak, chat, and get a summary at the end. One API call, one API key.


Every other notetaker assumes a human clicks join. Meeting API assumes an agent calls an endpoint. Same primitives, same API key, extended into the meeting room.

No second auth flow, no second billing relationship. STT, TTS, telephony, and meeting participation run on the Telnyx API key you already have. One account, one invoice, one support thread.

Call quality, latency, transcription, and TTS on the same carrier-grade network. No third-party hops. Consistent performance from session layer to model layer, all behind one API key.
Each primitive is independently useful and composes with the rest of the Telnyx stack.
Live transcription
Stream the meeting transcript to your agent as it happens, with speaker labels and timestamps, through Telnyx STT.
Programmable speech
Your agent can make the bot say anything at any point in the meeting. Text goes through Telnyx TTS and plays into the meeting audio.
Chat injection
Drop messages into the meeting chat on Zoom, Google Meet, and Teams. Webex supports joining and transcription but not chat.
Post-meeting artifacts
When the meeting ends, receive structured summaries and action items generated by Telnyx Inference. summarize_on_end auto-generates a summary from the final transcript.
Webhook-driven lifecycle
Set a webhook_url on session create to receive signed meeting lifecycle events. No polling required, but polling is supported for batch workflows.
Cross-platform support
One API surface for Zoom, Google Meet, Microsoft Teams, and Webex. Same request shape, same response shape, same webhook contract.
Create a session, poll for status, fetch the transcript, and tell the bot to speak.
Create, poll, transcribe, speak
# 1. Create a meeting session
curl -X POST https://api.telnyx.com/v2/meeting_sessions \
-H "Authorization: Bearer $TELNYX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"meeting_url": "https://meet.google.com/abc-defg-hij",
"bot_name": "Standup Bot",
"summarize_on_end": true
}'
# 2. Poll session status until active
curl https://api.telnyx.com/v2/meeting_sessions/$SESSION_ID \
-H "Authorization: Bearer $TELNYX_API_KEY"
# 3. Fetch the live transcript
curl "https://api.telnyx.com/v2/meeting_sessions/$SESSION_ID/transcript?after=0&limit=100" \
-H "Authorization: Bearer $TELNYX_API_KEY"
# 4. Make the bot speak
curl -X POST https://api.telnyx.com/v2/meeting_sessions/$SESSION_ID/actions/speak \
-H "Authorization: Bearer $TELNYX_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "text": "I have the action items from last week." }'Same flow with requests
import os, time, requests
API = "https://api.telnyx.com/v2"
HEADERS = {"Authorization": f"Bearer {os.environ['TELNYX_API_KEY']}", "Content-Type": "application/json"}
# 1. Create a meeting session
session = requests.post(f"{API}/meeting_sessions", headers=HEADERS, json={"meeting_url": "https://meet.google.com/abc-defg-hij", "bot_name": "Standup Bot", "summarize_on_end": True}).json()["data"]
session_id = session["id"]
# 2. Poll until active
while True:
status = requests.get(f"{API}/meeting_sessions/{session_id}", headers=HEADERS).json()["data"]
if status["status"] == "active": break
time.sleep(5)
# 3. Fetch the transcript
transcript = requests.get(f"{API}/meeting_sessions/{session_id}/transcript?after=0&limit=100", headers=HEADERS).json()["data"]
# 4. Make the bot speak
requests.post(f"{API}/meeting_sessions/{session_id}/actions/speak", headers=HEADERS, json={"text": "I have the action items from last week."})Same flow with fetch
const API = "https://api.telnyx.com/v2";
const headers = {Authorization: `Bearer ${process.env.TELNYX_API_KEY}`, "Content-Type": "application/json"};
// 1. Create a meeting session
const session = await fetch(`${API}/meeting_sessions`, {method: "POST", headers, body: JSON.stringify({meeting_url: "https://meet.google.com/abc-defg-hij", bot_name: "Standup Bot", summarize_on_end: true})}).then(r => r.json());
const sessionId = session.data.id;
// 2. Poll until active
let status;
do {
await new Promise(r => setTimeout(r, 5000));
status = await fetch(`${API}/meeting_sessions/${sessionId}`, {headers}).then(r => r.json());
} while (status.data.status !== "active");
// 3. Fetch the transcript
const transcript = await fetch(`${API}/meeting_sessions/${sessionId}/transcript?after=0&limit=100`, {headers}).then(r => r.json());
// 4. Make the bot speak
await fetch(`${API}/meeting_sessions/${sessionId}/actions/speak`, {method: "POST", headers, body: JSON.stringify({text: "I have the action items from last week."})});
Programmable voice agents for inbound and outbound calls. Same STT, TTS, and orchestration primitives that power Meeting API.

Open-weight and frontier models on edge-deployed GPUs. Per-token pricing with global availability.

Hosted voices from Telnyx and third-party providers. Use the same voice in your meeting bot, your voice agent, and your IVR.

Real-time and batch transcription with multiple model options. Pick the model that fits your latency, accuracy, and cost targets.
Sign up, grab your key, and run the cURL example above. Meeting API is in beta.
Sign up, grab your key, and run the cURL example above. Meeting API is in beta.
Meeting API is an API-first agent primitive that lets a developer programmatically add a Telnyx-controlled AI participant to a Zoom, Google Meet, Microsoft Teams, or Webex meeting. The bot transcribes the meeting live, can speak and chat into it, and returns structured summaries and action items when the meeting ends.