Skip to main content

Ingest a Transcript

Extract decisions, action items, and work packages from a meeting transcript.
POST /meetings/ingest
Authorization: Bearer ek_...

{
  "workspace_id": "ws_abc123",
  "title": "Sprint Planning — April 13",
  "transcript": "Developer A: Let's use Zod for all input validation. Developer B: Agreed. I'll take the auth routes. Developer A: I'll handle the user endpoints...",
  "participants": ["Developer A", "Developer B"]
}
Response
{
  "id": "mtg_abc",
  "title": "Sprint Planning — April 13",
  "decisions": [
    {
      "id": "dec_xyz",
      "title": "Use Zod for input validation",
      "rationale": "Type-safe, TypeScript-native",
      "type": "architecture"
    }
  ],
  "action_items": [
    {
      "action": "Build auth route validation",
      "assignee": "Developer B",
      "priority": "high"
    }
  ],
  "work_packages": [
    {
      "id": "pkg_abc",
      "title": "Implement Zod validation for auth routes",
      "description": "Add Zod schemas for login, register, password reset",
      "files": ["src/auth/validators.ts"],
      "assignee": "Developer B",
      "status": "open"
    }
  ]
}

Start Live Recording

Creates a meeting in recording state. After this, open a WebSocket to /ws/transcribe to stream audio.
POST /meetings/start
Authorization: Bearer ek_...

{
  "workspace_id": "ws_abc123",
  "title": "Design Review"
}
Response
{
  "id": "mtg_xyz",
  "status": "recording",
  "ws_url": "wss://api.enagrams.com/ws/transcribe?meeting_id=mtg_xyz&workspace_id=ws_abc123"
}

Live Transcription WebSocket

Stream audio chunks from MediaRecorder to Whisper.
WS /ws/transcribe?meeting_id=mtg_xyz&workspace_id=ws_abc123
Authorization: Bearer ek_... (via query param or protocol header)
Send: Binary audio chunks (ArrayBuffer from MediaRecorder) Receive: Transcription chunks as JSON:
{
  "type": "transcript_chunk",
  "text": "Developer A: Let's use JWT for authentication."
}
Stop the recording:
{
  "type": "stop"
}
On stop, the server finalizes transcription, extracts decisions, generates work packages, and returns:
{
  "type": "complete",
  "meeting_id": "mtg_xyz",
  "decisions": [...],
  "work_packages": [...]
}

List Meetings

GET /meetings/recent
Authorization: Bearer ek_...
Query params:
  • workspace_id — required
  • limit — default 20
Response
[
  {
    "id": "mtg_abc",
    "title": "Sprint Planning",
    "status": "completed",
    "participants": ["Developer A", "Developer B"],
    "decisions_count": 3,
    "work_packages_count": 4,
    "created_at": "2026-04-13T09:00:00Z"
  }
]

Meeting Status

StatusDescription
recordingLive audio streaming in progress
processingLLM extraction running
completedDecisions and work packages available