A shared, serverless authentication service. No passwords, no email, no recovery flows. Just passkeys.
How it works
Drop passwords from your side project today. SimplePasskey handles the hard parts so you can ship.
Get a clientId for your project. Each app gets its own isolated user pool and signing keys.
Use @simplewebauthn/browser and two fetch calls. That's the entire integration.
Fingerprint, Face ID, or security key. No passwords to remember, no phishing to worry about.
Integration
Two API calls to register. Two more to authenticate. You get back a JWT.
import { startRegistration } from '@simplewebauthn/browser';
// 1. Get registration options from the API
const { token, options } = await fetch('https://api.simplepasskey.com/register/options', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ clientId: 'your-app' })
}).then(r => r.json());
// 2. Prompt the user's browser to create a passkey
const credential = await startRegistration({ optionsJSON: options });
// 3. Verify and get a JWT back
const { jwt } = await fetch('https://api.simplepasskey.com/register/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token, credential })
}).then(r => r.json());
// Done! Use the JWT to authenticate requests to your backend
console.log('Signed in:', jwt);
import { startAuthentication } from '@simplewebauthn/browser';
// 1. Get authentication options
const { token, options } = await fetch('https://api.simplepasskey.com/auth/options', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ clientId: 'your-app' })
}).then(r => r.json());
// 2. Prompt the user to authenticate with their passkey
const credential = await startAuthentication({ optionsJSON: options });
// 3. Verify and get a fresh JWT
const { jwt } = await fetch('https://api.simplepasskey.com/auth/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token, credential })
}).then(r => r.json());
// That's it — no username, no password
console.log('Authenticated:', jwt);
Features
Built for developers who want auth that works without the baggage.
No passwords to store, hash, or leak. Phishing-resistant by design. WebAuthn under the hood.
Each app gets its own isolated user pool, signing keys, and credential storage. No cross-tenant leakage.
Runs on Lambda + DynamoDB. Scales to zero when idle. Your auth bill stays under $1/month for side projects.
Get back ES256-signed JWTs. Verify them independently using the JWKS endpoint. No callback to our servers needed.
API Reference
Everything lives at api.simplepasskey.com
| Method | Endpoint | Description |
|---|---|---|
| POST | /register/options |
Generate registration challenge for a new passkey |
| POST | /register/verify |
Verify registration and return a signed JWT |
| POST | /auth/options |
Generate authentication challenge |
| POST | /auth/verify |
Verify authentication and return a signed JWT |
| GET | /.well-known/jwks.json |
Public keys for independent JWT verification |
| POST | /credentials/* |
Add, list, and delete credentials (JWT-authed) |
Get started
SimplePasskey is in early access. Get your API key and start integrating passkey auth in minutes.