Skip to main content
A bot is one recording of one meeting. You send one when MeetingKit doesn’t learn about the call from a calendar: your user pastes a link, or your backend already decides which meetings to record. Either way, the bot belongs to a meeting and the results are on that meeting.

From a button

A “Send bot to meeting” button lets your user paste a link to a call that is on no calendar.
A Send bot to meeting button in the meetings screen opens a form with a meeting link and a Send bot button. Notes: Send bot is POST /bots with member_id and meeting_url; the results come from GET /meetings/{meeting_id}/results.
Without join_at the notetaker joins as soon as it can: within seconds, and always within three minutes. member_id makes the meeting this user’s, so it shows in their meetings list with source: "bot". member_id comes from connecting a calendar. For a user who never connected one, create their member once and store the mem_ id:
Sending the same email again returns the same member, unchanged: its name and metadata stay as they are. Change them with PATCH /members/{id}.

From your backend

If your product already knows which meetings to record, from your own calendar sync or your users’ choices, your backend sends a bot per meeting and keeps it in step with your calendar.

Schedule it

Set join_at to the meeting’s start, as an ISO 8601 time with an offset:
The bot stays queued until join_at, then joins on time. Send it as soon as the meeting is on your calendar, and at least ten minutes before it starts: scheduled bots are guaranteed a seat. join_at must be in the future.
  • participants are the people you expect, with names and emails. MeetingKit uses them to name the speakers instead of “Speaker 1”. Up to 100.
  • metadata holds your own ids: flat string values, merged on update. It comes back on the bot and the bot.* webhooks. It is not copied to the meeting: set the meeting’s own with PATCH /meetings/{id}.

One bot per meeting

When several of your users are invited to the same meeting, you want one bot, not one per attendee. A request with the same workspace_id, meeting_url and join_at as a bot that is still queued, joining or in_call returns that bot instead of sending a second one.
  • Send the meeting’s start as join_at, the same value for every attendee.
  • Send the join link exactly as it appears in the invite.
  • It is per workspace: two customers who meet each other get one bot each.
The first request wins: its participants and metadata stay on the bot. This also makes creation safe to retry: if a POST times out, send it again and you get the bot that was created. The meeting belongs to the member of that first request. A request naming a different member_id answers 409 bot_already_recording, with the id of the bot already there: send the bot once per meeting, with the member who owns it, such as the organizer.

Keep it in step with your calendar

Store the bot id next to your meeting, then: join_at and meeting_url can change until the bot starts joining; participants until the call ends; metadata until the bot ends. Past that, PATCH answers 409 bot_not_editable. Cancelling a bot in the call makes it leave; what it recorded is kept. Once a day, re-read the next seven days of your calendar and reconcile them with your bots: calendar notifications get lost.

How the bot looks and records

A bot follows the workspace’s and the member’s recording choices and the workspace’s branding. Override them for one bot: These values become the meeting’s own settings, so the bot and its meeting never disagree. Before the call, change the language, summary or silence alert with PATCH /settings/{id}, the settings_id of the meeting’s own assignment in its settings.assignments. See Settings.

What happens next

A bot moves from queued to joining, in_call, processing, and completed. It can also end as failed or cancelled.
The bot.* webhooks follow these steps. The results are on the meeting: when meeting.finished fires for the bot’s meeting_id, read GET /meetings/{id}/results.