Security & Trust · DomScan product

Email Authentication API

Analyze email authentication records including SPF, DKIM, and DMARC.

What you get

Analyze email authentication records including SPF, DKIM, and DMARC.

SynchronousBulkRESTMCPSDKInteractive tool

Choose this product when

Who it is for

Use bounded passive checks to enrich triage and investigation, not to replace authorized testing or human review.

Choose this product when

Choose this to inspect SPF, DKIM, DMARC, and related email-authentication posture for a domain.

What you get

Analyze email authentication records including SPF, DKIM, and DMARC.

Endpoints

Review the supported operations, inputs, outputs, execution modes, and response limits before integrating.

GET /v1/email-auth View API reference
POST /v1/email-auth/bulk View API reference
POST /v1/tools/spf/build View API reference
POST /v1/tools/spf/validate View API reference
POST /v1/tools/spf/flatten View API reference
POST /v1/tools/dmarc/build View API reference
POST /v1/tools/dmarc/validate View API reference
GET /v1/tools/dkim/check View API reference
GET /v1/tools/dkim/discover View API reference

Credits and authentication

1-3 Authentication required. Check the operation reference for the exact cost and any per-item pricing.

Example operation

Use documented operations to collect, assess, enrich, verify, compare, protect, or monitor public evidence.

GET /v1/email-auth

Query Parameters

Parameter Type required
domain string required
selectors string optional

Response Fields

