# POST /v1/orders/{orderId}/drawings:uploadSvg

**Service:** Orders  
**Operation:** `OrderService_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 order. An order with no flashing lines has no drawings, and this is the only surface that accepts an upload.

Call this after creating an order: map each drawing's `tempId` to the `drawingId` returned on the created order, 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 order, isn't an image/svg+xml, or has been deleted.

## Parameters

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

## Request body

`OrderServiceUploadDrawingSvgBody` (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 | `salesordersUploadDrawingSvgResponse` | 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

`salesordersUploadDrawingSvgResponse`

| 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/orders/upload-drawing-svg · Factory Sales API v1
