Check your domain against the SPF record lookup limit

Type a domain to count its SPF record lookups toward the limit, see which include costs the most, and know what to remove.

Try:

Only the domain is sent, to Cloudflare's public DNS resolver. Nothing is stored.

How the 10-lookup limit works

The SPF lookup limit of 10

At most 10 DNS lookups

Receivers count the terms that need a DNS lookup, across the record and every record it includes. include, a, mx, ptr, exists and redirect count. all, ip4, ip6 and exp do not. Past 10, the check returns permerror and SPF fails. Google also says a record can have up to 10 include tags.

Counts
include, a, mx, ptr, exists, redirect
Does not count
all, ip4, ip6, exp

At most 2 void lookups

A void lookup is a lookup that finds nothing, either an empty answer or a name that does not exist. Receivers should stop after two of them, with permerror. A stale include for a service you left is the usual cause.

An mx term may name at most 10 mail hosts

Checking one mx term must not look up more than 10 address records, so a domain with more than 10 MX hosts breaks an mx term that points at it.

Reading an SPF record

One SPF record per domain

A domain may publish only one SPF record, the TXT record that starts with v=spf1. With two or more, receivers stop with permerror and SPF fails for every message. Merge every sender into one record.

What the sign before each term means

Each mechanism can start with a qualifier. With none, it is +. The qualifier of the first mechanism that matches the sending server is the result.

+ (or no sign)
pass. The server may send for the domain.
-
fail. The server may not send for the domain.
~
softfail. The server is probably not allowed.
?
neutral. The domain says nothing either way.

The all at the end

all matches every server, so it sets what happens to servers the record did not list. -all fails them and ~all soft fails them. +all (or a bare all) lets any server on the internet pass, and ?all says nothing. Terms after all are never checked. A record with no all and no redirect ends as neutral.

include and redirect

include checks another domain's SPF record and matches when that record passes. If the included domain has no SPF record, the whole check ends in permerror. redirect hands the check to another domain's record, and is ignored when the record has an all anywhere.

Reading a DMARC record

Where the DMARC record lives

The DMARC record is a TXT record at _dmarc under the domain, for example _dmarc.example.com. It starts with v=DMARC1. If that name has no record, receivers look at each parent name in turn, one label at a time. Two or more DMARC records at one name are all discarded. RFC 9989 replaced RFC 7489 as the DMARC standard in May 2026.

What p=none means

p=none states no preference about mail that fails DMARC. It still turns on the reports when rua is set. Gmail accepts p=none from senders of more than 5,000 messages a day to Gmail accounts, who must publish a DMARC record.

DMARC tags

v Version
Must be DMARC1 and must be the first tag. Otherwise receivers ignore the whole record.
p Policy
What the domain asks receivers to do with mail that fails DMARC. Without it, receivers treat the record as p=none. none: No preference is stated. quarantine: Failing mail is suspicious. reject: Failing mail is not valid use of the domain.
sp Subdomain policy
The policy for subdomains that exist. When it is missing, p applies to subdomains too. Default: same as p.
np Non-existent subdomain policy
The policy for subdomains that do not exist in DNS. When it is missing, sp applies, or p when sp is missing too. Default: same as sp, or p.
t Test mode
Says whether the domain is testing its policy. It does not change the reports. Default: n. y: Testing. Receivers apply one level below the stated policy. n: Apply the policy as stated.
psd Public suffix flag
Says whether the domain is a public suffix, a name under which others register their domains. Default: u. y: The domain is a public suffix. n: Not a public suffix. The domain is the organizational domain for itself and its subdomains. u: Not a public suffix. The lookup up the DNS tree decides the organizational domain.
rua Aggregate reports
Where receivers send summary reports, as a comma-separated list of addresses. Receivers only have to support mailto addresses. Without it, receivers send no aggregate reports. Default: no reports.
ruf Failure reports
Where receivers send a report about each failing message, as a comma-separated list of addresses. Without it, receivers send no failure reports. Default: no reports.
adkim DKIM alignment
How closely the DKIM signing domain must match the From domain. Default: r. r: Relaxed. The same organizational domain is enough. s: Strict. The exact same name.
aspf SPF alignment
How closely the SPF domain (the envelope sender) must match the From domain. Default: r. r: Relaxed. The same organizational domain is enough. s: Strict. The exact same name.
fo Failure report options
When to send a failure report. Ignored without ruf. Default: 0. 0: When every check fails to give an aligned pass. 1: When any check gives something other than an aligned pass. d: When a DKIM signature fails. s: When SPF fails.
pct Percentage (retired)
Retired by RFC 9989 and marked historic. Under RFC 7489 it was the share of failing mail the policy applied to. t=y is meant to work like pct=0, and t=n like pct=100.
rf Failure report format (retired)
Retired by RFC 9989 and marked historic.
ri Report interval (retired)
Retired by RFC 9989 and marked historic.

