Build the server side of an Authbound verification flow. Your app creates a verification with a secret key, then returns a short-lived wallet handoff that the browser SDK can render.

1. Get keys and a policy ID

In the Authbound dashboard, copy:
  • a secret key that starts with sk_test_
  • a publishable key that starts with pk_test_
Every verification runs against a policy, which decides what to ask the user for and what counts as verified. Start with one of these common presets — these IDs work in every project, no setup needed: See SDKs and frameworks for the complete preset list.
Presets are built in and resolve when you create a verification, so don’t worry if they don’t show up under your project’s policy list. When you outgrow them, create your own policy with @authbound/server or POST /v1/policies and use its ID instead.

2. Install the server SDK

3. Create the verification

Your server calls Authbound with a secret key, then returns only the fields the browser needs.

4. Return the browser contract

Every UI SDK guide returns this shape from your create route. The SDK server routers normalize this contract for you. Only build this mapping yourself when you are writing a custom backend route instead of mounting the SDK router.

5. Render the wallet flow

Choose the framework guide that matches your app.

Next.js

Start here for a full App Router example.

React

React UI with a small backend create route.

Vue

Vue plugin and VerificationWall.

Nuxt

Nuxt module, server route, and route middleware.

Express

Build the create route yourself.

Hono

Add a verification route to a Hono backend.

Browser status headers

The browser uses the returned clientToken for this one verification. Authbound SDKs send:
You do not need to expose your secret key or build a custom status endpoint for the standard browser SDK flow. Framework packages subscribe automatically. For custom UI, pass expiresAt into subscribeToStatus. See status subscriptions for SSE fallback and polling deadlines.

Direct REST action kinds

If you use the REST API directly, client_action.kind tells you how to handle client_action.data. Terminal verifications (verified, failed, canceled, expired) do not include client_action. Wallet handoff fields are only present while the verification can still be handed to a wallet.

Production next steps

  • Handle webhooks and signed results.
  • Store a verified flag in your own user or session model.
  • Protect application routes after the trusted server-side result is stored.