Skip to content
Start here

Email Auth

Email AuthDMARC Reports

Get DMARC Report Status
client.emailAuth.dmarcReports.get(DMARCReportGetParams { zone_id } params, RequestOptionsoptions?): DMARCReportGetResponse { approved_sources, created, created_at, 9 more }
GET/zones/{zone_id}/email/auth/dmarc-reports
Configure DMARC Reports
client.emailAuth.dmarcReports.edit(DMARCReportEditParams { zone_id, enabled, skip_wizard } params, RequestOptionsoptions?): DMARCReportEditResponse { approved_sources, created, created_at, 9 more }
PATCH/zones/{zone_id}/email/auth/dmarc-reports
ModelsExpand Collapse
DMARCReportGetResponse { approved_sources, created, created_at, 9 more }

Response for GET/PATCH /dmarc-reports

approved_sources?: Array<ApprovedSource>

List of approved sending sources (omitted when empty)

Deprecatedcreated?: string

Use created_at instead.

Deprecated, use created_at

formatdate-time
created_at?: string

Creation timestamp

formatdate-time
domain?: string

The source domain

ips?: Array<string>

Resolved IP addresses from SPF

Deprecatedmodified?: string

Use modified_at instead.

Deprecated, use modified_at

formatdate-time
modified_at?: string

Last modification timestamp

formatdate-time
name?: string

Source name (typically same as domain)

slug?: string

URL-friendly identifier

tag?: string

Source UUID

Deprecatedcreated?: string

Use created_at instead.

Deprecated, use created_at

formatdate-time
created_at?: string

Creation timestamp

formatdate-time
enabled?: boolean

Whether DMARC reports are enabled

Deprecatedmodified?: string

Use modified_at instead.

Deprecated, use modified_at

formatdate-time
modified_at?: string

Last modification timestamp

formatdate-time
records?: Records { bimi_records, cname_dkim_records, cname_dmarc_records, 5 more }

Live DNS records for the zone, grouped by type

bimi_records?: Array<BimiRecord>

BIMI TXT records

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

cname_dkim_records?: Array<CnamedkimRecord>

CNAME records for DKIM selectors. Each selector is resolved independently; when a selector’s CNAME resolves to a DKIM TXT record, the API returns that record’s content in the resolved field of the corresponding entry.

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

cname_dmarc_records?: Array<CnamedmarcRecord>

CNAME records at _dmarc. When such a CNAME resolves to a DMARC TXT record, the API returns that record’s content in the resolved field of the corresponding entry.

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

cname_spf_records?: Array<CnamespfRecord>

CNAME records at the zone apex. When such a CNAME resolves to an SPF TXT record, the API returns that record’s content in the resolved field of the corresponding entry.

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

dkim_records?: Array<DKIMRecord>

DKIM TXT records

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

dmarc_records?: Array<DMARCRecord>

DMARC TXT records

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

Deprecatedresolved_dmarc_records?: Array<ResolvedDMARCRecord>

Use the resolved field on the corresponding entry in cname_dmarc_records instead.

DMARC records that a recursive lookup of _dmarc.{zone} returned. The API populates this only when the zone lacks a DMARC TXT record of its own, which usually means a CNAME delegates DMARC to another zone.

content?: string

The TXT record value. The API joins all character-strings into a single string.

name?: string

The name the API queried.

spf_records?: Array<SPFRecord>

SPF TXT records

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

rua_prefix?: string

Prefix for DMARC RUA addresses (32-char hex string)

skip_wizard?: boolean

Whether to skip the setup wizard

status?: "missing-dmarc-report" | "multiple-dmarc-reports" | "missing-dmarc-rua" | 2 more

DMARC configuration status. The API omits this field when DMARC is correctly configured. If the zone lacks a DMARC TXT record of its own, the API resolves _dmarc.{zone} recursively and evaluates whatever that lookup returns. A CNAME at _dmarc.{zone} that points to a valid DMARC record is therefore healthy; the cname-on-dmarc-record value means the CNAME resolves to no DMARC record at all.

One of the following:
"missing-dmarc-report"
"multiple-dmarc-reports"
"missing-dmarc-rua"
"cname-on-dmarc-record"
"unauthorized-reporting-domain"
Deprecatedtag?: string

Use zone_id instead.

Use zone_id instead

zone_id?: string

Zone identifier

DMARCReportEditResponse { approved_sources, created, created_at, 9 more }

Response for GET/PATCH /dmarc-reports

approved_sources?: Array<ApprovedSource>

List of approved sending sources (omitted when empty)

Deprecatedcreated?: string

Use created_at instead.

Deprecated, use created_at

formatdate-time
created_at?: string

Creation timestamp

formatdate-time
domain?: string

The source domain

ips?: Array<string>

Resolved IP addresses from SPF

Deprecatedmodified?: string

Use modified_at instead.

Deprecated, use modified_at

formatdate-time
modified_at?: string

Last modification timestamp

formatdate-time
name?: string

Source name (typically same as domain)

slug?: string

URL-friendly identifier

tag?: string

Source UUID

Deprecatedcreated?: string

