Speaking Bots

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

FieldEffect
owner_nameWho the bot represents. It says so when asked, and never pretends to be a human attendee.
approved_positionsThe only positions it will state, in these words. Without any, it captures the discussion and brings questions back.
escalate_onDecisions it must hand back. Spending, commitments and deadline changes are escalated even when not listed.
forbiddenThings 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:

KeyContents
summaryA few sentences on what was covered and concluded
decisionsDecisions actually taken
actions{ owner, task, due } items
unresolvedOpen questions and items waiting on the owner
what_the_representative_saidThe positions and statements the bot made
escalationsWhat was escalated, with status and answer
coverage_notesCaveats: 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.

On this page