Skip to main content
Whop uploads are direct-to-storage. When you call Create File, Whop doesn’t receive your bytes through the API. Instead it creates a file record and hands back a presigned upload URL that you PUT the bytes to yourself. The file becomes usable once those bytes land in Whop’s storage. This is the raw two-step flow behind the SDK’s files.create and files.retrieve methods. Reach for it when you upload from the browser (so the bytes never touch your server) or work in a language without an SDK. It’s also how you send files large enough to need multipart.
The /files endpoints require API version 2026-08-21-1 or later. Every request below pins it with the Api-Version-Date header. See API versions.

The upload lifecycle

Every upload is three steps, whether it’s one part or many:
  1. Create the file record → Whop returns a presigned destination and the file starts as pending.
  2. Upload the bytes straight to the presigned URLs.
  3. Poll Retrieve File until upload_status is ready — then url and size are populated and the file’s ID can be attached anywhere Whop accepts a document.
A file’s url and size stay null until the bytes arrive. upload_status walks pendingprocessingready (or failed).

Single-part upload

Use a single PUT for anything under a few hundred megabytes.
1

Create the file

Send the filename and, optionally, a visibility (private by default). The response’s upload_url is where the bytes go, and upload_headers are the headers you must send with them.
2

Upload the bytes

PUT the file’s contents to upload_url, sending every header from upload_headers. This request goes straight to Whop’s file storage, not to api.whop.com, and carries no Whop Authorization header — the credentials are baked into the presigned URL.
The presigned URL expires one hour after it’s issued. Create the file right before you upload, and request a fresh one if a PUT fails with 403 after a long delay. Multipart part URLs expire sooner, after 15 minutes.
3

Poll until ready

Retrieve the file by its ID until upload_status becomes ready. The url field then holds a download link: a permanent content delivery network URL when the file is public, or a signed, expiring one when it’s private.

Multipart upload

For large files, upload in parts. Whop returns one presigned URL per part. You upload them (optionally in parallel), then tell Whop to assemble them. Multipart is required above 5 GB, since a single upload request can’t exceed that. It’s also a good idea above ~100 MB, where one long upload is fragile. The file must be larger than 5 MB, since every part except the last must be at least 5 MB.
1

Create the file with multipart enabled

Pass multipart: true and the total byte_size so Whop knows how many presigned part URLs to return. The response carries a multipart_upload_id, one presigned url per part_number, and the multipart_chunk_size (bytes) each part except the last must be.
Multipart uploads support at most 10,000 parts of 5 MB each — about 50 GB. A byte_size that would need more parts is rejected with a 400.
2

Upload each part and capture its ETag

Slice the file into multipart_chunk_size-byte chunks (the final part may be smaller) and PUT each chunk to the matching part’s url. Each upload response returns an ETag header — keep it alongside the part_number, you’ll need both to finish.
3

Complete the upload

Hand back the multipart_upload_id and every part’s part_number + etag to Complete File Multipart Upload. Whop assembles the parts into the final file.
Every part must be listed, in order, with the exact ETag returned when you uploaded it. An unknown multipart_upload_id or a mismatched ETag comes back as a 400 — re-upload the offending part and complete again.
4

Poll until ready

As with single-part uploads, retrieve the file until upload_status is ready. The ID is then ready to attach.

Choosing a visibility

You set visibility at create time and can’t change it afterward: Public files are cached on Whop’s CDN and can’t be revoked, so keep the default private for anything sensitive. See Upload files for more.

Using an uploaded file

Once a file is ready, pass its id anywhere Whop accepts a document — for example a dispute’s evidence or an account’s legal documents.

Next steps

Upload files (SDK)

How the SDK’s files.create and files.retrieve methods wrap this flow.

Create File

Full request and response reference for the create endpoint.

Complete File Multipart Upload

Reference for assembling multipart parts.

API versions

Why the Api-Version-Date header matters and how to pin it.