SPF checker for all your domains

This free SPF checker reads the SPF record for up to 10 domains or subdomains at once, follows every include, and counts the DNS lookups against the limit of 10.

No signup, and nothing is stored.

By Rares Serban · Last updated October 24, 2026

What an SPF record does

An SPF record is a TXT record that starts with v=spf1 and lists the servers allowed to send mail for a hostname. Each hostname gets one. Receivers check it against the envelope sender (the Return-Path, also called MAIL FROM) and the server's HELO name, not the From line you see, as RFC 7208 sections 2.3 and 2.4 describe.

SPF is looked up per hostname, so updates.yourdomain.com needs its own record if mail goes out with that Return-Path, and the record at yourdomain.com does nothing for it. That's why this SPF record checker takes subdomains as well as domains. Our guide to SPF on a subdomain sets it up on a live domain.

How to read your SPF checker results

Each domain gets one verdict pill:

  • Valid (green): one SPF record, 7 or fewer DNS lookups, nothing to fix.
  • Valid, with a warning (amber): SPF works, but something needs a look, like 8 to 10 lookups, ?all or no all term, terms after all, an include listed twice, or an SPF record over 450 bytes.
  • SPF fails (red): receivers return a permanent error (permerror), from two SPF records, more than 10 lookups, more than 2 void lookups, a syntax error, a loop, or an include with no SPF record.
  • Any server passes (red): the record ends in +all, so every server on the internet passes SPF as you. SPF technically passes, which is the problem.
  • No SPF record (amber): no TXT record starting with v=spf1 at that name, or a name that doesn't exist.
  • Couldn't check (grey): DNS didn't answer in time. Try again in a minute.

Next to the pill you get the lookup meter ("7 of 10 DNS lookups", green up to 7, amber from 8 to 10, red past 10), the qualifier pill, and a one-line verdict that names the heaviest include. Open a domain to see the raw record, the include tree (every include and redirect with its own record, how many of the 10 lookups it uses, and how deep it sits) and each finding with its fix. Each SPF lookup reads live public DNS, so you see what receivers see right now.

The qualifier pill shows how the record ends (RFC 7208 section 4.6.2):

  • -all (fail): servers you haven't listed aren't allowed.
  • ~all (softfail): not allowed, but the domain isn't making a strong statement. Section 8.5 says receivers should not reject mail on softfail alone.
  • ?all (neutral): no opinion. A record with no all term ends with an implied ?all (section 4.7).
  • +all (pass): every server on the internet may send as you. Always red.

Our take: with DMARC at quarantine or reject, ~all and -all behave much the same for DMARC, because DMARC decides on SPF or DKIM passing and aligning.

The 10-lookup limit, and what counts

RFC 7208 section 4.6.4 caps the terms that make a receiver query DNS at 10 per SPF check, counted through every nested include. Past 10, receivers return permerror.

TermCosts a lookup?Note
includeYesPlus every lookup inside the record it points to
aYes
mxYesEach mx term may resolve no more than 10 MX hosts
ptrYesDon't use it (section 5.5)
existsYes
redirect=YesIgnored when the record has an all term
ip4, ip6No
allNo
exp=No

Separately, RFC 7208 recommends at most 2 void lookups: lookups that return no records, or a name that doesn't exist. Past 2, receivers return permerror as well.

Permerror means SPF doesn't pass for any of your mail, so DMARC rests on DKIM alone.

Common SPF problems, and the fix

Each of these is a check the tool runs:

  • Two SPF records. Every message gets permerror (section 4.5). Merge them into one record with every include and one all. v=spf1 include:_spf.google.com ~all and v=spf1 include:zohomail.com ~all become v=spf1 include:_spf.google.com include:zohomail.com ~all. The checker suggests the merged record with its lookup count, and our guide to merging Cloudflare's include with an existing record shows it on a live domain.
  • Over 10 lookups. Remove includes for services you no longer use, replace a and mx with the ip4 and ip6 addresses behind them, and drop ptr. Flattening (replacing includes with the IPs they resolve to) works too, but it goes stale when the sender changes IPs, so check it again after any change.
  • More than 2 void lookups. Usually an include for a service you left, whose record is gone. Delete it.
  • +all. Change it to ~all or -all.
  • No all term, or terms after all. Terms after all are never tested (section 5.1), so move them before it, and end the record with ~all or -all.
  • Record too long. Section 3.4 suggests keeping the name plus every TXT record at it under 450 bytes, so the DNS answer fits in one 512-byte UDP packet. Long records are split into 255-character strings in DNS (section 3.3), which is fine. The checker warns when the SPF record itself is over 450 bytes, and only adds a note when other TXT records, like site verification codes, push the total past it, since most receivers handle larger answers.

