1. Send the bot
native_meeting_id is the meeting id inside the join URL, not the whole URL. Have only the
URL? Send meeting_url alone instead of platform + native_meeting_id — the API parses it to
extract both, and, for a Zoom link that embeds one, the passcode. A URL that is not a recognizable
meeting link is refused with a 422 naming the missing native_meeting_id.
$API_BASE is https://api.cloud.vexa.ai hosted, or http://localhost:18056 self-hosted.
Optional on the spawn: language (ISO code; omit for per-window auto-detection) and task
(transcribe default, or translate).
2. Read the transcript live
Segments stream in as the meeting runs. Poll:completed: false and are replaced by completed: true confirmations. For
per-segment push instead of polling, subscribe on the gateway’s /ws:
Zoom specifics
- Web client only. In 0.12.x the bot joins Zoom through the web client. The native SDK / OBF-token path is not carried — see Roadmap → Status.
- Passcodes. The field is spelled
passcode.password,meeting_passwordand the other near-misses are refused with a422naming the field to use, rather than accepted and dropped. A passcode already in the URL’s query wins over a separatepasscodefield. - Language auto-detection. Zoom rides the mixed-audio lane, where a low-confidence detection
discards the window rather than guessing; those windows carry
language: null. Pinlanguageon the spawn to avoid it. - Leaving on its own. An active bot leaves after 10 minutes with no remote microphone audio and
finishes as
completed(left_alone). Widen it per meeting withautomatic_leave.max_time_left_alone.
Stop the bot
See also
- Send a bot and get a transcript — the full walkthrough, all platforms
- Meetings API — every parameter, status, and response shape
- Troubleshooting — the bot joined but there is no transcript