Send the note-taker from your own code
One key, one balance. The API spends the same meeting minutes the web app does, and a meeting booked by your code shows up on the same page as one booked by hand.
Getting a key
Sign in first: the key belongs to your account, and so do the minutes it spends.
Sign inCalling it
Every request carries the key. There is no cookie, no CORS and no browser flow: this is for your server.
curl -X POST https://api.odilelabs.com/v1/meetings \
-H "Authorization: Bearer $ODILE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"meeting_url":"https://meet.google.com/abc-defg-hij","title":"Weekly review"}'
The response carries the meeting, including its id. Poll /v1/meetings/:id, or read
/v1/meetings/:id/recap once it is done.
What you can call
| Method | Path | What it does |
|---|---|---|
| POST | /v1/meetings | Send the note-taker. {"meeting_url": "…"}, and optionally starts_at, title, max_minutes, recipients. |
| GET | /v1/meetings | Every meeting on the account, newest first. |
| GET | /v1/meetings/:id | One meeting: its state, the minutes charged, and who was sent the recap. |
| GET | /v1/meetings/:id/transcript | What was said, once there is a transcript. |
| GET | /v1/meetings/:id/recap | The written notes, once they exist. |
| POST | /v1/meetings/:id/cancel | Call the note-taker back before or during the meeting. |
| GET | /v1/account | The account behind the key, its minutes, and the packs it can buy. |
When something goes wrong
Errors are always {"error": {"code", "message"}}, and the code is stable even when the wording changes.
| Code | Status | Means |
|---|---|---|
| invalid_api_key | 401 | No key, a key that is not ours, or one that has been revoked. Unknown paths answer this too, so the API does not say which routes exist. |
| rate_limited | 429 | Too many requests for this key. Retry-After says how long. |
| body_too_large | 413 | Over 64 KB. |
| json_only | 415 | Send application/json. |
| meeting_url_required | 400 | A Zoom, Google Meet or Microsoft Teams link we can join. |
| not_enabled | 503 | Meeting notes is off on this deployment. |
Or connect it to your agent
There is a hosted MCP server at https://odilelabs.com/mcp. An agent that speaks MCP — Claude
Code, Codex, and anything else that does — can send the note-taker itself, without you writing a client.
Sign-in is OAuth, discovery is where a client expects it, and registration is dynamic: most clients need nothing
from you but the URL.
claude mcp add --transport http odile https://odilelabs.com/mcp
You are taken to a consent screen that lists what the connection is asking for, with each permission as its own tick box. Read-only is always included; everything that spends or changes something you tick yourself, and you can reconnect later to change your mind.
| Tool | Permission | What it does |
|---|---|---|
| schedule_meeting_notes | meetings:write | Sends the note-taker to a Zoom, Meet or Teams link. Reserves minutes before anything is booked. |
| get_meeting | meetings:read | Status, recipients and delivery state of one meeting, or the most recent. |
| get_meeting_summary | meetings:read | The recap of a finished meeting: decisions, action items, open questions. |
| cancel_meeting_notes | meetings:write | Stops a note-taker that has not finished, and releases the reserved minutes. |
It draws on the same minute balance as the API and the web app — one balance, whichever way you reach it. An agent cannot spend more than the permissions you ticked allow.
What it costs
The same minutes as the web app: charged for every minute the note-taker is on the call, from joining to leaving. Down to 3.5¢ a minute on the 2,000-minute pack. A meeting that fails on our side is not charged. The full pricing is here.
Rate limits are per key. A revoked key can keep working for up to about a minute while it clears.