Odile Labs

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 in

Calling 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

MethodPathWhat it does
POST/v1/meetingsSend the note-taker. {"meeting_url": "…"}, and optionally starts_at, title, max_minutes, recipients.
GET/v1/meetingsEvery meeting on the account, newest first.
GET/v1/meetings/:idOne meeting: its state, the minutes charged, and who was sent the recap.
GET/v1/meetings/:id/transcriptWhat was said, once there is a transcript.
GET/v1/meetings/:id/recapThe written notes, once they exist.
POST/v1/meetings/:id/cancelCall the note-taker back before or during the meeting.
GET/v1/accountThe 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.

CodeStatusMeans
invalid_api_key401No 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_limited429Too many requests for this key. Retry-After says how long.
body_too_large413Over 64 KB.
json_only415Send application/json.
meeting_url_required400A Zoom, Google Meet or Microsoft Teams link we can join.
not_enabled503Meeting 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.

ToolPermissionWhat it does
schedule_meeting_notesmeetings:writeSends the note-taker to a Zoom, Meet or Teams link. Reserves minutes before anything is booked.
get_meetingmeetings:readStatus, recipients and delivery state of one meeting, or the most recent.
get_meeting_summarymeetings:readThe recap of a finished meeting: decisions, action items, open questions.
cancel_meeting_notesmeetings:writeStops 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.