# GET /v1/quotes/{quoteId}/attachments/{attachmentId}

**Service:** Quotes  
**Operation:** `QuoteService_GetAttachment`

Returns the attachment's details and a fresh presigned download URL. Use this when a stored URL from an earlier read has expired.

## Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `quoteId` | path | string | yes | The id of the quote the attachment belongs to. Required. |
| `attachmentId` | path | string | yes | The id of the attachment to retrieve. Required. |
| `fields` | query | string | no | Comma-separated response fields to include, using camelCase JSON names (e.g. `orderId,total.amountMicros`). Dot paths reach into nested objects and map transparently across arrays. Paths are relative to the resource, not the response envelope; envelope keys like `nextPageToken` are always preserved. Only 2xx JSON responses are filtered; error bodies pass through unmodified. Unknown names are silently ignored. Takes precedence over `excludeFields` when both are provided. |
| `excludeFields` | query | string | no | Comma-separated response fields to exclude, using camelCase JSON names. Dot paths and array-transparency work the same as `fields`. Paths are relative to the resource, not the response envelope. Only 2xx JSON responses are filtered; error bodies pass through unmodified. Ignored when `fields` is also provided. |

## Responses

| Status | Schema | Description |
| --- | --- | --- |
| 200 | `quotesGetAttachmentResponse` | A successful response. |
| 400 | `Error` | The request was rejected because it failed validation. The body is a validation-failure envelope: an overall type and message and one entry per field-level problem (each with a stable code, a message, and a param pointing at the offending field). |
| 401 | `Error` | The request is missing a valid bearer token, or the token is invalid or expired. |
| 403 | `Error` | The token is valid but does not permit this action, or the resource belongs to a company the token cannot act for. The error type is permission_denied. |
| 404 | `Error` | No quote with the given id exists for the authenticated company, the attachment is not part of this quote's conversation, or it has been removed. |
| 429 | `Error` | The request was throttled (rate_limited) or exceeded a size limit (resource_exhausted). When throttled, the Retry-After header says how many seconds to wait before retrying; a resource_exhausted request will fail the same way if retried unchanged. |
| default | `Error` | Any other error. The body is the same error envelope every error uses: a short stable type identifying the kind of failure (for example "rate_limited" or "internal"), a human-readable message, and the request's idempotency key echoed back when one was supplied. |

## Returns

`quotesGetAttachmentResponse`

| Field | Type | Description |
| --- | --- | --- |
| `attachment` | Attachment | The requested attachment, with a fresh presigned download URL. |
| `attachment.id` | string | The id of this attachment. Use it to retrieve or delete the attachment. |
| `attachment.messageId` | string | The id of the conversation message this attachment belongs to. |
| `attachment.filename` | string | The file's name, as uploaded. |
| `attachment.contentType` | string | The file's media type (for example `image/png` or `application/pdf`). |
| `attachment.sizeBytes` | string | The file's size in bytes, rounded to kilobyte precision. Files smaller than one kilobyte read as 0. |
| `attachment.url` | string | A presigned URL to download the file. The URL expires; re-read the attachment for a fresh one rather than storing it. |
| `attachment.thumbnailUrl` | string | A presigned URL to a small preview image, for image attachments. Empty when no preview exists. Expires like `url`. |
| `attachment.isGenerated` | boolean | True when this file is a document the Factory app generated (for example a quote or invoice PDF) rather than a file somebody uploaded. Generated documents cannot be deleted through this API. |
| `attachment.generatedType` | string | For generated documents, the kind of document (for example `quote` or `invoice`). Not a fixed list; new kinds may appear. Empty for uploaded files. |

---

Source: https://developer.factory.app/reference/quotes/get-attachment · Factory Sales API v1
