DMARC reports
Read a DMARC report
GET /api/v1/dmarc/reports/:id
Who can use this: Site admins As Markdown
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 Where What it is
id required
path
The report's id, from List DMARC reports.e.g. 412
Good to know
An id with no report answers 404.
cURL
Perl
homelab-cli
Copy
curl -s 'https://api.mailmasker.org/api/v1/dmarc/reports/412' \
-H "Authorization: Bearer $TOKEN"
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";
There's no homelab-cli command for this yet.
Response 200 OK
Copy
{
"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" } ]
}
}
]
}