Skip to main content

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, or COMPANY.

  • 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

    PENDING for subdomain-MX bots awaiting DNS verification, VERIFIED otherwise.

  • Name
    createdAt
    Type
    string
    Description

    ISO-8601 creation timestamp.

  • Name
    updatedAt
    Type
    string
    Description

    ISO-8601 timestamp of the last update.

Bot object (truncated)
{
"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​

POST/meeting-recorder/bots/all

Lists 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
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/bots/all \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'
Response (truncated)
[
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"botDisplayName": "Acme Notetaker",
"isEnabled": true,
"autessadbTableId": "tR6yU3iO9p",
"verificationStatus": "VERIFIED"
}
]

Get a bot​

POST/meeting-recorder/bots/get

Retrieves one bot's full configuration.

Request parameters​

  • Name
    botId
    Type
    uuid
    Description

    The bot to fetch.

Response​

The bot object.

cURL
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" }'
Response (truncated)
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"botDisplayName": "Acme Notetaker",
"isEnabled": true,
"calendarConnectors": [
{ "connectorId": "gW7qL4hT8z", "autoRecordMode": "INVITED_ONLY" }
],
"autessadbTableId": "tR6yU3iO9p"
}

Create a bot​

POST/meeting-recorder/bots

Creates 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_CALENDAR connectors 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 like bot.acme.com), or AUTESSA_ALIAS (zero-config alias on bot.autessa.com).

  • Name
    strategyParams
    Type
    object
    Description

    Strategy-specific parameters. WORKSPACE_OAUTH: oauth_provider, bot_email, oauth_access_token, and optionally oauth_refresh_token and oauth_expires_at. SUBDOMAIN_MX: subdomain and local_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 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"
}'
Response
{
"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​

POST/meeting-recorder/bots/name-available

Checks 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; null otherwise.

  • Name
    errors
    Type
    array<string>
    Description

    Validation errors, when present.

cURL
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" }'
Response
{
"available": false,
"suggestion": "Acme Notetaker 2"
}

Update calendar connectors​

POST/meeting-recorder/bots/update-calendar-connectors

Replaces 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
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"]
}'
Response (truncated)
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"calendarConnectors": [
{ "connectorId": "gW7qL4hT8z", "autoRecordMode": "INVITED_ONLY" },
{ "connectorId": "pM4nK8rF6d", "autoRecordMode": "MANUAL" }
]
}

Update a calendar's record mode​

POST/meeting-recorder/bots/calendar/update-record-mode

Changes 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), or KEYWORD (record meetings whose title matches a keyword).

  • Name
    keywords
    Type
    array<string>
    Description

    Required when autoRecordMode is KEYWORD. 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
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
}'
Response (truncated)
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"calendarConnectors": [
{
"connectorId": "gW7qL4hT8z",
"autoRecordMode": "KEYWORD",
"autoRecordKeywords": "[\"standup\",\"pipeline review\"]",
"autoInviteEnabled": true
}
]
}

Get bot health​

POST/meeting-recorder/bots/health

Returns 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), or UNKNOWN (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
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" }'
Response
{
"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​

POST/meeting-recorder/bots/share

Updates 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, or SPECIFIC_MEMBER.

  • Name
    companyPermissionLevel
    Type
    string
    Description

    VIEWER, EDITOR, or ADMIN — the level granted company-wide when sharingLevel is COMPANY.

  • Name
    userGrants
    Type
    array<object>
    Description

    Per-user grants, each { userId, permissionLevel } where userId is a short opaque ID string and permissionLevel is VIEWER, EDITOR, or ADMIN. Replaces any existing grants.

Response​

The updated bot object.

cURL
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" }
]
}'
Response (truncated)
{
"id": "3f8a1b2c-4d5e-4f60-8a7b-9c0d1e2f3a4b",
"sharingLevel": "SPECIFIC_MEMBER",
"companyPermissionLevel": "READ"
}

List bot permissions​

POST/meeting-recorder/bots/permissions

Lists 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, or ADMIN.

  • Name
    grantedBy
    Type
    string
    Description

    The user who created the grant.

  • Name
    createdAt
    Type
    string
    Description

    ISO-8601 timestamp.

cURL
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" }'
Response
[
{
"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​

POST/meeting-recorder/bots/upcoming-meetings

Lists 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, and botInvited (boolean).

  • Name
    errors
    Type
    array<object>
    Description

    Per-calendar fetch failures — each has connectorId (string), provider (GOOGLE or OUTLOOK), and reason (for example an expired OAuth grant), so you can prompt a reconnect instead of reading an empty list as "no meetings".

cURL
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
}'
Response (truncated)
{
"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​

POST/meeting-recorder/bots/event/invite

Adds 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
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"
}'
Response
{ "invited": true }

Uninvite the bot from an event​

POST/meeting-recorder/bots/event/uninvite

Removes 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
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"
}'
Response
{ "uninvited": true }

