Open Caven

Reference

Recordings

List recordings and read their transcript, summary, notes, action items, speakers and tags

2 min read

All paths are relative to https://developers.caven.io/public/v1.

List recordings

GET /recordings

Scope: recordings:list

ParameterDescription
limit, offsetOffset pagination. Newest first.
updatedSince, cursorCursor pagination for syncing
statusRECORDED, PROCESSING, TRANSCRIBED, SUMMARIZED or FAILED (case-insensitive)
uploadOriginDESKTOP, MOBILE, WEB or CALL
from, toISO 8601 dates. Filters on when the meeting was recorded.
searchCase-insensitive match on the title
tagIdOnly recordings with this tag
userIdOrganization keys only: one member's recordings
onPremDeliverytrue: only recordings marked for the on-prem connector (always cursor mode). false: only the others. See On-prem connector.
curl "https://developers.caven.io/public/v1/recordings?status=summarized&from=2026-09-01&limit=10" \
  -H "X-API-Key: sk_your_key_here"

Get a recording

GET /recordings/:id

Scope: recordings:get

{
  "data": {
    "id": "cmat10lv8f4yn83oy3iofv0n3",
    "title": "Weekly sync",
    "description": null,
    "duration": "22:45",
    "fileSize": null,
    "recordingType": null,
    "storageMode": "cloud",
    "notesUrl": null,
    "status": "SUMMARIZED",
    "transcriptionStatus": "completed",
    "summaryStatus": "completed",
    "uploadOrigin": "DESKTOP",
    "uploadState": "completed",
    "uploadProgress": 100,
    "isAudioOnly": false,
    "contentHost": "caven",
    "transcriptHost": "caven",
    "summaryHost": "caven",
    "notesHost": "caven",
    "mediaHost": "caven",
    "mediaSource": "r2",
    "onPremSourceManaged": false,
    "organizationId": null,
    "organizationFolderId": null,
    "folderName": null,
    "tags": [{ "id": "cmt...", "name": "Sales", "color": "#3b82f6" }],
    "counts": { "actionItems": 2, "transcripts": 1, "summaries": 1 },
    "recordedAt": "2026-10-05T15:24:30.542Z",
    "uploadedAt": "2026-10-05T15:24:30.542Z",
    "createdAt": "2026-10-05T15:24:30.542Z",
    "updatedAt": "2026-10-05T15:34:58.670Z",
    "userId": "cmjal5xyj0000vaz4po9spv16",
    "ownerName": "Jane Doe"
  }
}

Recording fields

FieldDescription
title, descriptionAs shown in Caven
durationDisplay string: mm:ss or h:mm:ss
statusOverall processing state: RECORDED, PROCESSING, TRANSCRIBED, SUMMARIZED, FAILED
transcriptionStatus, summaryStatusidle, pending, processing, completed or failed
uploadOriginWhere the recording came from: DESKTOP, MOBILE, WEB, CALL
uploadState, uploadProgressWhether the upload has fully arrived. Wait for completed / 100 before relying on the media.
isAudioOnlytrue when there is no video
contentHostWhere the content lives: caven, sharepoint or onprem
transcriptHost, summaryHost, notesHost, mediaHostThe same, per type of content
mediaSourceWhere the media file can be read from right now: r2 (Caven storage), sharepoint, onprem, or missing when there is no media file
onPremSourceManagedtrue when the media is managed by your organization's on-prem connector instead of by Caven
organizationFolderId, folderNameThe organization folder, if the recording was filed in one
tagsTags on the recording
countsNumber of action items, transcripts and summaries
recordedAtWhen the meeting took place
userId, ownerNameWho recorded it

Check transcriptionStatus and summaryStatus before you fetch a transcript or summary. While they are pending or processing, the content endpoints return 404 TRANSCRIPT_NOT_AVAILABLE or 404 SUMMARY_NOT_AVAILABLE.

Transcript

GET /recordings/:id/transcript

Scope: transcripts:list

{
  "data": {
    "id": "cmuv...",
    "recordingId": "cmat10lv8f4yn83oy3iofv0n3",
    "language": "nl",
    "content": "[00:25] Speaker A:\nGood morning, shall we start?\n\n[00:31] Speaker B:\n...",
    "contentHost": "caven",
    "contentSource": "caven"
  }
}

content is plain text. Each turn starts with a [mm:ss] Speaker: line, followed by what was said.

Caven retrieves content stored in SharePoint or on your own server for you, so you always receive readable text. If that source can't be reached right now, you get 503 HOSTED_SOURCE_UNREACHABLE.

Summary

GET /recordings/:id/summary

Scope: summaries:list

{
  "data": {
    "id": "cmuvejep600gjrv92wzifu9ke",
    "recordingId": "cmat10lv8f4yn83oy3iofv0n3",
    "overview": "The team reviewed the Q4 roadmap...",
    "keyPoints": ["Launch moves to November", "..."],
    "actionItems": [{ "task": "Send the revised plan", "owner": "Speaker B", "deadline": null }],
    "decisions": [],
    "sections": [{ "id": "section-1", "title": "Roadmap", "content": "..." }],
    "language": "nl",
    "contentHost": "caven",
    "contentSource": "caven"
  }
}

sections follows the summary template that was used.

Notes

GET /recordings/:id/notes

Scope: transcripts:list

The free-text notes taken during the meeting:

{ "data": { "recordingId": "cmat...", "content": "...", "contentHost": "caven", "contentSource": "caven" } }

Returns 404 NOTES_NOT_AVAILABLE if nobody took notes.

Action items of a recording

GET /recordings/:id/action-items

Scope: action-items:list. Supports limit, offset, status and priority. Returns action item objects.

Speakers of a recording

GET /recordings/:id/speakers

Scope: speakers:list. Returns the speaker profiles recognized in this recording. With an organization key, the list is empty if the organization has turned off the speaker catalog.

Tags of a recording

GET /recordings/:id/tags

Scope: tags:list. Returns tag objects.

© 2026 Caven BV. All rights reserved. Built in Belgium.EU · GDPR · AI Act · Privacy-first · ISO 27001

On this page