---
title: Configure DMARC Reports
---

[Skip to content](#%5Ftop) 

[API Reference](https://developers.cloudflare.com/api/python)

[Email Auth](https://developers.cloudflare.com/api/python/resources/email%5Fauth)

[DMARC Reports](https://developers.cloudflare.com/api/python/resources/email%5Fauth/subresources/dmarc%5Freports)

Copy Markdown

Open in **Claude**

Open in **ChatGPT**

Open in **Cursor**

---

**Copy Markdown**

**View as Markdown**

# Configure DMARC Reports

email\_auth.dmarc\_reports.edit(DMARCReportEditParams\*\*kwargs)  \-> [DMARCReportEditResponse](https://developers.cloudflare.com/api/python/resources/email%5Fauth#%28resource%29%20email%5Fauth.dmarc%5Freports%20%3E%20%28model%29%20dmarc%5Freport%5Fedit%5Fresponse%20%3E%20%28schema%29)

PATCH/zones/{zone\_id}/email/auth/dmarc-reports

Updates the DMARC report configuration for a zone. At least one of `enabled` or `skip_wizard` must be provided. When enabling, the handler will ensure the DMARC RUA record exists in DNS.

##### Security

API Token

The preferred authorization scheme for interacting with the Cloudflare API. [Create a token](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/).

**Example:**`Authorization: Bearer Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY`

API Email + API Key

The previous authorization scheme for interacting with the Cloudflare API, used in conjunction with a Global API key.

**Example:**`X-Auth-Email: user@example.com`

The previous authorization scheme for interacting with the Cloudflare API. When possible, use API tokens instead of Global API keys.

**Example:**`X-Auth-Key: 144c9defac04969c7bfad8efaa8ea194`

##### ParametersExpand Collapse 

zone\_id: str

Identifier.

maxLength32

enabled: Optional\[bool\]

Enable or disable DMARC reports for this zone

skip\_wizard: Optional\[bool\]

Skip the DMARC setup wizard

##### ReturnsExpand Collapse 

class DMARCReportEditResponse: …

Response for GET/PATCH /dmarc-reports

approved\_sources: Optional\[List\[ApprovedSource\]\]

List of approved sending sources (omitted when empty)

Deprecatedcreated: Optional\[datetime\]

Use `created_at` instead.

Deprecated, use created\_at

formatdate-time

created\_at: Optional\[datetime\]

Creation timestamp

formatdate-time

domain: Optional\[str\]

The source domain

ips: Optional\[List\[str\]\]

Resolved IP addresses from SPF

Deprecatedmodified: Optional\[datetime\]

Use `modified_at` instead.

Deprecated, use modified\_at

formatdate-time

modified\_at: Optional\[datetime\]

Last modification timestamp

formatdate-time

name: Optional\[str\]

Source name (typically same as domain)

slug: Optional\[str\]

URL-friendly identifier

tag: Optional\[str\]

Source UUID

Deprecatedcreated: Optional\[datetime\]

Use `created_at` instead.

Deprecated, use created\_at

formatdate-time

created\_at: Optional\[datetime\]

Creation timestamp

formatdate-time

enabled: Optional\[bool\]

Whether DMARC reports are enabled

Deprecatedmodified: Optional\[datetime\]

Use `modified_at` instead.

Deprecated, use modified\_at

formatdate-time

modified\_at: Optional\[datetime\]

Last modification timestamp

formatdate-time

records: Optional\[Records\]

Live DNS records for the zone, grouped by type

bimi\_records: Optional\[List\[RecordsBimiRecord\]\]

BIMI TXT records

id: Optional\[str\]

DNS record ID

content: Optional\[str\]

Record content

name: Optional\[str\]

DNS record name

resolved: Optional\[List\[str\]\]

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: Optional\[int\]

Time to live in seconds

type: Optional\[str\]

Record type

cname\_dkim\_records: Optional\[List\[RecordsCnamedkimRecord\]\]

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: Optional\[str\]

DNS record ID

content: Optional\[str\]

Record content

name: Optional\[str\]

DNS record name

resolved: Optional\[List\[str\]\]

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: Optional\[int\]

Time to live in seconds

type: Optional\[str\]

Record type

cname\_dmarc\_records: Optional\[List\[RecordsCnamedmarcRecord\]\]

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: Optional\[str\]

DNS record ID

content: Optional\[str\]

Record content

name: Optional\[str\]

DNS record name

resolved: Optional\[List\[str\]\]

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: Optional\[int\]

Time to live in seconds

type: Optional\[str\]

Record type

cname\_spf\_records: Optional\[List\[RecordsCnamespfRecord\]\]

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: Optional\[str\]

DNS record ID

content: Optional\[str\]

Record content

name: Optional\[str\]

DNS record name

resolved: Optional\[List\[str\]\]

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: Optional\[int\]

Time to live in seconds

type: Optional\[str\]

Record type

dkim\_records: Optional\[List\[RecordsDKIMRecord\]\]

DKIM TXT records

id: Optional\[str\]

DNS record ID

content: Optional\[str\]

Record content

name: Optional\[str\]

DNS record name

resolved: Optional\[List\[str\]\]

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: Optional\[int\]

Time to live in seconds

type: Optional\[str\]

Record type

dmarc\_records: Optional\[List\[RecordsDMARCRecord\]\]

DMARC TXT records

id: Optional\[str\]

DNS record ID

content: Optional\[str\]

Record content

name: Optional\[str\]

DNS record name

resolved: Optional\[List\[str\]\]

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: Optional\[int\]

Time to live in seconds

type: Optional\[str\]

Record type

Deprecatedresolved\_dmarc\_records: Optional\[List\[RecordsResolvedDMARCRecord\]\]

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: Optional\[str\]

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

name: Optional\[str\]

The name the API queried.

spf\_records: Optional\[List\[RecordsSPFRecord\]\]

SPF TXT records

id: Optional\[str\]

DNS record ID

content: Optional\[str\]

Record content

name: Optional\[str\]

DNS record name

resolved: Optional\[List\[str\]\]

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: Optional\[int\]

Time to live in seconds

type: Optional\[str\]

Record type

rua\_prefix: Optional\[str\]

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

skip\_wizard: Optional\[bool\]

Whether to skip the setup wizard

status: Optional\[Literal\["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: Optional\[str\]

Use `zone_id` instead.

Use `zone_id` instead

zone\_id: Optional\[str\]

Zone identifier

### Configure DMARC Reports

Python

HTTPHTTP

TypeScriptTypeScript

PythonPython

GoGo

TerraformTerraform

```
import os
from cloudflare import Cloudflare

client = Cloudflare(
    api_token=os.environ.get("CLOUDFLARE_API_TOKEN"),  # This is the default and can be omitted
)
response = client.email_auth.dmarc_reports.edit(
    zone_id="023e105f4ecef8ad9ca31a8372d0c353",
)
print(response.zone_id)
```

200 example

```
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "success": true,
  "result": {
    "approved_sources": [
      {
        "created": "2024-01-15T10:30:00.12345Z",
        "created_at": "2024-01-15T10:30:00.12345Z",
        "domain": "sendgrid.net",
        "ips": [
          "192.168.1.1",
          "10.0.0.1"
        ],
        "modified": "2024-01-15T11:45:00.12345Z",
        "modified_at": "2024-01-15T11:45:00.12345Z",
        "name": "SendGrid",
        "slug": "sendgrid-net",
        "tag": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415"
      }
    ],
    "created": "2024-01-15T10:30:00.12345Z",
    "created_at": "2024-01-15T10:30:00.12345Z",
    "enabled": true,
    "modified": "2024-01-15T11:45:00.12345Z",
    "modified_at": "2024-01-15T11:45:00.12345Z",
    "records": {
      "bimi_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "cname_dkim_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "cname_dmarc_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "cname_spf_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "dkim_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "dmarc_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "resolved_dmarc_records": [
        {
          "content": "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com"
        }
      ],
      "spf_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ]
    },
    "rua_prefix": "9233c80fc89f43e3a7b749605f651868",
    "skip_wizard": false,
    "status": "missing-dmarc-report",
    "tag": "023e105f4ecef8ad9ca31a8372d0c353",
    "zone_id": "023e105f4ecef8ad9ca31a8372d0c353"
  }
}
```

##### Returns Examples

200 example

```
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "success": true,
  "result": {
    "approved_sources": [
      {
        "created": "2024-01-15T10:30:00.12345Z",
        "created_at": "2024-01-15T10:30:00.12345Z",
        "domain": "sendgrid.net",
        "ips": [
          "192.168.1.1",
          "10.0.0.1"
        ],
        "modified": "2024-01-15T11:45:00.12345Z",
        "modified_at": "2024-01-15T11:45:00.12345Z",
        "name": "SendGrid",
        "slug": "sendgrid-net",
        "tag": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415"
      }
    ],
    "created": "2024-01-15T10:30:00.12345Z",
    "created_at": "2024-01-15T10:30:00.12345Z",
    "enabled": true,
    "modified": "2024-01-15T11:45:00.12345Z",
    "modified_at": "2024-01-15T11:45:00.12345Z",
    "records": {
      "bimi_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "cname_dkim_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "cname_dmarc_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "cname_spf_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "dkim_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "dmarc_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ],
      "resolved_dmarc_records": [
        {
          "content": "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com"
        }
      ],
      "spf_records": [
        {
          "id": "e5bb46707a802688812d5d1c9f7977d4",
          "content": "v=DMARC1; p=none; rua=mailto:rua@dmarc-reports.cloudflare.net",
          "name": "_dmarc.example.com",
          "resolved": [
            "v=DMARC1; p=reject; rua=mailto:rua@dmarc-reports.cloudflare.net"
          ],
          "ttl": 300,
          "type": "TXT"
        }
      ]
    },
    "rua_prefix": "9233c80fc89f43e3a7b749605f651868",
    "skip_wizard": false,
    "status": "missing-dmarc-report",
    "tag": "023e105f4ecef8ad9ca31a8372d0c353",
    "zone_id": "023e105f4ecef8ad9ca31a8372d0c353"
  }
}
```