For side projects and early experiments.
- 1 workspace
- 2 environments
- 1,000 monthly active users
- Community support
Per-environment signing keys, tenant-aware tokens, fresh-state authorization. A serious auth platform, priced for teams still shipping v1.
Trusted by teams that treat identity as infrastructure
From the sign-in screen to the audit log — the whole identity surface, polished and ready to ship.
Branded flows, secure defaults, and every option users expect — social, email, magic link, TOTP.
Every workspace, every customer, every role — modeled the way B2B products actually work.
Everything you'd otherwise build yourself — signing keys, environments, audit and observability.
Flip multi-tenant on or off per environment. Roles resolve tenant → env → system in one pass. Every JWT ships with the entire tenant claim as one JSON object — no extra round trip.
Every environment gets its own RSA pair, its own audience and its own JWKS endpoint. A leaked test key can never sign a production token. Rotation is per-env, non-blocking, and published to JWKS in seconds.
kid: dev-4b2c · alg: RS256 · rotated 3d agokid: stg-9f1e · alg: RS256 · rotated 12d agokid: prd-c3a7 · alg: RS256 · rotated 2h agoThe JWT proves identity. Authorization is served from an in-memory snapshot that invalidates on every user-mutating domain event. /auth/me and /auth/validate always return the truth — the JWT stays valid, the state stays fresh.
Publishable key on the client. Secret on the server. Same primitives across every SDK.
// Verify the JWT and hydrate the user from Redis import { authyon } from "@authyon/node"; const auth = authyon({ env: process.env.AUTHYO_ENV_KEY }); app.get("/orders", auth.required(), async (req, res) => { // req.user is the fresh Redis snapshot const orders = await Orders.forTenant(req.user.tenant.id); res.json(orders); });
// Program.cs — one call wires JWT + Redis + fresh-state validation builder.Services.AddAuthyon(o => o.EnvironmentKey = builder.Configuration["Authyon:EnvKey"]); var app = builder.Build(); app.UseAuthyon(); app.MapGet("/orders", (AuthyonUser user, OrdersRepo repo) => repo.ForTenant(user.Tenant.Id)) .RequireAuthyon("orders:read");
# Any language, any framework — hit /auth/validate with the token curl -X POST https://api.authyon.com/auth/validate \ -H "Authorization: Bearer $TOKEN" \ -H "X-Authyon-Env: env_01HGXK..." # → 200 with fresh { user, tenant, scopes } # → 401 the instant a role, permission or tenant flag changes
"We ripped out three different auth pieces and replaced them with Authyon in one sprint. The per-env keys alone would have cost us a security audit if we'd built it ourselves."
"The snapshot-based authorization design is the thing. Role changes propagate instantly without rotating a single JWT. That was the sentence that sold our security team."
"Multi-tenant setups usually take us a quarter to design properly. With Authyon we had a tenant-aware JWT and a working invite flow the same afternoon we signed up."
Free while you're building. Predictable as you grow.
For side projects and early experiments.
Production-ready for growing products.
Self-hosted or SLA-backed, with a real human on Slack.
No. The JWT proves identity — the actual authorization state is served from an in-memory snapshot on /auth/me and /auth/validate. Any user-mutating domain event invalidates the snapshot, so the next call returns the new state without touching the JWT.
Keys are per-environment. A DEV leak cannot sign a PROD token. Rotation adds a new key beside the old one, publishes it in JWKS, and expires the old one on a configurable window — nothing drops mid-flight.
Yes, on the Enterprise plan. It's a .NET 9 API + Postgres + in-memory cache. Bring your own database, bring your own SMTP, we ship the container.
Both. Every user can enable authenticator app, email OTP, or both. And environment owners can force it — the flag lives on the env, not the user, so it applies uniformly.
Create your account in under a minute. Try the Starter plan while you evaluate — upgrade whenever you're ready.