SPF includes for common senders

SenderIncludeLookups it costs
Google Workspaceinclude:_spf.google.com1
Microsoft 365include:spf.protection.outlook.com1
Zoho Mailinclude:zohomail.com (nests spf.zohomail.com)2
Cloudflare Email Routinginclude:_spf.mx.cloudflare.net1

The includes come from Google's SPF setup page and Microsoft's SPF guide, and the lookup counts were measured over public DNS on October 24, 2026. Senders can change what sits behind an include, so run your own domain through the checker for today's count.

Some senders don't need your root record at all. Postmark, and Mailyond, which sends through it, check SPF on a Return-Path subdomain that is a CNAME to the sender, so connecting a domain adds no lookup to your root SPF.

SPF across several domains

Every domain you send from needs its own SPF record, or a Return-Path that has one. It's normal for one domain to be fine and another to sit at 11 lookups after someone added a new tool, so paste them all in one go. If you're sending from several domains, run the list again after each new sender you add.

SPF passing isn't the whole story: DMARC also needs the passing domain to align with the From. Run the same domains through the DMARC checker, which checks the policy and alignment settings on the same domains.

FAQ

How do I check my SPF record?

Paste your domain in the box at the top of this page and click Check SPF records. To check by hand, run dig TXT yourdomain.com on macOS or Linux, or nslookup -type=txt yourdomain.com on Windows, and look for the line that starts with v=spf1. That shows the record, but not the includes inside it or how many lookups they use, which is what this checker adds.

What is the SPF 10 DNS lookup limit?

RFC 7208 caps the terms that make a receiver query DNS at 10 per SPF check, counted through every nested include. Go over and receivers return a permanent error (permerror), so SPF doesn't pass for any of your mail, even mail from servers you listed.

Which SPF terms count toward the 10 lookups?

include, a, mx, ptr and exists, plus the redirect= modifier. ip4, ip6 and all don't count, and neither does exp=. Every include also counts the lookups inside the record it points to, which is how a record with 4 includes can end up at 12.

What happens when SPF has too many lookups?

SPF returns permerror, which receivers treat as SPF not passing. DMARC can still pass if DKIM passes and aligns with your From domain, so mail often keeps flowing, which is why the problem can go unnoticed for months. Fix it by removing includes you no longer use or swapping a and mx for the ip4 and ip6 addresses behind them.

Can a domain have two SPF records?

No. If a name has more than one TXT record starting with v=spf1, receivers return permerror and SPF fails for every message. Merge them into one record with every include and a single all at the end. The checker suggests the merged record for you.

What is the difference between ~all and -all?

-all (fail) says servers you haven't listed aren't allowed to send as you. ~all (softfail) says they probably aren't, without a strong statement, and RFC 7208 says receivers shouldn't reject mail on softfail alone. If your DMARC policy is quarantine or reject, DMARC decides what happens to failing mail either way. Never use +all: it lets any server pass.

What is an SPF void lookup?

A lookup during the SPF check that comes back with no records, or for a name that doesn't exist. RFC 7208 recommends a limit of 2, and past it receivers return permerror. The usual cause is an include for a service you stopped using, whose record has since been deleted.

Does SPF check the From address?

No. SPF checks the envelope sender, also called the Return-Path or MAIL FROM, and the server's HELO name. Many sending services use their own Return-Path subdomain, so the SPF that matters is on that host, not your root domain. DMARC is what ties the result back to the From address you see.

Can I check multiple domains at once?

Yes, up to 10 domains or subdomains per run, one per line or separated by commas or spaces. Each one gets its own row with its lookup count, and you don't need an account.

Do you store the domains I check?

No. Each check runs live against public DNS (Cloudflare's resolver, with Google's as a fallback) and the result goes straight back to your browser. We don't save or log the domains, and our analytics only counts how many you checked, never which ones. If you share a link to your results, the domains sit after the # in the URL, which browsers don't send to our server.