KeyValue.immanuel.co

Free · no account required

Free Online Key-Value Store

Store a value, read it back from anywhere. No SDK, no database to run — just HTTP. Start anonymously in one request, or sign up and get a private folder, app keys you can't lose, and an API header of your own.

Keys stored
App keys
terminal
$ curl /api/KeyVal/GetAppKey
"3cg7aby9"

$ curl -X POST /api/KeyVal/UpdateValue/3cg7aby9/greeting/hello
true

$ curl /api/KeyVal/GetValue/3cg7aby9/greeting
"hello"

What this is

A database you never have to run

A key-value pair, stored on a server, reachable over plain HTTP from anything that can make a request — a web page, a shell script, a device, a spreadsheet.

An app key is your store

Every app key gets its own database file. Your reads and writes never contend with anybody else's, and nothing you store is mixed in with another user's data.

Keys and values

Set a key to a value, read it back, list everything, delete one. Keys go up to 64 characters, values up to 1024.

Counters that count

Increment and decrement happen in a single statement, so fifty simultaneous hits land on fifty. A visit counter is one line on page load.

Anonymous, or with an account

Anonymous

Exactly how the service has worked since 2017.

Getting started
One request, no details given
Where data lives
App_Data/3cg7aby9.db
Losing the app key
The data is gone — nothing maps back to it
Who can read it
Anyone who has the app key
App keys
As many as you ask for

Signing up changes nothing about existing anonymous keys — they keep working exactly as they always have.

Quick start

Three requests, no account needed

Copy them straight into a terminal. Every snippet on this page already points at the host you are reading it from.

1 Get an app key

Your app key is the handle to your own private store. Keep it — without an account it cannot be recovered.

curl /api/KeyVal/GetAppKey

# "3cg7aby9"

2 Store a value

Key up to 64 characters, value up to 1024.

curl -X POST \
  /api/KeyVal/UpdateValue/3cg7aby9/yourkey/yourvalue

# true

3 Read it back

Returns an empty string when the key has never been set.

curl /api/KeyVal/GetValue/3cg7aby9/yourkey

# "yourvalue"

From JavaScript, with an account

One header on every request. Swap in the name and value from your account panel.

<script>
const KV_BASE = "";
const KV_APPKEY = "3cg7aby9";
const KV_HEADERS = { "x-yourapp-token": "kv_your_secret_value" };

async function getValue(key) {
  const res = await fetch(`${KV_BASE}/api/v2/appkeys/${KV_APPKEY}/keys/${key}`, { headers: KV_HEADERS });
  return res.ok ? (await res.json()).value : null;
}

async function setValue(key, value) {
  const res = await fetch(`${KV_BASE}/api/v2/appkeys/${KV_APPKEY}/keys/${key}`, {
    method: "PUT",
    headers: { ...KV_HEADERS, "Content-Type": "application/json" },
    body: JSON.stringify({ value })
  });
  return res.ok;
}

async function increment(key, by = 1) {
  const res = await fetch(`${KV_BASE}/api/v2/appkeys/${KV_APPKEY}/keys/${key}/increment`, {
    method: "POST",
    headers: { ...KV_HEADERS, "Content-Type": "application/json" },
    body: JSON.stringify({ by })
  });
  return res.ok ? (await res.json()).value : null;
}
</script>

Leave KV_HEADERS out entirely and the same code works against an anonymous app key.

Try it live

API console

Every endpoint, against the live service, with real data. Sign in below and your header and app keys are filled in for you.

GET

Headers sent with every call

Response
Pick an endpoint and press Send…
The same call as curl

Accounts

Your account

Sign in with an email address and a six-digit code. There is no password to choose, forget or leak.

Reference

Every endpoint

v1 is the original API, unchanged and supported indefinitely. v2 adds listing, deleting, bigger values and richer responses. auth is new and only concerns accounts.

v1 — unchanged since 2017

MethodPathDoes
GET/api/KeyVal/GetAppKeyIssue a new app key
GET/api/KeyVal/GetValue/{appkey}/{key}Read a value, or ""
POST/api/KeyVal/UpdateValue/{appkey}/{key}/{value}Create or overwrite
POST/api/KeyVal/ActOnValue/{appkey}/{key}/{action}increment or decrement
GET/api/KeyVal/GetCountKeys stored service-wide
GET/api/KeyVal/GetIpYour IP as the server sees it

v2 — recommended for new code

MethodPathDoes
POST/api/v2/appkeysIssue an app key — to your account when your header is sent
GET/api/v2/appkeys/{appkey}Key count and timestamps
GET/api/v2/appkeys/{appkey}/keysList everything you stored
GET/api/v2/appkeys/{appkey}/keys/{key}Read one key with timestamps
PUT/api/v2/appkeys/{appkey}/keys/{key}Set from a JSON body: {"value":"..."}
DEL/api/v2/appkeys/{appkey}/keys/{key}Remove a key
POST/api/v2/appkeys/{appkey}/keys/{key}/incrementStep by {"by":n}, default 1
GET/api/v2/statsService-wide totals

Accounts

MethodPathDoes
GET/api/v2/auth/stateWhether accounts are on, and how codes are delivered
POST/api/v2/auth/signupRegister an address and send it a code
POST/api/v2/auth/signinSend a code to an existing account
POST/api/v2/auth/verifyExchange the code for a session token
POST/api/v2/auth/signoutEnd the session
GET/api/v2/meYour account, app keys and API header
POST/api/v2/me/appkeysIssue an app key into your folder
DEL/api/v2/me/appkeys/{appkey}Delete an app key and everything under it
PUT/api/v2/me/headerSet the custom header: {"name":"...","value":"..."}
DEL/api/v2/me/headerRemove it

Routes under /api/v2/me need the session token from verify in Authorization: Bearer, not the custom header — so a leaked API header cannot mint more app keys or rewrite itself. Failures are RFC 9457 problem documents. Machine-readable schema: /openapi/v1.json.