Meetings
12 operations in the Tolvi API, version 1. Paths are relative to https://api.tolvi.co.uk. Every amount is integer pence.
List meetings
GET/api/v1/meetings
- Scopes
meetings:read
Newest first (up to 200). Filter by client to see the meetings filed against it, by words in the title or client name, by status, or to the ones you sent. Part of the meetings product: the firm must have it and you must have access to it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
mine | query | string | true: only the meetings you sent a note-taker to. One of: |
status | query | string (MeetingStatusGroup) | upcoming (scheduling, scheduled), in_progress (joining to processing), ready, not_recorded (failed or cancelled). One of: |
q | query | string | Words in the meeting’s title or its client’s name. up to 100 characters |
clientId | query | string (uuid) |
Responses
200 OK, application/json
Body: array of MeetingSummary.
A meeting a note-taker was sent to.
| Field | Type | Description |
|---|---|---|
[].idrequired | string (uuid) | |
[].titlerequired | string | |
[].clientIdrequired | string (uuid)nullable | |
[].clientNamerequired | stringnullable | |
[].platformrequired | string (MeetingPlatform)nullable | One of: |
[].meetingUrlrequired | string (uri) | |
[].joinAtrequired | string (date-time) | |
[].sourcerequired | string (MeetingSource) | link: pasted on the Meetings page. calendar: ticked on the Calendar page. One of: |
[].statusrequired | string (MeetingStatus) | scheduling: being sent to Recall. scheduled: will join at joinAt. joining, waiting_room (someone must admit it), in_call, recording. processing: the call ended; the transcript and summary are on their way. ready: transcript and summary filed. failed: see statusDetail. cancelled. One of: |
[].statusDetailrequired | stringnullable | Why it failed or is held up, in words. |
[].startedAtrequired | string (date-time)nullable | |
[].endedAtrequired | string (date-time)nullable | |
[].createdByIdrequired | string (uuid)nullable | |
[].createdByNamerequired | stringnullable | |
[].outputStatusrequired | string (MeetingOutputStatus) | One of: |
[].actionCountrequired | integer | at least 0 |
[].openActionCountrequired | integer | Next steps not yet sorted with Create follow-ups (made into a review point or a client request, or skipped). at least 0 |
[].recordingDeletedAtrequired | string (date-time)nullable | When the recording (audio and video) was deleted at Recall. Tolvi keeps only the transcript and summary. |
[].billableMinutesrequired | integernullable | Minutes this meeting counts against the firm’s monthly allowance: the recording’s length, rounded up. Null until it ends. at least 0 |
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).
Send a note-taker to a meeting
POST/api/v1/meetings
- Scopes
meetings:write- Retries
- Send an
Idempotency-Keyto make retries safe.
Recall.ai joins the meeting at joinAt (now if left out) as a visible participant, posts a notice that it is recording, and records it. After the call Tolvi files the transcript and Tolvi AI’s summary and actions against the meeting (charged to you as AI tokens). 409 if someone in the firm already sent one to the same meeting; 502 if Recall refused it. Part of the meetings product: the firm must have it and you must have access to it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Key | header | string | A unique key (1-255 visible characters) to make retries safe. Replayed for 24 hours. 1 to 255 characters |
Request body
Required. application/json: object (LaunchMeetingRequest).
| Field | Type | Description |
|---|---|---|
meetingUrlrequired | string (uri) | A Zoom, Google Meet, Microsoft Teams, Webex or GoTo Meeting link. example "https://teams.microsoft.com/l/meetup-join/…" |
title | string | up to 200 characters |
clientId | string (uuid)nullable | The client to file it against. |
joinAt | string (date-time) | When to join. Now if left out. |
Responses
201 Created, application/json
Body: object (MeetingDetail).
A meeting with its transcript and the Tolvi AI write-up: summary, takeaways, next steps, open questions and a draft follow-up email.
| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
titlerequired | string | |
clientIdrequired | string (uuid)nullable | |
clientNamerequired | stringnullable | |
platformrequired | string (MeetingPlatform)nullable | One of: |
meetingUrlrequired | string (uri) | |
joinAtrequired | string (date-time) | |
sourcerequired | string (MeetingSource) | link: pasted on the Meetings page. calendar: ticked on the Calendar page. One of: |
statusrequired | string (MeetingStatus) | scheduling: being sent to Recall. scheduled: will join at joinAt. joining, waiting_room (someone must admit it), in_call, recording. processing: the call ended; the transcript and summary are on their way. ready: transcript and summary filed. failed: see statusDetail. cancelled. One of: |
statusDetailrequired | stringnullable | Why it failed or is held up, in words. |
startedAtrequired | string (date-time)nullable | |
endedAtrequired | string (date-time)nullable | |
createdByIdrequired | string (uuid)nullable | |
createdByNamerequired | stringnullable | |
outputStatusrequired | string (MeetingOutputStatus) | One of: |
actionCountrequired | integer | at least 0 |
openActionCountrequired | integer | Next steps not yet sorted with Create follow-ups (made into a review point or a client request, or skipped). at least 0 |
recordingDeletedAtrequired | string (date-time)nullable | When the recording (audio and video) was deleted at Recall. Tolvi keeps only the transcript and summary. |
billableMinutesrequired | integernullable | Minutes this meeting counts against the firm’s monthly allowance: the recording’s length, rounded up. Null until it ends. at least 0 |
summaryrequired | stringnullable | |
keyPointsrequired | array of string | Takeaways: facts, figures and decisions worth keeping on the client file. |
actionsrequired | array of MeetingAction | Next steps: what each side agreed to do. |
actions[].textrequired | string | |
actions[].ownerrequired | stringnullable | As named in the meeting. |
actions[].siderequired | string (MeetingActionSide) | One of: |
actions[].duerequired | stringnullable | As said in the meeting, e.g. "by Friday". |
openQuestionsrequired | array of string | Questions raised in the meeting that were not settled. Empty for meetings summarised before 25 Oct 2026. |
followUpEmailrequired | object (MeetingFollowUpEmail)nullable | A draft email to the client recapping the meeting, with any client requests from Create follow-ups listed before the sign-off; null if nothing was agreed. Tolvi never sends it. |
followUpEmail.subjectrequired | string | |
followUpEmail.bodyrequired | string | Plain text. |
transcriptrequired | array of MeetingTurn | |
transcript[].speakerrequired | string | |
transcript[].startSecondsrequired | integer | Seconds from the start of the recording. at least 0 |
transcript[].textrequired | string | |
aiTokensrequired | integernullable | Tolvi AI tokens the summary used. at least 0 |
outputFailurerequired | stringnullable | |
followUpsrequired | array of MeetingFollowUp | What each next step became (Create follow-ups), by its position in actions. |
followUps[].actionIndexrequired | integer | The next step’s position in actions (from 0). at least 0 |
followUps[].kindrequired | string (MeetingFollowUpKind) | One of: |
followUps[].engagementIdrequired | string (uuid)nullable | |
followUps[].reviewPointIdrequired | string (uuid)nullable | |
followUps[].sectionCoderequired | stringnullable | The W/P section the review point is on (null: the engagement as a whole). |
followUps[].textrequired | stringnullable | Client requests: the line added to the follow-up email. |
followUps[].createdAtrequired | string (date-time) | |
followUps[].createdByIdrequired | string (uuid)nullable |
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 409 Conflict, 422 Unprocessable content, 429 Too many requests, as problem details (application/problem+json).
Get this month’s recorded minutes against the firm’s allowance
GET/api/v1/meetings/usage
- Scopes
meetings:read
Each meeting counts its recording’s length, rounded up to the minute, in the month it started. Part of the meetings product: the firm must have it and you must have access to it.
Responses
200 OK, application/json
Body: object (MeetingsUsage).
Recorded minutes this month against the firm’s Meetings allowance.
| Field | Type | Description |
|---|---|---|
monthrequired | string | The calendar month (UTC). example "2026-10" |
minutesUsedrequired | integer | at least 0 |
planIdrequired | stringnullable | Null on a trial (300 minutes). example "meetings_team" |
allowancerequired | integer | at least 0 |
remainingrequired | integer | at least 0 |
overageMinutesrequired | integer | Minutes beyond the allowance; billed at 3p each on a paid plan. Recording never stops. at least 0 |
thresholdsReachedrequired | array of number | 80 and 100 once reached. |
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).
Get a meeting with its transcript, summary and actions
GET/api/v1/meetings/{id}
- Scopes
meetings:read
Part of the meetings product: the firm must have it and you must have access to it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string (uuid) |
Responses
200 OK, application/json
Body: object (MeetingDetail).
A meeting with its transcript and the Tolvi AI write-up: summary, takeaways, next steps, open questions and a draft follow-up email.
The fields are as shown above.
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).
Rename a meeting or file it against a client
PATCH/api/v1/meetings/{id}
- Scopes
meetings:write
Part of the meetings product: the firm must have it and you must have access to it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string (uuid) |
Request body
Required. application/json: object (UpdateMeetingRequest).
| Field | Type | Description |
|---|---|---|
title | string | up to 200 characters |
clientId | string (uuid)nullable |
Responses
200 OK, application/json
Body: object (MeetingDetail).
A meeting with its transcript and the Tolvi AI write-up: summary, takeaways, next steps, open questions and a draft follow-up email.
The fields are as shown above.
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).
Turn next steps into follow-ups
POST/api/v1/meetings/{id}/follow-ups
- Scopes
meetings:write- Retries
- Send an
Idempotency-Keyto make retries safe.
For a filed meeting with a ready write-up: each chosen next step becomes a review point on one of the client’s engagements (needs a reviewer, manager or partner, the review:write scope and Working Papers), a request listed in the follow-up email, or is skipped. Review points are raised exactly as in the engagement, with the meeting as their source. A step already sorted the same way is left alone; sorting it differently is refused (409). Nothing is signed off. Part of the meetings product: the firm must have it and you must have access to it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string (uuid) | |
Idempotency-Key | header | string | A unique key (1-255 visible characters) to make retries safe. Replayed for 24 hours. 1 to 255 characters |
Request body
Required. application/json: object (CreateMeetingFollowUpsRequest).
| Field | Type | Description |
|---|---|---|
engagementId | string (uuid) | The engagement the review points go on: one of the filed client’s. Required when any item is a review_point. |
itemsrequired | array of MeetingFollowUpItem | 1 to 50 items |
items[].actionIndexrequired | integer | The next step’s position in the meeting’s actions (from 0). at least 0 |
items[].kindrequired | string (MeetingFollowUpKind) | review_point: raised on the engagement (reviewers, managers and partners). client_request: listed in the follow-up email. skip: nothing, but the step counts as sorted. One of: |
items[].sectionCode | stringnullable | review_point: the W/P section; null or left out for the engagement as a whole. example "J" |
items[].text | string | The wording to use instead of the next step’s own. up to 2000 characters |
items[].due | stringnullable | When it is due, in words; added to the point or request. up to 100 characters; example "by Friday" |
items[].mentionUserId | string (uuid)nullable | review_point: a person to @mention on it. |
Responses
200 OK, application/json
Body: object (MeetingDetail).
A meeting with its transcript and the Tolvi AI write-up: summary, takeaways, next steps, open questions and a draft follow-up email.
The fields are as shown above.
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 409 Conflict, 422 Unprocessable content, 429 Too many requests, as problem details (application/problem+json).
Stop the note-taker
POST/api/v1/meetings/{id}/cancel
- Scopes
meetings:write
Before it joins, it is cancelled. In the call, it leaves and what it recorded so far is still transcribed. Part of the meetings product: the firm must have it and you must have access to it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string (uuid) |
Responses
200 OK, application/json
Body: object (MeetingDetail).
A meeting with its transcript and the Tolvi AI write-up: summary, takeaways, next steps, open questions and a draft follow-up email.
The fields are as shown above.
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).
Get your connected calendar and its upcoming meetings
GET/api/v1/me/calendar
- Scopes
meetings:read
The next 28 days. A note-taker joins only the meetings you tick. Each event says if a colleague already sent a note-taker to it, and suggests a client whose name is in its title. Part of the meetings product: the firm must have it and you must have access to it.
Responses
200 OK, application/json
Body: object (MyCalendar).
Your connected calendar and its upcoming meetings.
| Field | Type | Description |
|---|---|---|
availablerequired | boolean | |
connectedrequired | boolean | |
statusrequired | stringnullable | connecting, connected or disconnected. |
platformrequired | string (CalendarPlatform)nullable | One of: |
emailrequired | stringnullable | |
eventsrequired | array of CalendarEvent | |
events[].idrequired | string | |
events[].titlerequired | string | |
events[].startTimerequired | string (date-time) | |
events[].endTimerequired | string (date-time) | |
events[].meetingUrlrequired | stringnullable | |
events[].platformrequired | string (MeetingPlatform)nullable | One of: |
events[].notetakerrequired | boolean | A note-taker will join: you ticked it. |
events[].meetingIdrequired | string (uuid)nullable | |
events[].clientIdrequired | string (uuid)nullable | |
events[].clientName | stringnullable | The name of the client the meeting is filed against. |
events[].takenByrequired | stringnullable | A colleague already sent a note-taker to this meeting: their name. |
events[].suggestedClientId | string (uuid)nullable | A client whose name is in the meeting’s title: a suggestion for filing it. |
events[].suggestedClientName | stringnullable |
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).
Disconnect your calendar
DELETE/api/v1/me/calendar
- Scopes
meetings:write- Access
- A signed-in Tolvi session only, never an API token.
Note-takers scheduled from it are cancelled. Part of the meetings product: the firm must have it and you must have access to it.
Responses
204 No content
Disconnected.
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).
Start connecting your Outlook calendar
POST/api/v1/me/calendar/connect
- Scopes
meetings:write- Access
- A signed-in Tolvi session only, never an API token.
Returns Microsoft’s sign-in URL. Tolvi asks only to read your calendar. Part of the meetings product: the firm must have it and you must have access to it.
Responses
200 OK, application/json
Body: object (CalendarConnectStart).
| Field | Type | Description |
|---|---|---|
authorizeUrlrequired | string (uri) | Send the browser here to sign in to Microsoft. |
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 429 Too many requests, as problem details (application/problem+json).
Send a note-taker to a calendar meeting
PUT/api/v1/me/calendar/events/{eventId}/notetaker
- Scopes
meetings:write
It joins when the meeting starts and follows the meeting if it moves. Part of the meetings product: the firm must have it and you must have access to it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
eventIdrequired | path | string (uuid) | The calendar event id from GET /me/calendar. |
Request body
Required. application/json: object (CalendarNotetakerRequest).
| Field | Type | Description |
|---|---|---|
clientId | string (uuid)nullable | The client to file it against. |
Responses
200 OK, application/json
Body: object (MeetingDetail).
A meeting with its transcript and the Tolvi AI write-up: summary, takeaways, next steps, open questions and a draft follow-up email.
The fields are as shown above.
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).
Stop sending a note-taker to a calendar meeting
DELETE/api/v1/me/calendar/events/{eventId}/notetaker
- Scopes
meetings:write
Part of the meetings product: the firm must have it and you must have access to it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
eventIdrequired | path | string (uuid) | The calendar event id from GET /me/calendar. |
Responses
204 No content
It won’t join.
Errors: 400 Bad request, 401 Unauthorised, 403 Forbidden, 404 Not found, 429 Too many requests, as problem details (application/problem+json).