Home / Integrations / Make
Validate Emails in Make Scenarios With ContactLint
Published 2026-10-18
This guide adds a ContactLint email check to a Make scenario with the HTTP Make a request module. A router sends each address down a reject, suggest or accept route. An error handler keeps the scenario running if ContactLint does not answer, so no lead is lost.
Where the check goes in Make
Put the check right after your trigger and before any module that creates a contact, adds a CRM record or sends an email. The trigger is usually a custom webhook that receives form posts, or a watch module from your form or CRM app.
Make runs on a server, so your secret key never reaches the browser. That makes this a real server-side check. If your form waits for a webhook response, you can return "Did you mean ...?" to the person. Otherwise, use the result to tag or hold the record.
Setup: the Make a request module
- Get a free secret key at /signup.
- Add the HTTP app's Make a request module after your trigger. Field names can differ slightly between module versions. Set:
- URL:
https://contactlint.com/v1/email/validate - Method:
POST - Headers: name
Authorization, valueBearer YOUR_SECRET_KEY - Body type: Raw, Content type: JSON (application/json)
- Request content: the JSON below, with the email mapped from your trigger
- Parse response: Yes
- Timeout (advanced settings):
3seconds
- URL:
{"email": "{{1.email}}"}Replace {{1.email}} with the mapped field from your trigger module. If addresses might contain quote characters, build the body with the JSON app's Create JSON module instead of typing it by hand.
The key is stored in the module's header settings. Anyone who can edit the scenario can see the header value, so limit who can edit it. Never paste the secret key into a form or page.
- Right-click the HTTP module and add an error handler with the Resume directive. Leave its output empty. A timeout or a non-2xx answer such as 401 or 402 then continues with no result, and the fallback route treats that as accept. This is how the scenario fails open.
Routing each verdict and did_you_mean
Add a Router after the HTTP module. Make runs every route whose filter passes, so the filters must not overlap. Map fields from the HTTP output, for example {{2.data.result.verdict}}.
- Reject: invalid. Filter:
result.verdictequal toinvalid. The domain has no MX or A record, or the address is malformed. - Suggest: typo. Filter:
result.verdictnot equal toinvalidANDresult.did_you_meanexists. The verdict isriskywith reasonpossible_typo. Reply "Did you mean {{2.data.result.did_you_mean}}?" or store the suggestion for review. - Reject: disposable. Filter:
result.verdictnot equal toinvalidANDresult.did_you_meandoes not exist ANDresult.disposableequal to true. - Accept. Set this route as the fallback route. It runs when no other route passes:
valid,unknown, reasonrole_address, and any bundle the error handler resumed.
The typo route comes before the disposable route on purpose. gmial.com is both a typo and on the disposable list, and the suggestion is the better answer. Role addresses like info@ are real, shared inboxes, so they are accepted. An unknown from a failed DNS lookup is not billed, so you can recheck it later.
If your trigger is a custom webhook and the form waits for a reply, end each route with a Webhook response module. Return an error status and message on the reject and suggest routes. If you only want to stop typos from being saved, remove the disposable route and let those addresses fall through to accept.
Testing it
Click Run once, then send test posts to your webhook URL:
curl -X POST https://hook.make.com/YOUR_WEBHOOK_ID \
-H "content-type: application/json" \
-d '{"email":"jane@gmial.com"}'Use the exact webhook URL Make shows you. Then check which route ran:
jane@gmial.com: suggest route, withdid_you_meanset to jane@gmail.com.x@mailinator.com: disposable route.jane@example.invalid: invalid route.- Fail open: change the header to a wrong key. The API returns 401, the error handler resumes, and the accept route should run. Put the real key back.
Limits
- ContactLint does not connect to mail servers. It cannot confirm that a mailbox exists or detect catch-all domains.
- Fail open is deliberate. A slow or failed check never blocks 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.
- For existing lists,
POST /v1/email/validate/batchtakes up to 50 addresses per request. See cleaning a CSV list. - To catch typos before submit, add the widget to your form and keep this scenario as the backstop.
Questions
Why do the router filters repeat the same conditions?
A Make router runs every route whose filter passes. Without the extra conditions, jane@gmial.com would match both the typo route and the disposable route. The repeated conditions make each address take exactly one route.
What does the Resume error handler do here?
It catches timeouts and error responses such as 401 or 402 from the HTTP module, and lets the bundle continue with no result. The fallback route then accepts the address, so the scenario fails open.
Does this send an email to the address?
No. ContactLint never opens an SMTP connection and never sends mail. It checks syntax, MX and A records, disposable domains, role addresses and typos.
Other integrations
- Next.js
- Express
- Django
- FastAPI
- Laravel
- Ruby on Rails
- Supabase
- Firebase Authentication
- WordPress
- Webflow
- Zapier
- n8n
Get a free API key. 100 checks per month, no card required. Or try a live check first.