---
title: "Get upload URLs for parts"
method: POST
path: "/v1/uploads/{uuid}/parts"
tags: ["Files"]
---

# Get upload URLs for parts

`POST /v1/uploads/{uuid}/parts`

## Request

- Base URL: `https://contentmaschine.ai/api`
- URL: `https://contentmaschine.ai/api/v1/uploads/{uuid}/parts`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://contentmaschine.ai/api/oauth/authorize`, token URL `https://contentmaschine.ai/api/oauth/token`)

Presigned PUT URLs, valid 15 minutes, for up to 100 part numbers per call.
PUT the part bytes to the URL as they are (no form encoding) and keep the `ETag` response
header for complete. **The URLs are credentials**: do not log them.

## Path parameters

- `uuid` string, uuid, required

## Request body

- object
  - `part_numbers` integer[], required: Part numbers, 1 to parts.

## Response `200`

One URL per part number.

- object
  - `success` boolean
  - `data` object
    - `urls` object: Part number => presigned PUT URL.
    - `expires_at` string, date-time
  - `timestamp` string, date-time

## Other responses

- `400`: Invalid part numbers.
- `401`: Missing or invalid API key.
- `403`: The token does not hold files:write.
- `404`: Unknown upload, or not yours.
- `409`: The upload is no longer open.
- `410`: The upload expired.
- `default`: Any other error. Every failure this API emits uses the same envelope; branch on `error.type`, never on `error.message`, and quote `error.correlation_id` to support.

---

[API](https://skmtc.dev/contentmaschine/apis/contentmaschine-ai-api.md) · [All operations](https://skmtc.dev/contentmaschine/apis/contentmaschine-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/contentmaschine/apis/contentmaschine-ai-api/revisions/28c74f46051c?raw)
