| Data size | 256 MB |
| Bandwidth | 10 GB/month |
| Commands | 500,000/month |
| Databases | 1 |
Traditional Redis clients open one persistent TCP socket and keep it warm for the life of the process. That's ideal on an always-on server and a disaster on serverless, where every cold instance wants its own connection — leading to connection storms, exhausted pools, and timeouts. Upstash solves this by making every Redis command an independent HTTPS request with a bearer token. No socket to hold, no pool to exhaust, and an idle database costs $0.
Is Upstash Free? The Numbers
Yes — all three products have standing free tiers with no credit card, usable for real prototypes rather than 14-day trials. Numbers move, so check the official pricing page before you build.
Upstash Redis
| Resource | Free tier | Pay-as-you-go |
|---|---|---|
| Commands / month | 500,000 | $0.20 per 100K |
| Max data size | 256 MB | Up to 100 GB ($0.25/GB, first 1 GB free) |
| Databases | 1 | Up to 100 |
| Bandwidth | 10 GB / month | Free to 200 GB, then $0.03/GB |
| Max commands / second | 10,000 | 10,000 |
| Region | Pick one at database creation | + global replication (paid) |
| Sleeps / expires? | No sleep and no trial expiry, but a free database nobody uses can be archived (the docs say after at least 30 days) | Not archived for inactivity |
| Commercial use | Allowed | Allowed |
| Credit card | Not required | Required |
500K commands is more generous than it looks: a cache hit is one command, a rate-limit check a small handful. That comfortably covers a side project or the caching layer of a low-traffic production service, and pay-as-you-go picks up seamlessly at $0.20 per 100K when you outgrow it. Fixed monthly plans (from $10) exist if you want predictable billing.
Upstash Vector
| Resource | Free tier |
|---|---|
| Requests / day | 10,000 (query + upsert) |
| Max vectors | Up to 200M × dimensions, 1 GB total |
| Max dimensions | 1,536 |
| Free indexes | Up to 10 |
| Pay-as-you-go | $0.40 per 100K requests |
10,000 requests/day is enough to build and demo a real RAG app. The 1,536-dimension ceiling matches OpenAI's text-embedding-3-small, and Vector can generate embeddings for you from raw text.
Upstash QStash
| Resource | Free tier |
|---|---|
| Messages / day | 1,000 |
| Max message size | 1 MB |
| Max delay | 7 days |
| Pay-as-you-go | $1 per 100K messages |
One honest note: each delivery attempt counts, so a message that fails and retries three times counts as multiple against your daily allowance.
Why Serverless Redis Is Actually Different
Deploy conventional Redis code to serverless and ten thousand concurrent requests can mean ten thousand cold starts, each opening its own connection. Redis caps concurrent connections (often in the low thousands), so you hit the ceiling and requests time out. Connection pooling helps on a stable server and does nothing when every instance is ephemeral.
Upstash's stateless REST API sidesteps this entirely:
- It runs where TCP cannot. Cloudflare Workers, Vercel Edge Functions, and Deno Deploy restrict raw TCP sockets. HTTP works everywhere, making Upstash one of the only Redis options that runs at the edge and in the browser.
- Concurrency isn't capped by connections. Ten thousand independent HTTP calls is a normal day for an HTTP endpoint — no shared socket to contend over.
- Global replication is built in on paid tiers, so an edge function reads from the nearest replica.
The honest trade-off: an HTTP round-trip carries more per-command overhead than a warm TCP socket, so from a co-located long-running server raw Redis is lower-latency. Upstash still supports the standard Redis protocol over TCP for those cases — the REST path is what you want when compute is serverless, edge, or geographically spread.
Your First Commands
Create a free Redis database in the Upstash console and it hands you a REST URL and a token.
TypeScript / JavaScript (npm install @upstash/redis):
import { Redis } from "@upstash/redis";
const redis = new Redis({
url: process.env.UPSTASH_REDIS_REST_URL,
token: process.env.UPSTASH_REDIS_REST_TOKEN,
});
await redis.set("greeting", "hello world");
const value = await redis.get("greeting"); // "hello world"
// Cache with a 60-second TTL
await redis.set("user:42", JSON.stringify(user), { ex: 60 });
This exact code runs unchanged in a Node server, a Vercel function, a Cloudflare Worker, and a Deno script — that portability is the point.
Raw REST — no SDK, works from anything that can make an HTTPS request:
curl https://YOUR-ENDPOINT.upstash.io/set/greeting/hello
-H "Authorization: Bearer YOUR_TOKEN"
curl https://YOUR-ENDPOINT.upstash.io/get/greeting
-H "Authorization: Bearer YOUR_TOKEN"
# {"result":"hello"}
A Python SDK (pip install upstash-redis) mirrors the same API.
The Killer Use Case: Rate Limiting at the Edge
The most common reason people reach for Upstash is rate limiting. It needs a shared, fast, atomic counter every instance can see — impossible with in-memory state when your app runs across dozens of ephemeral edge locations. Upstash ships @upstash/ratelimit with fixed-window, sliding-window, and token-bucket algorithms:
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"), // 10 req / 10 s
});
export default async function handler(req) {
const ip = req.headers.get("x-forwarded-for") ?? "anonymous";
const { success } = await ratelimit.limit(ip);
if (!success) return new Response("Too many requests", { status: 429 });
return new Response("OK");
}
Deploy that to a Worker or Edge Function and you have global, consistent rate limiting in a few lines — every edge location checks the same counter over HTTP. This is a genuinely hard problem to solve any other way in a serverless deployment.
Vector and QStash in Brief
Upstash Vector is a serverless vector database for RAG — the same job as Pinecone, Qdrant, and Chroma, but with scale-to-zero pricing. Its standout is built-in embedding models: upsert and query with raw text and let Upstash embed server-side, so you don't even need a separate embedding API for a prototype. Pair it with a scraper like Firecrawl and a free LLM for an end-to-end $0 RAG pipeline. If you'd rather store vectors next to relational data, Supabase or Neon with pgvector is the alternative.
QStash is a message queue and scheduler for serverless, where there's no daemon to run a cron loop. You publish an HTTP message and it calls your endpoint back later — after a delay or on a cron schedule — with automatic retries and a dead-letter queue:
curl -X POST https://qstash.upstash.io/v2/publish/https://myapp.com/api/task
-H "Authorization: Bearer QSTASH_TOKEN"
-H "Content-Type: application/json"
-H "Upstash-Delay: 60s"
-d '{"userId": "123", "action": "send-welcome-email"}'
Swap Upstash-Delay for Upstash-Cron to schedule recurring jobs. It's the "do this later" primitive for stacks with no worker process.
Upstash vs Redis Cloud vs Cloudflare KV vs Self-Hosted
| Upstash | Redis Cloud | Cloudflare KV | Self-hosted | |
|---|---|---|---|---|
| Model | Serverless, per-request | Provisioned instance | Edge key-value | You run the box |
| HTTP/REST API | Yes (native) | No (TCP only) | Yes | No |
| Edge / Workers | Yes | No | Cloudflare only | No |
| Full Redis commands | Yes | Yes | No (get/put/list) | Yes |
| Scales to zero | Yes | No | Yes | No |
| Free tier | 500K cmd/mo, 256 MB | ~30 MB | 100K reads/day, 1 GB | Free (your server) |
| Best for | Serverless & edge | Always-on servers | Cloudflare reads | Full control, high volume |
- Redis Cloud is the reference managed Redis with the richest feature set and lowest latency from a co-located server — but it's a provisioned instance with a minimum cost and doesn't run at the edge.
- Cloudflare KV is edge-native but eventually-consistent key-value, not Redis — no atomic counters, sorted sets, or pub/sub. Great for read-heavy config, wrong for rate limiting.
- Self-hosted Redis on a free Oracle Cloud ARM box is $0/month and total control — the cost is operational (persistence, backups, upgrades, and the connection-pool problem if you're serverless). A PaaS like Coolify makes standing one up a one-click job.
- Upstash wins when compute is serverless, edge, or spread across regions. Note: Vercel's own KV was built on Upstash, so on Vercel it's effectively the native Redis path.
When to Use Upstash (and When Not To)
- Deploying to serverless or the edge? Upstash is the natural pick — the connectionless REST model exists precisely for you.
- Need distributed rate limiting?
@upstash/ratelimitis the cleanest solution available. This alone justifies it. - Want a RAG prototype fast? Vector with built-in embeddings gets you to semantic search in a few lines; compare against Qdrant, Pinecone, and Chroma if you'll scale hard.
- Always-on server doing millions of commands/second? Provisioned Redis (Redis Cloud or self-hosted) is cheaper and lower-latency — per-request pricing and HTTP overhead work against you.
- Need a plain database, not a cache/queue? Reach for Turso or a managed Postgres — Upstash shines for ephemeral key-value workloads, not as a relational system of record.
Frequently Asked Questions
Is Upstash really free?
Yes. Redis includes 500,000 commands/month, 256 MB storage, and 10 GB bandwidth on a standing free tier with no credit card; Vector adds 10,000 requests/day and QStash 1,000 messages/day, both free. These are real free tiers for prototypes, not time-limited trials — you only add a card when you move to pay-as-you-go. Two limits to plan around: the free plan gives you one Redis database, and a free database that sees no use for 30 days or more can be archived. Upstash emails a warning first, keeps a backup, and lets you restore it, but the connection details stop working until you do.
Is Upstash real Redis?
It implements the Redis command set and is compatible with standard Redis clients over TCP, so your knowledge and most existing code transfer. What differs is that it also exposes every command over a stateless HTTP/REST API and prices per request — the parts that make it work in serverless and edge environments.
Does Upstash work on Cloudflare Workers and Vercel Edge?
Yes — this is one of its main reasons to exist. Because it speaks HTTP rather than requiring a raw TCP socket, it runs in edge runtimes that restrict or forbid TCP connections. The @upstash/redis SDK is built for exactly these environments.
Why use Upstash instead of self-hosting Redis?
Use Upstash when your app runs on serverless or edge, where the persistent-connection model causes connection-exhaustion problems, and its REST API scales to zero when idle. Self-host when you have always-on servers, need the full feature set at lowest latency, or run high, steady volume where flat pricing beats per-request.
Bottom Line
Upstash is Redis rebuilt for how apps are actually deployed — stateless, serverless, spread across the edge. Exposing Redis over HTTP and pricing per request removes the connection-exhaustion problem that breaks traditional Redis in serverless environments, and scale-to-zero means an idle database costs nothing. If your compute is stateless and your traffic is bursty, it's one of the cleanest free-tier keys you can add. If it's a beefy always-on server doing millions of commands a second, reach for provisioned or self-hosted Redis instead.
Related Reads
- Qdrant vs Pinecone vs Chroma: Free Vector DB for RAG — the dedicated vector DBs to weigh against Upstash Vector
- Turso Free Tier: Hosted SQLite, 5GB and 100 DBs — when you need a database, not a cache
- Supabase vs Neon: Free PostgreSQL Database Compared — the SQL-first alternative with pgvector
- Appwrite: Free Open-Source Backend (Firebase Alternative) — a full backend if you need more than a cache
- Oracle Cloud Always Free: 2-Core 12GB ARM VPS (Halved 2026) — the free box to self-host Redis on