Representing someone
Send the bot to a meeting on a person's behalf, with limits on what it may say, escalation back to them and a briefing afterwards
A persona tells the bot who it is. authority tells it whose place it is taking. With it, the bot introduces itself as an AI representative, states only the positions its owner approved, hands every real decision back to the owner instead of guessing, and writes a briefing when the meeting ends.
{
"meeting_url": "https://meet.google.com/abc-defg-hij",
"bot_name": "RepMe",
"prompt": "You attend team meetings for Ada Okafor when she cannot.",
"respond_mode": "mentioned",
"language": "en",
"authority": {
"owner_name": "Ada Okafor",
"approved_positions": ["Ada supports option B for the vendor choice"],
"escalate_on": ["any spending above 500 dollars"],
"forbidden": ["agreeing to new deadlines"]
},
"briefing": { "language": "en" },
"callback_url": "https://app.example.com/hooks/speaking-bot",
"callback_secret": "a shared secret"
}What authority changes
| Field | Effect |
|---|---|
owner_name | Who the bot represents. It says so when asked, and never pretends to be a human attendee. |
approved_positions | The only positions it will state, in these words. Without any, it captures the discussion and brings questions back. |
escalate_on | Decisions it must hand back. Spending, commitments and deadline changes are escalated even when not listed. |
forbidden | Things it will not say or do, even if asked directly. |
The block is appended last to the system prompt, so it wins over the persona and the voice guidance. The bot also stops speaking unprompted: a representative does not fill silences. Pair it with respond_mode: "mentioned" for meetings where it should only answer when addressed.
Escalations
When a participant asks for something outside the bot's authority, it calls its escalate_to_owner tool. That records the question, posts a speaking_bot.escalation event to your callback_url, and the bot tells the room it has asked the owner and will relay the answer. It does not decide, and it does not wait silently.
# What has been escalated so far
curl -s https://speaking.meetingbaas.com/bots/<bot_id>/escalations \
-H "x-meeting-baas-api-key: $KEY"
# The owner's answer; the bot relays it to the meeting
curl -s -X POST https://speaking.meetingbaas.com/bots/<bot_id>/escalations/<escalation_id>/response \
-H "x-meeting-baas-api-key: $KEY" -H "Content-Type: application/json" \
-d '{ "response": "No, hold at 500.", "decision": "declined" }'decision is optional: approved, declined, deferred or info. An escalation nobody answers stays open and is reported as unresolved in the briefing. The bot never treats silence as approval.
Messages from the owner
Anything the owner wants said mid-meeting goes through the same channel:
curl -s -X POST https://speaking.meetingbaas.com/bots/<bot_id>/messages \
-H "x-meeting-baas-api-key: $KEY" -H "Content-Type: application/json" \
-d '{ "text": "I will join at half past. Go ahead with option B." }'The bot relays it in its own words within a second or two, and a speaking_bot.owner_message_delivered event confirms it did. The relayed text appears in the transcript as the bot's turn.
The briefing
With briefing set (an empty object is enough), the API runs one LLM call when the meeting ends, on the same provider and key the bot spoke with, and writes:
| Key | Contents |
|---|---|
summary | A few sentences on what was covered and concluded |
decisions | Decisions actually taken |
actions | { owner, task, due } items |
unresolved | Open questions and items waiting on the owner |
what_the_representative_said | The positions and statements the bot made |
escalations | What was escalated, with status and answer |
coverage_notes | Caveats: parts missed, unclear audio, a late join |
curl -s https://speaking.meetingbaas.com/bots/<bot_id>/briefing \
-H "x-meeting-baas-api-key: $KEY"briefing.language picks the language it is written in (a BCP-47 tag, default English) and briefing.instructions what to focus on. Bots that do not set briefing get none: it is an LLM call on a key, and only a bot that asked for it pays for it. The same object arrives in the speaking_bot.ended event.
Every per-bot route above answers only to the API key that created the bot; any other key gets a 404.
Language
language sets the language the bot listens for, as a BCP-47 tag (en, en-NG, fr) or multi to let the speech-to-text switch between its multilingual set during the call. It defaults to US English. The language the bot speaks follows the prompt and the voice.
Events and usage
Everything the bot says, escalates and consumes is reported to you. See Callbacks and transcripts for the callback_url events and Bring your own keys for the usage report and how provider usage is billed.