Transcriptions

List transcriptions

Cursor-paginated list of transcriptions created by this API key's owner, newest first by default (order=desc); pass order=asc for oldest first. Pass cursor from the previous response's next_cursor to page through results — it continues in whichever direction order set. next_cursor is null on the final page. Use view=summary to get lightweight rows (~6 kB each) instead of the legacy bundled shape; use q, created_before, created_after to filter. Pass workspace_id to see a shared workspace's recordings instead of just your own — get workspace_id / project_id values from GET /v1/workspaces.

get/v1/transcriptions

Request

  • Base URL: https://api.quillhub.ai
  • URL: https://api.quillhub.ai/v1/transcriptions
  • Auth: HTTP bearer

Query parameters

limitinteger

Page size. 1–100, default 20. With the default view=full a page never holds more than 20 rows, whatever you ask for — each row bundles the whole transcript. Keep paging with next_cursor, or use view=summary for larger pages.

Example:20
cursorstring

Opaque cursor returned as next_cursor by the previous page. Omit for the first page.

status'queued' | 'processing' | 'completed' | 'failed' | 'cancelled'

Return only transcriptions in this status.

view'full' | 'summary'

full (default) keeps the legacy bundled rows. summary returns ~6 kB rows with title, summary, key_theses, highlights — what an agent needs to find a specific transcription.

order'asc' | 'desc'

desc (default) — newest first, matching legacy behavior. asc — oldest first (chronological). cursor pages in the same direction as order.

qstring

Case-insensitive substring search. Covers title, summary, key_theses and topics by default — narrow it with q_fields. Cap 200 chars.

q_fields'all' | 'title'

Which fields q searches. all (default) also scans the summary, key theses and topics stored inside the structured result — thorough, but it reads every candidate recording in full and slows down as a workspace grows. title searches titles only and stays in single-digit milliseconds; prefer it when picking a known recording by name.

created_beforestring date-time

ISO 8601 timestamp; exclusive upper bound on created_at.

created_afterstring date-time

ISO 8601 timestamp; inclusive lower bound on created_at.

workspace_idinteger

Restrict to this workspace. Includes teammates' recordings that are shared with the workspace (visibility='visible'); your own and — for owners/admins — all workspace recordings. 403 if you are not a member. Omit to see every transcription the caller authored across all workspaces (default behaviour). Get workspace_id / project_id values from GET /v1/workspaces.

project_idinteger nullable

Restrict to this project. Pass 0 for the Inbox (workspace recordings without a project). Requires workspace_id.

needs_project'true' | 'false'

Pass true to list only the recordings the AI listened to and could not file under any project (ai_layer_status='awaiting_project') — the ones waiting on a human decision. Deliberately narrower than project_id=0: that returns every projectless recording, which also covers Telegram-bot recordings (never routed at all), recordings the AI deliberately skipped, and recordings whose analysis is still running. Requires workspace_id.

unassigned'true'

Pass true to list desktop-recorded meetings (source='desktop', excluding dictation) in the workspace without a project — EXCEPT the ones a human explicitly kept without one (POST /v1/ai/recordings/:id/keep-unassigned, ai_layer_status='kept') and the ones whose AI analysis hasn't finished yet (pending/extracting). Telegram-bot, web, and API recordings are never included — routing never runs for them, and they stay plain transcripts the user can file by hand. Same predicate as GET /v1/workspaces/:wsId/unassigned-count — see apps/api/src/lib/unassigned-filter.ts. Requires workspace_id.

Response

Cursor-paginated page of transcriptions.

OR

Example response

{
  "data": [
    {
      "id": "trs_01HZXK9P2Q7R8S4T5V6W7X8Y9Z",
      "internal_id": 212241,
      "kind": "dictation",
      "title": "Q3 planning sync",
      "status": "queued",
      "stage": "transcribing",
      "progress": 0.42,
      "source": {
        "type": "youtube",
        "channel": "desktop"
      },
      "duration_seconds": 1843,
      "language": "en",
      "points_spent": 28,
      "result": {
        "segments": [
          {
            "start": 3.84,
            "end": 7.12,
            "text": "Welcome back to the channel.",
            "speaker": "Speaker 1"
          }
        ]
      },
      "error_code": "GOT_ARCHIVE",
      "workspace_id": 42,
      "project_id": 7,
      "created_at": "2026-04-23T10:14:22Z"
    }
  ],
  "next_cursor": "trs_01HZXK9P2Q7R8S4T5V6W7X8Y9Z"
}

Changes

No recorded changes to this operation across all 1 revision of this API.