Skip to content
fixyour.page

SPF Checker

Validate your SPF record and see the whole include tree.

Your data stays in your browser
Enter a domain. We'll follow every include and count the lookups. Queries go straight from your browser to Cloudflare's public DNS resolver, never to our servers.

How to Check an SPF Record

Enter your domain and hit Check. The tool fetches your SPF record over DNS-over-HTTPS, straight from your browser, then follows every include and redirect it references. You get the full include tree, a running count against the 10-lookup limit, your effective policy, and a checklist of everything receivers would trip on.

The lookup counter is the part most SPF checkers get wrong or skip. We count every include, a, mx, ptr, exists, and redirect in the whole tree, the same way receivers budget them. If you're at 9 of 10, you'll know before the next marketing tool pushes you over.

How the 10-Lookup Limit Sneaks Up on You

Nobody writes an SPF record with 11 lookups on purpose. It accumulates. Google Workspace costs 1 to 3. Your email marketing platform adds one or two more. Then the CRM, the help desk, the billing system, the survey tool someone in ops signed up for in 2023. Each one says "just add include:spf.us.com to your record" and each one quietly spends your budget.

When you cross 10, nothing warns you. Mail keeps sending. But receivers evaluating your record hit the limit and return permerror, DMARC stops getting an SPF pass, and deliverability erodes until someone finally checks. The fix is pruning: drop includes for services you've stopped using, and check whether your ESP can sign with DKIM on a dedicated domain instead of piggybacking on your root SPF.

Reading Your Include Tree

The tree shows every domain your SPF record pulls in, nested the way receivers resolve them. The @N marker on each branch shows which lookup number that fetch was, so you can see exactly which include pushed you near the limit. Red badges mean a branch is broken: NXDOMAIN means the target domain doesn't exist, NO SPF RECORD means it exists but publishes nothing useful, and LOOP means a record includes itself somewhere down the chain. Any of those is a permerror waiting for a receiver to find it.

SPF is one third of email authentication. Check your DMARC policy with the DMARC Checker, verify your signing keys with the DKIM Checker, or build all three records with the SPF, DKIM & DMARC Generator.

What is the SPF 10-lookup limit? +
RFC 7208 caps SPF evaluation at 10 DNS lookups. Every include, a, mx, ptr, exists, and redirect in your record costs one, including the ones buried inside your includes' includes. Go over and receivers return permerror, which means your SPF stops working entirely. Most domains blow the limit by stacking ESP includes over the years without ever pruning. This tool counts every lookup in the full tree so you can see exactly where they go.
What is the difference between ~all and -all? +
~all (softfail) tells receivers "mail from other servers probably isn't mine, mark it suspicious." -all (hardfail) says "reject it outright." In practice, most senders use ~all and let DMARC handle enforcement, because a too-eager -all can bounce legitimate forwarded mail. If you run DMARC with p=quarantine or p=reject, ~all is the standard choice.
Why do I have too many DNS lookups? +
Includes nest. include:_spf.google.com costs one lookup, but the record it points to contains more includes that each cost another. Stack Google Workspace, an ESP, a CRM, and a help desk and you're at 8 or 9 before anyone notices. Fixes: remove services you no longer use, use your ESP's dedicated sending domain instead of a root include, or use an SPF flattening service that resolves includes to raw IPs (and keeps them updated, because IPs change).
Can I have two SPF records? +
No. Two v=spf1 records at the same domain is a permerror, and receivers treat it as if you had none at all (RFC 7208 §4.5). It usually happens when someone adds a new ESP's record without noticing the old one. Merge them into a single record: one v=spf1, all your includes and ip4/ip6 blocks, one all at the end.