# POST /v1/quotes/{quoteId}/drawings:uploadSvg

**Service:** Quotes  
**Operation:** `QuoteService_UploadDrawingSvg`

Drawings exist only on flashing lines: a drawing is the folded profile of a sheet-metal flashing, not a general image or file attachment for the quote. A quote with no flashing lines has no drawings, and this is the only surface that accepts an upload.

Call this after creating a quote: map each drawing's `tempId` to the `drawingId` returned on the created quote, then upload the rendered SVG for each `drawingId`. Stored SVGs are returned as a presigned URL (`svgUrl` on the FlashingDrawing) on later reads. Each drawing's outcome is reported individually; a drawing is skipped if it isn't part of this quote, isn't an image/svg+xml, or has been deleted.

## Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `quoteId` | path | string | yes | The id of the quote whose flashing drawings are being uploaded. Required. |

## Request body

`QuoteServiceUploadDrawingSvgBody` (application/json)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `svgs` | DrawingSvg[] | yes | The flashing drawings and their rendered SVGs. At least one is required. |
| `svgs.drawingId` | string | yes | The id of the flashing drawing this SVG belongs to. Required. |
| `svgs.svg` | string | yes | The rendered SVG image content, sent base64-encoded in JSON. The decoded image must be at most 2,000,000 bytes (the base64 text is about a third larger). Required. |
| `fields` | 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 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` | 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 | `quotesUploadDrawingSvgResponse` | 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, the echoed `requestId`, 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. |
| 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

`quotesUploadDrawingSvgResponse`

| Field | Type | Description |
| --- | --- | --- |
| `results` | DrawingSvgResult[] | One result per submitted flashing drawing, in request order. |
| `results.drawingId` | string | The drawing this result refers to. |
| `results.uploaded` | boolean | Whether the SVG was stored successfully. |
| `results.svgUrl` | string | On success, a presigned URL to the stored SVG. |
| `results.error` | string | On failure, the reason: the drawing isn't part of this order or quote, isn't an image/svg+xml, or has been deleted. |

---

Source: https://developer.factory.app/reference/quotes/upload-drawing-svg · Factory Sales API v1
