Block disposable email in your stack.
Each guide has a single drop-in code snippet, plus notes on the gotchas specific to that stack (where to put the API key, fail-open vs fail-closed, how the error reaches the UI).
NextAuth.js (Auth.js)
TypeScriptNextAuth's `signIn` callback runs before Auth.js writes the account. Return `false` (or a redirect URL) and the signup is refused.
Read the guide →WorkOS
TypeScriptHook the `user.created` webhook from WorkOS. Verify the disposable status, then delete the user if needed. AuthKit doesn't expose a synchronous pre-creation hook, so this is the supported pattern.
Read the guide →Remix
TypeScriptAdd the check inside your signup `action`. Remix's nested error UI surfaces it cleanly via `useActionData()` without extra plumbing.
Read the guide →Nuxt 3
TypeScriptUse a server route under `server/api/`. Nuxt 3 runs on Nitro — `useRuntimeConfig` exposes server-only env vars to the handler.
Read the guide →SvelteKit
TypeScriptAdd the check inside a `+page.server.ts` action. SvelteKit forms post directly to actions, so this is the natural place — no separate API route needed.
Read the guide →Astro
TypeScriptAstro's server endpoints (with SSR or hybrid output) work like Express handlers. Add the check in the POST handler for your signup form.
Read the guide →Express.js
JavaScriptAdd the check as middleware on your signup route. Works with Passport, custom auth, or any stack — no library required.
Read the guide →Fastify
TypeScriptUse a preHandler hook on your signup route. Fastify's built-in schema validation makes the email-shape check explicit; the disposable check goes right after.
Read the guide →Don’t see your stack? Point your AI at us.
Paste this single prompt into Claude Code, Cursor, Codex, Aider, or Copilot:
Read https://checkdisposable.email/integrate.md and follow the instructions on that page.
The integrate.md page is written in the second person for an LLM. It tells the AI what to ask you for, what code to add, and what rules to follow.