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.
- 20 calls a minute per IP
- Same engine as the SPF Record Checker tool
{
"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
domainstringrequiredThe 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 inquery.domain.ipstringoptionalAn IPv4 or IPv6 sending address to test with RFC 7208 check_host; the answer'stestsays what receivers decide for it and which term matched.helostringoptionalWithip: the HELO/EHLO host name the server announces (macros like %{h} expand with it); its own SPF record is checked too (test.heloResult).senderstringoptionalWithip: 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.
queryobjectalwaysWhat was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).Show 4 fields
domainstringalwaysThe domain checked, lower case, IDNs as Punycode.ipstring or nullalwaysThe address tested with check_host (an IPv4-mapped IPv6 address becomes its IPv4);nullwithoutip.helostring or nullalwaysThe HELO name given, normalised;nullwhen none.senderstring or nullalwaysThe MAIL FROM given, normalised to local@domain;nullwhen none (check_host then uses postmaster@<domain>).
verdictstring or nullalwaysThe 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_errorandcheck_incompletemean we couldn't check it all.nullonly 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",nullstatusstringalwaysThe 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 nullalwaysRFC 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.passhere means every server passes.one of
"pass","fail","softfail","neutral","none","permerror","temperror",nullstoppedBystring or nullalwaysWhyresultis 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.nullotherwise.one of
"lookups","voids","include_nospf","redirect_nospf","syntax","multiple","temperror","mx10","loop","deep","cap","timeout",nullrecordstring or nullalwaysThe domain's SPF record as published (the first, when there are several);nullwhen there is none.recordsintegeralwaysTXT records at the name that start withv=spf1. Two or more is a permerror.ttlinteger or nullalwaysThe record's TTL in seconds, asked of the domain's own nameserver (the resolver's remaining TTL when that fails).allstring or nullalwaysTheallending unlisted senders get, through a redirect whenallVianames one;nullwhen the record has none (they get neutral).one of
"+","-","~","?",nullallViastring or nullalwaysThe redirect target whoseallapplies;nullwhen the record's ownall(or none) applies.lookupsobjectalwaysDNS lookups the record needs, counted like a receiver (include, a, mx, ptr, exists, redirect: 1 each).countintegeralwaysLookups needed for a sender the record doesn't list. Counted past the 10th so a broken record shows its whole bill ("18 needed").limitintegeralwaysRFC 7208's limit: 10. Receivers stop at the 11th with permerror.atLeastbooleanalwaystruewhen the count stopped at 50: the record needs at least that many.
voidLookupsobjectalwaysLookups that came back empty (NXDOMAIN or no records): more than 2 is permerror.countintegeralwaysVoid lookups a receiver counts.limitintegeralwaysRFC 7208's limit: 2.namesarray of objectsalwaysEach void lookup, in the order a receiver meets it.Show 5 fields
namestringalwaysThe name asked.typestringalwaysThe record type asked.one of
"A","AAAA","MX","PTR"rcodestringalwaysThe answer's code:NXDOMAIN, orNOERRORwith no records.termstringalwaysThe term that asked.recordstringalwaysThe record holding that term.
treearray of objectsalwaysThe whole record tree, flattened depth first in the order a receiver reads it: the domain's record, then each include's (rebuild the tree withparent). Empty when there is no record. At most 60 records.Show 9 fields
namestringalwaysThe name the record was read at.viastringalwaysHow the walk reached it: the checked domain itself, aninclude:or aredirect=.one of
"root","include","redirect"parentstring or nullalwaysThe record that includes or redirects to this one;nullfor the root.depthintegeralwaysNesting depth: 0 for the domain's own record.recordstring or nullalwaysThe SPF record's text as published (TXT strings joined);nullwhen there is none.ttlinteger or nullalwaysThe record's TTL in seconds, as the resolver returned it.lookupsintegeralwaysDNS lookups spent inside this record and everything it reaches (the include term itself not counted).errorstring or nullalwaysWhy 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) ortoo_large(our own cap).one of
"dns_error","no_record","multiple_records","syntax_error","too_deep","too_large",nulltermsarray of objectsalwaysThe record's terms in order (at most 120).Show 11 fields
termstringalwaysThe term as written, e.g.include:_spf.google.comor~all.kindstringalwaysmechanism(all, include, a, mx, ptr, ip4, ip6, exists),modifier(redirect=, exp= or an unknown one) orinvalid(breaks RFC 7208's grammar).one of
"mechanism","modifier","invalid"qualifierstring or nullalwaysA mechanism's qualifier:+pass (the default),-fail,~softfail,?neutral.nullfor modifiers and invalid terms.one of
"+","-","~","?",nullnamestring or nullalwaysThe mechanism or modifier name in lower case (include,ip4,redirect…);nullfor an invalid term.targetstring or nullalwaysThe domain the term asks about (include, redirect, a, mx, exists, ptr), macros expanded for 192.0.2.1;nullfor ip4/ip6/all.lookupinteger or nullalwaysThe running count of DNS lookups after this term, when it costs one (include, a, mx, ptr, exists, redirect);nullotherwise. Over 10 is permerror.addressesinteger or nullalwaysip4/ip6: how many addresses the range holds (IPv6 capped at 2^64);nullfor other terms.ipsarray of strings or nullalwaysa and mx: the addresses the term resolved to (at most 32);nullfor other terms.hostsarray of strings or nullalwaysmx: the mail server names; ptr: the validated reverse names;nullfor other terms.evaluatedbooleanalwaysfalsewhen a receiver never reaches the term: it comes afterall, or after the check already stopped (the 11th lookup, the 3rd void).problemstring or nullalwaysWhat 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 inissues.one of
"syntax_error","unknown_modifier","after_all","redirect_ignored","loop","no_spf_record","dns_error",null
sendersobject or nullalwaysWho 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.nullwhen there is no record.Show 5 fields
ipv4RangesintegeralwaysIPv4 ranges that pass, across the tree.ipv6RangesintegeralwaysIPv6 ranges that pass, across the tree.ipv4AddressesintegeralwaysIPv4 addresses those ranges hold, summed (ranges may overlap: an upper bound).perIpTermsintegeralwaysTerms decided per sending IP (exists:, ptr, macros) whose senders can't be listed.recordsarray of objectsalwaysPer record of the tree that lists senders: the domain's own first, then each include's.Show 5 fields
recordstringalwaysThe record's name.ipv4array of stringsalwaysIPv4 ranges (CIDR) that pass; a/mx addresses as /32 (or the term's prefix).ipv6array of stringsalwaysIPv6 ranges (CIDR) that pass.otherarray of objectsalwaysRanges listed with another qualifier:-(denied),~(softfail) or?(neutral). They don't authorise.Show 2 fields
rangestringalwaysThe CIDR range.qualifierstringalwaysIts qualifier.one of
"-","~","?"
perIparray of stringsalwaysTerms in this record decided per sending IP (exists:, ptr, macros), as written.
providersarray of objectsalwaysEach 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
termstringalwaysThe term as written.targetstringalwaysThe name it includes.providerobject or nullalwaysThe company behind the include (from our list of 70+ senders' documented includes);nullwhen we don't know it.Show 2 fields
idstringalwaysOur stable id for the company, e.g.google,microsoft365,sendgrid.namestringalwaysIts name as it writes it, e.g.Google Workspace.
documentedstringalwaysAgainst the provider's documentation:matchesthe documented include,differs(it documentsdocumentedInclude),none(it documents no SPF include),unknown(not in our list).one of
"matches","differs","none","unknown"documentedIncludestring or nullalwaysThe include the provider documents, when it differs or matches;nullotherwise.lookupsintegeralwaysDNS lookups this include costs here (itself plus everything it reaches).
mailboxobject or nullalwaysThe mailbox provider the domain's MX names (security gateways skipped), and whether the record carries its documented include anywhere in the tree.nullwhen the MX names no provider we know.providerobjectalwaysThe mailbox provider.Show 2 fields
idstringalwaysOur stable id for the company, e.g.google,microsoft365,sendgrid.namestringalwaysIts name as it writes it, e.g.Google Workspace.
includestring or nullalwaysThe include it documents;nullwhen it documents none.includePresentbooleanalwaysThe record (or one of its includes) carries that include.
testobject or nullalwaysWithip: RFC 7208 check_host for that address, as a receiver runs it.nullwithoutip.Show 8 fields
ipstringalwaysThe address tested.helostring or nullalwaysThe HELO name used;nullwhen none was given.senderstringalwaysThe MAIL FROM used (postmaster@<domain> when none was given).resultstringalwayscheck_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 nullalwaysWhy the result is permerror or temperror;nullotherwise.one of
"lookups","voids","include_nospf","redirect_nospf","syntax","multiple","temperror","mx10","loop","deep","cap","timeout",nullpatharray of objectsalwaysThe 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
termstringalwaysThe term.recordstringalwaysThe record holding it.
lookupsintegeralwaysDNS lookups this check spent.heloResultobject or nullalwaysWithhelo: check_host of the HELO name's own SPF record for the same address.Show 2 fields
namestringalwaysThe HELO name.resultstringalwaysIts result.one of
"pass","fail","softfail","neutral","none","permerror","temperror"
issuesarray of objectsalwaysProblems in the record, worst first: the SPF Record Checker's readings (RFC 7208).errorbreaks something (receivers fail it),warningrisks it,infois worth knowing.severitystringalwayserrorbreaks something,warningrisks it,infois worth knowing.one of
"error","warning","info"codestringalwaysStable machine-readable code.messagestringalwaysThe problem and what to do about it, in plain English.
Errors
400missing_parameterheloorsenderis given withoutip.429rate_limitedThe 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 afterRetry-Afterseconds.
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{
"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{
"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{
"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.