1. Home
  2. Workflow templates
  3. Sign-up forms: catch bad emails in the browser, then confirm on your server

Sign-up forms template

Sign-up forms: catch bad emails in the browser, then confirm on your server

Add one script tag for instant typo and throwaway-address checks, then make one API call from your server so a mailbox that does not exist never becomes an account.

About 20 minutes to set upFounders and developers with a sign-up or lead form who are tired of fake addresses and bounced welcome emails.

How it runs

  1. 1

    Browser check

    The widget flags typos, throwaway domains and role inboxes as the person types.

  2. 2

    Submit

    The form posts to your server.

  3. 3

    Server check

    Your server calls the SimpleVerifier verify endpoint.

  4. 4

    Decide

    Save the user, ask for another address or flag the account for review.

What you need

  • A form you can edit
  • Server code that handles the form post
  • A SimpleVerifier API key from simpleverifier.com/api-keys (starts with sv_live_) for the server step

Set it up

  1. Paste the widget script and add data-simpleverifier to your email input. It runs in the browser with no key.
  2. On your server add the check above, after your own format validation and before you save the user.
  3. Decide what each action does on your form. Only do_not_send should block. A catch-all or a role inbox is not a reason to turn a real person away.
  4. Set a timeout of 40 seconds or answer the form first and check in the background, because a slow mail server can take about 30 seconds.
Browser widget (free, no key)
<script src="https://simpleverifier.com/widget.js" defer></script>

<input type="email" name="email" required data-simpleverifier>
Server check (Node.js)
const response = await fetch(
  `https://simpleverifier.com/api/v1/verify?email=${encodeURIComponent(email)}`,
  { headers: { Authorization: `Bearer ${process.env.SIMPLEVERIFIER_API_KEY}` } },
);
const result = await response.json();

if (result.action === "do_not_send") {
  // Ask for another address.
} else if (result.action === "send_with_care") {
  // Save the user, but do not start a long onboarding sequence yet.
}

Keep the key in an environment variable on your server. Never put it in the page.

Where your judgment still matters

Be careful what you block. Never reject a visitor because of a risky result, since catch-all domains hide real people. Show a friendly message for do_not_send and let them correct a typo. Do not log or store the raw responses longer than you need them.

Start with your own key

Every template calls the SimpleVerifier API with your key. Create one, then run the template on a handful of rows. To check a whole list without any setup, upload it as a CSV.

Get your API key

Common questions

Does the widget need an API key?
No. It is free and runs in the browser against lists inside the script. Only the server-side mailbox check uses your key.
Does the widget check if the mailbox exists?
No. It catches typos, throwaway domains and role inboxes. The server call does the live mailbox check.
Which SimpleVerifier plan do I need?
Pro is $39/month with 10,000 API and MCP calls included, then $1.50 per 1,000. Cancel anytime. Each key can make 120 calls a minute.
What do valid, risky and invalid mean here?
The result has a status and an action. Action send means the mail server confirmed the mailbox. send_with_care is a catch-all, role inbox or provider that hides mailbox status. retry_later means the check could not finish. do_not_send means the address will bounce or is a throwaway. Catch-all addresses are never marked valid.

Related: Sign-up form widget · Sign-up protection recipes · API docs

All workflow templates · By SimpleVerifier Team

Clean your next list before it bounces

100 free email checks when you sign in with Google, no card. Then monthly plans from $9, or one flat price with fair use, never cut off.

100 free checks, no card Cancel anytime Secure payment by Stripe