# Save a recording's summary

Source: https://workroad.app/docs/api/put-recording-summary

`PUT https://workroad.app/api/v1/recordings/{recordingId}/summary`

Saves a summary and key terms you wrote from the transcript, replacing the ones the recording had. Chapters stay as they are. The recording page shows them as it shows the ones WorkRoad's AI writes.

Use this to save content you wrote yourself. It uses none of the user's WorkRoad AI uses.

- MCP tool: `putRecordingSummary` on `https://workroad.app/api/mcp`
- Required scopes: notes:update
- Test mode: `PUT https://workroad.app/api/test/v1/recordings/{recordingId}/summary` checks the request and returns the example response without changing anything.

## Path parameters

- `recordingId`: string (uuid), required. Recording id from `GET /notes/{noteId}/recordings`.

## Request body

JSON.

- `summary`: string, required, 1-4000 characters. What the lecture covered, in plain text, up to 4000 characters.
- `keyTerms`: array of objects, up to 40 items, default `[]`. Up to 40 terms the lecture defines, each once. The app can make a study set from them.
  - `term`: string, required, 1-80 characters
  - `definition`: string, required, 1-400 characters

## Response

`200` OK

- `data`: object, required
  - `id`: string (uuid), required
  - `noteId`: string (uuid), required
  - `title`: string or null, required
  - `status`: one of `"recording"`, `"assembling"`, `"finished"`, required. `recording` while audio is still coming in, `assembling` while WorkRoad puts the transcript together, `finished` once it is final.
  - `summaryStatus`: one of `"none"`, `"queued"`, `"running"`, `"done"`, `"failed"`, required. Whether the recording has a summary: `done` when one is saved, `queued` or `running` while WorkRoad's AI writes one.
  - `createdAt`: string (date-time), required. When the recording started.
  - `transcript`: array of string, required. The transcript, one entry per line, in order. Empty until the recording is finished.
  - `summary`: string or null, required. The saved summary, or `null`.
  - `keyTerms`: array of objects, required
    - `term`: string, required
    - `definition`: string, required
  - `chapters`: array of objects, required
    - `startMs`: integer, required
    - `title`: string, required
    - `summary`: string, required

### Example

```json
{
  "data": {
    "id": "5e4d3c2b-1a09-4f8e-9d7c-6b5a49382716",
    "noteId": "2f1e0d9c-8b7a-4c6d-9e5f-4a3b2c1d0e9f",
    "title": "Lecture 7: CPU scheduling",
    "status": "finished",
    "summaryStatus": "done",
    "createdAt": "2026-01-15T09:30:00.000Z",
    "transcript": [
      "Today we look at how the scheduler picks the next process.",
      "Round robin gives each process a fixed time slice, in turn."
    ],
    "summary": "How a CPU scheduler chooses the next process, with round robin as the main example.",
    "keyTerms": [
      {
        "term": "Round robin",
        "definition": "Each process runs for a fixed time slice, in turn."
      }
    ],
    "chapters": [
      {
        "startMs": 0,
        "title": "Scheduling",
        "summary": "Why the CPU needs a scheduler."
      }
    ]
  }
}
```

## Errors

Every error has the body `{ "error": { "code", "message", "details" } }`.

- `400`: Invalid request body or query
- `401`: Missing, invalid, disabled or expired API key
- `403`: The API key lacks the required scope
- `404`: No recording with that id exists for this key's user.
- `405`: Method not allowed. Use a method from the Allow header.
- `409`: `conflict` with `details.reason` `not-finished` while the recording is still coming in or assembling, or `summary-running` while WorkRoad's AI is writing its summary. Try again once it is done.
- `429`: Rate limit exceeded. Wait for Retry-After before retrying. The rate-limit headers are absent when the key's own limiter rejected the request before the per-endpoint bucket check ran.
- `500`: Internal server error
