GET/api/v2/spf

SPF check API

A domain's SPF record walked like a receiver walks it: the lookup bill against RFC 7208's limit of 10, void lookups, every include expanded, the senders it authorises, and with `ip` the check_host result for that address.

GEThttps://dnsrobot.netBase URL/api/v2Version/spfEndpoint?domain=&ip=&helo=&sender=Parameters
200 OKRecorded 2026-10-25. Send it to run the request live.
{
  "query": {
    "domain": "github.com",
    "ip": null,
    "helo": null,
    "sender": null
  },
  "verdict": "valid_no_lookups_left",
  "status": "ok",
  "result": "softfail",
  "stoppedBy": null,
  "record": "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com include:_netblocks2.google.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net include:mktomail.com include:sendgrid.net ip4:62.253.227.114 ip4:166.78.69.169 ip4:166.78.69.170 ip4:166.78.71.131 ~all",
  "records": 1,
  "ttl": 300,
  "all": "~",
  "allVia": null,
  "lookups": {
    "count": 10,
    "limit": 10,
    "atLeast": false
  },
  "voidLookups": {
    "count": 1,
    "limit": 2,
    "names": [
      {
        "name": "192.0.2.1._spf.mta.salesforce.com",
        "type": "A",
        "rcode": "NXDOMAIN",
        "term": "exists:%{i}._spf.mta.salesforce.com",
        "record": "_spf.salesforce.com"
      }
    ]
  },
  "tree": [
    {
      "name": "github.com",
      "via": "root",
      "parent": null,
      "depth": 0,
      "record": "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com include:_netblocks2.google.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net include:mktomail.com include:sendgrid.net ip4:62.253.227.114 ip4:166.78.69.169 ip4:166.78.69.170 ip4:166.78.71.131 ~all",
      "ttl": 300,
      "lookups": 10,
      "error": null,
      "terms": [
        {
          "term": "ip4:192.30.252.0/22",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1024,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:spf.protection.outlook.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "spf.protection.outlook.com",
          "lookup": 1,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:_netblocks.google.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "_netblocks.google.com",
          "lookup": 2,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:_netblocks2.google.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "_netblocks2.google.com",
          "lookup": 3,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:mail.zendesk.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "mail.zendesk.com",
          "lookup": 4,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:_spf.salesforce.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "_spf.salesforce.com",
          "lookup": 5,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:servers.mcsv.net",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "servers.mcsv.net",
          "lookup": 7,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:mktomail.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "mktomail.com",
          "lookup": 8,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:sendgrid.net",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "sendgrid.net",
          "lookup": 9,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:62.253.227.114",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:166.78.69.169",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:166.78.69.170",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:166.78.71.131",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "spf.protection.outlook.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:40.92.0.0/15 ip4:40.107.0.0/16 ip4:52.100.0.0/15 ip4:52.102.0.0/16 ip4:52.103.0.0/17 ip4:104.47.0.0/17 ip6:2a01:111:f400::/48 ip6:2a01:111:f403::/49 ip6:2a01:111:f403:8000::/51 ip6:2a01:111:f403:c000::/51 ip6:2a01:111:f403:f000::/52 -all",
      "ttl": 232,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:40.92.0.0/15",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 131072,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:40.107.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:52.100.0.0/15",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 131072,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:52.102.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:52.103.0.0/17",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 32768,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:104.47.0.0/17",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 32768,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2a01:111:f400::/48",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2a01:111:f403::/49",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2a01:111:f403:8000::/51",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2a01:111:f403:c000::/51",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2a01:111:f403:f000::/52",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "-all",
          "kind": "mechanism",
          "qualifier": "-",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "_netblocks.google.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:74.125.0.0/16 ip4:209.85.128.0/17 ~all",
      "ttl": 300,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:74.125.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:209.85.128.0/17",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 32768,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "_netblocks2.google.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all",
      "ttl": 300,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip6:2001:4860:4000::/36",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2404:6800:4000::/36",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2607:f8b0:4000::/36",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2800:3f0:4000::/36",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2a00:1450:4000::/36",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2c0f:fb50:4000::/36",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "mail.zendesk.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:103.151.192.0/23 ip4:185.12.80.0/22 ip4:188.172.128.0/20 ip4:192.161.144.0/20 ip4:216.198.0.0/18 ~all",
      "ttl": 3513,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:103.151.192.0/23",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 512,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:185.12.80.0/22",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1024,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:188.172.128.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:192.161.144.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:216.198.0.0/18",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 16384,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "_spf.salesforce.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 exists:%{i}._spf.mta.salesforce.com -all",
      "ttl": 3557,
      "lookups": 1,
      "error": null,
      "terms": [
        {
          "term": "exists:%{i}._spf.mta.salesforce.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "exists",
          "target": "192.0.2.1._spf.mta.salesforce.com",
          "lookup": 6,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "-all",
          "kind": "mechanism",
          "qualifier": "-",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "servers.mcsv.net",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:205.201.128.0/20 ip4:198.2.128.0/18 ip4:148.105.0.0/16 -all",
      "ttl": 595,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:205.201.128.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:198.2.128.0/18",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 16384,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:148.105.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "-all",
          "kind": "mechanism",
          "qualifier": "-",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "mktomail.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:199.15.212.0/22 ip4:72.3.185.0/24 ip4:72.32.154.0/24 ip4:72.32.217.0/24 ip4:72.32.243.0/24 ip4:94.236.119.0/26 ip4:37.188.97.188/32 ip4:185.28.196.0/22 ip4:192.28.128.0/18 ip4:103.237.104.0/22 ip4:130.248.172.0/24 ip4:130.248.173.0/24 ~all",
      "ttl": 836,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:199.15.212.0/22",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1024,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:72.3.185.0/24",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 256,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:72.32.154.0/24",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 256,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:72.32.217.0/24",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 256,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:72.32.243.0/24",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 256,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:94.236.119.0/26",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 64,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:37.188.97.188/32",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:185.28.196.0/22",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1024,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:192.28.128.0/18",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 16384,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:103.237.104.0/22",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1024,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:130.248.172.0/24",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 256,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:130.248.173.0/24",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 256,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "sendgrid.net",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:167.89.0.0/17 ip4:208.117.48.0/20 ip4:50.31.32.0/19 ip4:198.37.144.0/20 ip4:198.21.0.0/21 ip4:192.254.112.0/20 ip4:168.245.0.0/17 ip4:149.72.0.0/16 ip4:159.183.0.0/16 ip4:134.128.64.0/18 ip4:159.26.176.0/20 include:ab.sendgrid.net ~all",
      "ttl": 319,
      "lookups": 1,
      "error": null,
      "terms": [
        {
          "term": "ip4:167.89.0.0/17",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 32768,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:208.117.48.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:50.31.32.0/19",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 8192,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:198.37.144.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:198.21.0.0/21",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 2048,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:192.254.112.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:168.245.0.0/17",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 32768,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:149.72.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:159.183.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:134.128.64.0/18",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 16384,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:159.26.176.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:ab.sendgrid.net",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "ab.sendgrid.net",
          "lookup": 10,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    {
      "name": "ab.sendgrid.net",
      "via": "include",
      "parent": "sendgrid.net",
      "depth": 2,
      "record": "v=spf1 ip4:223.165.113.0/24 ip4:223.165.115.0/24 ip4:223.165.118.0/23 ip4:223.165.120.0/23 ~all",
      "ttl": 1356,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:223.165.113.0/24",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 256,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:223.165.115.0/24",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 256,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:223.165.118.0/23",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 512,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:223.165.120.0/23",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 512,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    }
  ],
  "senders": {
    "ipv4Ranges": 48,
    "ipv6Ranges": 11,
    "ipv4Addresses": 932421,
    "perIpTerms": 1,
    "records": [
      {
        "record": "github.com",
        "ipv4": [
          "192.30.252.0/22",
          "62.253.227.114/32",
          "166.78.69.169/32",
          "166.78.69.170/32",
          "166.78.71.131/32"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "spf.protection.outlook.com",
        "ipv4": [
          "40.92.0.0/15",
          "40.107.0.0/16",
          "52.100.0.0/15",
          "52.102.0.0/16",
          "52.103.0.0/17",
          "104.47.0.0/17"
        ],
        "ipv6": [
          "2a01:111:f400::/48",
          "2a01:111:f403::/49",
          "2a01:111:f403:8000::/51",
          "2a01:111:f403:c000::/51",
          "2a01:111:f403:f000::/52"
        ],
        "other": [],
        "perIp": []
      },
      {
        "record": "_netblocks.google.com",
        "ipv4": [
          "74.125.0.0/16",
          "209.85.128.0/17"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "_netblocks2.google.com",
        "ipv4": [],
        "ipv6": [
          "2001:4860:4000::/36",
          "2404:6800:4000::/36",
          "2607:f8b0:4000::/36",
          "2800:3f0:4000::/36",
          "2a00:1450:4000::/36",
          "2c0f:fb50:4000::/36"
        ],
        "other": [],
        "perIp": []
      },
      {
        "record": "mail.zendesk.com",
        "ipv4": [
          "103.151.192.0/23",
          "185.12.80.0/22",
          "188.172.128.0/20",
          "192.161.144.0/20",
          "216.198.0.0/18"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "_spf.salesforce.com",
        "ipv4": [],
        "ipv6": [],
        "other": [],
        "perIp": [
          "exists:%{i}._spf.mta.salesforce.com"
        ]
      },
      {
        "record": "servers.mcsv.net",
        "ipv4": [
          "205.201.128.0/20",
          "198.2.128.0/18",
          "148.105.0.0/16"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "mktomail.com",
        "ipv4": [
          "199.15.212.0/22",
          "72.3.185.0/24",
          "72.32.154.0/24",
          "72.32.217.0/24",
          "72.32.243.0/24",
          "94.236.119.0/26",
          "37.188.97.188/32",
          "185.28.196.0/22",
          "192.28.128.0/18",
          "103.237.104.0/22",
          "130.248.172.0/24",
          "130.248.173.0/24"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "sendgrid.net",
        "ipv4": [
          "167.89.0.0/17",
          "208.117.48.0/20",
          "50.31.32.0/19",
          "198.37.144.0/20",
          "198.21.0.0/21",
          "192.254.112.0/20",
          "168.245.0.0/17",
          "149.72.0.0/16",
          "159.183.0.0/16",
          "134.128.64.0/18",
          "159.26.176.0/20"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "ab.sendgrid.net",
        "ipv4": [
          "223.165.113.0/24",
          "223.165.115.0/24",
          "223.165.118.0/23",
          "223.165.120.0/23"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      }
    ]
  },
  "providers": [
    {
      "term": "include:spf.protection.outlook.com",
      "target": "spf.protection.outlook.com",
      "provider": {
        "id": "microsoft-365",
        "name": "Microsoft 365"
      },
      "documented": "matches",
      "documentedInclude": "include:spf.protection.outlook.com",
      "lookups": 1
    },
    {
      "term": "include:_netblocks.google.com",
      "target": "_netblocks.google.com",
      "provider": {
        "id": "google-workspace",
        "name": "Google"
      },
      "documented": "differs",
      "documentedInclude": "include:_spf.google.com",
      "lookups": 1
    },
    {
      "term": "include:_netblocks2.google.com",
      "target": "_netblocks2.google.com",
      "provider": {
        "id": "google-workspace",
        "name": "Google"
      },
      "documented": "differs",
      "documentedInclude": "include:_spf.google.com",
      "lookups": 1
    },
    {
      "term": "include:mail.zendesk.com",
      "target": "mail.zendesk.com",
      "provider": {
        "id": "zendesk",
        "name": "Zendesk"
      },
      "documented": "matches",
      "documentedInclude": "include:mail.zendesk.com",
      "lookups": 1
    },
    {
      "term": "include:_spf.salesforce.com",
      "target": "_spf.salesforce.com",
      "provider": {
        "id": "salesforce",
        "name": "Salesforce"
      },
      "documented": "matches",
      "documentedInclude": "include:_spf.salesforce.com",
      "lookups": 2
    },
    {
      "term": "include:servers.mcsv.net",
      "target": "servers.mcsv.net",
      "provider": {
        "id": "mailchimp",
        "name": "Mailchimp"
      },
      "documented": "none",
      "documentedInclude": null,
      "lookups": 1
    },
    {
      "term": "include:mktomail.com",
      "target": "mktomail.com",
      "provider": {
        "id": "marketo",
        "name": "Marketo"
      },
      "documented": "unknown",
      "documentedInclude": null,
      "lookups": 1
    },
    {
      "term": "include:sendgrid.net",
      "target": "sendgrid.net",
      "provider": {
        "id": "sendgrid",
        "name": "Twilio SendGrid"
      },
      "documented": "matches",
      "documentedInclude": "include:sendgrid.net",
      "lookups": 2
    }
  ],
  "mailbox": {
    "provider": {
      "id": "microsoft-365",
      "name": "Microsoft 365"
    },
    "include": "include:spf.protection.outlook.com",
    "includePresent": true
  },
  "test": null,
  "issues": [
    {
      "severity": "warning",
      "code": "lookup_limit_reached",
      "message": "The record uses 10 of the 10 DNS lookups RFC 7208 allows: one more include breaks it."
    },
    {
      "severity": "info",
      "code": "void_lookup",
      "message": "1 lookup came back empty (192.0.2.1._spf.mta.salesforce.com): allowed up to 2."
    },
    {
      "severity": "info",
      "code": "per_ip_terms",
      "message": "exists:%{i}._spf.mta.salesforce.com in _spf.salesforce.com is decided per sending IP (a macro or exists:), so the senders it allows can't be listed."
    },
    {
      "severity": "info",
      "code": "large_txt_answer",
      "message": "The TXT records at the name come to 1586 bytes, over the 450 RFC 7208 §3.4 suggests for a 512-byte UDP answer; resolvers fall back to TCP, so it rarely matters."
    }
  ],
  "tookMs": 281
}

How it works

Reads the TXT records at the name and walks the SPF record the way a receiving mail server does: grammar first, then every term in order with the running count of DNS lookups (include, a, mx, ptr, exists, redirect) against the limit of 10 and void lookups against 2. Unlike a receiver it keeps counting past the 11th, so a broken record shows its whole bill. tree holds every record it reached; senders the ranges they authorise; providers the companies behind the includes beside what they document.

Without ip the record is walked for 192.0.2.1, an address nobody lists, so every term runs and result is what the record does with forged mail. With ip (and optionally helo and sender), test is RFC 7208 check_host for that address: pass, fail, softfail, neutral, none, permerror or temperror, and the path of terms that decided.

DNS is Google Public DNS with Cloudflare's 1.1.1.1 as a second opinion; the TTL comes from the domain's own nameserver. A failed lookup is temperror ("couldn't check", incomplete), never "broken", and a permerror is never reported as fail. Agrees with pyspf, the RFC's reference implementation, on 25 of 25 test domains.

Query parameters

  • domainstringrequired
    The domain whose SPF record to check. It is checked exactly as given: SPF has no inheritance, so mail.example.com has a record of its own. A URL (its host), an email address (its domain), an IDN in Unicode or a trailing dot are read the way the tool page reads them; the normalised name comes back in query.domain.
  • ipstringoptional
    An IPv4 or IPv6 sending address to test with RFC 7208 check_host; the answer's test says what receivers decide for it and which term matched.
  • helostringoptional
    With ip: the HELO/EHLO host name the server announces (macros like %{h} expand with it); its own SPF record is checked too (test.heloResult).
  • senderstringoptional
    With ip: the MAIL FROM address or domain (default postmaster@domain); macros like %{l} and %{s} expand with it.

Response fields

200 with this JSON object, plus tookMs, and incomplete with warnings when a source failed. Fields marked optional appear only when they apply.

  • queryobjectalways
    What was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).
    Show 4 fields
    • domainstringalways
      The domain checked, lower case, IDNs as Punycode.
    • ipstring or nullalways
      The address tested with check_host (an IPv4-mapped IPv6 address becomes its IPv4); null without ip.
    • helostring or nullalways
      The HELO name given, normalised; null when none.
    • senderstring or nullalways
      The MAIL FROM given, normalised to local@domain; null when none (check_host then uses postmaster@<domain>).
  • verdictstring or nullalways
    The record's health for receivers: valid, valid_no_lookups_left (10 of 10), valid_redirect (hands every check to another record), valid_uses_ptr; allows_everyone (+all, or an include ending in +all), no_record, near_miss (a TXT meant as SPF that receivers ignore), multiple_records, syntax_error, too_many_lookups, too_many_void_lookups, include_without_spf, redirect_without_spf, include_loop, mx_too_many_hosts; dns_error and check_incomplete mean we couldn't check it all. null only when the walk didn't run.

    one of "valid", "valid_no_lookups_left", "valid_redirect", "valid_uses_ptr", "allows_everyone", "no_record", "near_miss", "multiple_records", "syntax_error", "too_many_lookups", "too_many_void_lookups", "include_without_spf", "redirect_without_spf", "include_loop", "mx_too_many_hosts", "dns_error", "check_incomplete", null

  • statusstringalways
    The verdict in one word: ok, warning, error (receivers fail it or it lets everyone pass), unknown (couldn't check).

    one of "ok", "warning", "error", "unknown"

  • resultstring or nullalways
    RFC 7208 check_host's result for a sender the record doesn't list (192.0.2.1, an address nobody lists): what the record does with forged mail. pass here means every server passes.

    one of "pass", "fail", "softfail", "neutral", "none", "permerror", "temperror", null

  • stoppedBystring or nullalways
    Why result is permerror or temperror: the 11th lookup, the 3rd void lookup, an include or redirect without SPF, a syntax error, two records, a DNS failure, an mx with more than 10 hosts, a loop, nesting, our cap or our deadline. null otherwise.

    one of "lookups", "voids", "include_nospf", "redirect_nospf", "syntax", "multiple", "temperror", "mx10", "loop", "deep", "cap", "timeout", null

  • recordstring or nullalways
    The domain's SPF record as published (the first, when there are several); null when there is none.
  • recordsintegeralways
    TXT records at the name that start with v=spf1. Two or more is a permerror.
  • ttlinteger or nullalways
    The record's TTL in seconds, asked of the domain's own nameserver (the resolver's remaining TTL when that fails).
  • allstring or nullalways
    The all ending unlisted senders get, through a redirect when allVia names one; null when the record has none (they get neutral).

    one of "+", "-", "~", "?", null

  • allViastring or nullalways
    The redirect target whose all applies; null when the record's own all (or none) applies.
  • lookupsobjectalways
    DNS lookups the record needs, counted like a receiver (include, a, mx, ptr, exists, redirect: 1 each).
    • countintegeralways
      Lookups needed for a sender the record doesn't list. Counted past the 10th so a broken record shows its whole bill ("18 needed").
    • limitintegeralways
      RFC 7208's limit: 10. Receivers stop at the 11th with permerror.
    • atLeastbooleanalways
      true when the count stopped at 50: the record needs at least that many.
  • voidLookupsobjectalways
    Lookups that came back empty (NXDOMAIN or no records): more than 2 is permerror.
    • countintegeralways
      Void lookups a receiver counts.
    • limitintegeralways
      RFC 7208's limit: 2.
    • namesarray of objectsalways
      Each void lookup, in the order a receiver meets it.
      Show 5 fields
      • namestringalways
        The name asked.
      • typestringalways
        The record type asked.

        one of "A", "AAAA", "MX", "PTR"

      • rcodestringalways
        The answer's code: NXDOMAIN, or NOERROR with no records.
      • termstringalways
        The term that asked.
      • recordstringalways
        The record holding that term.
  • treearray of objectsalways
    The whole record tree, flattened depth first in the order a receiver reads it: the domain's record, then each include's (rebuild the tree with parent). Empty when there is no record. At most 60 records.
    Show 9 fields
    • namestringalways
      The name the record was read at.
    • viastringalways
      How the walk reached it: the checked domain itself, an include: or a redirect=.

      one of "root", "include", "redirect"

    • parentstring or nullalways
      The record that includes or redirects to this one; null for the root.
    • depthintegeralways
      Nesting depth: 0 for the domain's own record.
    • recordstring or nullalways
      The SPF record's text as published (TXT strings joined); null when there is none.
    • ttlinteger or nullalways
      The record's TTL in seconds, as the resolver returned it.
    • lookupsintegeralways
      DNS lookups spent inside this record and everything it reaches (the include term itself not counted).
    • errorstring or nullalways
      Why the walk couldn't use this record: dns_error (the lookup failed), no_record (no v=spf1 at the name), multiple_records, syntax_error, too_deep (nesting) or too_large (our own cap).

      one of "dns_error", "no_record", "multiple_records", "syntax_error", "too_deep", "too_large", null

    • termsarray of objectsalways
      The record's terms in order (at most 120).
      Show 11 fields
      • termstringalways
        The term as written, e.g. include:_spf.google.com or ~all.
      • kindstringalways
        mechanism (all, include, a, mx, ptr, ip4, ip6, exists), modifier (redirect=, exp= or an unknown one) or invalid (breaks RFC 7208's grammar).

        one of "mechanism", "modifier", "invalid"

      • qualifierstring or nullalways
        A mechanism's qualifier: + pass (the default), - fail, ~ softfail, ? neutral. null for modifiers and invalid terms.

        one of "+", "-", "~", "?", null

      • namestring or nullalways
        The mechanism or modifier name in lower case (include, ip4, redirect…); null for an invalid term.
      • targetstring or nullalways
        The domain the term asks about (include, redirect, a, mx, exists, ptr), macros expanded for 192.0.2.1; null for ip4/ip6/all.
      • lookupinteger or nullalways
        The running count of DNS lookups after this term, when it costs one (include, a, mx, ptr, exists, redirect); null otherwise. Over 10 is permerror.
      • addressesinteger or nullalways
        ip4/ip6: how many addresses the range holds (IPv6 capped at 2^64); null for other terms.
      • ipsarray of strings or nullalways
        a and mx: the addresses the term resolved to (at most 32); null for other terms.
      • hostsarray of strings or nullalways
        mx: the mail server names; ptr: the validated reverse names; null for other terms.
      • evaluatedbooleanalways
        false when a receiver never reaches the term: it comes after all, or after the check already stopped (the 11th lookup, the 3rd void).
      • problemstring or nullalways
        What is wrong with this term, if anything: a grammar fault, an unknown modifier, a term after all, a redirect ignored because of all, an include loop, an include of a name with no SPF record, or a DNS failure. Details are in issues.

        one of "syntax_error", "unknown_modifier", "after_all", "redirect_ignored", "loop", "no_spf_record", "dns_error", null

  • sendersobject or nullalways
    Who the record authorises, for a sender it doesn't list (every term a receiver reaches): ip4/ip6 ranges and the addresses behind a/mx terms, per record. null when there is no record.
    Show 5 fields
    • ipv4Rangesintegeralways
      IPv4 ranges that pass, across the tree.
    • ipv6Rangesintegeralways
      IPv6 ranges that pass, across the tree.
    • ipv4Addressesintegeralways
      IPv4 addresses those ranges hold, summed (ranges may overlap: an upper bound).
    • perIpTermsintegeralways
      Terms decided per sending IP (exists:, ptr, macros) whose senders can't be listed.
    • recordsarray of objectsalways
      Per record of the tree that lists senders: the domain's own first, then each include's.
      Show 5 fields
      • recordstringalways
        The record's name.
      • ipv4array of stringsalways
        IPv4 ranges (CIDR) that pass; a/mx addresses as /32 (or the term's prefix).
      • ipv6array of stringsalways
        IPv6 ranges (CIDR) that pass.
      • otherarray of objectsalways
        Ranges listed with another qualifier: - (denied), ~ (softfail) or ? (neutral). They don't authorise.
        Show 2 fields
        • rangestringalways
          The CIDR range.
        • qualifierstringalways
          Its qualifier.

          one of "-", "~", "?"

      • perIparray of stringsalways
        Terms in this record decided per sending IP (exists:, ptr, macros), as written.
  • providersarray of objectsalways
    Each top-level include or redirect, with the company behind it and what that company documents. The domain's own names are left out.
    Show 6 fields
    • termstringalways
      The term as written.
    • targetstringalways
      The name it includes.
    • providerobject or nullalways
      The company behind the include (from our list of 70+ senders' documented includes); null when we don't know it.
      Show 2 fields
      • idstringalways
        Our stable id for the company, e.g. google, microsoft365, sendgrid.
      • namestringalways
        Its name as it writes it, e.g. Google Workspace.
    • documentedstringalways
      Against the provider's documentation: matches the documented include, differs (it documents documentedInclude), none (it documents no SPF include), unknown (not in our list).

      one of "matches", "differs", "none", "unknown"

    • documentedIncludestring or nullalways
      The include the provider documents, when it differs or matches; null otherwise.
    • lookupsintegeralways
      DNS lookups this include costs here (itself plus everything it reaches).
  • mailboxobject or nullalways
    The mailbox provider the domain's MX names (security gateways skipped), and whether the record carries its documented include anywhere in the tree. null when the MX names no provider we know.
    • providerobjectalways
      The mailbox provider.
      Show 2 fields
      • idstringalways
        Our stable id for the company, e.g. google, microsoft365, sendgrid.
      • namestringalways
        Its name as it writes it, e.g. Google Workspace.
    • includestring or nullalways
      The include it documents; null when it documents none.
    • includePresentbooleanalways
      The record (or one of its includes) carries that include.
  • testobject or nullalways
    With ip: RFC 7208 check_host for that address, as a receiver runs it. null without ip.
    Show 8 fields
    • ipstringalways
      The address tested.
    • helostring or nullalways
      The HELO name used; null when none was given.
    • senderstringalways
      The MAIL FROM used (postmaster@<domain> when none was given).
    • resultstringalways
      check_host's result: pass (authorised), fail (-), softfail (~), neutral (?), none (no record), permerror (the record is broken), temperror (a DNS lookup failed).

      one of "pass", "fail", "softfail", "neutral", "none", "permerror", "temperror"

    • stoppedBystring or nullalways
      Why the result is permerror or temperror; null otherwise.

      one of "lookups", "voids", "include_nospf", "redirect_nospf", "syntax", "multiple", "temperror", "mx10", "loop", "deep", "cap", "timeout", null

    • patharray of objectsalways
      The terms that decided, from the domain's record down through includes to the term that matched (the last). Empty when no term matched (the default neutral, or none).
      Show 2 fields
      • termstringalways
        The term.
      • recordstringalways
        The record holding it.
    • lookupsintegeralways
      DNS lookups this check spent.
    • heloResultobject or nullalways
      With helo: check_host of the HELO name's own SPF record for the same address.
      Show 2 fields
      • namestringalways
        The HELO name.
      • resultstringalways
        Its result.

        one of "pass", "fail", "softfail", "neutral", "none", "permerror", "temperror"

  • issuesarray of objectsalways
    Problems in the record, worst first: the SPF Record Checker's readings (RFC 7208). error breaks something (receivers fail it), warning risks it, info is worth knowing.
    • severitystringalways
      error breaks something, warning risks it, info is worth knowing.

      one of "error", "warning", "info"

    • codestringalways
      Stable machine-readable code.
    • messagestringalways
      The problem and what to do about it, in plain English.

Errors

  • 400 missing_parameter helo or sender is given without ip.
  • 429 rate_limited The domain (its registrable domain) was checked 30 times in the last minute by all callers together, or every caller together reached 600 a minute: retry after Retry-After seconds.

Plus the errors every endpoint can return: 400 for a missing or unreadable parameter, 429 past the limit, 503 when every source failed.

Code samples

curl "https://dnsrobot.net/api/v2/spf?domain=github.com"
const params = new URLSearchParams({ domain: "github.com" });
const res = await fetch(`https://dnsrobot.net/api/v2/spf?${params}`);
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data.verdict);
import requests

r = requests.get(
    "https://dnsrobot.net/api/v2/spf",
    params={"domain": "github.com"},
    timeout=30,
)
data = r.json()
if not r.ok:
    raise RuntimeError(data["error"]["message"])
print(data["verdict"])
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
)

func main() {
	q := url.Values{"domain": {"github.com"}}
	res, err := http.Get("https://dnsrobot.net/api/v2/spf?" + q.Encode())
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	var data map[string]any
	if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(data["error"])
	}
	fmt.Println(data["verdict"])
}
<?php
$query = http_build_query(["domain" => "github.com"]);
$context = stream_context_create(["http" => ["ignore_errors" => true, "timeout" => 30]]);
$data = json_decode(file_get_contents("https://dnsrobot.net/api/v2/spf?" . $query, false, $context), true);
if (isset($data["error"])) {
    throw new RuntimeException($data["error"]["message"]);
}
print_r($data["verdict"]);
require "net/http"
require "json"

uri = URI("https://dnsrobot.net/api/v2/spf")
uri.query = URI.encode_www_form(domain: "github.com")
data = JSON.parse(Net::HTTP.get(uri))
raise data["error"]["message"] if data["error"]
puts data["verdict"]
// Cargo.toml: reqwest = { version = "0.13", features = ["blocking", "json"] }, serde_json = "1"
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let res = reqwest::blocking::get("https://dnsrobot.net/api/v2/spf?domain=github.com")?;
    let ok = res.status().is_success();
    let data: serde_json::Value = res.json()?;
    if !ok {
        return Err(data["error"]["message"].to_string().into());
    }
    println!("{}", data["verdict"]);
    Ok(())
}
using System.Text.Json;

using var http = new HttpClient();
var res = await http.GetAsync("https://dnsrobot.net/api/v2/spf?domain=github.com");
var data = JsonDocument.Parse(await res.Content.ReadAsStringAsync()).RootElement;
if (!res.IsSuccessStatusCode)
    throw new Exception(data.GetProperty("error").GetProperty("message").GetString());
Console.WriteLine(data.GetProperty("verdict"));

github.com's record

GET /api/v2/spf?domain=github.com
200 OKRecorded 2026-10-25
{
  "query": {
    "domain": "github.com",
    "ip": null,
    "helo": null,
    "sender": null
  },
  "verdict": "valid_no_lookups_left",
  "status": "ok",
  "result": "softfail",
  "stoppedBy": null,
  "record": "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com incl…",
  "records": 1,
  "ttl": 300,
  "all": "~",
  "allVia": null,
  "lookups": {
    "count": 10,
    "limit": 10,
    "atLeast": false
  },
  "voidLookups": {
    "count": 1,
    "limit": 2,
    "names": [
      {
        "name": "192.0.2.1._spf.mta.salesforce.com",
        "type": "A",
        "rcode": "NXDOMAIN",
        "term": "exists:%{i}._spf.mta.salesforce.com",
        "record": "_spf.salesforce.com"
      }
    ]
  },
  "tree": [
    {
      "name": "github.com",
      "via": "root",
      "parent": null,
      "depth": 0,
      "record": "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com incl…",
      "ttl": 300,
      "lookups": 10,
      "error": null,
      "terms": [
        {
          "term": "ip4:192.30.252.0/22",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1024,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:spf.protection.outlook.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "spf.protection.outlook.com",
          "lookup": 1,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:_netblocks.google.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "_netblocks.google.com",
          "lookup": 2,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        // … 11 more items
      ]
    },
    {
      "name": "spf.protection.outlook.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:40.92.0.0/15 ip4:40.107.0.0/16 ip4:52.100.0.0/15 ip4:52.102.0.0/16 ip4:52.103.0.0/17 …",
      "ttl": 232,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:40.92.0.0/15",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 131072,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:40.107.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:52.100.0.0/15",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 131072,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        // … 9 more items
      ]
    },
    {
      "name": "_netblocks.google.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:74.125.0.0/16 ip4:209.85.128.0/17 ~all",
      "ttl": 300,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:74.125.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:209.85.128.0/17",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 32768,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    // … 7 more items
  ],
  "senders": {
    "ipv4Ranges": 48,
    "ipv6Ranges": 11,
    "ipv4Addresses": 932421,
    "perIpTerms": 1,
    "records": [
      {
        "record": "github.com",
        "ipv4": [
          "192.30.252.0/22",
          "62.253.227.114/32",
          "166.78.69.169/32",
          // … 2 more items
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "spf.protection.outlook.com",
        "ipv4": [
          "40.92.0.0/15",
          "40.107.0.0/16",
          "52.100.0.0/15",
          // … 3 more items
        ],
        "ipv6": [
          "2a01:111:f400::/48",
          "2a01:111:f403::/49",
          "2a01:111:f403:8000::/51",
          // … 2 more items
        ],
        "other": [],
        "perIp": []
      },
      {
        "record": "_netblocks.google.com",
        "ipv4": [
          "74.125.0.0/16",
          "209.85.128.0/17"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      // … 7 more items
    ]
  },
  "providers": [
    {
      "term": "include:spf.protection.outlook.com",
      "target": "spf.protection.outlook.com",
      "provider": {
        "id": "microsoft-365",
        "name": "Microsoft 365"
      },
      "documented": "matches",
      "documentedInclude": "include:spf.protection.outlook.com",
      "lookups": 1
    },
    {
      "term": "include:_netblocks.google.com",
      "target": "_netblocks.google.com",
      "provider": {
        "id": "google-workspace",
        "name": "Google"
      },
      "documented": "differs",
      "documentedInclude": "include:_spf.google.com",
      "lookups": 1
    },
    {
      "term": "include:_netblocks2.google.com",
      "target": "_netblocks2.google.com",
      "provider": {
        "id": "google-workspace",
        "name": "Google"
      },
      "documented": "differs",
      "documentedInclude": "include:_spf.google.com",
      "lookups": 1
    },
    // … 5 more items
  ],
  "mailbox": {
    "provider": {
      "id": "microsoft-365",
      "name": "Microsoft 365"
    },
    "include": "include:spf.protection.outlook.com",
    "includePresent": true
  },
  "test": null,
  "issues": [
    {
      "severity": "warning",
      "code": "lookup_limit_reached",
      "message": "The record uses 10 of the 10 DNS lookups RFC 7208 allows: one more include breaks it."
    },
    {
      "severity": "info",
      "code": "void_lookup",
      "message": "1 lookup came back empty (192.0.2.1._spf.mta.salesforce.com): allowed up to 2."
    },
    {
      "severity": "info",
      "code": "per_ip_terms",
      "message": "exists:%{i}._spf.mta.salesforce.com in _spf.salesforce.com is decided per sending IP (a macro or…"
    },
    // … 1 more item
  ],
  "tookMs": 281
}

Shortened for the page: long lists show their first items.

Is 192.30.252.1 allowed to send for github.com?

GET /api/v2/spf?domain=github.com&ip=192.30.252.1
200 OKRecorded 2026-10-25
{
  "query": {
    "domain": "github.com",
    "ip": "192.30.252.1",
    "helo": null,
    "sender": null
  },
  "verdict": "valid_no_lookups_left",
  "status": "ok",
  "result": "softfail",
  "stoppedBy": null,
  "record": "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com incl…",
  "records": 1,
  "ttl": 300,
  "all": "~",
  "allVia": null,
  "lookups": {
    "count": 10,
    "limit": 10,
    "atLeast": false
  },
  "voidLookups": {
    "count": 1,
    "limit": 2,
    "names": [
      {
        "name": "192.0.2.1._spf.mta.salesforce.com",
        "type": "A",
        "rcode": "NXDOMAIN",
        "term": "exists:%{i}._spf.mta.salesforce.com",
        "record": "_spf.salesforce.com"
      }
    ]
  },
  "tree": [
    {
      "name": "github.com",
      "via": "root",
      "parent": null,
      "depth": 0,
      "record": "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com incl…",
      "ttl": 300,
      "lookups": 10,
      "error": null,
      "terms": [
        {
          "term": "ip4:192.30.252.0/22",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1024,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:spf.protection.outlook.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "spf.protection.outlook.com",
          "lookup": 1,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:_netblocks.google.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "_netblocks.google.com",
          "lookup": 2,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        // … 11 more items
      ]
    },
    {
      "name": "spf.protection.outlook.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:40.92.0.0/15 ip4:40.107.0.0/16 ip4:52.100.0.0/15 ip4:52.102.0.0/16 ip4:52.103.0.0/17 …",
      "ttl": 482,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:40.92.0.0/15",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 131072,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:40.107.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:52.100.0.0/15",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 131072,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        // … 9 more items
      ]
    },
    {
      "name": "_netblocks.google.com",
      "via": "include",
      "parent": "github.com",
      "depth": 1,
      "record": "v=spf1 ip4:74.125.0.0/16 ip4:209.85.128.0/17 ~all",
      "ttl": 300,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:74.125.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:209.85.128.0/17",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 32768,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "~all",
          "kind": "mechanism",
          "qualifier": "~",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    // … 7 more items
  ],
  "senders": {
    "ipv4Ranges": 48,
    "ipv6Ranges": 11,
    "ipv4Addresses": 932421,
    "perIpTerms": 1,
    "records": [
      {
        "record": "github.com",
        "ipv4": [
          "192.30.252.0/22",
          "62.253.227.114/32",
          "166.78.69.169/32",
          // … 2 more items
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "spf.protection.outlook.com",
        "ipv4": [
          "40.92.0.0/15",
          "40.107.0.0/16",
          "52.100.0.0/15",
          // … 3 more items
        ],
        "ipv6": [
          "2a01:111:f400::/48",
          "2a01:111:f403::/49",
          "2a01:111:f403:8000::/51",
          // … 2 more items
        ],
        "other": [],
        "perIp": []
      },
      {
        "record": "_netblocks.google.com",
        "ipv4": [
          "74.125.0.0/16",
          "209.85.128.0/17"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      // … 7 more items
    ]
  },
  "providers": [
    {
      "term": "include:spf.protection.outlook.com",
      "target": "spf.protection.outlook.com",
      "provider": {
        "id": "microsoft-365",
        "name": "Microsoft 365"
      },
      "documented": "matches",
      "documentedInclude": "include:spf.protection.outlook.com",
      "lookups": 1
    },
    {
      "term": "include:_netblocks.google.com",
      "target": "_netblocks.google.com",
      "provider": {
        "id": "google-workspace",
        "name": "Google"
      },
      "documented": "differs",
      "documentedInclude": "include:_spf.google.com",
      "lookups": 1
    },
    {
      "term": "include:_netblocks2.google.com",
      "target": "_netblocks2.google.com",
      "provider": {
        "id": "google-workspace",
        "name": "Google"
      },
      "documented": "differs",
      "documentedInclude": "include:_spf.google.com",
      "lookups": 1
    },
    // … 5 more items
  ],
  "mailbox": {
    "provider": {
      "id": "microsoft-365",
      "name": "Microsoft 365"
    },
    "include": "include:spf.protection.outlook.com",
    "includePresent": true
  },
  "test": {
    "ip": "192.30.252.1",
    "helo": null,
    "sender": "postmaster@github.com",
    "result": "pass",
    "stoppedBy": null,
    "path": [
      {
        "term": "ip4:192.30.252.0/22",
        "record": "github.com"
      }
    ],
    "lookups": 0,
    "heloResult": null
  },
  "issues": [
    {
      "severity": "warning",
      "code": "lookup_limit_reached",
      "message": "The record uses 10 of the 10 DNS lookups RFC 7208 allows: one more include breaks it."
    },
    {
      "severity": "info",
      "code": "void_lookup",
      "message": "1 lookup came back empty (192.0.2.1._spf.mta.salesforce.com): allowed up to 2."
    },
    {
      "severity": "info",
      "code": "per_ip_terms",
      "message": "exists:%{i}._spf.mta.salesforce.com in _spf.salesforce.com is decided per sending IP (a macro or…"
    },
    // … 1 more item
  ],
  "tookMs": 236
}

Shortened for the page: long lists show their first items.

cloudflare.com's record

GET /api/v2/spf?domain=cloudflare.com
200 OKRecorded 2026-10-25
{
  "query": {
    "domain": "cloudflare.com",
    "ip": null,
    "helo": null,
    "sender": null
  },
  "verdict": "valid",
  "status": "ok",
  "result": "fail",
  "stoppedBy": null,
  "record": "v=spf1 ip4:199.15.212.0/22 ip4:173.245.48.0/20 include:_spf.google.com include:spf1.mcsv.net inc…",
  "records": 1,
  "ttl": 300,
  "all": "-",
  "allVia": null,
  "lookups": {
    "count": 7,
    "limit": 10,
    "atLeast": false
  },
  "voidLookups": {
    "count": 1,
    "limit": 2,
    "names": [
      {
        "name": "192.0.2.1._spf.mta.salesforce.com",
        "type": "A",
        "rcode": "NXDOMAIN",
        "term": "exists:%{i}._spf.mta.salesforce.com",
        "record": "_spf.salesforce.com"
      }
    ]
  },
  "tree": [
    {
      "name": "cloudflare.com",
      "via": "root",
      "parent": null,
      "depth": 0,
      "record": "v=spf1 ip4:199.15.212.0/22 ip4:173.245.48.0/20 include:_spf.google.com include:spf1.mcsv.net inc…",
      "ttl": 300,
      "lookups": 7,
      "error": null,
      "terms": [
        {
          "term": "ip4:199.15.212.0/22",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 1024,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:173.245.48.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "include:_spf.google.com",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "include",
          "target": "_spf.google.com",
          "lookup": 1,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        // … 6 more items
      ]
    },
    {
      "name": "_spf.google.com",
      "via": "include",
      "parent": "cloudflare.com",
      "depth": 1,
      "record": "v=spf1 ip4:74.125.0.0/16 ip4:209.85.128.0/17 ip6:2001:4860:4864::/56 ip6:2404:6800:4864::/56 ip6…",
      "ttl": 300,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:74.125.0.0/16",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 65536,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:209.85.128.0/17",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 32768,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip6:2001:4860:4864::/56",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip6",
          "target": null,
          "lookup": null,
          "addresses": 18446744073709552000,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        // … 6 more items
      ]
    },
    {
      "name": "spf1.mcsv.net",
      "via": "include",
      "parent": "cloudflare.com",
      "depth": 1,
      "record": "v=spf1 ip4:205.201.128.0/20 ip4:198.2.128.0/18 ?all",
      "ttl": 20808,
      "lookups": 0,
      "error": null,
      "terms": [
        {
          "term": "ip4:205.201.128.0/20",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 4096,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "ip4:198.2.128.0/18",
          "kind": "mechanism",
          "qualifier": "+",
          "name": "ip4",
          "target": null,
          "lookup": null,
          "addresses": 16384,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        },
        {
          "term": "?all",
          "kind": "mechanism",
          "qualifier": "?",
          "name": "all",
          "target": null,
          "lookup": null,
          "addresses": null,
          "ips": null,
          "hosts": null,
          "evaluated": true,
          "problem": null
        }
      ]
    },
    // … 4 more items
  ],
  "senders": {
    "ipv4Ranges": 53,
    "ipv6Ranges": 6,
    "ipv4Addresses": 154782,
    "perIpTerms": 1,
    "records": [
      {
        "record": "cloudflare.com",
        "ipv4": [
          "199.15.212.0/22",
          "173.245.48.0/20"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      {
        "record": "_spf.google.com",
        "ipv4": [
          "74.125.0.0/16",
          "209.85.128.0/17"
        ],
        "ipv6": [
          "2001:4860:4864::/56",
          "2404:6800:4864::/56",
          "2607:f8b0:4864::/56",
          // … 3 more items
        ],
        "other": [],
        "perIp": []
      },
      {
        "record": "spf1.mcsv.net",
        "ipv4": [
          "205.201.128.0/20",
          "198.2.128.0/18"
        ],
        "ipv6": [],
        "other": [],
        "perIp": []
      },
      // … 4 more items
    ]
  },
  "providers": [
    {
      "term": "include:_spf.google.com",
      "target": "_spf.google.com",
      "provider": {
        "id": "google-workspace",
        "name": "Google Workspace"
      },
      "documented": "matches",
      "documentedInclude": "include:_spf.google.com",
      "lookups": 1
    },
    {
      "term": "include:spf1.mcsv.net",
      "target": "spf1.mcsv.net",
      "provider": {
        "id": "mailchimp",
        "name": "Mailchimp"
      },
      "documented": "none",
      "documentedInclude": null,
      "lookups": 1
    },
    {
      "term": "include:spf.mandrillapp.com",
      "target": "spf.mandrillapp.com",
      "provider": {
        "id": "mandrill",
        "name": "Mandrill"
      },
      "documented": "unknown",
      "documentedInclude": null,
      "lookups": 1
    },
    // … 3 more items
  ],
  "mailbox": null,
  "test": null,
  "issues": [
    {
      "severity": "info",
      "code": "void_lookup",
      "message": "1 lookup came back empty (192.0.2.1._spf.mta.salesforce.com): allowed up to 2."
    },
    {
      "severity": "info",
      "code": "per_ip_terms",
      "message": "exists:%{i}._spf.mta.salesforce.com in _spf.salesforce.com is decided per sending IP (a macro or…"
    },
    {
      "severity": "info",
      "code": "large_txt_answer",
      "message": "The TXT records at the name come to 2133 bytes, over the 450 RFC 7208 §3.4 suggests for a 512-by…"
    }
  ],
  "tookMs": 399
}

Shortened for the page: long lists show their first items.