MeetStream — MIA API Reference
MeetStream — MIA API Reference
MIA (MeetStream Infrastructure Agent) configurations define how an AI agent behaves when deployed into a meeting. Use these endpoints to create, retrieve, update, and delete agent configurations programmatically — no dashboard required.
Base URL: https://api.meetstream.ai
Authentication: Authorization: Token <YOUR_API_KEY>
Content-Type: application/json
Applies to: Google Meet, Zoom, Microsoft Teams Support: docs.meetstream.ai · API: api.meetstream.ai
Before you start: Agent configurations require that you have configured the relevant provider API keys in MeetStream. Add keys via the MeetStream dashboard → Integrations page (or the Integrations API) before creating an agent that references those providers.
Endpoints
POST /api/v1/mia
Create a new agent configuration.
Request Body
Nested: model (Pipeline Mode)
Nested: model (Realtime Mode)
Realtime providers — model and voice values
Nested: voice (Pipeline Mode)
Voice model defaults by provider
If you omit voice.model, the API fills it automatically:
Important: ElevenLabs voice IDs are provider-specific UUIDs — do not use OpenAI voice names like
"alloy"withprovider: "elevenlabs". This will cause a 403 error from ElevenLabs.
Nested: transcriber (Pipeline Mode)
Transcriber model defaults by provider
If you omit transcriber.model, the API fills it automatically:
Nested: agent
The agent block is optional. If omitted entirely on a pipeline-mode create, the API fills it with sensible defaults so you don’t need to specify every field.
Nested: agent.mcp_servers[]
Nested: agent.custom_functions[]
Each entry registers a single HTTPS endpoint as an LLM-callable tool. Authentication is handled by you — put a narrowly scoped bearer token or API key in headers. See the Custom Functions Guide for end-to-end setup and response-variable examples.
By default, POST, PUT, and PATCH requests use the body {"name", "bot", "args"}. The bot object always contains bot_id; agent_id is optional. Its dynamic_vars contains values extracted from earlier custom-function responses, not the bot’s initial agent_config_params. GET and DELETE send no body unless payload_args_only=true.
Nested: agent.custom_functions[].response_variables[]
Nested: wake_word (Pipeline Mode Only)
Runtime default: A pipeline agent with no stored
wake_wordblock starts with gating enabled, the phrases["hey assistant", "hello bot"], and a 30-second timeout. Setwake_word.enabled=falseexplicitly when the agent should listen to every utterance.Tip — picking values: Leave both adaptive fields at
0for shared meetings where the wake word is the privacy contract. Setbypass_below_participants: 1for direct 1:1 calls. Combinemax_listening_window: 600with the defaulttimeout: 30for a hard ten-minute listening ceiling.
Speaker-Aware Responses
Pipeline mode only. When agent.speaker_aware_responses: true, every transcribed user utterance is prefixed with the active speaker’s display name before it reaches the LLM. The agent’s chat history then carries who-said-what context, which is critical for multi-participant calls (sales calls, panels, group standups) where the agent should address people by name and reason about turn-taking.
What the agent sees
Without speaker_aware_responses (default):
With speaker_aware_responses: true:
The system prompt is automatically extended with a short instruction telling the LLM to use the names but not echo the bracketed prefix back in its replies.
Customising the instruction (speaker_aware_prompt)
The default instruction MeetStream appends is generic — “use the name to keep track of who said what, address participants by name when appropriate, do not include the bracketed prefix in your own replies”. For most agents this is all you need.
When you want different behaviour — e.g. only address the most senior participant, summarise per-speaker at the end of the call, or treat the names purely as metadata that the agent should never mention out loud — provide your own agent.speaker_aware_prompt. It’s appended to your model.system_prompt verbatim (with a leading blank line) whenever speaker_aware_responses=true. Limits:
- Max 2000 characters.
- Must be a string.
null, empty string, or omitted field → MeetStream uses its default. - Has no effect when
speaker_aware_responsesisfalse(it’s still accepted by the API so configs round-trip cleanly).
The bracketing mechanism ([Rahul]: ...) is unconditional once speaker_aware_responses=true — speaker_aware_prompt only governs how the LLM interprets the prefix, not whether it appears.
Example custom prompts:
Speaker accuracy by platform
The transcript prefix uses the latest speaker state when an utterance completes; it is not bound to a speaker-specific transcript span. Treat names as helpful conversational context, not forensic diarization. Rapid hand-offs, overlapping speech, and fallback mixed-audio paths can be misattributed.
Compatibility
- STT providers: Works with any provider you configure in
transcriber. No diarization flags or special setup required — the speaker label comes from the bot itself, not the STT provider. - Wake word: Compatible. Wake-word detection tokenises the transcript and ignores punctuation, so the bracketed prefix does not block matching.
- Realtime mode: Not part of the documented speaker-prefix contract. Realtime providers ingest raw audio directly; do not rely on this field for speaker attribution.
- Custom functions / MCP tools: Compatible. Tool calls are unaffected.
Example — enable speaker-aware responses
Nested: avatar
Renders a video avatar on the bot’s participant tile. Requires an Anam API key configured via the Integrations API (config_type=avatar, provider=anam). See Virtual Avatars for capability details.
Example Request — Pipeline Mode
Example Request — Realtime Mode
Example Request — Realtime Mode (xAI Grok)
Example Request — Realtime Mode (Google Gemini)
Example Request — Pipeline Mode with Wake Words
The
bypass_below_participants: 1above tells the bot to skip wake-word gating when only one human is in the meeting (you + bot). The moment a second human joins, gating resumes automatically.
Example Request — Pipeline Mode with MCP Tools
Example Request — Pipeline Mode with Custom Functions
Register two HTTPS endpoints as agent tools. The LLM sees them in the function-calling schema and can call them when the conversation warrants. The response body from lookup_order is captured into the session’s dynamic vars so later prompt updates can reference {{latest_order_status}}.
Example Request — Realtime Mode with Anam Avatar
Renders a video avatar on the bot’s tile that lip-syncs to the agent’s voice. Requires an Anam API key stored via the Integrations API (config_type=avatar, provider=anam). Use GET https://api.anam.ai/v1/avatars to list your available avatar ids.
Response — 200 OK
GET /api/v1/mia
Retrieve a specific agent configuration by ID, or list all configurations for your account.
Query Parameters
If agent_config_id is omitted, all configurations for your account are returned.
Example — List All Configurations
200 OK
Example — Get a Specific Configuration
200 OK
PUT /api/v1/mia
Update an existing agent configuration. Only fields present in the request body are updated — omitted fields are left unchanged.
Request Body
Note: Changing
modetriggers full re-validation. Updating individual sections likemodel,voice, ortranscribervalidates that you have the required provider API keys but does not re-validate the full config structure.
Example — Update the System Prompt
Example — Update Agent Name and Wake Word
Example — Switch from Pipeline to Realtime Mode
Response — 200 OK
DELETE /api/v1/mia
Permanently delete an agent configuration. This action cannot be undone.
Query Parameters
Example
200 OK
Error Codes
Common Error Responses
Missing provider API key
Missing required field
Invalid mode
Unsupported provider
Invalid realtime voice
Invalid xAI voice
Invalid Gemini voice
Access denied
Server-Side Defaults (Pipeline Mode)
When creating a pipeline agent, the API automatically fills missing optional fields so the stored config matches what the internal dashboard produces. You can override any default by including the field explicitly.
Field-name normalization:
model.max_tokenis auto-corrected tomodel.max_tokens.transcriber.boost_wordsis auto-corrected totranscriber.boostwords.
Supported Providers
For the full list of supported realtime and pipeline providers, voices, models, and capabilities (wake words, interruption, VAD, MCP, echo cancellation, etc.), see the MeetStream MIA Reference.
Template Variables
Agent config prompts support Mustache-style {{variable}} placeholders in model.system_prompt and model.first_message. This lets you create a reusable agent config once and customize it per-bot at creation time by passing different variable values.
How It Works
- Define placeholders in your agent config prompt using
{{variable_name}}syntax. - Pass values via the
agent_config_paramsfield when creating a bot. - Placeholders are resolved before the agent session starts — the LLM receives the fully substituted prompt.
Variable names can contain letters, digits, and underscores (\w+). Unresolved placeholders (no matching key in agent_config_params) are left as-is in the prompt.
Example — Reusable Sales Agent
Step 1: Create an agent config with template variables
Step 2: Create bots with different variable values
The agent receives this resolved prompt:
You are a sales assistant for Acme Corp. You are speaking with Sarah. Focus on enterprise analytics. Mention the Q2 discount if asked about pricing.
And the first message spoken to the meeting:
Hi Sarah, thanks for joining! I am here to help you with enterprise analytics.
Example — Fully Dynamic Prompt
You can use a single {{prompt}} placeholder to make the entire system prompt dynamic:
agent_config_params Reference
Custom Functions
Custom functions let your agent call any HTTPS endpoint you host as a tool. Pair them with, or use them instead of, MCP: use MCP when you already run a multi-tool MCP server; use custom functions when you want to register a single endpoint without standing up MCP.
What you get per function
- JSON Schema arguments (the LLM generates correctly-typed args).
- Custom headers with
{{variable}}substitution, plus automaticX-Bot-IDandX-Agent-IDcontext headers. - Automatic retries on 5xx / network errors with exponential backoff.
- Configurable response cap so long payloads don’t overwhelm the model.
- Optional filler utterance while the HTTP call runs (
speak_during_execution) and optional silent return once it finishes (speak_after_execution=false). - Optional response variables — values pulled from successful JSON responses via dot-notation paths. They are immediately available to later custom-function templates and to stored-prompt template rebuilds triggered by
update_mia.
See agent.custom_functions[] for the full field table and the Custom Functions Guide for an end-to-end example.
Mid-Call Updates (update_mia)
Request an asynchronous update to the agent’s prompt, template variables, or wake-word state while the bot is live in a meeting. A successful HTTP response confirms that the command was accepted and forwarded; it does not wait for an application acknowledgement from the active agent session.
Endpoint
Request Body
Note: At least one of
agent_config_params,system_prompt,wake_word_enabled, orwake_wordsis required. If bothagent_config_paramsandsystem_promptare provided,system_prompttakes precedence. A suppliedsystem_promptis literal and is not template-resolved. The wake-word fields are applied first.
Merge Behavior for agent_config_params
New params are merged into the bot’s existing AgentConfigParams in DynamoDB — they do not replace them. For example, if the bot was created with:
And you send:
The merged result used for template resolution is:
The original template from the agent config is re-resolved against the merged params.
Example — Update Template Variables Mid-Call
Example — Replace the System Prompt Entirely
Live wake-word control
wake_word_enabled and wake_words give you runtime control over the wake-word system without needing to update the agent config or restart the bot.
Behaviour
wake_word_enabled: trueforces the gate on: the agent stays gated even if the meeting drops belowbypass_below_participants(e.g. a 1:1 call where the gate would normally auto-bypass). The agent waits for a wake phrase before responding.wake_word_enabled: falseforces the gate off: the agent listens to every utterance regardless of meeting size. Useful for “always-on” modes, push-to-talk dashboards, or debugging.wake_words: [...]replaces the entire phrase list. Subsequent utterances are matched against the new list (whole-token, case-insensitive, punctuation-insensitive). Phrases configured at agent-config creation time are no longer matched.- Either field is sticky for the rest of the session — it overrides the agent-config defaults and the participant-count bypass until the bot leaves the meeting (or you call
update_miaagain with a different value). - Both fields are accepted in a single call. Phrases are applied first, then the on/off override, then any prompt update.
Override semantics — important
wake_word_enabled supersedes the automatic bypass_below_participants logic configured on the agent. Once you call update_mia with wake_word_enabled, the platform-side participant-count bypass is no longer consulted for that bot — your explicit setting is authoritative until the bot leaves. This lets you take full control from a dashboard or runtime workflow without fighting the platform.
Examples
Disable the gate for the rest of the call (always-on listening):
Re-enable the gate (e.g. when guests join the call):
Switch wake phrases mid-call (e.g. swap to a meeting-specific code phrase):
Combined update — switch into always-on, replace wake phrases, and pivot the prompt in one call:
Validation errors (400)
Persistence: live overrides are held in-memory on the agentic task. If the agentic task is replaced (rolling deploy), the bot reverts to the wake-word settings configured on its agent. To make a setting permanent, also update the agent config via the standard
PUT /api/v1/miaendpoint.
Response (200)
This response means accepted for asynchronous delivery, not confirmed application:
Conditions
- The bot must have an active MIA agent session (created with
agent_config_id). - The bot must be in the meeting (
JoiningorInMeetingstatus). - Rate limit: 30 bot-command requests per minute per bot, shared with other commands on this endpoint.
- Works on all platforms: Google Meet, Zoom, Microsoft Teams.
Error Responses
Using an Agent Config with a Bot
Pass agent_config_id when creating a bot to attach the agent to a meeting session. The agent becomes active as soon as the bot joins. WebSocket URLs for socket_connection_url and live_audio_required are auto-populated when agent_config_id is present — you do not need to provide them.
To customize the prompt per-bot, add agent_config_params (see Template Variables):
See the Create Bot Payload Reference for all available bot creation options.
Related Guides
- MIA Reference — Full feature reference: modes, providers, wake words, MCP tool calling, interruption handling
- Create an AI Agent (Dashboard) — Step-by-step dashboard walkthrough with MCP server setup
- Create Bot Payload Reference — All
create_botfields includingagent_config_id
