NewAPIVerve Academy: free courses and certifications anyone can verify.Explore the Academy →

Generate a domain health report.

Roll five diagnostics into one scorecard — DNS, SSL expiry, SPF, DMARC, and domain expiration — so you catch deliverability and security gaps before they bite.

5-step workflow
46 crTotal cost per run, across 5 APIs
  • DNS Lookup6 cr
  • SSL Certificate Checker10 cr
  • SPF Validator10 cr
  • DMARC Validator10 cr
  • Domain Expiration10 cr
The problem

An expired certificate, a missing DMARC record, or a domain about to lapse rarely announces itself — until email stops landing or the site throws warnings. A scheduled check turns silent failures into alerts.

What you get

A pass/fail health report you can run on a schedule and surface in a dashboard or alert when something regresses.

The workflow

How the calls chain together

Every response below is a live sample from the actual API — nothing mocked.

01
DNS LookupGET /v1/dnslookup6 cr

Resolve DNS records

Pull the domain's A, MX, TXT, and other records as the baseline for every other check.

domaingoogle.comrecords{ … }
Sample response
{
  "domain": "google.com",
  "records": {
    "A": [
      "172.253.156.100",
      "172.253.156.113",
      "172.253.156.101",
      "172.253.156.139",
      "172.253.156.138",
      "172.253.156.102"
    ],
    "AAAA": [
      "2607:f8b0:4023:100d::65",
      "2607:f8b0:4023:100d::8a",
      "2607:f8b0:4023:100d::71",
      "2607:f8b0:4023:100d::64"
    ],
    "CNAME": null,
    "MX": [
      {
        "exchange": "smtp.google.com",
        "priority": 10
      }
    ],
    "NS": [
      "ns4.google.com",
      "ns3.google.com",
      "ns2.google.com",
      "ns1.google.com"
    ],
    "PTR": null,
    "SRV": null,
    "SOA": {
      "nsname": "ns1.google.com",
      "hostmaster": "dns-admin.google.com",
      "serial": 1005474929,
      "refresh": 900,
      "retry": 900,
      "expire": 1800,
      "minttl": 60
    },
    "TXT": [
      [
        "onetrust-domain-verification=0d477fe608074e6f9c12bca7826035cc"
      ],
      [
        "work-accounts-domain-verification=Tcj6JjIMZOw2KsSEw2Nt2rLae89tN6"
      ],
      [
        "google-site-verification=wD8N7i1JTNTkezJ49swvWW48f8_9xveREV4oB-0Hf5o"
      ],
      [
        "Z29vZ2xl"
      ],
      [
        "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
      ],
      [
        "arcules-domain-verification=2R4t5G7nI6tRCo61lpxxbLksPYstxhGmtV75cpr8x9K"
      ],
      [
        "v=spf1 include:_spf.google.com ~all"
      ],
      [
        "_r4rd1pvwyrpi7sw4a3hzmw8e51yh9td"
      ],
      [
        "apple-domain-verification=30afIBcvSuDV2PLX"
      ],
      [
        "onetrust-domain-verification=6d685f1d41a94696ad7ef771f68993e0"
      ],
      [
        "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95"
      ],
      [
        "google-site-verification=TV9-DBe4R80X4v0M4U_bd_J9cpOJM0nikft0jAgjmsQ"
      ],
      [
        "MS=E4A68B9AB2BB9670BCE15412F62916164C0B20BB"
      ],
      [
        "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
      ],
      [
        "google-site-verification=4ibFUgB-wXLQ_S7vsXVomSTVamuOXBiVAzpR5IZ87D0"
      ],
      [
        "docusign=1b0a6754-49b1-4db5-8540-d2c12664b289"
      ],
      [
        "cisco-ci-domain-verification=47c38bc8c4b74b7233e9053220c1bbe76bcc1cd33c7acf7acd36cd6a5332004b"
      ]
    ],
    "CAA": [
      {
        "critical": 0,
        "issue": "pki.goog"
      }
    ]
  },
  "ttl": {
    "A": 10,
    "AAAA": 2,
    "CNAME": null,
    "MX": 74,
    "NS": 15382,
    "PTR": null,
    "SRV": null,
    "SOA": 25,
    "TXT": 300,
    "CAA": 21600
  },
  "summary": {
    "hasIPv6": true,
    "hasMailServers": true,
    "hasSPF": true
  }
}
↓ passes the record set to the next step
02
SSL Certificate CheckerGET /v1/sslchecker10 cr

