Validate signup email addresses with DNS checks and Data Tables

Go to Workflow
0 views
Built by Daniel Shashko Daniel Shashko
Created on September 01, 2026

Description

Quick overview
This workflow exposes a webhook that evaluates an email address at signup using Cloudflare DNS-over-HTTPS lookups, RDAP domain registration data, and a public disposable-domain blocklist, then returns an accept/review/reject verdict with reasons and logs the check to an n8n Data Table.

How it works
Receives a POST webhook request containing an email address (from JSON body, form fields, or a query parameter) and normalizes it for checks.
Queries Cloudflare DNS-over-HTTPS for MX, A, DMARC (TXT), and SPF (TXT) records, fetches RDAP domain registration/expiry data from rdap.org, and downloads the disposable-email domain blocklist from GitHub.
Interprets the DNS and RDAP responses to detect conditions like NXDOMAIN, null MX (RFC 7505), mail-to-A fallback, mail provider hints, disposable domains, and domain age.
Generates a typo suggestion for common mistyped domains (for example, gmial.com → gmail.com) using an edit-distance check.
Looks up how many times the canonicalized address has been checked before in the n8n Data Table and combines this with role-address and policy checks.
Returns a JSON response with the accept/review/reject verdict, reasons, and key signals, and inserts a log row for the check into the Data Table.

Setup
Create an n8n Data Table named email_checks with columns address_key, email, domain, verdict, reasons, and checked_on.
Activate the workflow and use the production webhook URL (POST /check-email) from your form or app.
Adjust the in-workflow settings for role prefixes, free providers, and thresholds (repeat checks and minimum domain age) to match your signup policy.

Requirements
No credentials at all. Every lookup is a public endpoint - Cloudflare DNS over HTTPS, RDAP and a public blocklist on GitHub.

Customization
role_addresses in Settings decides whether info@ and sales@ are a reject or a review, and min_domain_age_days sets how new a domain has to be before it is worth a second look.

Nodes Used (2)

Code
n8n-nodes-base.code
HTTP Request
n8n-nodes-base.httpRequest