UsefulKey

Open‑source, Self‑hostable, Typescript toolkit for API keys and rate limiting. Designed to be simple to adopt and easy to extend.

Adapters

Use Postgres, Redis, SQLite, Cloudflare D1/KV, or HTTP backends.

Learn more →

Plugins

Enable scopes, IP access control, usage caps, and more.

Learn more →

Rate limiting

Global and token bucket strategies with persistent stores.

Learn more →

Examples

Next.js, Hono, and service‑to‑service usage patterns.

Learn more →

What is UsefulKey?

UsefulKey provides the building blocks for managing API access in your apps and services. It comes with storage adapters, middleware-friendly helpers, and pluggable features so you can choose only what you need.

  • Issue and verify API keys with optional expiration and metadata.
  • Apply global or token bucket rate limits backed by persistent stores.
  • Enable scopes, usage caps, and IP access control via plugins.
  • Use your preferred backend: Postgres, Redis, SQLite, Cloudflare, or HTTP.

Quick Example

Swap in any adapter (Postgres, Redis, SQLite, Cloudflare) when you’re ready.

import { usefulkey, MemoryKeyStore, MemoryRateLimitStore, ConsoleAnalytics } from "usefulkey";

// in your server code (e.g. Next.js Route Handler, Hono, etc.)
const uk = usefulkey({
  keyPrefix: "uk",
  adapters: {
    keyStore: new MemoryKeyStore(),
    rateLimitStore: new MemoryRateLimitStore(),
    analytics: new ConsoleAnalytics(),
  },
});

const create = await uk.createKey({
  metadata: {
    plan: "pro",
  },
});

// app/api/protected/route.ts
export async function GET(req: Request) {
  const key = req.headers.get("x-api-key") ?? "";

  const verify = await uk.verifyKey({ key });
  if (!verify.result?.valid) return new Response("unauthorized", { status: 401 });
  return new Response("ok");
}