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:- Create the file record → Whop returns a presigned destination and the file starts as
pending. - Upload the bytes straight to the presigned URLs.
- Poll Retrieve File until
upload_statusisready— thenurlandsizeare populated and the file’s ID can be attached anywhere Whop accepts a document.
url and size stay null until the bytes arrive. upload_status walks pending → processing → ready (or failed).
Single-part upload
Use a singlePUT 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.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.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 setvisibility 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 isready, 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.
