Meeting Recorder
Manage meeting-recorder bots and everything they capture: create, share, and delete bots, control per-calendar auto-record behavior, dispatch the bot into meetings, retry transcription and summarization, share recordings, and pull transcripts, summaries, and presigned media URLs.
All paths on this page are relative to https://api.autessa.com/autessa_poweruser/meeting-recorder. Every request is a POST with a JSON body. Bot, meeting, alert, and share-token IDs are UUID strings; linked resources (connectors, tools, users, AutessaDB tables) use the usual opaque ID strings. See the Poweruser API overview for authentication and conventions.
A bot is a recorder configuration: which calendars it watches, where its
recordings land (an AutessaDB table it owns), and how recap emails are sent.
Each recording is a row in that table; the endpoints on this page return a
flattened, agent-friendly view of those rows, but you can also query the
table directly with the
AutessaDB Query API using the bot's
autessadbTableId.
Write operations check the linked user's access to the bot: updates, dispatch, retries, and recording shares need EDITOR or better; deleting or sharing the bot itself needs ADMIN (or ownership). Read endpoints need at least VIEWER access.
Two flows remain UI-only and are not exposed on this API: the direct
recording-upload endpoints (/recordings/upload,
/recordings/upload/complete, which serve the browser upload widget) and
the inbound webhook activity feed (/bots/inbound-activity, which backs the
settings-page debug view). Use the Builder for those.
The bot object
- Name
id- Type
- uuid
- Description
Unique bot identifier.
- Name
companyId- Type
- integer
- Description
Owning company.
- Name
ownerId- Type
- integer
- Description
Owning user.
- Name
botDisplayName- Type
- string
- Description
Name the bot joins meetings under.
- Name
sharingLevel- Type
- string
- Description
PRIVATE,SPECIFIC_MEMBER, orCOMPANY.
- Name
companyPermissionLevel- Type
- string
- Description
Access level granted company-wide when shared with the company.
- Name
isEnabled- Type
- boolean
- Description
Whether the bot is active.
- Name
botConnectorId- Type
- string
- Description
The external connector the bot records through.
- Name
calendarConnectors- Type
- array<CalendarBinding>
- Description
Per-calendar bindings, each carrying that calendar's auto-record settings and health metadata.
- Name
autessadbTableId- Type
- string
- Description
The AutessaDB table holding this bot's recordings — usable directly with the AutessaDB Query API.
- Name
summarizeLlmCallToolId- Type
- string
- Description
The LLM-call tool that writes meeting summaries.
- Name
notifyToolId- Type
- string
- Description
The tool that sends recap notifications.
- Name
purgeToolId- Type
- string
- Description
The tool that enforces retention on old recordings.
- Name
triggerExtractAudioId- Type
- string
- Description
AutessaDB trigger that extracts audio from a finished recording.
- Name
triggerTranscribeId- Type
- string
- Description
AutessaDB trigger that transcribes the audio.
- Name
triggerSummarizeAndNotifyId- Type
- string
- Description
AutessaDB trigger that summarizes the transcript and sends the recap.
- Name
sendParticipantEmail- Type
- boolean
- Description
Whether participants get a recap email after the meeting.
- Name
shareAccessMode- Type
- string
- Description
Who can open the recording share link.
- Name
includeTranscriptInEmail- Type
- boolean
- Description
Whether the recap email embeds the transcript.
- Name
senderEmail- Type
- string
- Description
From-address used for recap emails.
- Name
senderName- Type
- string
- Description
From-name used for recap emails.
- Name
shareLinkTtlHours- Type
- integer
- Description
How long recording share links stay valid.
- Name
monthlyMinuteCap- Type
- integer
- Description
Monthly recording-minute quota for the bot.
- Name
quotaOverrideEnabled- Type
- boolean
- Description
Whether the quota cap is overridden for this bot.
- Name
verificationStatus- Type
- string
- Description
PENDINGfor subdomain-MX bots awaiting DNS verification,VERIFIEDotherwise.
- Name
createdAt- Type
- string
- Description
ISO-8601 creation timestamp.
- Name
updatedAt- Type
- string
- Description
ISO-8601 timestamp of the last update.
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"companyId": 1024,
"ownerId": 2048,
"botDisplayName": "Acme Notetaker",
"sharingLevel": "COMPANY",
"companyPermissionLevel": "READ",
"isEnabled": true,
"botConnectorId": "xC5vB9nM2k",
"calendarConnectors": [
{
"connectorId": "gW7qL4hT8z",
"autoRecordMode": "INVITED_ONLY",
"autoInviteEnabled": true
}
],
"autessadbTableId": "tR6yU3iO9p",
"summarizeLlmCallToolId": "kZ3mQ9pW2x",
"notifyToolId": "nJ8fD1sG5c",
"purgeToolId": "qA2eX7cV4b",
"sendParticipantEmail": true,
"shareAccessMode": "PARTICIPANTS",
"includeTranscriptInEmail": false,
"senderEmail": "meetings@autessa.com",
"senderName": "Acme Notetaker",
"shareLinkTtlHours": 168,
"monthlyMinuteCap": 3000,
"quotaOverrideEnabled": false,
"verificationStatus": "VERIFIED",
"createdAt": "2026-04-10T08:00:00",
"updatedAt": "2026-06-28T17:42:10"
}
List bots
/meeting-recorder/bots/allLists every bot the linked user can access — owned, shared with them, or shared with the company.
Request parameters
None — send an empty object {}.
Response
A JSON array of bot objects (not wrapped in an envelope).
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/all \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'
[
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"botDisplayName": "Acme Notetaker",
"isEnabled": true,
"autessadbTableId": "tR6yU3iO9p",
"verificationStatus": "VERIFIED"
}
]
Get a bot
/meeting-recorder/bots/getRetrieves one bot's full configuration.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to fetch.
Response
The bot object.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/get \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b" }'
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"botDisplayName": "Acme Notetaker",
"isEnabled": true,
"calendarConnectors": [
{ "connectorId": "gW7qL4hT8z", "autoRecordMode": "INVITED_ONLY" }
],
"autessadbTableId": "tR6yU3iO9p"
}
Create a bot
/meeting-recorder/botsCreates a bot and provisions everything it needs: the AutessaDB recordings table (with its extract-audio, transcribe, and summarize-and-notify triggers), the summarize/notify/purge tools, and the bot's email identity. The provisioned tools and table are regular resources — you can inspect and edit them like any other.
Request parameters
- Name
botDisplayName- Type
- string
- Description
Name the bot joins meetings under. Must be unique within the company — check with name-available first.
- Name
botAvatarS3Key- Type
- string
- Description
S3 key of an uploaded avatar image.
- Name
calendarConnectorIds- Type
- array<string>
- Description
GOOGLE_CALENDAR/OUTLOOK_CALENDARconnectors the bot should watch. Empty or omitted is allowed — calendar auto-join stays off until connectors are added.
- Name
identityStrategy- Type
- string
- Description
How the bot gets its email identity:
WORKSPACE_OAUTH(OAuth a real mailbox from your Google Workspace / M365 tenant),SUBDOMAIN_MX(delegate MX on a subdomain likebot.acme.com), orAUTESSA_ALIAS(zero-config alias onbot.autessa.com).
- Name
strategyParams- Type
- object
- Description
Strategy-specific parameters.
WORKSPACE_OAUTH:oauth_provider,bot_email,oauth_access_token, and optionallyoauth_refresh_tokenandoauth_expires_at.SUBDOMAIN_MX:subdomainandlocal_part.AUTESSA_ALIAS: omit.
Response
- Name
botId- Type
- uuid
- Description
The new bot.
- Name
botEmail- Type
- string
- Description
The email address the bot joins meetings from.
- Name
botConnectorId- Type
- string
- Description
The provisioned bot connector.
- Name
autessadbTableId- Type
- string
- Description
The provisioned recordings table.
- Name
summarizeLlmCallToolId- Type
- string
- Description
The provisioned summarizer tool.
- Name
notifyToolId- Type
- string
- Description
The provisioned notification tool.
- Name
purgeToolId- Type
- string
- Description
The provisioned retention tool.
- Name
triggerExtractAudioId- Type
- string
- Description
The extract-audio trigger on the recordings table.
- Name
triggerTranscribeId- Type
- string
- Description
The transcription trigger.
- Name
triggerSummarizeAndNotifyId- Type
- string
- Description
The summarize-and-notify trigger.
- Name
errors- Type
- array<string>
- Description
Validation or provisioning errors, when present.
- cURL
- JavaScript
- Python
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botDisplayName": "Acme Notetaker",
"calendarConnectorIds": ["gW7qL4hT8z"],
"identityStrategy": "AUTESSA_ALIAS"
}'
const response = await fetch(
'https://api.autessa.com/autessa_poweruser/meeting-recorder/bots',
{
method: 'POST',
headers: {
'Authorization': process.env.POWERUSER_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
botDisplayName: 'Acme Notetaker',
calendarConnectorIds: ['gW7qL4hT8z'],
identityStrategy: 'AUTESSA_ALIAS'
})
}
);
const bot = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/autessa_poweruser/meeting-recorder/bots',
headers={'Authorization': os.environ['POWERUSER_KEY']},
json={
'botDisplayName': 'Acme Notetaker',
'calendarConnectorIds': ['gW7qL4hT8z'],
'identityStrategy': 'AUTESSA_ALIAS'
}
)
bot = response.json()
{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"botEmail": "acme-notetaker@bot.autessa.com",
"botConnectorId": "xC5vB9nM2k",
"autessadbTableId": "tR6yU3iO9p",
"summarizeLlmCallToolId": "kZ3mQ9pW2x",
"notifyToolId": "nJ8fD1sG5c",
"purgeToolId": "qA2eX7cV4b",
"triggerExtractAudioId": "trg_9f2c1a",
"triggerTranscribeId": "trg_4b8d3e",
"triggerSummarizeAndNotifyId": "trg_7a5f9c"
}
Check name availability
/meeting-recorder/bots/name-availableChecks whether a bot display name is free within the company. When taken, the response suggests the nearest free variant.
Request parameters
- Name
name- Type
- string
- Description
The candidate display name.
Response
- Name
available- Type
- boolean
- Description
Whether the name is free.
- Name
suggestion- Type
- string
- Description
A free variant (for example
Acme Notetaker 2) when the name is taken;nullotherwise.
- Name
errors- Type
- array<string>
- Description
Validation errors, when present.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/name-available \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Acme Notetaker" }'
{
"available": false,
"suggestion": "Acme Notetaker 2"
}
Update calendar connectors
/meeting-recorder/bots/update-calendar-connectorsReplaces the set of calendar connectors the bot watches — an empty list
removes every calendar. The replacement is scoped to calendars the linked
user can see: bindings for connectors they cannot access (for example
teammates' PRIVATE calendars) are never touched. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to update.
- Name
calendarConnectorIds- Type
- array<string>
- Description
The new set of calendar connectors. Empty list clears the caller-visible bindings.
Response
The updated bot object.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/update-calendar-connectors \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"calendarConnectorIds": ["gW7qL4hT8z", "pM4nK8rF6d"]
}'
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"calendarConnectors": [
{ "connectorId": "gW7qL4hT8z", "autoRecordMode": "INVITED_ONLY" },
{ "connectorId": "pM4nK8rF6d", "autoRecordMode": "MANUAL" }
]
}
Update a calendar's record mode
/meeting-recorder/bots/calendar/update-record-modeChanges how the bot decides which meetings to auto-record on one
calendar. Settings are per-calendar, so a single bot can be MANUAL on a
personal calendar and INVITED_ONLY on a work one. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to update.
- Name
connectorId- Type
- string
- Description
Which linked calendar this update applies to.
- Name
autoRecordMode- Type
- string
- Description
MANUAL(only record when explicitly dispatched),INVITED_ONLY(record meetings the bot is invited to), orKEYWORD(record meetings whose title matches a keyword).
- Name
keywords- Type
- array<string>
- Description
Required when
autoRecordModeisKEYWORD. Substrings matched case-insensitively against meeting titles.
- Name
autoInviteEnabled- Type
- boolean
- Description
When
false, the calendar scan still creates recording rows but won't add the bot to the calendar invite.
Response
The updated bot object.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/calendar/update-record-mode \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"connectorId": "gW7qL4hT8z",
"autoRecordMode": "KEYWORD",
"keywords": ["standup", "pipeline review"],
"autoInviteEnabled": true
}'
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"calendarConnectors": [
{
"connectorId": "gW7qL4hT8z",
"autoRecordMode": "KEYWORD",
"autoRecordKeywords": "[\"standup\",\"pipeline review\"]",
"autoInviteEnabled": true
}
]
}
Get bot health
/meeting-recorder/bots/healthReturns the bot connector's health. Fully wired for WORKSPACE_OAUTH bots
(OAuth refresh and push-subscription state); other identity strategies
report UNKNOWN/GREEN.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to check.
Response
- Name
status- Type
- string
- Description
GREEN,YELLOW(subscription expiring soon, auto-renewal in progress),RED(needs reconnecting), orUNKNOWN(no health data yet).
- Name
message- Type
- string
- Description
Human-readable explanation of the status.
- Name
oauthRefreshStatus- Type
- string
- Description
State of the last OAuth token refresh.
- Name
oauthLastRefreshAt- Type
- string
- Description
ISO-8601 timestamp of the last successful OAuth refresh.
- Name
pushSubscriptionExpiresAt- Type
- string
- Description
When the calendar push subscription expires.
- Name
lastCheckedAt- Type
- string
- Description
When the health check last ran.
- Name
consecutiveFailureCount- Type
- integer
- Description
Consecutive failed health checks.
- Name
errors- Type
- array<string>
- Description
Validation errors, when present.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/health \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b" }'
{
"status": "GREEN",
"message": "Bot is healthy.",
"oauthRefreshStatus": "OK",
"oauthLastRefreshAt": "2026-07-01T09:12:44",
"pushSubscriptionExpiresAt": "2026-07-06T09:12:44",
"lastCheckedAt": "2026-07-01T12:00:00",
"consecutiveFailureCount": 0
}
Share a bot
/meeting-recorder/bots/shareUpdates the bot's sharing level and per-user permission grants. When
userGrants is provided it replaces all existing grants for the bot.
Requires ADMIN access (or ownership).
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to share.
- Name
sharingLevel- Type
- string
- Description
PRIVATE,COMPANY, orSPECIFIC_MEMBER.
- Name
companyPermissionLevel- Type
- string
- Description
VIEWER,EDITOR, orADMIN— the level granted company-wide whensharingLevelisCOMPANY.
- Name
userGrants- Type
- array<object>
- Description
Per-user grants, each
{ userId, permissionLevel }whereuserIdis a short opaque ID string andpermissionLevelisVIEWER,EDITOR, orADMIN. Replaces any existing grants.
Response
The updated bot object.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/share \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"sharingLevel": "SPECIFIC_MEMBER",
"userGrants": [
{ "userId": "uH2jP6wQ9s", "permissionLevel": "EDITOR" }
]
}'
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"sharingLevel": "SPECIFIC_MEMBER",
"companyPermissionLevel": "READ"
}
List bot permissions
/meeting-recorder/bots/permissionsLists the bot's per-user permission grants.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot whose grants to list.
Response
A JSON array of grant objects (not wrapped in an envelope):
- Name
id- Type
- uuid
- Description
Grant identifier.
- Name
botId- Type
- uuid
- Description
The bot.
- Name
userId- Type
- string
- Description
The user the grant applies to.
- Name
permissionLevel- Type
- string
- Description
VIEWER,EDITOR, orADMIN.
- Name
grantedBy- Type
- string
- Description
The user who created the grant.
- Name
createdAt- Type
- string
- Description
ISO-8601 timestamp.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/permissions \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b" }'
[
{
"id": "b7e1c9d3-2f4a-4b6c-8d0e-1f2a3b4c5d6e",
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"userId": "uH2jP6wQ9s",
"permissionLevel": "EDITOR",
"grantedBy": "aK9dR3tY7m",
"createdAt": "2026-06-20T14:03:22"
}
]
List upcoming meetings
/meeting-recorder/bots/upcoming-meetingsLists upcoming events across the bot's linked calendars, with each event's join URL and whether the bot is already invited. Use event/invite and event/uninvite to toggle the bot on a specific event.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot whose calendars to read.
- Name
forceRefresh- Type
- boolean
- Description
When
true, runs the calendar scan synchronously before returning, so auto-record changes apply without waiting for the every-30-minute scheduled scan.
Response
- Name
events- Type
- array<object>
- Description
Upcoming events. Each has
externalEventId(string),connectorId(string),calendarId,title,startTimeUtc,endTimeUtc,organizerEmail,attendeeCount(integer),meetingUrl,platform, andbotInvited(boolean).
- Name
errors- Type
- array<object>
- Description
Per-calendar fetch failures — each has
connectorId(string),provider(GOOGLEorOUTLOOK), andreason(for example an expired OAuth grant), so you can prompt a reconnect instead of reading an empty list as "no meetings".
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/upcoming-meetings \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"forceRefresh": false
}'
{
"events": [
{
"externalEventId": "evt_8Xy2Kq",
"connectorId": "gW7qL4hT8z",
"calendarId": "primary",
"title": "Q3 pipeline review",
"startTimeUtc": "2026-07-03T17:00:00Z",
"endTimeUtc": "2026-07-03T18:00:00Z",
"organizerEmail": "sam@acme.com",
"attendeeCount": 6,
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"platform": "GOOGLE_MEET",
"botInvited": true
}
],
"errors": []
}
Invite the bot to an event
/meeting-recorder/bots/event/inviteAdds the bot to one calendar event's attendee list. This does not dispatch the recorder immediately — the next calendar-scan tick handles dispatch when the meeting enters the scheduling horizon. To record right away, use recordings/dispatch. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to invite.
- Name
connectorId- Type
- string
- Description
The calendar connector the event lives on.
- Name
externalEventId- Type
- string
- Description
The provider event id (Google event id or Microsoft Graph event id), as returned by upcoming-meetings.
Response
{ "invited": true }.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/event/invite \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"connectorId": "gW7qL4hT8z",
"externalEventId": "evt_8Xy2Kq"
}'
{ "invited": true }
Uninvite the bot from an event
/meeting-recorder/bots/event/uninviteRemoves the bot from one calendar event's attendee list. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to remove.
- Name
connectorId- Type
- string
- Description
The calendar connector the event lives on.
- Name
externalEventId- Type
- string
- Description
The provider event id.
Response
{ "uninvited": true }.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/event/uninvite \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"connectorId": "gW7qL4hT8z",
"externalEventId": "evt_8Xy2Kq"
}'
{ "uninvited": true }
Delete a bot
/meeting-recorder/bots/deleteHard-deletes a bot and everything created alongside it: the recordings AutessaDB table (including its stored media, search vectors, triggers, and permissions), the auto-provisioned tools, the summarizer agent, and all recording metadata. This is not reversible. Requires ADMIN access (or ownership).
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to delete.
Response
{ "deleted": true }.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/delete \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b" }'
{ "deleted": true }
The recording object
A flattened view of the recording's AutessaDB row. All timestamps are UTC ISO-8601 strings.
- Name
meetingId- Type
- uuid
- Description
Unique recording identifier.
- Name
title- Type
- string
- Description
Meeting title.
- Name
platform- Type
- string
- Description
Meeting platform (Zoom, Google Meet, Teams, …).
- Name
origin- Type
- string
- Description
How the recording was initiated:
CALENDAR_AUTOINVITE,EMAIL_INVITE, orMANUAL_DISPATCH.
- Name
meetingUrl- Type
- string
- Description
The meeting join URL — the stable identifier shared between calendar invites and the recording row. Use it to correlate a recording with a calendar event (for example one returned by the
LIST_CALENDAR_EVENTtool).
- Name
externalCalendarUrl- Type
- string
- Description
Link to the calendar event, when the recording came from a calendar.
- Name
startTime- Type
- string
- Description
Meeting start (UTC ISO-8601).
- Name
endTime- Type
- string
- Description
Meeting end (UTC ISO-8601).
- Name
durationSeconds- Type
- integer
- Description
Recorded duration.
- Name
organizerEmail- Type
- string
- Description
The organizer.
- Name
expectedParticipants- Type
- string
- Description
Invitees from the calendar event.
- Name
participants- Type
- string
- Description
Who actually attended.
- Name
recordingVideoUrl- Type
- string
- Description
Presigned URL for the video recording (time-boxed).
- Name
recordingAudioUrl- Type
- string
- Description
Presigned URL for the extracted audio (time-boxed).
- Name
transcript- Type
- string
- Description
Full transcript text.
- Name
transcriptLanguage- Type
- string
- Description
Detected transcript language.
- Name
transcriptSource- Type
- string
- Description
Where the transcript came from (for example
AUTESSA_STTorMEETING_CAPTIONS).
- Name
summary- Type
- string
- Description
LLM-generated meeting summary.
- Name
shareLink- Type
- string
- Description
Public proxy URL participants use to view the recording.
- Name
status- Type
- string
- Description
Pipeline status:
SCHEDULED,BOT_JOINING,WAITING_ROOM,RECORDING,PROCESSING,DONE,FAILED,CANCELLED, orDELETED.
- Name
errorMessage- Type
- string
- Description
Failure detail when
statusisFAILED.
- Name
partialRecording- Type
- boolean
- Description
Whether the bot missed part of the meeting.
{
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f",
"title": "Q3 pipeline review",
"platform": "GOOGLE_MEET",
"origin": "CALENDAR_AUTOINVITE",
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"startTime": "2026-06-30T17:00:00Z",
"endTime": "2026-06-30T17:47:12Z",
"durationSeconds": 2832,
"organizerEmail": "sam@acme.com",
"participants": "sam@acme.com, lee@acme.com",
"recordingVideoUrl": "https://s3.amazonaws.com/autessa-recordings/...",
"recordingAudioUrl": "https://s3.amazonaws.com/autessa-recordings/...",
"transcript": "Sam: Let's start with the numbers...",
"transcriptLanguage": "en",
"transcriptSource": "AUTESSA_STT",
"summary": "The team reviewed Q3 pipeline...",
"shareLink": "https://autessa.com/recording/...",
"status": "DONE",
"errorMessage": null,
"partialRecording": false
}
List recordings
/meeting-recorder/recordings/listLists a bot's recordings, paginated, with optional filters that are
AND-combined server-side. To fetch the recording for a specific calendar
event, pass the event's join URL as meetingUrl.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot whose recordings to list.
- Name
meetingUrl- Type
- string
- Description
Exact-match filter on the meeting join URL — the correlation key with calendar events.
- Name
meetingTitleContains- Type
- string
- Description
Substring filter on the title.
- Name
startTimeFrom- Type
- string
- Description
UTC ISO-8601 lower bound on
startTime(inclusive).
- Name
startTimeTo- Type
- string
- Description
UTC ISO-8601 upper bound on
startTime(exclusive).
- Name
status- Type
- string
- Description
Filter on pipeline status (
SCHEDULED,RECORDING,DONE,FAILED, …).
- Name
page- Type
- integer
- Description
1-based page index. Defaults to
1.
- Name
pageSize- Type
- integer
- Description
Rows per page. Defaults to
50, max100.
Response
- Name
recordings- Type
- array<Recording>
- Description
Matching recordings, each in the recording object shape.
- Name
page- Type
- integer
- Description
The page returned.
- Name
pageSize- Type
- integer
- Description
Rows per page.
- Name
totalRows- Type
- integer
- Description
Total matching recordings.
- Name
totalPages- Type
- integer
- Description
Total number of pages.
- cURL
- JavaScript
- Python
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/list \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"status": "DONE",
"startTimeFrom": "2026-06-01T00:00:00Z",
"startTimeTo": "2026-07-01T00:00:00Z",
"page": 1,
"pageSize": 50
}'
// Fetch the recording for a specific calendar event by its join URL
const response = await fetch(
'https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/list',
{
method: 'POST',
headers: {
'Authorization': process.env.POWERUSER_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
botId: '3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b',
meetingUrl: 'https://meet.google.com/abc-defg-hij'
})
}
);
const { recordings } = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/list',
headers={'Authorization': os.environ['POWERUSER_KEY']},
json={
'botId': '3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b',
'status': 'DONE',
'page': 1,
'pageSize': 50
}
)
data = response.json()
{
"recordings": [
{
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f",
"title": "Q3 pipeline review",
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"startTime": "2026-06-30T17:00:00Z",
"durationSeconds": 2832,
"status": "DONE"
}
],
"page": 1,
"pageSize": 50,
"totalRows": 12,
"totalPages": 1
}
Get a recording
/meeting-recorder/recordings/getRetrieves one recording by ID, including transcript, summary, and presigned media URLs.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot that owns the recording.
- Name
meetingId- Type
- uuid
- Description
The recording to fetch.
Response
The recording object.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/get \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f"
}'
{
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f",
"title": "Q3 pipeline review",
"transcript": "Sam: Let's start with the numbers...",
"summary": "The team reviewed Q3 pipeline...",
"recordingVideoUrl": "https://s3.amazonaws.com/autessa-recordings/...",
"status": "DONE"
}
Dispatch a recording
/meeting-recorder/recordings/dispatchSends the bot into a meeting by its join URL — immediately, or at a
scheduled join time. Creates the recording row and returns its meetingId.
Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to dispatch.
- Name
meetingUrl- Type
- string
- Description
Zoom / Google Meet / Teams join URL.
- Name
joinAtUtc- Type
- string
- Description
UTC ISO-8601 time for the bot to join (
yyyy-MM-ddTHH:mm:ssZ). Omit to dispatch immediately.
- Name
title- Type
- string
- Description
Title override; defaults to a generic
Manual recording · {platform}.
Response
- Name
meetingId- Type
- uuid
- Description
The new recording row — poll it with recordings/get.
- Name
platform- Type
- string
- Description
Platform detected from the URL.
- Name
startTimeUtc- Type
- string
- Description
When the bot joins (UTC ISO-8601).
- Name
errors- Type
- array<string>
- Description
Validation errors (bad URL, quota exhausted, …), when present.
- cURL
- JavaScript
- Python
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/dispatch \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingUrl": "https://meet.google.com/abc-defg-hij",
"title": "Q3 pipeline review"
}'
const response = await fetch(
'https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/dispatch',
{
method: 'POST',
headers: {
'Authorization': process.env.POWERUSER_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
botId: '3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b',
meetingUrl: 'https://meet.google.com/abc-defg-hij',
joinAtUtc: '2026-07-03T17:00:00Z'
})
}
);
const { meetingId } = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/dispatch',
headers={'Authorization': os.environ['POWERUSER_KEY']},
json={
'botId': '3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b',
'meetingUrl': 'https://meet.google.com/abc-defg-hij'
}
)
meeting_id = response.json()['meetingId']
{
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f",
"platform": "GOOGLE_MEET",
"startTimeUtc": "2026-07-02T18:30:00Z"
}
Record an upcoming calendar event
/meeting-recorder/recordings/dispatch-from-eventMarks an upcoming calendar event for recording — the same mechanic as the
auto-invite scan: the bot is added to the event's attendee list and the
recorder is scheduled as the meeting approaches. The work runs
asynchronously via an immediate calendar scan, so the response carries
no meetingId; find the recording row afterwards with
recordings/list using the event's join URL. Requires
EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot to schedule.
- Name
externalEventId- Type
- string
- Description
The provider event id (Google event id or Microsoft Graph event id).
- Name
calendarId- Type
- string
- Description
Calendar id; defaults to
primary.
Response
- Name
meetingId- Type
- uuid
- Description
Always
null— the row is created by the asynchronous scan.
- Name
platform- Type
- string
- Description
Always
CALENDAR.
- Name
startTimeUtc- Type
- string
- Description
Always
null.
- Name
errors- Type
- array<string>
- Description
Validation errors, when present.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/dispatch-from-event \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"externalEventId": "evt_8Xy2Kq",
"calendarId": "primary"
}'
{
"meetingId": null,
"platform": "CALENDAR",
"startTimeUtc": null
}
Retry transcription
/meeting-recorder/recordings/retry-transcriptionClears the recording's transcript and re-runs speech-to-text on the stored audio. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot that owns the recording.
- Name
meetingId- Type
- uuid
- Description
The recording to retranscribe.
Response
A plain string (not JSON): ok, no_row, no_audio, or stt_error.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/retry-transcription \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f"
}'
ok
Retry summarization
/meeting-recorder/recordings/retry-summaryClears the recording's summary and re-fires the summarize-and-notify trigger, which regenerates the summary from the transcript and resends the recap. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot that owns the recording.
- Name
meetingId- Type
- uuid
- Description
The recording to resummarize.
Response
A plain string (not JSON): retrigger_enqueued.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/retry-summary \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f"
}'
retrigger_enqueued
Retry processing
/meeting-recorder/recordings/retry-processingSelf-service recovery for a FAILED recording. The endpoint first diagnoses
why it failed from structured pipeline state; only the retryable case —
the meeting was recorded but ingest failed — actually re-pulls the media.
For every other cause it returns the diagnosis unchanged so you can take the
action that helps (RETRY_TRANSCRIPTION, REDISPATCH, or nothing).
Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot that owns the recording.
- Name
meetingId- Type
- uuid
- Description
The failed recording.
Response
- Name
cause- Type
- string
- Description
RETRYABLE_INGEST(recorded but ingest failed — retry fixes it),RETRY_TRANSCRIPTION(audio landed but transcription failed),NOT_DISPATCHED(the bot never joined — re-dispatch instead),NOT_RECORDED(the bot joined but captured no media),NOT_APPLICABLE_UPLOAD(manually uploaded recording), orNOT_FAILED(nothing to retry).
- Name
canRetryProcessing- Type
- boolean
- Description
trueonly forRETRYABLE_INGEST.
- Name
message- Type
- string
- Description
Human-readable explanation.
- Name
suggestedAction- Type
- string
- Description
RETRY_PROCESSING,RETRY_TRANSCRIPTION,REDISPATCH, orNONE.
- Name
status- Type
- string
- Description
Set after a retry attempt:
QUEUED,EMPTY_BUNDLE,ERROR, orNOT_APPLICABLE;nullwhen no retry was attempted.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/retry-processing \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f"
}'
{
"cause": "RETRYABLE_INGEST",
"canRetryProcessing": true,
"message": "The meeting was recorded but processing failed — retrying.",
"suggestedAction": "RETRY_PROCESSING",
"status": "QUEUED"
}
Resend notifications
/meeting-recorder/recordings/resend-notificationsRe-sends the recap notification for a recording to its configured recipients. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot that owns the recording.
- Name
meetingId- Type
- uuid
- Description
The recording whose recap to resend.
Response
A plain string (not JSON): sent:N failed:M on success, or skipped
(participant email disabled on the bot), no_row, or no_recipients.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/resend-notifications \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f"
}'
sent:4 failed:0
Share a recording by email
/meeting-recorder/recordings/shareShares a recording with an explicit list of recipients — each gets their own tokenized link by email. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot that owns the recording.
- Name
meetingId- Type
- uuid
- Description
The recording to share.
- Name
recipientEmails- Type
- array<string>
- Description
Recipient email addresses. Normalized and de-duplicated server-side; at least one valid address is required.
- Name
requiresOtp- Type
- boolean
- Description
Whether recipients must pass an email OTP check before viewing. Defaults to the bot's configured share access mode.
Response
- Name
sent- Type
- integer
- Description
Links successfully emailed.
- Name
failed- Type
- integer
- Description
Deliveries that failed.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/share \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f",
"recipientEmails": ["lee@acme.com", "pat@acme.com"],
"requiresOtp": true
}'
{
"sent": 2,
"failed": 0
}
Create a share link
/meeting-recorder/recordings/share-linkMints a single shareable link for a recording without emailing anyone — copy-link semantics. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot that owns the recording.
- Name
meetingId- Type
- uuid
- Description
The recording to link.
- Name
ttlHours- Type
- integer
- Description
Link lifetime. Defaults to the bot's configured TTL (or 168 hours).
- Name
requiresOtp- Type
- boolean
- Description
Whether viewers must pass an email OTP check. Defaults to the bot's configured share access mode.
Response
- Name
tokenId- Type
- uuid
- Description
The share token — pass to share-tokens/revoke to invalidate all of a recording's tokens.
- Name
publicUrl- Type
- string
- Description
The shareable URL.
- Name
expiresAt- Type
- string
- Description
ISO-8601 expiry timestamp.
- Name
requiresOtp- Type
- boolean
- Description
The effective OTP setting.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/share-link \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f",
"ttlHours": 72
}'
{
"tokenId": "c4d5e6f7-8a9b-4c0d-9e1f-2a3b4c5d6e7f",
"publicUrl": "https://autessa.com/recording/c4d5e6f7...",
"expiresAt": "2026-07-05T18:30:00",
"requiresOtp": false
}
Revoke share tokens
/meeting-recorder/recordings/share-tokens/revokeRevokes every outstanding share token for a recording — emailed links and copy-links alike stop working immediately. Requires EDITOR access.
Request parameters
- Name
botId- Type
- uuid
- Description
The bot that owns the recording.
- Name
meetingId- Type
- uuid
- Description
The recording whose tokens to revoke.
Response
The bare number 1 on success.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/recordings/share-tokens/revoke \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f"
}'
1
List alerts
/meeting-recorder/alerts/listLists the linked user's meeting-recorder alerts — bot health problems, failed recordings, quota warnings, and similar. Alerts belong to the user, not to a single bot.
Request parameters
Both parameters are optional; an empty body {} works.
- Name
unreadOnly- Type
- boolean
- Description
Only alerts not yet dismissed. Defaults to
true.
- Name
limit- Type
- integer
- Description
Maximum alerts to return. Defaults to
20.
Response
A JSON array of alert objects (not wrapped in an envelope):
- Name
id- Type
- uuid
- Description
Alert identifier — pass to alerts/dismiss.
- Name
userId- Type
- integer
- Description
The user the alert belongs to.
- Name
companyId- Type
- integer
- Description
The company scope.
- Name
alertType- Type
- string
- Description
What happened (for example a failed recording or a bot needing reconnection).
- Name
severity- Type
- string
- Description
Alert severity.
- Name
title- Type
- string
- Description
Short headline.
- Name
body- Type
- string
- Description
Detail text.
- Name
meetingId- Type
- uuid
- Description
Related recording, when applicable.
- Name
botId- Type
- uuid
- Description
Related bot, when applicable.
- Name
linkUrl- Type
- string
- Description
Deep link into the Builder for the affected resource.
- Name
dismissedAt- Type
- string
- Description
When the alert was dismissed;
nullwhile unread.
- Name
actedAt- Type
- string
- Description
When the user acted on the alert, if they did.
- Name
createdAt- Type
- string
- Description
ISO-8601 creation timestamp.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/alerts/list \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "unreadOnly": true, "limit": 20 }'
[
{
"id": "e5f6a7b8-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"userId": 2048,
"companyId": 1024,
"alertType": "RECORDING_FAILED",
"severity": "ERROR",
"title": "Recording failed",
"body": "The bot couldn't join 'Q3 pipeline review'.",
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f",
"botId": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"linkUrl": "https://autessa.com/builder/meeting-recorder/...",
"dismissedAt": null,
"actedAt": null,
"createdAt": "2026-07-01T18:05:12"
}
]
Dismiss an alert
/meeting-recorder/alerts/dismissDismisses one alert for the linked user.
Request parameters
- Name
alertId- Type
- uuid
- Description
The alert to dismiss.
Response
{ "dismissed": true } — false when the alert doesn't exist or belongs
to another user.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/alerts/dismiss \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{ "alertId": "e5f6a7b8-9c0d-4e1f-8a2b-3c4d5e6f7a8b" }'
{ "dismissed": true }
Dismiss all alerts
/meeting-recorder/alerts/dismiss-allDismisses every unread alert for the linked user.
Request parameters
None — send an empty object {}.
Response
{ "dismissed": N } where N is the number of alerts dismissed.
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/alerts/dismiss-all \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'
{ "dismissed": 3 }
Errors
Most endpoints on this page surface failures as HTTP errors without a body envelope:
| Status | When |
|---|---|
200 | Success. |
400 | Missing or malformed botId/meetingId/alertId (must be UUIDs), a recording that was not found, an inaccessible connector id, or a missing required field. |
401 | Invalid or missing poweruser key, or the linked user lacks the required access level (EDITOR for updates, dispatch, retries, and recording shares; ADMIN for bots/delete and bots/share). |
403 | Scoped key without the endpoint in its allow-list. |
The envelope-wrapped endpoints — create a bot,
name-available, health,
dispatch, and
dispatch-from-event — instead report validation and
provisioning failures in the response's errors array:
| Status | When |
|---|---|
200 | Success — check errors for validation messages. |
408 | Server-side error; errors contains the message. |