Reading MX records

MX preference

Each MX record has a preference number. Senders try the lowest number first.

No MX record

With no MX record, senders deliver to the domain's own address record, as if it were an MX with preference 0.

Null MX

A single MX record with preference 0 and the host . says the domain accepts no email. Mail to it fails at once.

Mail hosts and gateways this tool recognises (11)
Google WorkspaceMail host
Google's business mail. The MX value is smtp.google.com with priority 1. Domains set up before 2023 may have older values that start with aspmx, which still work.
Microsoft 365 (Exchange Online)Mail host
Microsoft's business mail. The MX value is your MX token followed by .mail.protection.outlook.com. Microsoft is moving these hosts to subdomains under mx.microsoft, for domains that turn on DNSSEC and for part of new domains from July 1, 2026.
Zoho MailMail host
Zoho's mail service. The MX values are mx.zoho.com (10), mx2.zoho.com (20) and mx3.zoho.com (50). The ending after zoho changes with the data center that holds the account.
FastmailMail host
Fastmail's mail service. The MX values are in1-smtp.messagingengine.com (10) and in2-smtp.messagingengine.com (20).
Proton MailMail host
Proton's mail service. The MX values are mail.protonmail.ch (10) and mailsec.protonmail.ch (20).
iCloud Mail (custom domain)Mail host
Apple's mail service for a custom domain. The MX values are mx01.mail.icloud.com and mx02.mail.icloud.com, both priority 10.
Mailgun (inbound routes)Mail host
Mailgun receives mail for a domain that uses its inbound routes. The MX values are mxa.mailgun.org and mxb.mailgun.org, both priority 10.
Sophos EmailSecurity gateway
A mail security gateway. Mail reaches it first and it passes clean mail on. Its MX hosts end in prod.hydra.sophos.com (United States, Germany, Ireland) or in an eml100 subdomain of ctr.sophos.com (Canada, Australia, Japan, India, Brazil, UAE).
Cisco Secure Email Cloud GatewaySecurity gateway
A mail security gateway. Its MX hosts are named for the customer's allocation under iphmx.com, such as mx1.hc1234-49.iphmx.com.
Barracuda Email Gateway DefenseSecurity gateway
A mail security gateway. Its MX hosts end in ess.barracudanetworks.com.
Trend Micro Email SecuritySecurity gateway
A mail security gateway. Its MX hosts start with a company identifier and end in a regional name such as in.tmes.trendmicro.com, in.tmes.trendmicro.eu or in.tmems-jp.trendmicro.com.
SPF includes this tool recognises (15)
Google Workspace
Google Workspace's SPF value is v=spf1 include:_spf.google.com ~all.
Microsoft 365
Microsoft 365's SPF value is v=spf1 include:spf.protection.outlook.com -all.
Zoho Mail
Zoho Mail's SPF value is v=spf1 include:zohomail.com -all. Zoho suggests include:one.zoho.com when you use several Zoho services.
Fastmail
Fastmail's SPF value is v=spf1 include:spf.messagingengine.com ?all.
Proton Mail
Proton's SPF example includes _spf.protonmail.ch.
iCloud Mail (custom domain)
iCloud Mail's SPF value for a custom domain is v=spf1 include:icloud.com ~all.
Amazon SES
Amazon SES asks for v=spf1 include:amazonses.com ~all on a custom MAIL FROM domain, a subdomain used for bounces.
SendGrid
Twilio's sending service. Its SPF example is v=spf1 include:sendgrid.net -all.
Mailgun
Mailgun's SPF value is v=spf1 include:mailgun.org ~all.
Postmark
Postmark's include is spf.mtasv.net. Postmark says it is no longer needed in your own record, because its custom Return-Path covers SPF.
HubSpot
HubSpot's SPF includes are shared.hubspot.com, or an account-specific name under hubspotemail.net such as 123456.spf03.hubspotemail.net.
Zendesk
Zendesk's SPF value is v=spf1 include:mail.zendesk.com -all.
Mailchimp
Mailchimp sends from servers whose names contain mcsv.net. Microsoft's SPF example for a domain that sends with Mailchimp includes servers.mcsv.net.
Sophos Email
Sophos gives a regional SPF domain, such as _spf_uswest2.prod.hydra.sophos.com. It warns that the older _spf.prod.hydra.sophos.com can cause the SPF error too many DNS lookups.
Cisco Secure Email Cloud Gateway
Cisco's SPF uses an exists term with a macro under the allocation's iphmx.com name, such as exists:%{i}.spf.hc1234-49.iphmx.com.
Verification records this tool recognises (7)
Google (Search Console or Google Workspace)
Google's verification record looks like google-site-verification= followed by a code.
Microsoft 365
Microsoft 365's verification record looks like MS=ms followed by digits.
Zoho Mail
Zoho Mail's verification record looks like zoho-verification= followed by a code ending in zmverify.zoho.
Proton Mail
Proton's verification record looks like protonmail-verification= followed by a code.
Apple Business
Apple's verification record looks like apple-domain-verification= followed by a code.
Webex (Control Hub)
Webex checks a cisco-ci-domain-verification entry in the domain's TXT records.
Yandex Webmaster
Yandex's verification record looks like yandex-verification followed by a code.
Photo of Utku Zihnioglu

