# Media

| Method | Path | What it does |
| --- | --- | --- |
| GET | `/v1/media/{id}` | A signed download link for one attachment, recording or fax |

| Id starts with | What it is | Where the id comes from |
| --- | --- | --- |
| `att_` | A message attachment | `attachments` in `GET /v1/messages` and in message webhooks |
| `rec_` | A call recording | `recording_url`, or a part's `url` in `recordings`, on a call leg |
| `fax_` | A fax document | `fax_id` in `GET /v1/faxes` and in fax webhooks |

**A recording200 OKCopy**

```json
{
  "id": "rec_58213407",
  "type": "recording",
  "content_type": "audio/mp3",
  "format": "mp3",
  "duration": 264,
  "url": "<a signed link, good for 30 minutes>",
  "expires_at": "2026-09-24T14:05:12.000Z",
  "part": 1,
  "parts": 1,
  "recording_id": 10592210,
  "start_time": "2026-09-24T13:02:25.000Z"
}
```

**An attachment200 OKCopy**

```json
{
  "id": "att_902114",
  "type": "attachment",
  "source": "sms",
  "content_type": "image/jpeg",
  "filename": "side-entrance.jpg",
  "size": 184220,
  "url": "<a signed link, good for 30 minutes>",
  "expires_at": "2026-09-24T14:05:12.000Z"
}
```

- The `url` works for 30 minutes and needs no key. Ask again for a fresh one.
- An attachment on a text you sent answers with the link you sent it with, and no `expires_at`.
- A recording answers with its latest part. Add `?part=N` for part N of a call that was parked and picked up again (from 1, oldest first). The answer names its `part` of `parts`, its `recording_id` and `start_time`. A part that does not exist answers `404`, and the message says how many parts there are.
- A fax answers with `content_type: application/pdf` and its `pages`.
- API Messaging keys may fetch attachments only. A recording or a fax answers them `403`.
- `404`: not found, not yours, or not ready yet. `410`: the attachment is gone. `503`: storage trouble on our side. The file exists, so tell us.

[Media in the API reference](https://vocatech.com/developers/reference/media)
