# Read a DMARC report

`GET https://api.mailmasker.org/api/v1/dmarc/reports/:id`

One report in full, with a line for each sending address it covers.

- Who can use it: Site admins
- Area: DMARC reports
- Answers 200 OK when it works
- Page: https://developer.mailmasker.org/dmarc-report

Each of `records` is a number of messages from one address, and what the receiver made of them. `dkim_result` and `spf_result` say whether each lined up with the domain, which is what DMARC goes by. The checks themselves, with the DKIM key's `selector`, are in `auth_results`; a signature can pass there and still not line up.

## Parameters

| Name | In | Required | What it is | Example |
|---|---|---|---|---|
| `id` | path | yes | The report's `id`, from List DMARC reports. | `412` |

## Good to know

- An id with no report answers 404.

## Examples

cURL:

```bash
curl -s 'https://api.mailmasker.org/api/v1/dmarc/reports/412' \
  -H "Authorization: Bearer $TOKEN"
```

Perl:

```perl
use Mojo::Base -strict;
use Mojo::UserAgent;

my $ua  = Mojo::UserAgent->new;
my $res = $ua->get('https://api.mailmasker.org/api/v1/dmarc/reports/412',
    { Authorization => "Bearer $ENV{TOKEN}" })->result;
die $res->code, ' ', ($res->json('/error') // $res->message), "\n" unless $res->is_success;
print $res->body, "\n";
```

homelab-cli:

There is no homelab-cli command for this yet.

## Response

200 OK:

```json
{
  "id": 412,
  "org_name": "example.net",
  "org_email": "dmarc-noreply@example.net",
  "report_id": "18342296310421557",
  "date_begin": "2026-11-02 18:00:00-06",
  "date_end": "2026-11-03 17:59:59-06",
  "policy_domain": "example.com",
  "policy_p": "quarantine",
  "policy_sp": null,
  "policy_pct": 100,
  "policy_adkim": "r",
  "policy_aspf": "r",
  "ingested_at": "2026-11-03 21:00:03.998120-06",
  "records": [
    {
      "source_ip": "192.0.2.25",
      "message_count": 212,
      "disposition": "none",
      "dkim_result": "pass",
      "spf_result": "pass",
      "header_from": "example.com",
      "auth_results": {
        "dkim": [ { "domain": "example.com", "result": "pass", "selector": "20261020a" } ],
        "spf": [ { "domain": "example.com", "result": "pass" } ]
      }
    },
    {
      "source_ip": "203.0.113.77",
      "message_count": 2,
      "disposition": "quarantine",
      "dkim_result": "fail",
      "spf_result": "fail",
      "header_from": "example.com",
      "auth_results": {
        "dkim": [],
        "spf": [ { "domain": "example.net", "result": "fail" } ]
      }
    }
  ]
}
```