Delete a bot​

POST/meeting-recorder/bots/delete

Hard-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
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" }'
Response
{ "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, or MANUAL_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_EVENT tool).

  • 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_STT or MEETING_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, or DELETED.

  • Name
    errorMessage
    Type
    string
    Description

    Failure detail when status is FAILED.

  • Name
    partialRecording
    Type
    boolean
    Description

    Whether the bot missed part of the meeting.

Recording object (truncated)
{
"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​

POST/meeting-recorder/recordings/list

Lists 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, max 100.

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 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
}'
Response (truncated)
{
"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​

POST/meeting-recorder/recordings/get

Retrieves 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
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"
}'
Response (truncated)
{
"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​

POST/meeting-recorder/recordings/dispatch

Sends 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 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"
}'
Response
{
"meetingId": "9d2c4e6f-1a3b-4c5d-8e7f-0a1b2c3d4e5f",
"platform": "GOOGLE_MEET",
"startTimeUtc": "2026-07-02T18:30:00Z"
}

Record an upcoming calendar event​

POST/meeting-recorder/recordings/dispatch-from-event

Marks 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
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"
}'
Response
{
"meetingId": null,
"platform": "CALENDAR",
"startTimeUtc": null
}

Retry transcription​

POST/meeting-recorder/recordings/retry-transcription

Clears 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
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"
}'
Response
ok

Retry summarization​

POST/meeting-recorder/recordings/retry-summary

Clears 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
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"
}'
Response
retrigger_enqueued

Retry processing​

POST/meeting-recorder/recordings/retry-processing

Self-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), or NOT_FAILED (nothing to retry).

  • Name
    canRetryProcessing
    Type
    boolean
    Description

    true only for RETRYABLE_INGEST.

  • Name
    message
    Type
    string
    Description

    Human-readable explanation.

  • Name
    suggestedAction
    Type
    string
    Description

    RETRY_PROCESSING, RETRY_TRANSCRIPTION, REDISPATCH, or NONE.

  • Name
    status
    Type
    string
    Description

    Set after a retry attempt: QUEUED, EMPTY_BUNDLE, ERROR, or NOT_APPLICABLE; null when no retry was attempted.

cURL
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"
}'
Response
{
"cause": "RETRYABLE_INGEST",
"canRetryProcessing": true,
"message": "The meeting was recorded but processing failed — retrying.",
"suggestedAction": "RETRY_PROCESSING",
"status": "QUEUED"
}

Resend notifications​

POST/meeting-recorder/recordings/resend-notifications

Re-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
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"
}'
Response
sent:4 failed:0

Share a recording by email​

POST/meeting-recorder/recordings/share

Shares 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
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
}'
Response
{
"sent": 2,
"failed": 0
}

POST/meeting-recorder/recordings/share-link

Mints 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
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
}'
Response
{
"tokenId": "c4d5e6f7-8a9b-4c0d-9e1f-2a3b4c5d6e7f",
"publicUrl": "https://autessa.com/recording/c4d5e6f7...",
"expiresAt": "2026-07-05T18:30:00",
"requiresOtp": false
}

Revoke share tokens​

POST/meeting-recorder/recordings/share-tokens/revoke

Revokes 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
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"
}'
Response
1

List alerts​

POST/meeting-recorder/alerts/list

Lists 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; null while 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
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 }'
Response
[
{
"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​

POST/meeting-recorder/alerts/dismiss

Dismisses 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
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" }'
Response
{ "dismissed": true }

Dismiss all alerts​

POST/meeting-recorder/alerts/dismiss-all

Dismisses 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
curl https://api.autessa.com/autessa_poweruser/meeting-recorder/alerts/dismiss-all \
-X POST \
-H "Authorization: $POWERUSER_KEY" \
-H "Content-Type: application/json" \
-d '{}'
Response
{ "dismissed": 3 }

Errors​

Most endpoints on this page surface failures as HTTP errors without a body envelope:

StatusWhen
200Success.
400Missing or malformed botId/meetingId/alertId (must be UUIDs), a recording that was not found, an inaccessible connector id, or a missing required field.
401Invalid 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).
403Scoped 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:

StatusWhen
200Success — check errors for validation messages.
408Server-side error; errors contains the message.