Home / Integrations / Zapier
Validate Emails in Zapier Zaps With ContactLint
Published 2026-10-18
This guide adds a ContactLint email check to a Zap, between the trigger and the step that saves the contact. Code by Zapier is the recommended option because it can time out after 3 seconds and fail open. A no-code Webhooks by Zapier option is also covered, with its trade-off.
Where the check goes in Zapier
Put the check right after your trigger, such as a new form entry or a new lead, and before any step that creates a contact, adds a subscriber or sends an email. Zapier runs on a server, so your secret key never reaches the browser.
Zapier runs after the form has been submitted, so it cannot show a hint on the form. It decides what happens to the record: save it, hold it, or ask the person to fix it. To show "Did you mean ...?" on the form itself, add the widget and keep this Zap as the backstop.
Option 1: Code by Zapier (recommended)
- Get a free secret key at /signup.
- Add an action step: Code by Zapier, event Run JavaScript.
- Under Input Data, add
emailmapped to the email field from your trigger, andkeyset to your secret key. Zapier has no environment variables for code steps, so anyone who can edit the Zap can see this value. Limit who can edit it. - Paste this code:
const email = (inputData.email || '').trim();
const out = { action: 'accept', message: '', suggestion: '', verdict: '', reason: '' };
if (!email) return out;
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 3000);
try {
const res = await fetch('https://contactlint.com/v1/email/validate', {
method: 'POST',
headers: { 'Authorization': 'Bearer ' + inputData.key, 'content-type': 'application/json' },
body: JSON.stringify({ email }),
signal: controller.signal,
});
if (res.ok) {
const { result } = await res.json();
out.verdict = result.verdict;
out.reason = result.reason || '';
if (result.verdict === 'invalid') {
out.action = 'reject';
out.message = 'That email address cannot receive mail.';
} else if (result.did_you_mean) {
out.action = 'suggest';
out.suggestion = result.did_you_mean;
out.message = 'Did you mean ' + result.did_you_mean + '?';
} else if (result.disposable) {
out.action = 'reject';
out.message = 'Please use a permanent email address.';
}
}
// Non-200 (401, 402, 429): action stays 'accept' (fail open)
} catch (e) {
// Timeout or network error: fail open
} finally {
clearTimeout(timer);
}
return out;The step returns flat fields (action, message, suggestion, verdict, reason) that later steps can map directly.
Option 2: Webhooks by Zapier POST
If you prefer no code, add an action step: Webhooks by Zapier, event POST. Webhooks by Zapier may depend on your plan, so check your plan. Set:
- URL:
https://contactlint.com/v1/email/validate - Payload Type:
json - Data: key
email, value mapped from your trigger - Headers: key
Authorization, valueBearer YOUR_SECRET_KEY
The response fields, including the result's verdict, reason, did_you_mean and disposable, become available to later steps. The trade-off: this step has no 3 second timeout setting, and an error response such as 402 makes the step fail. That stops the Zap run unless you have set up error handling, which may also depend on your plan. In other words, it does not fail open by default. For signups, use Code by Zapier.
Handling each verdict and did_you_mean
Branch on the action field with Paths by Zapier (check your plan) or with Filter by Zapier steps.
- reject, verdict
invalid: the domain has no MX or A record, or the address is malformed. Skip the save step, or save the record with a tag for review. - suggest, verdict
riskywith reasonpossible_typo:suggestionholds the fix fromdid_you_mean. Store it in a CRM note, or flag the record for someone to confirm. Do not send mail to the original address, since it probably bounces. The code checksdid_you_meanbeforedisposablebecause gmial.com is both a typo and on the disposable list. - reject, reason
disposable: skip or tag it if you need a permanent address. Edit the code to accept it if you do not. - accept:
valid,unknown, reasonrole_address(info@, sales@), and any failed or timed-out check. Continue to your save step.
Testing it
In the Code by Zapier step, temporarily set the email input to each test address and click Test step:
jane@gmial.com: actionsuggest, suggestion jane@gmail.com, verdictrisky, reasonpossible_typo.x@mailinator.com: actionreject, verdictrisky, reasondisposable.jane@example.invalid: actionreject, verdictinvalid.- Fail open: set the key input to a wrong value. The API returns 401, and the action should be
accept. Put the real key back.
Then map the email back to your trigger field and turn the Zap on.
Limits
- ContactLint does not connect to mail servers. It cannot confirm that a mailbox exists or detect catch-all domains.
- Fail open is deliberate in the code option. A slow or failed check never drops a lead.
- A key is limited to 60 requests per minute. A 402 means the 100 free monthly checks are used and no credits remain. Credit packs start at $9 for 5,000 checks.
- Each address checked uses one check. An unknown caused by a failed DNS lookup is not billed.
- For cleaning an existing list, see the CSV guide. For the full API, see server-side validation.
Questions
Should I use Code by Zapier or Webhooks by Zapier?
Use Code by Zapier for signups and leads. It times out after 3 seconds and accepts the address if ContactLint does not answer. A Webhooks by Zapier POST has no timeout setting, and an error response stops the Zap run unless you have error handling set up.
Can Zapier show a Did you mean message on my form?
No. Zapier runs after the form is submitted. Add the ContactLint widget with a cl_pub_ publishable key to show the hint on the form, and keep the Zap as the server-side backstop.
Is it safe to put my secret key in the Zap?
It stays on Zapier's servers and never reaches the browser, but anyone who can edit the Zap can see it. Limit edit access to people you trust with the key.
Other integrations
- Next.js
- Express
- Django
- FastAPI
- Laravel
- Ruby on Rails
- Supabase
- Firebase Authentication
- WordPress
- Webflow
- Make
- n8n
Get a free API key. 100 checks per month, no card required. Or try a live check first.