For developers
Block fake and disposable signups with one API call
Check each new address with the SimpleVerifier API before the account is created. Block disposable, invalid and misspelled emails with a clear message, flag role and catch-all addresses, and let every unfinished check through. Drop-in recipes for Supabase, Clerk, Firebase, Next.js, Express, Cloudflare Workers, Zapier, n8n, Webflow and Framer.
Why fake signups cost you
Free credits farmed with throwaway inboxes
A temporary inbox takes seconds to open. If your app gives AI tokens, trial seats or credits on signup, each one is a cost.
Welcome emails that bounce
Invented and misspelled addresses bounce your onboarding mail, and bounces count against the sender reputation your real users depend on.
Metrics you can't trust
Fake accounts inflate signups, waitlists and activation funnels, and make every conversion rate look worse than it is.
The whole idea in four lines
Run it on your server where the account is created. action is do_not_send only for addresses that can't receive mail or are throwaway. The recipes wrap this with a timeout, dry-run mode and fail-open handling.
const r = await fetch("https://simpleverifier.com/api/v1/verify", { method: "POST",
headers: { Authorization: `Bearer ${process.env.SIMPLEVERIFIER_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ email }) }).then((res) => res.json());
if (r.action === "do_not_send") throw new Error("Please use a real, permanent email address.");What every check looks at
Format
Catches addresses that can't exist, before any network call.
Domain and MX
Confirms the domain is real and has a mail server that accepts mail.
Disposable domains
Matched against a list of 9,913 temporary and throwaway email domains.
Typo domains
gmial.com, hotmial.com and friends, with the suggested fix in reason.
Role inboxes
info@, sales@, admin@: flagged with reason_code role so you can warn instead of block.
Invented-looking addresses
likely_invented flags test@, john.doe@ and template domains. Never set for a confirmed mailbox.
Live mailbox check
Asks the mail server whether the mailbox exists, without sending a message.
Fails open
Any timeout or error answer lets the person sign up. A slow mail server never blocks a real user.
What to block and what to warn on
Branch on the decision fields, never on the reason sentence: action, reason_code and likely_invented have a fixed shape and are documented here.
| Address | Fields | Do | Why |
|---|---|---|---|
| Disposable or temporary inbox | reason_code "disposable" (action "do_not_send") | Block | The address stops working within minutes or hours. It is the main tool for farming free trials and credits. |
| Invalid: bad format, no mail server, mailbox not found | action "do_not_send" (reason_code "syntax", "no_mx", "mailbox_not_found", "domain_not_hosted") | Block | Mail to it bounces. Ask the person to fix it instead of creating an account nobody can reach. |
| Misspelled domain (gmial.com, hotmial.com) | reason_code "typo_domain" (action "do_not_send") | Block | Show the suggested domain from reason so a real person can correct it in one go. |
| Role inbox (info@, sales@, admin@) | reason_code "role" | Warn | Often a real team inbox. Let it in, flag the account, and require email confirmation before credits. |
| Catch-all domain | reason_code "catch_all" | Warn | The server accepts every address, so the mailbox can't be confirmed. Many real company domains work this way. |
| Looks invented (test@, john.doe@, example.com) | likely_invented true | Warn | A strong abuse signal on an unconfirmed address. Hold free credits until the email is confirmed. |
| Valid, or the check could not finish | action "send", "send_with_care", "retry_later", or any non-2xx answer or timeout | Allow | Fail open: a slow mail server or a brief outage must never stop a real person signing up. |
Drop-in recipes
Each one is complete, copy-paste code against the public API, with the timeout set under the platform's own limit.
- SupabaseRuns before the user exists. A blocked address never becomes an auth.users row.
- ClerkThe webhook runs just after Clerk creates the user, so a blocked account exists for a moment and is then deleted. A custom sign-up form (step 4) checks before the account is created.
- FirebaseRuns before the user is saved. A thrown HttpsError stops the account being created.
- Next.jsRuns in your own server code before the account is created, so you choose exactly what happens.
- ExpressRuns before your route handler creates the account.
- Cloudflare WorkersRuns in front of your origin, so blocked sign-ups never reach your app or database.
- Zapier and n8nRuns after the form is submitted, before the contact reaches your list or CRM. It can't show an error on the form itself.
- Webflow and Framer formsRuns after the visitor submits. It keeps fakes out of your list but can't show an error on the hosted form.
Pricing
Signup checks use the API included in the existing plans. Each address you check is one call. Calls past the included ones are billed per 1,000 on monthly billing.
| Plan | Per month | API calls included | After that |
|---|---|---|---|
| Pro | $29.99 | 10,000 | $1.50 per 1,000 |
| Business | $99 | 100,000 | $1.00 per 1,000 |
| Agency | $249 | 300,000 | $1.00 per 1,000 |
Every key allows 120 calls a minute. Full plan details are on the pricing page.
Common questions
- Will this block real people?
- Block only what the table says: disposable, invalid and misspelled addresses. Role inboxes, catch-all domains and invented-looking addresses get a warn flag instead, and anything the check couldn't finish is allowed. Start with dry-run mode, which logs what would be blocked and blocks nothing.
- How fast is a check?
- Format, disposable, typo and no-mail-server answers come back quickly. A live mailbox check can take several seconds when a mail server is slow, so every recipe sets a timeout under its platform's limit and lets the signup through when it runs out.
- Can I call the API from the browser?
- No. Keep the key on your server, in your auth hook or in a Worker. Anyone who can read the key from your page can use your plan.
- Is there an npm package?
- Not yet. Client drafts for Node.js and other languages can be downloaded, but none is on npm. The recipes use plain fetch, so there is nothing to install. See the SDKs page.
- Which plan do I need?
- Any plan with API access: Pro, Business or Agency. Each signup you check is one API call. Starter and Growth cover CSV uploads only.
Put the check in front of your next signup
Create a key, paste a recipe, run it in dry-run mode for a few days, then switch blocking on.