Use created_at instead.

Deprecated, use created_at

formatdate-time
created_at?: string

Creation timestamp

formatdate-time
enabled?: boolean

Whether DMARC reports are enabled

Deprecatedmodified?: string

Use modified_at instead.

Deprecated, use modified_at

formatdate-time
modified_at?: string

Last modification timestamp

formatdate-time
records?: Records { bimi_records, cname_dkim_records, cname_dmarc_records, 5 more }

Live DNS records for the zone, grouped by type

bimi_records?: Array<BimiRecord>

BIMI TXT records

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

cname_dkim_records?: Array<CnamedkimRecord>

CNAME records for DKIM selectors. Each selector is resolved independently; when a selector’s CNAME resolves to a DKIM TXT record, the API returns that record’s content in the resolved field of the corresponding entry.

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

cname_dmarc_records?: Array<CnamedmarcRecord>

CNAME records at _dmarc. When such a CNAME resolves to a DMARC TXT record, the API returns that record’s content in the resolved field of the corresponding entry.

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

cname_spf_records?: Array<CnamespfRecord>

CNAME records at the zone apex. When such a CNAME resolves to an SPF TXT record, the API returns that record’s content in the resolved field of the corresponding entry.

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

dkim_records?: Array<DKIMRecord>

DKIM TXT records

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

dmarc_records?: Array<DMARCRecord>

DMARC TXT records

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

Deprecatedresolved_dmarc_records?: Array<ResolvedDMARCRecord>

Use the resolved field on the corresponding entry in cname_dmarc_records instead.

DMARC records that a recursive lookup of _dmarc.{zone} returned. The API populates this only when the zone lacks a DMARC TXT record of its own, which usually means a CNAME delegates DMARC to another zone.

content?: string

The TXT record value. The API joins all character-strings into a single string.

name?: string

The name the API queried.

spf_records?: Array<SPFRecord>

SPF TXT records

id?: string

DNS record ID

content?: string

Record content

name?: string

DNS record name

resolved?: Array<string> | null

For a CNAME record, the TXT content(s) found by following the CNAME chain to its target. An empty array means the chain was resolved but nothing usable was found there; omitted/null means resolution was not attempted for this record (always the case for non-CNAME entries). A CNAME chain that terminates in more than one TXT value at the target yields multiple entries. Populated on entries in cname_dmarc_records, cname_spf_records, and cname_dkim_records.

ttl?: number

Time to live in seconds

type?: string

Record type

rua_prefix?: string

Prefix for DMARC RUA addresses (32-char hex string)

skip_wizard?: boolean

Whether to skip the setup wizard

status?: "missing-dmarc-report" | "multiple-dmarc-reports" | "missing-dmarc-rua" | 2 more

DMARC configuration status. The API omits this field when DMARC is correctly configured. If the zone lacks a DMARC TXT record of its own, the API resolves _dmarc.{zone} recursively and evaluates whatever that lookup returns. A CNAME at _dmarc.{zone} that points to a valid DMARC record is therefore healthy; the cname-on-dmarc-record value means the CNAME resolves to no DMARC record at all.

One of the following:
"missing-dmarc-report"
"multiple-dmarc-reports"
"missing-dmarc-rua"
"cname-on-dmarc-record"
"unauthorized-reporting-domain"
Deprecatedtag?: string

Use zone_id instead.

Use zone_id instead

zone_id?: string

Zone identifier

Email AuthSPF

Email AuthSPFInspect

Inspect SPF Record
client.emailAuth.spf.inspect.get(InspectGetParams { zone_id, id } params, RequestOptionsoptions?): InspectGetResponse { components, domain, record, 2 more }
GET/zones/{zone_id}/email/auth/spf/inspect
ModelsExpand Collapse
InspectGetResponse { components, domain, record, 2 more }

Recursive SPF inspection tree

components: Array<unknown>

Parsed SPF components (mechanisms)

domain: string

Domain being inspected

record: string

Raw SPF record content

total_lookups: number

Total number of DNS lookups performed across all includes

errors?: Array<Error>

All errors encountered during inspection, collected from the entire tree. This includes errors from nested includes at any depth, providing a quick overview of all issues without needing to traverse the nested structure. Each error includes a domain field to identify where it occurred. Empty array if no errors (omitted from JSON when empty).

code: string

Error code. Known values:

  • lookup_failed — DNS TXT lookup failed
  • spf_not_found — no SPF record found
  • invalid_spf — record does not start with v=spf1
  • invalid_domain — PSL validation failed
  • loop_detected — include/redirect cycle detected
  • invalid_mechanism — unrecognised or malformed mechanism
  • resource_limit_exceeded — internal resource protection limits exceeded (recursion depth or query budget)
  • max_lookups — RFC 7208 10-lookup limit exceeded
domain: string

Domain where the error occurred

message: string

Human-readable error message

details?: string

Additional error-specific details (optional).

  • For invalid_domain errors: the invalid domain string
  • For invalid_mechanism errors: the invalid mechanism text (e.g., “invalidmech123”)
  • For loop_detected errors: the domain that caused the loop
  • For other error types: not present