---
title: "Complete File Multipart Upload"
method: POST
path: "/files/{id}/complete"
tags: ["Files"]
---

# Complete File Multipart Upload

`POST /files/{id}/complete`

Assembles the parts of a multipart upload after every part has been PUT to its presigned URL. Pass the `multipart_upload_id` from Create File and each part's `ETag` response header. For a step-by-step walkthrough of multipart uploads, see the [direct file uploads guide](/developer/guides/direct-file-uploads).

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `multipart_parts` object[], required — Every uploaded part, in order.
    - `etag` string, required — The `ETag` response header from the part's upload.
    - `part_number` integer, required — The 1-based index of the part.
  - `multipart_upload_id` string, required — The ID of the multipart upload, returned by Create File.

## Response `200`

multipart upload completed

- File
  - `content_type` string, nullable, required — The file's MIME type, e.g. `application/pdf`.
  - `created_at` string, required — When the file was created, as an ISO 8601 timestamp.
  - `filename` string, nullable, required — The original filename, including its extension.
  - `id` string, required — The file's ID, prefixed `file_`.
  - `multipart_chunk_size` integer, nullable — The byte size each part (except the last) must be. Present only on create, and only for multipart uploads.
  - `multipart_upload_id` string, nullable — The ID of the multipart upload, passed back to `complete`. Present only on create, and only for multipart uploads.
  - `multipart_upload_urls` FileMultipartUrl[], nullable
    - `part_number` integer, required — The 1-based index of this part within the multipart upload.
    - `url` string, required — The presigned URL to PUT this part's bytes to.
  - `object` string, required — The type of this object, always `file`.
  - `size` integer, nullable, required — The file size in bytes. `null` until the upload has finished.
  - `upload_headers` object — Headers to send with the upload PUT. Present only on create.
  - `upload_status` 'pending' | 'processing' | 'ready' | 'failed', required — Where the file is in its upload lifecycle.
  - `upload_url` string, nullable — Presigned URL to PUT the file's bytes to. Present only on create, and only for single-part uploads.
  - `url` string, nullable, required — A URL to download the file: a permanent CDN URL for public files, a signed expiring URL for private ones. `null` until the upload has finished.
  - `visibility` 'public' | 'private', required — `public` files are served via an unsigned CDN URL; `private` files via a signed, expiring URL.

## Other responses

- `400` — Invalid Parameters
- `401` — Unauthorized
- `404` — Resource not found
- `409` — Conflict

## Changes

- **2026-08-24** `e91d507bda45` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/whop/apis/whop-api/changes/files/:id/complete/post.md)

---

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