Upload a file to Blob Storage
Upload a file of up to 100 MB to Blob Storage with POST /v1/objects: public or private, with expiry, cache, metadata and checksum options.
The API key for your account. You can find this in your account settings.
id and, for public files, a CDN url you can embed or share directly. It backs attachments, generated exports and user-uploaded media for applications hosted on the platform.
A single request accepts files from 512 bytes up to 100 MB. Larger files, up to 10 GiB, go through the chunked upload flow or the S3 gateway. Requires the blob:write scope, or an upload token sent in Authorization, and an active plan.
Treat the returned
id as opaque: store it as it comes and send it back to the other routes. It starts with pub/ or prv/ and can change when the file changes visibility or expiry. Legacy files, stored before the September 2026 update, keep ids without that prefix, and every route accepts both.Parameters
Use FormData (
Send a real filename: the stored extension comes from it (
multipart/form-data), exactly one file per request.Send a real filename: the stored extension comes from it (
reads.fastq.gz stays .fastq.gz).The file name, without extension. 1 to 128 characters: letters, digits,
_, . and -, starting with a letter, digit or _. It can’t contain ...A folder path for the file, up to 8 segments separated by
/ and 256 characters in total. Each segment follows the same pattern as name, up to 64 characters. A trailing / is ignored.true stores the file without a public URL. Read it through Object Download, a share link or the S3 gateway. When omitted, the rule for the prefix decides.Deletes the file automatically after this time:
30 or 30d for days, 6h for hours. From 1 hour to 1825 days (5 years). Expiries under 7 days need the Enterprise plan. When omitted, the rule for the prefix decides.true adds a random suffix to the name, so the URL can’t be guessed and a new upload never replaces an old one. Private files always get it (false together with private=true is refused).Without a security hash, a new upload with the same name and prefix replaces the file.
false refuses it with 409 OBJECT_ALREADY_EXISTS instead.true makes browsers download the file instead of opening it, whatever its type.How long the CDN and browsers keep the file:
immutable (1 year), max-age=N with N from 60 to 31536000 seconds, or no-cache (every read goes to storage; Enterprise only). Files with a security hash default to immutable. The cache never outlives the file’s expiry.A JSON object of string values, returned by Object Info. Keys use
a-z, 0-9 and - (up to 64 characters). Up to 5 keys and 512 bytes in total. Pro and Enterprise only.The SHA-256 of the file. When it doesn’t match, the upload is refused with
CHECKSUM_MISMATCH and nothing is stored.Rate limits & concurrency
- Every account may have at most 4 uploads in progress at the same time (
TOO_MANY_CONCURRENT_UPLOADS, 429). - Hobby and Standard plans are limited to 1 upload per second (
RATE_LIMITED, 429). Pro and Enterprise are exempt. - Uploads over the account’s included storage are refused with
STORAGE_QUOTA_EXCEEDED.
File types
Practically any extension is accepted, including formats with no registered MIME type (.bam, .vcf, .fasta, .parquet, .h5, .npy and so on).
- The served
Content-Typeis derived server-side from the extension. Unknown formats are served asapplication/octet-stream. - Formats a browser renders (
.html,.svg,.xmland similar) are always served as downloads. - Executables and installers are refused with
BLOCKED_FILE_TYPE:exe,msi,dll,bat,cmd,com,scr,cpl,pif,hta,vbs,vbe,jse,wsf,wsh,msc,reg,lnk,sys,drv,ps1,apk,xpi. - A rule for the prefix or an upload token can restrict the accepted extensions and size.
Response
Errors
See Errors for the full list.
Related
- Blob SDK:
blob.put()