Field Type
domain string
spf object
spf.record string | null
spf.lookup_estimate integer
spf.includes[] string[]
spf.redirect string | null
spf.macros_present boolean
spf.macro_references[] string[]
spf.lookup_walk_count integer
spf.lookup_limit_exceeded boolean
spf.walk[] object[]
spf.walk[] object
spf.walk[].domain string
spf.walk[].depth integer
spf.walk[].record string
spf.walk[].mechanisms[] string[]
spf.walk[].includes[] string[]
spf.walk[].redirect string | null
spf.walk[].direct_lookup_count integer
spf.walk[].total_lookup_count integer
spf.walk[].macros_present boolean
spf.walk[].macro_references[] string[]
spf.walk[].multiple_records integer
spf.walk_errors[] string[]
spf.lookup_tree object
spf.lookup_tree.root_domain string
spf.lookup_tree.node_count integer
spf.lookup_tree.max_depth integer
spf.lookup_tree.cycles_detected[] string[]
spf.lookup_tree.nodes[] object[]
spf.lookup_tree.nodes[] object
spf.lookup_tree.nodes[].domain string
spf.lookup_tree.nodes[].depth integer
spf.lookup_tree.nodes[].status string
spf.lookup_tree.nodes[].direct_lookup_count integer
spf.lookup_tree.nodes[].total_lookup_count integer
spf.lookup_tree.nodes[].includes[] string[]
spf.lookup_tree.nodes[].redirect string | null
spf.lookup_tree.nodes[].mechanisms[] string[]
spf.lookup_tree.nodes[].errors[] string[]
spf.lookup_tree.edges[] object[]
spf.lookup_tree.edges[] object
spf.lookup_tree.edges[].from string
spf.lookup_tree.edges[].to string
spf.lookup_tree.edges[].type string
dkim[] object[]
dkim[] object
dkim[].selector string
dkim[].record string | null
dkim[].key_type string | null
dkim[].key_size integer | null
dkim_audit object
dkim_audit.selectors_checked[] string[]
dkim_audit.selectors_found[] object[]
dkim_audit.selectors_found[] object
dkim_audit.selectors_found[].selector string
dkim_audit.selectors_found[].dns_name string
dkim_audit.selectors_found[].record string | null
dkim_audit.selectors_found[].record_type string | null
dkim_audit.selectors_found[].cname_targets[] string[]
dkim_audit.selectors_found[].provider_hint string | null
dkim_audit.selectors_found[].key_type string | null
dkim_audit.selectors_found[].key_size integer | null
dkim_audit.selectors_found[].valid boolean
dkim_audit.selectors_found[].revoked boolean
dkim_audit.selectors_found[].weak boolean
dkim_audit.selectors_found[].hash_algorithms[] string[]
dkim_audit.selectors_found[].service_type string | null
dkim_audit.selectors_found[].flags[] string[]
dkim_audit.selectors_found[].issues[] string[]
dkim_audit.total_found integer
dkim_audit.providers_detected[] string[]
dkim_audit.valid_selector_count integer
dkim_audit.weak_selector_count integer
dkim_audit.revoked_selector_count integer
bimi object
bimi.exists boolean
bimi.record string | null
bimi.valid boolean
bimi.logo_url string | null
bimi.authority_url string | null
bimi.logo_fetch_ok boolean | null
bimi.logo_http_status integer | null
bimi.logo_content_type string | null
bimi.logo_bytes integer | null
bimi.logo_svg_detected boolean | null
bimi.vmc_present boolean
bimi.vmc_fetched boolean | null
bimi.vmc_http_status integer | null
bimi.vmc_content_type string | null
bimi.vmc_certificate_valid boolean | null
bimi.vmc_subject string | null
bimi.vmc_issuer string | null
bimi.vmc_not_before string | null
bimi.vmc_not_after string | null
bimi.vmc_days_to_expiry integer | null
bimi.vmc_fingerprint_sha256 string | null
bimi.vmc_san_domains[] string[]
bimi.errors[] string[]
dmarc object
dmarc.record string | null
dmarc.tags object
mta_sts object
mta_sts.exists boolean
mta_sts.record string | null
mta_sts.valid boolean
mta_sts.policy_id string | null
mta_sts.policy_fetch_ok boolean
mta_sts.policy_http_status integer | null
mta_sts.mode string | null
mta_sts.max_age integer | null
mta_sts.mx_hosts[] string[]
mta_sts.mx_records[] string[]
mta_sts.policy_matches_mx boolean | null
mta_sts.uncovered_mx[] string[]
mta_sts.errors[] string[]
tls_rpt object
tls_rpt.exists boolean
tls_rpt.record string | null
tls_rpt.valid boolean
tls_rpt.rua[] string[]
tls_rpt.errors[] string[]
client_access object
client_access.provider_hint object
client_access.provider_hint.id string
client_access.provider_hint.name string
client_access.mx_records[] string[]
client_access.services[] object[]
client_access.services[] object
client_access.services[].service string
client_access.services[].host string
client_access.services[].port integer
client_access.services[].source string
client_access.services[].priority integer | null
client_access.services[].weight integer | null
client_access.services[].tls_mode string
client_access.services[].reachable boolean
client_access.services[].tls_negotiated boolean
client_access.services[].starttls_offered boolean | null
client_access.services[].protocol string | null
client_access.services[].cipher string | null
client_access.services[].certificate object
client_access.services[].certificate.subject string
client_access.services[].certificate.issuer string
client_access.services[].certificate.not_before string
client_access.services[].certificate.not_after string
client_access.services[].certificate.days_to_expiry integer
client_access.services[].certificate.expired boolean
client_access.services[].certificate.san_domains[] string[]
client_access.services[].certificate.public_key_type string | null
client_access.services[].certificate.public_key_bits integer | null
client_access.services[].certificate.fingerprint_sha256 string | null
client_access.services[].certificate.hostname_match boolean | null
client_access.services[].certificate.chain_valid boolean
client_access.services[].certificate.chain_error string | null
client_access.services[].chain_depth integer
client_access.services[].error string | null
client_access.reachable_service_count integer
client_access.secure_service_count integer
autodiscover object
autodiscover.provider_hint object
autodiscover.provider_hint.id string
autodiscover.provider_hint.name string
autodiscover.mx_records[] string[]
autodiscover.srv object
autodiscover.srv.autodiscover[] object[]
autodiscover.srv.autodiscover[] object
autodiscover.srv.autodiscover[].priority integer
autodiscover.srv.autodiscover[].weight integer
autodiscover.srv.autodiscover[].port integer
autodiscover.srv.autodiscover[].target string
autodiscover.srv.submission[] object[]
autodiscover.srv.submission[] object
autodiscover.srv.submission[].priority integer
autodiscover.srv.submission[].weight integer
autodiscover.srv.submission[].port integer
autodiscover.srv.submission[].target string
autodiscover.srv.submissions[] object[]
autodiscover.srv.submissions[] object
autodiscover.srv.submissions[].priority integer
autodiscover.srv.submissions[].weight integer
autodiscover.srv.submissions[].port integer
autodiscover.srv.submissions[].target string
autodiscover.srv.imap[] object[]
autodiscover.srv.imap[] object
autodiscover.srv.imap[].priority integer
autodiscover.srv.imap[].weight integer
autodiscover.srv.imap[].port integer
autodiscover.srv.imap[].target string
autodiscover.srv.imaps[] object[]
autodiscover.srv.imaps[] object
autodiscover.srv.imaps[].priority integer
autodiscover.srv.imaps[].weight integer
autodiscover.srv.imaps[].port integer
autodiscover.srv.imaps[].target string
autodiscover.srv.pop3[] object[]
autodiscover.srv.pop3[] object
autodiscover.srv.pop3[].priority integer
autodiscover.srv.pop3[].weight integer
autodiscover.srv.pop3[].port integer
autodiscover.srv.pop3[].target string
autodiscover.srv.pop3s[] object[]
autodiscover.srv.pop3s[] object
autodiscover.srv.pop3s[].priority integer
autodiscover.srv.pop3s[].weight integer
autodiscover.srv.pop3s[].port integer
autodiscover.srv.pop3s[].target string
autodiscover.thunderbird_autoconfig object
autodiscover.thunderbird_autoconfig.subdomain object
autodiscover.thunderbird_autoconfig.subdomain.url string
autodiscover.thunderbird_autoconfig.subdomain.status_code integer | null
autodiscover.thunderbird_autoconfig.subdomain.content_type string | null
autodiscover.thunderbird_autoconfig.subdomain.final_url string | null
autodiscover.thunderbird_autoconfig.subdomain.redirect_count integer
autodiscover.thunderbird_autoconfig.subdomain.incoming[] object[]
autodiscover.thunderbird_autoconfig.subdomain.incoming[] object
autodiscover.thunderbird_autoconfig.subdomain.incoming[].type string
autodiscover.thunderbird_autoconfig.subdomain.incoming[].hostname string
autodiscover.thunderbird_autoconfig.subdomain.incoming[].port integer
autodiscover.thunderbird_autoconfig.subdomain.incoming[].socket_type string
autodiscover.thunderbird_autoconfig.subdomain.incoming[].username string
autodiscover.thunderbird_autoconfig.subdomain.outgoing[] object[]
autodiscover.thunderbird_autoconfig.subdomain.outgoing[] object
autodiscover.thunderbird_autoconfig.subdomain.outgoing[].type string
autodiscover.thunderbird_autoconfig.subdomain.outgoing[].hostname string
autodiscover.thunderbird_autoconfig.subdomain.outgoing[].port integer
autodiscover.thunderbird_autoconfig.subdomain.outgoing[].socket_type string
autodiscover.thunderbird_autoconfig.subdomain.outgoing[].username string
autodiscover.thunderbird_autoconfig.subdomain.error string | null
autodiscover.thunderbird_autoconfig.well_known object
autodiscover.thunderbird_autoconfig.well_known.url string
autodiscover.thunderbird_autoconfig.well_known.status_code integer | null
autodiscover.thunderbird_autoconfig.well_known.content_type string | null
autodiscover.thunderbird_autoconfig.well_known.final_url string | null
autodiscover.thunderbird_autoconfig.well_known.redirect_count integer
autodiscover.thunderbird_autoconfig.well_known.incoming[] object[]
autodiscover.thunderbird_autoconfig.well_known.incoming[] object
autodiscover.thunderbird_autoconfig.well_known.incoming[].type string
autodiscover.thunderbird_autoconfig.well_known.incoming[].hostname string
autodiscover.thunderbird_autoconfig.well_known.incoming[].port integer
autodiscover.thunderbird_autoconfig.well_known.incoming[].socket_type string
autodiscover.thunderbird_autoconfig.well_known.incoming[].username string
autodiscover.thunderbird_autoconfig.well_known.outgoing[] object[]
autodiscover.thunderbird_autoconfig.well_known.outgoing[] object
autodiscover.thunderbird_autoconfig.well_known.outgoing[].type string
autodiscover.thunderbird_autoconfig.well_known.outgoing[].hostname string
autodiscover.thunderbird_autoconfig.well_known.outgoing[].port integer
autodiscover.thunderbird_autoconfig.well_known.outgoing[].socket_type string
autodiscover.thunderbird_autoconfig.well_known.outgoing[].username string
autodiscover.thunderbird_autoconfig.well_known.error string | null
autodiscover.outlook_autodiscover object
autodiscover.outlook_autodiscover.url string
autodiscover.outlook_autodiscover.status_code integer | null
autodiscover.outlook_autodiscover.content_type string | null
autodiscover.outlook_autodiscover.final_url string | null
autodiscover.outlook_autodiscover.redirect_count integer
autodiscover.outlook_autodiscover.auth_required boolean | null
autodiscover.outlook_autodiscover.error string | null
autodiscover.recommended[] object[]
autodiscover.recommended[] object
autodiscover.recommended[].service string
autodiscover.recommended[].host string
autodiscover.recommended[].port integer
autodiscover.recommended[].tls_mode string
autodiscover.recommended[].source string
edge_summary object
edge_summary.relay_configured boolean
edge_summary.evidence_sources[] string[]
edge_summary.spf_lookup_count integer | null
edge_summary.spf_lookup_limit_exceeded boolean
edge_summary.dkim_valid_selector_count integer
edge_summary.dkim_weak_selector_count integer
edge_summary.dkim_revoked_selector_count integer
edge_summary.providers_detected[] string[]
edge_summary.mta_sts_enforced boolean
edge_summary.tls_rpt_configured boolean
edge_summary.bimi_logo_verified boolean | null
edge_summary.vmc_certificate_valid boolean | null
edge_summary.client_access_reachable_services integer | null
edge_summary.client_access_secure_services integer | null
edge_summary.autodiscover_recommendation_count integer | null
provider_selector_recommendations[] object[]
provider_selector_recommendations[] object
provider_selector_recommendations[].provider string
provider_selector_recommendations[].selectors[] string[]
provider_selector_recommendations[].source string
provider_selector_recommendations[].checked_selectors[] string[]
provider_selector_recommendations[].found_selectors[] string[]
provider_selector_recommendations[].missing_selectors[] string[]
grade string
notes[] string[]

