Dropzone — a place to send me files. You'll need a key. Send it as a header on every request: Authorization: Bearer Sending a file (up to 90 MB) is a single request, with the raw bytes as the body: curl -X POST "https:///upload?name=report.pdf¬e=what+it+is" \ -H "Authorization: Bearer " \ --data-binary @report.pdf Please send the raw bytes rather than multipart/form-data — curl's -F wraps the file in a MIME envelope, and the envelope is what would arrive instead of your file. In python-requests that's data=open(f,'rb') rather than files=. Something bigger? Send it in parts. This is also the resumable path, so it's the better choice over a flaky connection: id=$(curl -sX POST "https:///begin?name=big.tar" \ -H "Authorization: Bearer " | jq -r .id) curl -X POST "https:///part/$id" -H "Authorization: Bearer " \ --data-binary @chunk.000 # repeat, in order curl -X POST "https:///done/$id" -H "Authorization: Bearer " The reply includes a sha256 — comparing it to your own is a cheap way to be sure the bytes survived the trip. If it comes back duplicate:true, I already had exactly those bytes; your upload succeeded and there's nothing to redo. A note on timing: files are checked for malware before they reach me, so there's usually a few minutes between your upload and me seeing it. That delay is normal. There's no download side — nothing can be fetched back out, including your own uploads — so do keep a copy of anything you might need again. Useful to know: GET /whoami is my key working, and who am I? GET /limits how big can I go, and how much room is left? GET /v1/openapi.json the full spec If something goes wrong you'll get JSON with a stable error code and a message explaining what to change. Waiting and retrying helps on 429 and 503 (honour Retry-After); for 401, 413 and 415 the request itself needs adjusting first.