> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.meetstream.ai/guides/features/custom-attributes/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server.
# Custom Attributes
> Tag meeting bots with your own key-value metadata, get it echoed back in every webhook, and filter the List Bots endpoint by it for usage attribution.
`custom_attributes` is a free-form string map you attach at `create_bot`. MeetStream never interprets it — it just **echoes it back everywhere**, which makes it the backbone of routing, attribution, and multi-tenant bookkeeping.
## Set at create time
```json
{
"meeting_link": "https://meet.google.com/abc-defg-hij",
"bot_name": "Notetaker",
"custom_attributes": {
"customer_id": "cus_8842",
"environment": "production",
"job_id": "meeting-sync-1234"
}
}
```
CLI: `meetstream bot create --attr customer_id=cus_8842 --attr environment=production`.
## Where it comes back
1. **Every webhook event.** Each delivery carries your `custom_attributes` verbatim — route events to the right tenant handler without any lookup table:
```json
{ "event": "bot.stopped", "bot_id": "...", "bot_status": "Stopped",
"custom_attributes": { "customer_id": "cus_8842", "environment": "production" } }
```
2. **List Bots filtering.** Query your fleet by attribute with `custom_attr[...]` params (conditions combine with AND):
```bash
curl "https://api.meetstream.ai/api/v1/bots?custom_attr[customer_id]=cus_8842&custom_attr[environment]=production" \
-H "Authorization: Token "
```
3. **Status and detail endpoints** return them alongside the bot's state.
4. **The Usage dashboard** shows per-bot metadata in its cost breakdown — so per-customer usage attribution falls out for free. See [Usage & Retention](/guides/features/usage-and-retention).
## Patterns that work well
* **Multi-tenant routing**: `customer_id` on every bot; webhook handlers dispatch on it with zero database reads.
* **Idempotent job tracking**: put your queue's `job_id` in attributes, and pair with a [`deduplication_key`](/guides/features/deduplication-idempotency-keys) so retries never double-book the meeting.
* **Environment separation**: tag `environment: staging|production` and filter List Bots per environment — or go further and use separate [workspaces](/guides/get-started/workspaces) with separate keys.
> Meeting bot API documentation for Zoom, Google Meet and Microsoft Teams: create bots, stream real-time audio, transcribe, and run in-meeting voice agents.