Inspect the certificate

Read the SSL certificate's issuer and expiry so you're never surprised by a lapse.

issuer{ … }valid_toApr 22 23:59:59 2027 GMT
Sample response
{
  "subject": {
    "C": "US",
    "ST": "California",
    "O": "eBay, Inc.",
    "CN": "ebay.com"
  },
  "issuer": {
    "C": "GB",
    "O": "Sectigo Limited",
    "CN": "Sectigo Public Server Authentication CA OV R40"
  },
  "subjectaltname": "DNS:ebay.com, DNS:befr.ebay.be, DNS:benl.ebay.be, DNS:cafr.ebay.ca, DNS:e-bay.com, DNS:e-bay.it, DNS:ebay.at, DNS:ebay.be, DNS:ebay.ca, DNS:ebay.ch, DNS:ebay.co.nz, DNS:ebay.co.uk, DNS:ebay.com.au, DNS:ebay.com.cn, DNS:ebay.com.hk, DNS:ebay.com.my, DNS:ebay.com.ph, DNS:ebay.com.sg, DNS:ebay.de, DNS:ebay.es, DNS:ebay.fr, DNS:ebay.ie, DNS:ebay.in, DNS:ebay.io, DNS:ebay.it, DNS:ebay.nl, DNS:ebay.ph, DNS:ebay.pl, DNS:ebay.us, DNS:ebay.vn, DNS:shorturiweb.ebay.com, DNS:wwww.ebay.co.uk, DNS:wwww.ebay.com, DNS:wwww.ebay.com.au, DNS:wwww.ebay.de, DNS:wwww.ebay.in, DNS:wwww.ebay.it",
  "infoAccess": {
    "CA Issuers - URI": [
      "http://crt.sectigo.com/SectigoPublicServerAuthenticationCAOVR40.crt"
    ],
    "OCSP - URI": [
      "http://ocsp.sectigo.com"
    ]
  },
  "ca": false,
  "bits": 2048,
  "valid_from": "Oct  6 00:00:00 2026 GMT",
  "valid_to": "Apr 22 23:59:59 2027 GMT",
  "serialNumber": "19FD41E42C169CF248511D2BEE660A83",
  "domain": "ebay.com",
  "isExpired": false,
  "isValid": true,
  "daysUntilExpiry": 182,
  "isExpiringSoon": false,
  "isSelfSigned": false,
  "protocol": "TLSv1.3",
  "cipher": "TLS_AES_128_GCM_SHA256",
  "isTrusted": true,
  "trustError": null,
  "hostnameMatches": true,
  "chain": [
    {
      "subject": "ebay.com",
      "issuer": "Sectigo Public Server Authentication CA OV R40",
      "validTo": "Apr 22 23:59:59 2027 GMT",
      "isCA": false
    },
    {
      "subject": "Sectigo Public Server Authentication CA OV R40",
      "issuer": "Sectigo Public Server Authentication Root R46",
      "validTo": "May 13 23:59:59 2040 GMT",
      "isCA": true
    },
    {
      "subject": "Sectigo Public Server Authentication Root R46",
      "issuer": "USERTrust RSA Certification Authority",
      "validTo": "Jan 18 23:59:59 2038 GMT",
      "isCA": true
    },
    {
      "subject": "USERTrust RSA Certification Authority",
      "issuer": "USERTrust RSA Certification Authority",
      "validTo": "Jan 18 23:59:59 2038 GMT",
      "isCA": true
    }
  ],
  "keyType": "RSA",
  "signatureAlgorithm": "sha256WithRSAEncryption",
  "hasEmbeddedSCTs": true,
  "ocspStapled": true,
  "hsts": {
    "present": true,
    "maxAge": 31536000,
    "includeSubDomains": false,
    "preload": false
  }
}
↓ passes cert status to the next step
03
SPF ValidatorGET /v1/spfvalidator10 cr

Validate SPF

Confirm the SPF record exists, is valid, and has no lookup or syntax issues.

