api reference
REST, predictable, typed
Base URL https://api.nexauth.dev/v1. Keys: pk_* (client), sk_* (server), Bearer header. All errors are { error: { code, message } }.
Auth
| POST | /v1/otp/send | send OTP — pk |
| POST | /v1/otp/verify | verify → session — pk |
| POST | /v1/social/google | google id-token → session — pk |
| POST | /v1/password/login | password login — pk |
| POST | /v1/magic-link/send | /verify | email links — pk |
| POST | /v1/passkey/register/* | /login/* | WebAuthn — pk |
| POST | /v1/token/refresh | rotate refresh — pk |
| GET | /v1/jwks.json | public JWKS — pk |
Server
| POST | /v1/verify | claims lookup — sk |
| GET | /v1/users | list end users — sk |
| POST | /v1/sessions/revoke | revoke session(s) — sk |
| POST | /v1/users/import | bulk import w/ hash adapters — sk |
| POST | /v1/users/lazy-login | legacy-hash login — pk |
AuthZ
| GET/POST | /v1/authz/permissions | perm CRUD — sk |
| GET/POST | /v1/authz/roles | role CRUD — sk |
| POST/DELETE | /v1/authz/roles/:r/permissions/:p | grant/revoke — sk |
| POST/DELETE | /v1/authz/assign | user↔role w/ scope — sk |
| POST | /v1/authz/check | allow/deny — sk |
Admin (console session)
| GET/POST | /v1/admin/apps | /keys | apps + key rotation |
| GET/PUT | /v1/admin/gateways/:provider | BYO gateway creds |
| GET | /v1/admin/credits | /usage | balance + metered usage |
| GET/POST | /v1/admin/webhooks | endpoints + deliveries |
| GET | /v1/admin/users | /users/:id | end-user management |
| GET/POST | /v1/admin/members | team seats + roles |
Webhooks
Events: user.created, session.started, otp.sent, otp.delivered, otp.failed, otp.verified. Payloads are HMAC-SHA256 signed:
verify signature
signature = HMAC_SHA256(whsec, raw_body)
header: X-NexAuth-Signature: sha256=<hex>
// retry: ×8, exponential, 24h windowRate limits
10/minper IP on credential endpoints (otp send/verify, password, magic-link)10/hourper identifier per app — SMS-pumping guard- Standard endpoints: generous per-key buckets