Meeting infrastructure
A bot joins the meeting. Your application gets everything that happened.
Bot Engine sends an automated participant into Zoom, Microsoft Teams and Google Meet, captures the audio, transcribes it, and reports every step of the lifecycle back to you over a versioned API and signed webhooks. You build the product; the part that has to survive a meeting is ours.
Already set up? Sign in to your dashboard.
curl -X POST https://api.botengine.dev/v1/bots \
-H "Authorization: Bearer $BOT_ENGINE_KEY" \
-d '{
"meeting_url": "https://zoom.us/j/123456789",
"display_name": "Acme Notetaker",
"transcription": true
}'
# → { "id": "bot_7f3a…", "status": "scheduled" }POST /your/webhook X-BotEngine-Signature: v1=…
{
"type": "recording.ready",
"sequence": 4,
"data": {
"bot_id": "bot_7f3a…",
"duration_seconds": 2714
}
}The problem
Joining a meeting reliably is a full-time engineering project
Every provider ships UI changes on their own schedule, and each one breaks a headless browser in a way that looks identical to a network error. Building this once is a sprint; keeping it working is a team.
The pages keep moving
A join button moves, a consent dialog is added, a lobby appears. Bot Engine tracks per-provider join success as its headline metric, so drift is visible as a falling number rather than as a support ticket.
Meetings fail in specific ways
Nobody admits the bot. The host removes it. The meeting had already ended. Each is a distinct, documented failure code — not a generic timeout you have to guess at.
Media is the easy part to lose
Audio is captured in short segments and assembled server-side, so a process that dies at minute fifty does not take the first forty-nine with it.
How it works
Three calls, and the rest is reported to you
- 01
Create a bot
One POST with a meeting link. Schedule it for later or send it in now.
- 02
It joins and records
The bot appears as a named participant, captures audio, and tracks who came and went.
- 03
You get the artefacts
Recording and transcript, plus a signed webhook at every lifecycle change.
Built for developers
An API you can reason about at 3am
The details that decide whether an integration is pleasant or painful, decided in your favour.
- Keyset pagination, so a list being written to never skips or repeats a row
- Every error carries a request id you can quote — no guessing which log line was yours
- Per-bot monotonic sequence numbers, so out-of-order webhook deliveries are trivially discarded
- Signed webhooks with dual-secret rotation: the old secret keeps verifying until you switch over
- Replay any event after your endpoint comes back up
- A mock server you can run in your own CI instead of booking a real meeting
What a lifecycle looks like
- bot.scheduledqueued for a meeting at 14:00
- bot.status_changedjoining
- bot.status_changedrecording
- recording.ready45m 14s of audio, assembled
- transcript.ready412 segments, speaker-labelled
Operate it
A control plane, not just an API
Every bot, recording, transcript and webhook delivery is visible to your team without anyone opening a terminal.
Live status
Watch bots join and record as it happens, over a resumable event stream.
Delivery log
Every webhook attempt with the response your server actually returned.
Roles and audit
Four roles, and a log of every change your team makes with secrets redacted before they are written.
Retention controls
Set how long media is kept. Deletion runs in two phases with a recovery window.