New:Upstash has a remote MCP server

Serverless file storage for web developers

Upstash Blob is S3-compatible object storage for your files. Upload straight from the browser, serve public files from a CDN worldwide, keep private ones behind signed URLs, and pay only for what you store and serve. No regions to pick, no servers to run.

Why Upstash Blob

Object storage built for serverless apps and the browsers that talk to them.

Direct browser uploads

Bytes go straight from the browser to storage. Your server only authorizes, signs, and records the upload.

Global CDN, no regions

Every file is replicated to a CDN worldwide. Public buckets get a URL out of the box, with no region to choose.

S3 compatible

Exchange your bucket token for temporary S3 credentials and use the AWS SDK, the AWS CLI, or any S3 tool.

Public or private

Public buckets serve from a URL anyone can read. Private buckets have no URL and every read is signed.

Resumable uploads

Large files go up as multipart with pause, resume, cancel, and per-part retry built into the SDK.

Server-enforced limits

Declare size and content type constraints per route. The server stays authoritative and the file picker follows.

Fully typesafe

TypeScript types connect your upload handler to your React hooks, with autocomplete for options, progress, and results.

Simple pricing

Pay for storage, simple and advanced operations, and outbound bandwidth. No upload bandwidth fees, deletes are free, and usage never rounds up.

Add file uploads to your app

Build with the fully typesafe @upstash/blob SDK. Upload from your server or browser, and track progress with React hooks.

import { Bucket } from "@upstash/blob"

const bucket = Bucket.fromEnv()

const blob = await bucket.put("avatars/me.png", file, {
  contentType: "image/png",
})

console.log(blob.url)  // public buckets: global CDN URL

await bucket.get("avatars/me.png")   // record + ReadableStream body
await bucket.info("avatars/me.png")  // metadata only
await bucket.list({ prefix: "avatars/", limit: 100 })
await bucket.del("avatars/me.png")

What is blob storage?

A place to put files that does not care what is in them.

Blob storage, also called object storage, keeps files as objects in a flat namespace. Each object has a path, a body, a content type, and a little metadata. There is no filesystem to mount and no schema to design, which is why it is the standard home for images, documents, videos, backups, and anything else that does not belong in a database row.

Most object stores expose an S3-style API and leave the rest to you: signing uploads, enforcing limits, handling multipart, cleaning up abandoned parts, and wiring a CDN in front. That glue is where the time goes.

Upstash Blob ships that glue as an SDK. A bucket is global and replicated to a CDN, so there is no region to pick. The upload handler runs in your own route, so a browser can send bytes straight to storage while your server decides who may upload and records what landed. Underneath it is real S3-compatible storage, so the AWS SDK and every S3 tool still work.

Frequently asked questions

Upstash Blob is serverless, S3-compatible object storage for files. You create a bucket in the console, get a token, and upload from your server or straight from the browser with the @upstash/blob SDK. Public files are served from a global CDN and private files are read through signed URLs.

Blob storage, also called object storage, stores files as objects in a flat namespace instead of on a filesystem or in database rows. Each object has a path, a body, a content type, and metadata. It is the standard way to store images, documents, videos, backups, and any other unstructured data at scale.

Yes. Your bucket token exchanges for temporary S3 credentials, so you can use the AWS SDK, the AWS CLI, or any S3-compatible tool alongside the @upstash/blob SDK. The SDK exposes this directly through bucket.s3(), which hands the AWS SDK a credential provider that refreshes itself.

No. A bucket is global. Every file is replicated to a CDN worldwide, so a reader in Singapore and a reader in Frankfurt are both served from close by without any configuration. There is one rate sheet and no charge for replication or cross-region transfer.

Yes. The upload handler runs on your server to authorize the upload and sign it, then the browser sends the bytes straight to storage. Your server never handles the file body. Uploads over 16 MB go up as multipart, so they can pause, resume, and retry, and a completion callback runs in your own route once the object exists.

Yes. A public bucket gets its own URL and anyone with a link can read from it, while writes still require credentials. A private bucket has no public URL and every read goes through a short-lived signed URL that you generate on the server.

5 TB per object. Files over 16 MB are uploaded as multipart automatically, and multipart is recommended for anything over 100 MB so uploads can pause, resume, and retry per part.

The free plan includes 1 GB of storage, 10 GB of bandwidth, 10,000 simple operations, and 2,000 advanced operations per month. Pay as you go is billed from the first unit, with no free allowance: $0.02 per GB stored per month, $0.02 per GB of outbound bandwidth, $0.30 per million simple operations, and $4.50 per million advanced operations. Uploads incur advanced-operation charges but no bandwidth fees; deletes are free. See the pricing page for details.

Blob uses the same Upstash account and billing as Redis, Vector, QStash, Workflow, and Box. A common pattern is to store the file in Blob, then kick off a Workflow or QStash job from the upload completion callback to generate thumbnails, transcribe audio, or index the document in Vector.

Create your first bucket in seconds

Start on the free tier with 1 GB of storage and 10 GB of bandwidth. No credit card required.