Example Request

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/email-auth?domain=example.com&selectors=google%2Cselector1%2Csendgrid"

Example Response

{
  "domain": "google.com",
  "spf": {
    "record": "v=spf1 include:_spf.google.com ~all",
    "lookup_estimate": 1,
    "includes": [
      "_spf.google.com"
    ],
    "redirect": null,
    "macros_present": false,
    "macro_references": [],
    "lookup_walk_count": 1,
    "lookup_limit_exceeded": false,
    "walk": [
      {
        "domain": "google.com",
        "depth": 0,
        "record": "v=spf1 include:_spf.google.com ~all",
        "mechanisms": [
          "include:_spf.google.com",
          "~all"
        ],
        "includes": [
          "_spf.google.com"
        ],
        "redirect": null,
        "direct_lookup_count": 1,
        "total_lookup_count": 1,
        "macros_present": false,
        "macro_references": [],
        "multiple_records": 1
      }
    ],
    "walk_errors": [],
    "lookup_tree": {
      "root_domain": "google.com",
      "node_count": 1,
      "max_depth": 0,
      "cycles_detected": [],
      "nodes": [
        {
          "domain": "google.com",
          "depth": 0,
          "status": "present",
          "direct_lookup_count": 1,
          "total_lookup_count": 1,
          "includes": [
            "_spf.google.com"
          ],
          "redirect": null,
          "mechanisms": [
            "include:_spf.google.com",
            "~all"
          ],
          "errors": []
        }
      ],
      "edges": [
        {
          "from": "google.com",
          "to": "_spf.google.com",
          "type": "include"
        }
      ]
    }
  },
  "dkim": [
    {
      "selector": "google",
      "record": "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A",
      "key_type": "rsa",
      "key_size": 2048
    }
  ],
  "dkim_audit": {
    "selectors_checked": [
      "google",
      "default",
      "selector1",
      "selector2"
    ],
    "selectors_found": [
      {
        "selector": "google",
        "dns_name": "google._domainkey.google.com",
        "record": "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A",
        "record_type": "TXT",
        "cname_targets": [],
        "provider_hint": "Google Workspace",
        "key_type": "rsa",
        "key_size": 2048,
        "valid": true,
        "revoked": false,
        "weak": false,
        "hash_algorithms": [
          "sha256"
        ],
        "service_type": "email",
        "flags": [
          "s"
        ],
        "issues": []
      }
    ],
    "total_found": 1,
    "providers_detected": [
      "Google Workspace"
    ],
    "valid_selector_count": 1,
    "weak_selector_count": 0,
    "revoked_selector_count": 0
  },
  "bimi": {
    "exists": true,
    "record": "v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/vmc.pem",
    "valid": true,
    "logo_url": "https://example.com/logo.svg",
    "authority_url": "https://example.com/vmc.pem",
    "logo_fetch_ok": true,
    "logo_http_status": 200,
    "logo_content_type": "image/svg+xml",
    "logo_bytes": 2048,
    "logo_svg_detected": true,
    "vmc_present": true,
    "vmc_fetched": true,
    "vmc_http_status": 200,
    "vmc_content_type": "application/x-pem-file",
    "vmc_certificate_valid": true,
    "vmc_subject": "/CN=Example Inc VMC",
    "vmc_issuer": "/CN=Example Issuer",
    "vmc_not_before": "2026-01-01T00:00:00Z",
    "vmc_not_after": "2027-01-01T00:00:00Z",
    "vmc_days_to_expiry": 258,
    "vmc_fingerprint_sha256": "AA:BB:CC:DD",
    "vmc_san_domains": [
      "google.com"
    ],
    "errors": []
  },
  "dmarc": {
    "record": "v=DMARC1; p=reject; rua=mailto:[email protected]",
    "tags": {
      "v": "DMARC1",
      "p": "reject",
      "rua": "mailto:[email protected]"
    }
  },
  "mta_sts": {
    "exists": true,
    "record": "v=STSv1; id=2024010101Z",
    "valid": true,
    "policy_id": "2024010101Z",
    "policy_fetch_ok": true,
    "policy_http_status": 200,
    "mode": "enforce",
    "max_age": 86400,
    "mx_hosts": [
      "*.google.com"
    ],
    "mx_records": [
      "aspmx.l.google.com"
    ],
    "policy_matches_mx": true,
    "uncovered_mx": [],
    "errors": []
  },
  "tls_rpt": {
    "exists": true,
    "record": "v=TLSRPTv1; rua=mailto:[email protected]",
    "valid": true,
    "rua": [
      "mailto:[email protected]"
    ],
    "errors": []
  },
  "client_access": {
    "provider_hint": {
      "id": "google_workspace",
      "name": "Google Workspace"
    },
    "mx_records": [
      "aspmx.l.google.com"
    ],
    "services": [
      {
        "service": "imap",
        "host": "imap.gmail.com",
        "port": 993,
        "source": "provider_default",
        "priority": null,
        "weight": null,
        "tls_mode": "implicit",
        "reachable": true,
        "tls_negotiated": true,
        "starttls_offered": null,
        "protocol": "TLSv1.3",
        "cipher": "TLS_AES_256_GCM_SHA384",
        "certificate": {
          "subject": "/CN=imap.gmail.com",
          "issuer": "/CN=WR2",
          "not_before": "2026-01-01T00:00:00Z",
          "not_after": "2026-07-01T00:00:00Z",
          "days_to_expiry": 70,
          "expired": false,
          "san_domains": [
            "imap.gmail.com"
          ],
          "public_key_type": "EC",
          "public_key_bits": 256,
          "fingerprint_sha256": "CC:DD:EE:FF",
          "hostname_match": true,
          "chain_valid": true,
          "chain_error": null
        },
        "chain_depth": 2,
        "error": null
      }
    ],
    "reachable_service_count": 1,
    "secure_service_count": 1
  },
  "autodiscover": {
    "provider_hint": {
      "id": "google_workspace",
      "name": "Google Workspace"
    },
    "mx_records": [
      "aspmx.l.google.com"
    ],
    "srv": {
      "autodiscover": [],
      "submission": [],
      "submissions": [],
      "imap": [],
      "imaps": [],
      "pop3": [],
      "pop3s": []
    },
    "thunderbird_autoconfig": {
      "subdomain": {
        "url": "https://autoconfig.google.com/mail/config-v1.1.xml?emailaddress=postmaster%40google.com",
        "status_code": 404,
        "content_type": "text/html",
        "final_url": "https://autoconfig.google.com/mail/config-v1.1.xml?emailaddress=postmaster%40google.com",
        "redirect_count": 0,
        "incoming": [],
        "outgoing": [],
        "error": null
      },
      "well_known": {
        "url": "https://google.com/.well-known/autoconfig/mail/config-v1.1.xml?emailaddress=postmaster%40google.com",
        "status_code": 200,
        "content_type": "application/xml",
        "final_url": "https://google.com/.well-known/autoconfig/mail/config-v1.1.xml?emailaddress=postmaster%40google.com",
        "redirect_count": 0,
        "incoming": [
          {
            "type": "imap",
            "hostname": "imap.gmail.com",
            "port": 993,
            "socket_type": "SSL"
          }
        ],
        "outgoing": [
          {
            "type": "smtp",
            "hostname": "smtp.gmail.com",
            "port": 587,
            "socket_type": "STARTTLS"
          }
        ],
        "error": null
      }
    },
    "outlook_autodiscover": {
      "url": "https://autodiscover.google.com/autodiscover/autodiscover.xml",
      "status_code": 401,
      "content_type": "text/html",
      "final_url": "https://autodiscover.google.com/autodiscover/autodiscover.xml",
      "redirect_count": 0,
      "auth_required": true,
      "error": null
    },
    "recommended": [
      {
        "service": "imap",
        "host": "imap.gmail.com",
        "port": 993,
        "tls_mode": "implicit",
        "source": "provider_default"
      }
    ]
  },
  "edge_summary": {
    "relay_configured": true,
    "evidence_sources": [
      "spf_walk",
      "mail_policies",
      "bimi_audit",
      "dkim_audit",
      "mail_client_access",
      "mail_autodiscover"
    ],
    "spf_lookup_count": 1,
    "spf_lookup_limit_exceeded": false,
    "dkim_valid_selector_count": 1,
    "dkim_weak_selector_count": 0,
    "dkim_revoked_selector_count": 0,
    "providers_detected": [
      "Google Workspace"
    ],
    "mta_sts_enforced": true,
    "tls_rpt_configured": true,
    "bimi_logo_verified": true,
    "vmc_certificate_valid": true,
    "client_access_reachable_services": 1,
    "client_access_secure_services": 1,
    "autodiscover_recommendation_count": 1
  },
  "provider_selector_recommendations": [
    {
      "provider": "Google Workspace",
      "selectors": [
        "google",
        "20230601",
        "20210112"
      ],
      "source": "detected",
      "checked_selectors": [
        "google"
      ],
      "found_selectors": [
        "google"
      ],
      "missing_selectors": [
        "20230601",
        "20210112"
      ]
    }
  ],
  "grade": "A",
  "notes": []
}

Limits and evidence boundaries

Results describe observed public evidence and its provenance.
Unknown means the requested fact could not be determined from the available evidence.
Bulk operations process multiple supported inputs while preserving documented item-level outcomes.
Evidence can change over time; use timestamps and freshness fields when provided.

Reviewed 2026-08-22

Frequently asked questions

Where can I find the Email Authentication request and response reference?

Use the API reference for Email Authentication to review parameters, response fields, examples, status codes, and supported operation modes.

How should I interpret unknown or incomplete results from Email Authentication?

Unknown or partial results mean that the requested evidence could not be fully determined. Keep the result state, confidence, freshness, and limitations in downstream decisions.

How is Email Authentication priced?

Pricing depends on the operation and execution mode. Check the endpoint reference for the current credit cost, authentication requirement, and per-item rules.

Used by people at amazing companies

InstantOutseerMongoDBRespondentSage Expense ManagementInstantlyD.R. HortonWhatConvertsAdobeMotionElementsLLM Pulse