SPF Validator live
Looks up and parses the SPF record for a domain, breaks every mechanism into a readable list, and flags common mistakes (too many lookups, missing all, etc.).
// response appears here
| domain* | text | domain whose SPF record to check | github.com |
| ip | text | IPv4/IPv6 to evaluate against the record (optional) | 192.30.252.1 |
curl 'https://spf.benjamin-dreier.de/v1/check?domain=github.com&ip=192.30.252.1'
{
"domain": "github.com",
"found": true,
"record": "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com ... ~all",
"terms": [
{ "raw": "ip4:192.30.252.0/22", "qualifier": "+", "kind": "ip4", "value": "192.30.252.0/22" },
{ "raw": "include:spf.protection.outlook.com", "qualifier": "+", "kind": "include", "value": "spf.protection.outlook.com" }
],
"warnings": []
}
OpenAPI spec → — drop it into your own client or codegen.
The SPF Checker looks up a domain's v=spf1 record, parses every mechanism into a readable list, and flags the common mistakes that quietly break email deliverability — things like blowing past the 10-DNS-lookup limit or forgetting an all mechanism. Pass an optional IP and it evaluates whether that sender would pass.
Reach for it when mail keeps landing in spam for no obvious reason, when you're adding a new sending service (Google Workspace, Outlook, SendGrid, Mailchimp…) to an existing record, or when you just want to see what a domain actually publishes. It reads and lints SPF — it never touches your DNS.
| ip4 / ip6 | an address or CIDR range allowed to send |
| include | pull in another domain's SPF (counts toward the 10-lookup limit) |
| a / mx | allow the domain's own A / MX hosts |
| all | the catch-all at the end of the record |
| + - ~ ? | qualifier: pass · fail (-all) · softfail (~all) · neutral |
| github.com | a long record chaining many includes |
| google.com | a minimal record: one include plus ~all |
| microsoft.com | a large multi-include record |
| domain=example.com&ip=1.2.3.4 | add an IP to get a pass/fail evaluation |
| a domain with no SPF | returns found: false with an explanatory error |