Now in public beta

Passwordless auth for modern apps

Drop-in authentication with Ed25519 challenge-response, passkeys, TOTP, and multi-tenant isolation. Ship auth in minutes, not months.

Terminal
$ npm install @wardauth/sdk-js

// 3 lines to passwordless auth
import { createClient } from "@wardauth/sdk-js"

const auth = createClient({
  baseUrl: "https://api.wardauth.com",
  apiKey: "wardauth_live_..."
})

const session = await auth.signIn("alice@acme.com")

Everything you need for auth

Production-ready authentication infrastructure so you can focus on your product.

Passwordless by default

Ed25519 challenge-response authentication. No passwords to leak, no credentials to phish.

MFA built-in

TOTP authenticator apps, WebAuthn passkeys, and recovery codes. All out of the box.

Multi-tenant isolation

Each tenant gets isolated users, API keys, and audit logs. Zero cross-tenant data leakage.

Sub-second auth

Redis-backed sessions, JWT access tokens with 15-min expiry, and automatic refresh rotation.

Refresh token rotation

Atomic token rotation with reuse detection. Compromised tokens revoke the entire session family.

Tenant subdomains

Each tenant gets their own login portal at slug.wardauth.com with custom branding support.

How it works

From zero to passwordless auth in under 10 minutes.

01

Create a tenant

Sign up on the admin dashboard. Get your API key in seconds.

02

Install the SDK

npm install @wardauth/sdk-js — works with React, Next.js, Vue, or vanilla JS.

03

Register users

Users generate an Ed25519 key pair on their device. The public key is registered with WardAuth.

04

Authenticate

Challenge → Sign → Verify. No passwords. Tokens are issued with automatic refresh rotation.

Developer-first API

Clean REST API with SDKs for JavaScript, React, and more coming soon.

React — Provider + Hook
import { WardAuthProvider, useAuth }
  from "@wardauth/sdk-js/react";

<WardAuthProvider
  baseUrl="https://api.wardauth.com"
  apiKey="wardauth_live_..."
>
  <App />
</WardAuthProvider>

const { signIn, user } = useAuth()
REST API — cURL
curl -X POST api.wardauth.com/v1/register
  -H "X-API-Key: wardauth_live_..."
  -d '{"email":"alice@acme.com",
       "publicKey":"base64..."}'

curl -X POST api.wardauth.com/v1/challenge

curl -X POST api.wardauth.com/v1/challenge/verify

Simple, transparent pricing

Start free. Scale as you grow.

Free

$0forever

For side projects and prototypes

Get started
  • 5,000 monthly active users
  • Email + password auth
  • Passwordless (Ed25519)
  • Magic link
  • Audit log (7 days)
  • Community support
Most popular

Pro

$29/month

For growing applications

Contact sales
  • 25,000 monthly active users
  • Everything in Free
  • MFA (TOTP + WebAuthn)
  • Webhooks
  • Audit log (90 days)
  • Custom CORS origins
  • Priority support

Enterprise

Custom

For large-scale deployments

Contact sales
  • Unlimited MAU
  • Everything in Pro
  • SSO / SAML
  • Custom domains
  • Dedicated infrastructure
  • Audit log (1 year)
  • SLA 99.99%
  • Dedicated support engineer