spf_validtruehas_issuesfalse
Sample response
{
  "host": "myspace.com",
  "has_spf_record": true,
  "dns_lookups_num": 9,
  "spf_record": "v=spf1 mx ip4:63.208.226.34 ip4:204.16.32.0/22 ip4:67.134.143.0/24 ip4:216.205.243.0/24 ip4:34.85.156.5/32 ip4:35.245.108.108/32 ip4:34.86.129.193/32 ip4:34.86.134.94/32 ip4:34.85.222.234/32 ip4:34.86.176.234/32 ip4:34.86.125.212/32 ip4:34.85.224.60/32 ip4:34.86.160.49/32 ip4:35.245.64.166/32 ip4:35.188.226.11/32 ip4:34.86.208.228/32 ip4:34.85.216.144/32 ip4:35.221.22.153/32 ip4:34.86.137.108/32 ip4:34.86.51.35/32 ip4:34.150.221.40/32 ip4:34.85.216.70/32 ip4:34.86.37.191/32 ip4:34.85.214.215/32 ip4:35.236.234.82/32 ip4:34.86.161.241/32 ip4:216.32.181.16 ip4:216.178.32.0/20 ip4:168.235.224.0/24 include:_netblocks.mimecast.com -all",
  "spf_records_list": [
    {
      "origin": "myspace.com",
      "record": "v=spf1 mx ip4:63.208.226.34 ip4:204.16.32.0/22 ip4:67.134.143.0/24 ip4:216.205.243.0/24 ip4:34.85.156.5/32 ip4:35.245.108.108/32 ip4:34.86.129.193/32 ip4:34.86.134.94/32 ip4:34.85.222.234/32 ip4:34.86.176.234/32 ip4:34.86.125.212/32 ip4:34.85.224.60/32 ip4:34.86.160.49/32 ip4:35.245.64.166/32 ip4:35.188.226.11/32 ip4:34.86.208.228/32 ip4:34.85.216.144/32 ip4:35.221.22.153/32 ip4:34.86.137.108/32 ip4:34.86.51.35/32 ip4:34.150.221.40/32 ip4:34.85.216.70/32 ip4:34.86.37.191/32 ip4:34.85.214.215/32 ip4:35.236.234.82/32 ip4:34.86.161.241/32 ip4:216.32.181.16 ip4:216.178.32.0/20 ip4:168.235.224.0/24 include:_netblocks.mimecast.com -all",
      "chars_num": 637,
      "use_macro": false,
      "domains": [
        "_netblocks.mimecast.com"
      ],
      "authorized_ips": {
        "ipv4": [
          "63.208.226.34",
          "204.16.32.0/22",
          "67.134.143.0/24",
          "216.205.243.0/24",
          "34.85.156.5/32",
          "35.245.108.108/32",
          "34.86.129.193/32",
          "34.86.134.94/32",
          "34.85.222.234/32",
          "34.86.176.234/32",
          "34.86.125.212/32",
          "34.85.224.60/32",
          "34.86.160.49/32",
          "35.245.64.166/32",
          "35.188.226.11/32",
          "34.86.208.228/32",
          "34.85.216.144/32",
          "35.221.22.153/32",
          "34.86.137.108/32",
          "34.86.51.35/32",
          "34.150.221.40/32",
          "34.85.216.70/32",
          "34.86.37.191/32",
          "34.85.214.215/32",
          "35.236.234.82/32",
          "34.86.161.241/32",
          "216.32.181.16",
          "216.178.32.0/20",
          "168.235.224.0/24"
        ]
      }
    },
    {
      "origin": "_netblocks.mimecast.com",
      "record": "v=spf1 include:eu._netblocks.mimecast.com include:us._netblocks.mimecast.com include:za._netblocks.mimecast.com include:de._netblocks.mimecast.com include:au._netblocks.mimecast.com include:ca._netblocks.mimecast.com include:usb._netblocks.mimecast.com ~all",
      "chars_num": 257,
      "use_macro": false,
      "domains": [
        "eu._netblocks.mimecast.com",
        "us._netblocks.mimecast.com",
        "za._netblocks.mimecast.com",
        "de._netblocks.mimecast.com",
        "au._netblocks.mimecast.com",
        "ca._netblocks.mimecast.com",
        "usb._netblocks.mimecast.com"
      ]
    },
    {
      "origin": "eu._netblocks.mimecast.com",
      "record": "v=spf1 ip4:195.130.217.0/24 ip4:91.220.42.0/24 ip4:146.101.78.0/24 ip4:207.82.80.0/24 ip4:213.167.81.0/25 ip4:193.7.207.0/25 ip4:213.167.75.0/25 ip4:185.58.85.0/24 ip4:185.58.86.0/24 ip4:193.7.206.0/25 ip4:147.28.36.0/24 ~all",
      "chars_num": 225,
      "use_macro": false,
      "authorized_ips": {
        "ipv4": [
          "195.130.217.0/24",
          "91.220.42.0/24",
          "146.101.78.0/24",
          "207.82.80.0/24",
          "213.167.81.0/25",
          "193.7.207.0/25",
          "213.167.75.0/25",
          "185.58.85.0/24",
          "185.58.86.0/24",
          "193.7.206.0/25",
          "147.28.36.0/24"
        ]
      }
    },
    {
      "origin": "us._netblocks.mimecast.com",
      "record": "v=spf1 ip4:207.211.31.0/25 ip4:205.139.110.0/24 ip4:216.205.24.0/24 ip4:170.10.129.0/24 ip4:63.128.21.0/24 ip4:170.10.133.0/24 ip4:185.58.84.93/32 ip4:207.211.41.113/32 ip4:207.211.30.64/26 ip4:207.211.30.128/25 ip4:216.145.221.0/24 ip4:170.10.128.0/24 ip4:170.10.132.56/29 ip4:170.10.132.64/29 ~all",
      "chars_num": 299,
      "use_macro": false,
      "authorized_ips": {
        "ipv4": [
          "207.211.31.0/25",
          "205.139.110.0/24",
          "216.205.24.0/24",
          "170.10.129.0/24",
          "63.128.21.0/24",
          "170.10.133.0/24",
          "185.58.84.93/32",
          "207.211.41.113/32",
          "207.211.30.64/26",
          "207.211.30.128/25",
          "216.145.221.0/24",
          "170.10.128.0/24",
          "170.10.132.56/29",
          "170.10.132.64/29"
        ]
      }
    },
    {
      "origin": "za._netblocks.mimecast.com",
      "record": "v=spf1 ip4:41.74.192.0/22 ip4:41.74.200.0/23 ip4:41.74.196.0/22 ip4:41.74.204.0/23 ip4:41.74.206.0/24 ~all",
      "chars_num": 106,
      "use_macro": false,
      "authorized_ips": {
        "ipv4": [
          "41.74.192.0/22",
          "41.74.200.0/23",
          "41.74.196.0/22",
          "41.74.204.0/23",
          "41.74.206.0/24"
        ]
      }
    },
    {
      "origin": "de._netblocks.mimecast.com",
      "record": "v=spf1 ip4:51.163.158.0/24 ip4:194.104.109.0/24 ip4:194.104.111.0/24 ip4:194.104.110.21/32 ip4:194.104.110.240/28 ip4:62.140.10.21/32 ip4:62.140.7.0/24 ip4:194.104.108.240/29 ip4:194.104.108.21/32 ip4:51.163.159.0/24 ~all",
      "chars_num": 221,
      "use_macro": false,
      "authorized_ips": {
        "ipv4": [
          "51.163.158.0/24",
          "194.104.109.0/24",
          "194.104.111.0/24",
          "194.104.110.21/32",
          "194.104.110.240/28",
          "62.140.10.21/32",
          "62.140.7.0/24",
          "194.104.108.240/29",
          "194.104.108.21/32",
          "51.163.159.0/24"
        ]
      }
    },
    {
      "origin": "au._netblocks.mimecast.com",
      "record": "v=spf1 ip4:103.13.69.0/24 ip4:124.47.150.0/24 ip4:124.47.189.0/24 ip4:103.96.23.0/24 ip4:103.96.21.0/24 ip4:180.189.28.0/24 ip4:216.145.217.0/24 ip4:103.96.22.96/28 ip4:103.96.22.22/32 ip4:103.96.20.22/32 ip4:103.96.20.96/28 ~all",
      "chars_num": 229,
      "use_macro": false,
      "authorized_ips": {
        "ipv4": [
          "103.13.69.0/24",
          "124.47.150.0/24",
          "124.47.189.0/24",
          "103.96.23.0/24",
          "103.96.21.0/24",
          "180.189.28.0/24",
          "216.145.217.0/24",
          "103.96.22.96/28",
          "103.96.22.22/32",
          "103.96.20.22/32",
          "103.96.20.96/28"
        ]
      }
    },
    {
      "origin": "ca._netblocks.mimecast.com",
      "record": "v=spf1 ip4:170.10.145.0/24 ip4:170.10.147.0/24 ip4:170.10.144.126/32 ip4:170.10.146.126/32 ip4:170.10.144.240/29 ip4:170.10.146.240/29 ip4:216.145.216.0/24 ~all",
      "chars_num": 160,
      "use_macro": false,
      "authorized_ips": {
        "ipv4": [
          "170.10.145.0/24",
          "170.10.147.0/24",
          "170.10.144.126/32",
          "170.10.146.126/32",
          "170.10.144.240/29",
          "170.10.146.240/29",
          "216.145.216.0/24"
        ]
      }
    },
    {
      "origin": "usb._netblocks.mimecast.com",
      "record": "v=spf1 ip4:170.10.151.0/24 ip4:170.10.153.0/24 ip4:170.10.150.240/29 ip4:170.10.152.240/29 ip4:170.10.156.0/24 ip4:170.10.157.0/24 ~all",
      "chars_num": 135,
      "use_macro": false,
      "authorized_ips": {
        "ipv4": [
          "170.10.151.0/24",
          "170.10.153.0/24",
          "170.10.150.240/29",
          "170.10.152.240/29",
          "170.10.156.0/24",
          "170.10.157.0/24"
        ]
      }
    }
  ],
  "domains_extracted": [
    "myspace.com",
    "_netblocks.mimecast.com",
    "eu._netblocks.mimecast.com",
    "us._netblocks.mimecast.com",
    "za._netblocks.mimecast.com",
    "de._netblocks.mimecast.com",
    "au._netblocks.mimecast.com",
    "ca._netblocks.mimecast.com",
    "usb._netblocks.mimecast.com"
  ],
  "authorized_ips": {
    "ipv4": [
      "63.208.226.34",
      "204.16.32.0/22",
      "67.134.143.0/24",
      "216.205.243.0/24",
      "34.85.156.5/32",
      "35.245.108.108/32",
      "34.86.129.193/32",
      "34.86.134.94/32",
      "34.85.222.234/32",
      "34.86.176.234/32",
      "34.86.125.212/32",
      "34.85.224.60/32",
      "34.86.160.49/32",
      "35.245.64.166/32",
      "35.188.226.11/32",
      "34.86.208.228/32",
      "34.85.216.144/32",
      "35.221.22.153/32",
      "34.86.137.108/32",
      "34.86.51.35/32",
      "34.150.221.40/32",
      "34.85.216.70/32",
      "34.86.37.191/32",
      "34.85.214.215/32",
      "35.236.234.82/32",
      "34.86.161.241/32",
      "216.32.181.16",
      "216.178.32.0/20",
      "168.235.224.0/24",
      "195.130.217.0/24",
      "91.220.42.0/24",
      "146.101.78.0/24",
      "207.82.80.0/24",
      "213.167.81.0/25",
      "193.7.207.0/25",
      "213.167.75.0/25",
      "185.58.85.0/24",
      "185.58.86.0/24",
      "193.7.206.0/25",
      "147.28.36.0/24",
      "207.211.31.0/25",
      "205.139.110.0/24",
      "216.205.24.0/24",
      "170.10.129.0/24",
      "63.128.21.0/24",
      "170.10.133.0/24",
      "185.58.84.93/32",
      "207.211.41.113/32",
      "207.211.30.64/26",
      "207.211.30.128/25",
      "216.145.221.0/24",
      "170.10.128.0/24",
      "170.10.132.56/29",
      "170.10.132.64/29",
      "41.74.192.0/22",
      "41.74.200.0/23",
      "41.74.196.0/22",
      "41.74.204.0/23",
      "41.74.206.0/24",
      "51.163.158.0/24",
      "194.104.109.0/24",
      "194.104.111.0/24",
      "194.104.110.21/32",
      "194.104.110.240/28",
      "62.140.10.21/32",
      "62.140.7.0/24",
      "194.104.108.240/29",
      "194.104.108.21/32",
      "51.163.159.0/24",
      "103.13.69.0/24",
      "124.47.150.0/24",
      "124.47.189.0/24",
      "103.96.23.0/24",
      "103.96.21.0/24",
      "180.189.28.0/24",
      "216.145.217.0/24",
      "103.96.22.96/28",
      "103.96.22.22/32",
      "103.96.20.22/32",
      "103.96.20.96/28",
      "170.10.145.0/24",
      "170.10.147.0/24",
      "170.10.144.126/32",
      "170.10.146.126/32",
      "170.10.144.240/29",
      "170.10.146.240/29",
      "216.145.216.0/24",
      "170.10.151.0/24",
      "170.10.153.0/24",
      "170.10.150.240/29",
      "170.10.152.240/29",
      "170.10.156.0/24",
      "170.10.157.0/24"
    ],
    "ipv6": []
  },
  "issues_found": [],
  "spf_valid": true,
  "has_issues": false,
  "macros_found": false,
  "ip_pass": false,
  "elapsed_ms": 431,
  "all_qualifier": "fail",
  "risk_score": 5,
  "risk_level": "low"
}
↓ passes sender policy to the next step
04
DMARC ValidatorGET /v1/dmarcvalidator10 cr

