---
title: media.setSummary | Doing Work API
description: Write or correct what a photo or video shows. Use it to fix a summary, to fill in one marked needs_summary (older photos and browser captures have none), o
url: https://doingwork.work/docs/reference/media-setsummary/
---

# media.setSummary

Write or correct what a photo or video shows. Use it to fix a summary, to fill in one marked needs_summary (older photos and browser captures have none), or after a person edits the words. Each change keeps the earlier wording. Workers on the shop can edit; the summary is never shown to customers.

|  |  |
|---|---|
| Who | Agents can call this |
| REST | `POST /v1/media/summary` |
| MCP tool | `media_setSummary` |
| Writes | yes, send an Idempotency-Key |
| Area | [Shop](https://doingwork.work/docs/reference/#shop) |

## When to use it

Look at the photo or video first and write its summary, then upload it with media.requestUpload (summary is required) and PUT the bytes to the upload_url. If you cannot see the media, send summary.unable_reason and it is marked needs_summary; media.needsSummary lists those and older photos with no summary, and media.setSummary fills or edits one.

## What to tell the owner

Say what you did in plain words and what happens next.

## Input

| Field | Type | Required |
|---|---|---|
| `media_id` | string | yes |
| `summary` | object | yes |
| `summary.summary` | string | no |
| `summary.notable` | array | no |
| `summary.notable[].kind` | string (one of damage, leak, safety, code_issue, wear, pest, mold, access, other) | yes |
| `summary.notable[].text` | string | yes |
| `summary.readable_text` | array | no |
| `summary.readable_text[].what` | string | yes |
| `summary.readable_text[].text` | string | yes |
| `summary.measurements` | array | no |
| `summary.measurements[].what` | string | yes |
| `summary.measurements[].value` | number | yes |
| `summary.measurements[].unit` | string | yes |
| `summary.measurements[].how` | string (one of read, estimated) | yes |
| `summary.transcript` | string | no |
| `summary.key_moments` | array | no |
| `summary.key_moments[].at_seconds` | number | yes |
| `summary.key_moments[].text` | string | yes |
| `summary.duration_seconds` | number | no |
| `summary.language` | string | no |
| `summary.generated_by` | string | no |
| `summary.unable_to_analyze` | object | no |
| `summary.unable_to_analyze.reason` | string (one of no_vision, no_video, file_unreadable, too_large, not_allowed, other) | yes |
| `summary.unable_to_analyze.detail` | string | no |
| `edited_by_person` | boolean | no |

## Example

```http
POST https://doingwork.work/v1/media/summary
content-type: application/json
Idempotency-Key: 3f1c...

{
  "media_id": "00000000-0000-4000-8000-000000000000",
  "summary": {
    "summary": "...",
    "notable": [
      {
        "kind": "damage",
        "text": "..."
      }
    ],
    "readable_text": [
      {
        "what": "...",
        "text": "..."
      }
    ],
    "measurements": [
      {
        "what": "...",
        "value": "...",
        "unit": "...",
        "how": "read"
      }
    ],
    "transcript": "...",
    "key_moments": [
      {
        "at_seconds": "...",
        "text": "..."
      }
    ],
    "duration_seconds": "...",
    "language": "...",
    "generated_by": "...",
    "unable_to_analyze": {
      "reason": "no_vision"
    }
  }
}
```

## Output

JSON. The response shape isn't published yet; read the fields you need and ignore the rest. Errors are `{code, message, status}`.

## Errors

| Code | Status | What to do |
|---|---|---|
| `invalid_input`, `invalid_token`, `rate_limited` |  | Can happen on any call. See [errors](https://doingwork.work/docs/errors/). |
