ContactLintAPIMCPPricingFree toolsGet a key

Home / Catch Email Typos on Your Signup Form

Catch Email Typos on Your Signup Form

Published 2026-10-17

When someone types jane@gmial.com into your signup form, the account gets created, the welcome email never arrives, and the person usually assumes your product is broken. The ContactLint widget catches that moment. When the email field loses focus, it shows Did you mean jane@gmail.com? right under the field, and one click fixes the address.

What the widget does

It does not connect to mail servers, so it cannot confirm that a mailbox exists or detect catch-all domains. It is a pre-send check, not mailbox verification. See the comparison with mailbox verifiers if you need that.

Set it up in two steps

1. Create a publishable key restricted to your site's origin, using your secret key (get one free at /signup):

curl -X POST https://contactlint.com/v1/widget/keys \
  -H "Authorization: Bearer YOUR_SECRET_KEY" \
  -H "content-type: application/json" \
  -d '{"origins":["https://yoursite.com"],"daily_cap":200}'

The response contains a publishable_key that starts with cl_pub_. It only answers browser requests from the origins you listed.

2. Mark the email input and load the script:

<input type="email" name="email" data-contactlint>
<script src="https://contactlint.com/widget.js" data-key="cl_pub_..." defer></script>

That is all. Any input with the data-contactlint attribute gets a hint line below it, including inputs added to the page later. Using React, WordPress or a site builder? See framework and site builder setup.

Optional: act on the result

After each check the input fires a contactlint:result event with the result. You can use it to hold back submission for disposable or undeliverable addresses:

document.addEventListener('contactlint:result', function (e) {
  var r = e.detail; // { verdict, reason, did_you_mean, disposable, role_address }
  var bad = r.verdict === 'invalid' || r.disposable;
  e.target.setCustomValidity(bad ? 'Please use a permanent, working email address.' : '');
});

The verdict is one of valid, risky, invalid or unknown. A typo suggestion makes the verdict risky with reason possible_typo.

What it costs

Each check uses one check from your secret key's balance: 100 free checks per month, then credit packs from $9 for 5,000 (see pricing). The widget only checks when the field loses focus and the value has changed, so a visitor who fills the form once uses one check. A check that ends as unknown because our DNS lookup failed is not billed.

Limits that protect your balance

The publishable key is visible in your page source, and the Origin header can be forged outside a browser, so set the daily cap to what you are willing to spend in a day.

ContactLint widget or a client-side library?

Choose a client-side library such as the open-source Mailcheck.js if you only want typo suggestions and want nothing to leave the browser. It compares the domain against a built-in list and costs nothing, but it does not look up DNS or check disposable domains.

Choose the ContactLint widget if you also want to catch domains that cannot receive mail and disposable addresses at signup, and you are fine sending the typed address to an API for checking.

Choose a mailbox verifier if you need to know whether a specific mailbox exists before you send. ContactLint does not do that.

Privacy

Addresses typed into the field are sent to contactlint.com for checking. Mention this in your privacy notice. The browser only receives the verdict, the reason, the typo suggestion and two flags (disposable and role address). It never sees MX records or your balance.

Get a free API key. 100 checks per month, no card required.