Validate DMARC

Check the DMARC record and policy — the difference between spoofable and protected.

hasDmarctrueprejectvalidtrue
Sample response
{
  "host": "paypal.com",
  "dmarcHost": "_dmarc.paypal.com",
  "hasDmarc": true,
  "dmarc_record": "v=DMARC1; p=reject; rua=mailto:d@rua.agari.com,mailto:dmarc_agg@vali.email; ruf=mailto:d@ruf.agari.com,mailto:MTc4Mzcw@ruf.vali.email",
  "rua": {
    "email": "d@rua.agari.com,dmarc_agg@vali.email",
    "domain": "rua.agari.com",
    "valid": true
  },
  "ruf": {
    "email": "d@ruf.agari.com,MTc4Mzcw@ruf.vali.email",
    "domain": "ruf.agari.com",
    "valid": true
  },
  "v": "DMARC1",
  "p": "reject",
  "sp": null,
  "pct": null,
  "adkim": null,
  "aspf": null,
  "fo": null,
  "rf": null,
  "ri": null,
  "valid": true,
  "issues": [],
  "isEnforced": true,
  "riskScore": 5,
  "riskLevel": "low"
}
↓ passes auth posture to the next step
05
Domain ExpirationGET /v1/domainexpiration10 cr

Check expiration