By

ยท CEO & co-founder

Published Nov 11, 2026

Shorter page: the tool first, the answer in a few lines.

The SPF record lookup limit caps how many DNS lookups a receiver makes while checking your SPF record, and the count runs through every record your includes point at. Go over it and the check ends in permerror, so SPF fails for every message from the domain. Type your domain above to see the count the way a receiver makes it.

Only the domain is sent, to Cloudflare's public DNS resolver, and nothing is stored.

What counts toward the limit

The include, a, mx, ptr and exists terms and the redirect modifier each cost a lookup, wherever they sit in the chain. The all, ip4 and ip6 terms cost nothing, so IP ranges never move the count.

Void lookups, the ones that come back empty, have a smaller limit of their own. An include for a service you left is the usual cause. Both limits come from RFC 7208, section 4.6.4.

In the result, read the lookups inside each include. One sending service that splits its servers across several records can be most of your count.

Ways back under the limit

Delete includes for services you stopped using, and check each service's setup page for includes it no longer asks for. Replace a or mx terms for your own servers with ip4 or ip6.

Move a sending service to a subdomain as its envelope sender. That subdomain has its own record and its own count, and under DMARC's relaxed alignment it still lines up with your From address.

Moving includes into a second record of your own does not help, because the count follows the include. Flattening, copying a service's IP addresses into your record, works but goes stale when the service changes servers, so leave it for last.

Then check the domain again, and send a test message through the email header analyzer. If you send from several domains, check each one.

SPF record lookup limit: common questions

Why did my SPF lookup count go up when I did not change my record?

Because each include points at a record the sending service owns. When a service adds a layer to its own record, your count rises with it, so check the domain again whenever a service changes its sending setup.

Does a redirect count toward the SPF lookup limit?

Only when it is used. A record that also has an all term ignores its redirect, so the redirect costs nothing there. Without an all term, the redirect costs a lookup, and every lookup in the record it points at counts too.

Does an mx term have a limit of its own?

Yes. RFC 7208 caps how many mail hosts an mx term may return. Point one at a domain with too many MX hosts and that term alone breaks the check, however low your lookup count is.

Why are exists, ptr and macro terms counted but not followed?

Their answer depends on the server sending each message, so DNS alone cannot settle them. They still cost a lookup. RFC 7208 also says ptr should not be published, so remove any ptr term you find.

About this article

Photo of Utku Zihnioglu

Utku Zihnioglu

CEO & co-founder

Serial entrepreneur who built infrastructure companies handling billions of requests. Now leads engineering at Oneprofile, which finds the people worth talking to, researches each one, and follows up until they reply.

Drafted with AI from our product docs and code. Utku Zihnioglu answers for what it says.

Check your domain before the first send

A record under the limit fixes authentication, so verify the addresses on your list in Oneprofile next.

Free plan: 200 credits a month, 3 integrations, no card

Check your domain before the first send

A record under the limit fixes authentication, so verify the addresses on your list in Oneprofile next.

Free plan: 200 credits a month, 3 integrations, no card