---
title: "Initiate a direct multipart upload"
method: POST
path: "/v1/files/init-upload"
tags: ["API", "File Management"]
---

# Initiate a direct multipart upload

`POST /v1/files/init-upload`

Start uploading a local file directly to Rendi's storage. Returns a per-part list of presigned PUT URLs that you upload chunks to. See the [direct upload guide](https://docs.rendi.dev/direct-upload) for the full flow and code samples.

## Request body

- InitUploadRequest
  - `filename` string, required — The filename to store. Only alphanumeric characters, underscores, dashes, and dots are allowed.
  - `size_bytes` integer, required — Total size of the file in bytes. Used to size the multipart chunks and verify quota up front. Maximum 5 TB.
  - `is_private` boolean — If true, the uploaded file is placed in private storage and can only be downloaded via a presigned URL (request one by passing `presigned_ttl_seconds` on the files /get endpoint). Not available on trial plans.
  - `part_size` integer, nullable — Requested per-part size in bytes. Optional. If not set, a sensible default is used. If the requested value is below 5 MB it's raised to 5 MB; if above 5 GB or too small for the file to fit in the allowed number of parts, it's clamped accordingly. The value actually used is returned in the response.

## Response `200`

Multipart upload session created

- InitUploadResponse
  - `file_id` string, required — Unique identifier for the uploaded file. Use it in `complete-upload` / `abort-upload` and to poll `GET /files/{file_id}`.
  - `part_size` integer, required — Byte size for every part except the last (which is the remainder). Split your file into chunks of exactly this size and PUT each chunk to the matching URL in `upload_urls`.
  - `upload_urls` string[], required — Presigned PUT URLs, one per part. Send part 1 to `upload_urls[0]`, part 2 to `upload_urls[1]`, and so on. Each response's `ETag` header must be sent back in `complete-upload`.

## Other responses

- `401` — Invalid API key
- `403` — Account quota exceeded or plan does not support uploads
- `422` — Validation Error
- `429` — Rate limit exceeded

---

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