Read the registration expiry and days remaining so a domain never lapses on your watch.

expirationStatushealthydaysToExpiration1164
Sample response
{
  "domain": "myspace.com",
  "expirationDate": "2029-02-23T05:00:00Z",
  "daysToExpiration": 1164,
  "expirationStatus": "healthy",
  "createdDate": "1996-02-22T05:00:00Z",
  "lastUpdatedDate": "2023-01-17T00:16:21Z",
  "daysSinceLastUpdate": 1064,
  "domainAgeDays": 10890,
  "domainAgeYears": 29.8
}

Recipe questions.

What to know before you wire it up.

Talk to the team →
Can I run this on a schedule?
Yes — that's the intended use. Call the recipe from a cron job, a serverless function, or an automation platform daily or weekly and alert when any check regresses.
Does it work for domains I don't own?
These are all public DNS and certificate lookups, so you can monitor vendor and partner domains too — useful for supply-chain and deliverability monitoring.
What counts as a failing report?
That's your call: common triggers are an expired or soon-to-expire certificate, a missing or invalid SPF/DMARC record, or a domain within N days of expiration.

Cook this in an afternoon. Every API in this recipe shares one key, one response shape, and one bill.

Swap in your own APIs

Every step is a catalog API — mix and match freely.

Browse the catalog