Upstash Redis database archived: why it happened and how to restore it

Your side project's Redis calls started failing. You open the Upstash console and the database is gone, or marked as archived.
Upstash didn't lose it. It archived the database because nothing had used it for a month.
- 30+ days
- of inactivity before a free database is archived
- several
- warning emails Upstash sends first
- backed up
- your data is kept, the instance is removed
- paid plan
- Upstash's own fix to keep the endpoint alive
Why Upstash archived your Redis database
Upstash's FAQ says free databases are archived after a minimum of 30 days of inactivity.
Archival means two things: Upstash backs up your data, then removes the database instance.
That second part is why your app breaks. The endpoint it was talking to no longer exists.
The warning emails you probably missed
Upstash sends several warning emails before it archives a database.
If your Upstash account uses an old inbox, or the mails land in a filtered folder, the first sign is a broken app.
How to restore an archived Upstash Redis database
You can't switch the old instance back on. Upstash's route is to create a new database and restore the backup into it.
- In the Upstash console, create a new Redis database.
- Open the new database and go to its Backups tab.
- Click Restore..., select the source database (the one that was archived) and the backup you want.
- Click Start Restore.
How to point your app at the restored database
The restored data lives in a new database, so expect a new endpoint and token.
Copy the new values into your environment variables, usually UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN, then redeploy.
Forget this step and the app keeps calling the old endpoint, which still fails.
How to stop Upstash archiving your database
How to stop it for good: switch to a paid plan
Upstash's own advice: if you want to keep the endpoint alive through longer quiet periods, switch to a paid plan.
If real users depend on the app, that's the real fix. Archiving idle databases is part of how the free plan stays free.
How to keep a free Upstash database active
The other option is to make sure the database never goes a month without use. A small daily job that sends one real command does that.
One honest caveat: Upstash doesn't publish exactly what counts as activity. A real command is the safest bet, but it's not a documented guarantee.
Paste this into Claude or ChatGPT and it'll write the job for your stack:
My Upstash Redis database is on the free plan. Upstash archives free databases after at least 30 days of inactivity, and I want to stop that from catching me out. Write me a small scheduled job that: - Runs once a day (pick the simplest option for my stack: a GitHub Actions schedule, a Vercel/Netlify/Cloudflare cron, or a cron in my existing backend). - Uses the @upstash/redis client with UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN from secrets, never hardcoded. - Sends one real command (PING, or a SET of a timestamp key) and exits non-zero if it fails, so a dead database shows up as a failed run. Also tell me honestly: Upstash doesn't publish what counts as "activity", so what else should I do (warning emails, backups, upgrading) in case the ping isn't enough? My stack: [describe it here]
How to know your Upstash Redis is reachable before users do
An archived database doesn't announce itself. Your app just starts throwing errors, and users notice first.
A health check fixes that. It sends Redis a PING and reports the answer somewhere that will email you when it fails.
import { Redis } from "@upstash/redis";
import { tmwd } from "@tellmewhendown/node";
// Reads UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN
const redis = Redis.fromEnv();
export async function checkRedis() {
const started = Date.now();
try {
await redis.ping();
await tmwd.check("redis", { status: "ok", latencyMs: Date.now() - started });
} catch (err) {
await tmwd.check("redis", { status: "fail", detail: { error: String(err) } });
}
}Run it on a schedule. Each run is also a real command, so it doubles as your keep-alive.
If the check reports fail or stops arriving, you get an email. That covers an archived database and a keep-alive that quietly stopped.
Other free databases have their own version of this. See how to stop Neon autosuspend, or the cross-host playbook in how to keep a free backend awake.
The archive policy and restore steps come from Upstash's FAQ and Backup/Restore docs.
Find out your Redis is gone before your users do.
Join Tell Me When Down free and we'll watch your app and its Redis around the clock. An archived database, a failing health check, or a keep-alive that quietly stopped: you get an email in minutes, not a bug report next month.
spot something wrong or out of date? [email protected] — we'll fix it