---
title: "Upload Drawing File"
method: POST
path: "/api/v1/parts/{part_id}/drawings/upload"
tags: ["drawings"]
---

# Upload Drawing File

`POST /api/v1/parts/{part_id}/drawings/upload`

Stream a drawing file to R2 server-side (firewall-safe upload proxy).

Replaces the browser's direct PUT to ``*.r2.cloudflarestorage.com``.
The client POSTs the file as ``multipart/form-data`` and passes the
``r2_key`` returned by ``/initiate`` as a query parameter. The client
must still call ``POST /confirm`` afterwards.

Authorization: the part must be owned by the current user, and the
requested ``r2_key`` must fall inside the deterministic
``drawings/{user_id}/{part_id}/`` namespace for this part — any key
outside it is rejected (403).

## Path parameters

- `part_id` string, uuid, required

## Query parameters

- `r2_key` string, required — R2 object key from the initiate endpoint.

## Response `200`

Successful Response

- object

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/prototyping/apis/prototyping-io-api.md) · [All operations](https://skmtc.dev/prototyping/apis/prototyping-io-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/prototyping/prototyping-io-api/revisions/f4a0079fbb57/schema)
