# Download attachment

> Get a short-lived presigned URL for a stored attachment.

`GET https://inboundr.net/api/v1/emails/{id}/attachments/{index}`

Returns a **presigned download URL** (valid 15 minutes) for one attachment. The
`index` is 0-based and matches the order of the `attachments` array from
[Get email by ID](/api-reference/emails/get). Only attachments with
`stored: true` can be downloaded.

<Note>
  Attachment storage is included on Pro and Scale. On Free this returns `402`:
  the metadata is kept, but the content isn't stored.
</Note>

<ParamField path="id" type="string" required>
  The email id (`em_…`).
</ParamField>
<ParamField path="index" type="integer" required>
  0-based index into the email's `attachments` array.
</ParamField>

<ResponseExample>
```json 200
{
  "url": "https://…s3…/…?X-Amz-Signature=…",
  "filename": "invoice.pdf",
  "contentType": "application/pdf",
  "size": 48210,
  "expiresAt": "2026-07-20T10:45:00.000Z"
}
```
</ResponseExample>

Fetch the file from `url` directly — it's pre-signed, so no auth header is
needed.

<Note>
  Returns `404` if the email or attachment isn't found (or has no stored
  content), or `503` if attachment storage isn't configured.
</Note>
