> ## Documentation Index
> Fetch the complete documentation index at: https://docs.enagrams.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Meetings

> Meeting transcript ingestion and live recording

## Ingest a Transcript

Extract decisions, action items, and work packages from a meeting transcript.

```bash theme={null}
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**

```json theme={null}
{
  "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.

```bash theme={null}
POST /meetings/start
Authorization: Bearer ek_...

{
  "workspace_id": "ws_abc123",
  "title": "Design Review"
}
```

**Response**

```json theme={null}
{
  "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:

```json theme={null}
{
  "type": "transcript_chunk",
  "text": "Developer A: Let's use JWT for authentication."
}
```

**Stop the recording:**

```json theme={null}
{
  "type": "stop"
}
```

On stop, the server finalizes transcription, extracts decisions, generates work packages, and returns:

```json theme={null}
{
  "type": "complete",
  "meeting_id": "mtg_xyz",
  "decisions": [...],
  "work_packages": [...]
}
```

***

## List Meetings

```bash theme={null}
GET /meetings/recent
Authorization: Bearer ek_...
```

Query params:

* `workspace_id` — required
* `limit` — default 20

**Response**

```json theme={null}
[
  {
    "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

| Status       | Description                           |
| ------------ | ------------------------------------- |
| `recording`  | Live audio streaming in progress      |
| `processing` | LLM extraction running                |
| `completed`  | Decisions and work packages available |
