---
title: "Get the DMARC summary"
method: GET
path: "/domains/{domainId}/reports/summary"
tags: ["Reports"]
---

# Get the DMARC summary

`GET /domains/{domainId}/reports/summary`

## Request

- Base URL: `https://api.palisade.email`
- URL: `https://api.palisade.email/domains/{domainId}/reports/summary`
- Auth: one of:
  - HTTP bearer
  - HTTP basic

## Path parameters

- `domainId` string, uuid, required

## Query parameters

- `period` 'last_7_days' | 'last_14_days' | 'last_30_days': Reporting window, ending yesterday. Defaults to last_7_days.

## Headers

- `Palisade-Version` '2025-04-30' | 'unstable', required

## Response `200`

Success

- DmarcSummary
  - `domain_id` string, uuid, required: Id of the domain the summary is for.
  - `domain` string, required: The domain name the summary is for.
  - `date_from` string, required: First day of the window, YYYY-MM-DD. Clamped to the earliest day the organization's plan retains report history for, so it can be later than the requested period alone implies.
  - `date_to` string, required: Last day of the window, YYYY-MM-DD. Always yesterday: aggregate reports arrive a day in arrears, so a window ending today would read as a volume collapse.
  - `volume` integer, required: Total messages reported in the window, across every compliance bucket.
  - `dmarc_pass_pct` number, required: Share of volume that passed DMARC, 0-100, rounded to two decimals, and 0 when the window has no volume. The denominator is volume, so forwarded and uncategorised traffic counts against it - which is why this reads lower than the last_14_days figure.
  - `spf_pass_pct` number, required: Share of volume that passed SPF, 0-100, rounded to two decimals, and 0 when the window has no volume.
  - `dkim_pass_pct` number, required: Share of volume that passed DKIM, 0-100, rounded to two decimals, and 0 when the window has no volume.
  - `totals` object, required: Message counts by compliance bucket. They sum to volume.
    - `compliant` integer, required: Messages that passed DMARC alignment.
    - `non_compliant` integer, required: Messages that failed DMARC. This is the number to drive to zero.
    - `forwarded` integer, required: Messages the compliance categorizer attributed to forwarding.
    - `unknown` integer, required: Messages from a sending source Palisade could not identify.
    - `undetermined` integer, required: Messages whose compliance is undetermined, including reports the categorizer has not processed yet.
  - `previous_period` object, required: The same number of days immediately before this window. It ends the day before this window starts, so its date_to is not yesterday.
    - `date_from` string, required: First day of the window, YYYY-MM-DD. Clamped to the earliest day the organization's plan retains report history for, so it can be later than the requested period alone implies.
    - `date_to` string, required: Last day of the window, YYYY-MM-DD. No window ever includes today: aggregate reports arrive a day in arrears, so a window ending today would read as a volume collapse.
    - `volume` integer, required: Total messages reported in the window, across every compliance bucket.
    - `dmarc_pass_pct` number, required: Share of volume that passed DMARC, 0-100, rounded to two decimals, and 0 when the window has no volume. The denominator is volume, so forwarded and uncategorised traffic counts against it - which is why this reads lower than the last_14_days figure.
    - `spf_pass_pct` number, required: Share of volume that passed SPF, 0-100, rounded to two decimals, and 0 when the window has no volume.
    - `dkim_pass_pct` number, required: Share of volume that passed DKIM, 0-100, rounded to two decimals, and 0 when the window has no volume.
  - `change` object, required: This window minus the previous one. Positive means the metric improved (or grew, for volume).
    - `volume` integer, required: Change in message volume against the previous window.
    - `dmarc_pass_pct` number, required: Change in DMARC pass rate, in percentage points, rounded to two decimals.
    - `spf_pass_pct` number, required: Change in SPF pass rate, in percentage points, rounded to two decimals.
    - `dkim_pass_pct` number, required: Change in DKIM pass rate, in percentage points, rounded to two decimals.
  - `last_14_days` object, required: The stored 14-day figures GET /domains/{id} reports. These count only compliant and non-compliant traffic, so they read higher than the window figures above on a domain with forwarding. A mismatch is the two definitions, not a fault.
    - `volume` integer, required: Messages counted over the last 14 days, as stored on the domain.
    - `dmarc_pass_pct` number, required: Share of that volume that passed DMARC, 0-100.
    - `spf_pass_pct` number, required: Share of that volume that passed SPF, 0-100.
    - `dkim_pass_pct` number, required: Share of that volume that passed DKIM, 0-100.
  - `dmarc_policy` string, required: The domain's DMARC policy state, in the same form GET /domains/{id} reports.
  - `monitoring_status` string, required: Monitoring state of the domain, in the same form GET /domains/{id} reports.
  - `policy_readiness` object, required: Whether Palisade currently recommends tightening the DMARC policy. This reports the recommendation Palisade has already computed - it is not a second, independent gate.
    - `status` 'advance_recommended' | 'hold' | 'at_maximum', required: "advance_recommended" when Palisade has an open policy-advancement task for the domain, "hold" when it has not opened one, and "at_maximum" when the domain is already at p=reject with pct=100.
    - `reason` string, required: Why Palisade does or does not recommend tightening the policy right now. When status is "advance_recommended", this is the advancement task's own description.
    - `open_task_id` string, uuid, nullable, required: The UPDATE_DMARC_RECORD task carrying the recommendation, when Palisade has opened one.
  - `open_tasks` DmarcProbeTask[], required: Open and pending remediation tasks for this domain, most urgent first, capped at 10.
    - `id` string, uuid, required: Task id. Read it with GET /tasks/{id}?expand[]=instructions for the fix Palisade has worked out.
    - `type` 'cleanup_spf_record' | 'confirm_source' | 'lockdown_domain' | 'reduce_spf_lookups' | 'set_up_dmarc_record' | 'source_failing_dkim' | 'source_failing_spf' | 'set_up_mx_record' | 'set_up_spf_record' | 'update_dmarc_record' | 'update_ttl' | 'set_up_mta_sts' | 'set_up_tls_rpt' | 'resolve_dns_conflict' | 'review_unused_sender' | 'cleanup_sender_records' | 'fix_mx_certificate' | 'renew_vmc_certificate' | 'dkim_selector_not_imported' | 'set_up_bimi', required: What kind of problem the task describes.
    - `priority` integer, required: Lower is more urgent. 0 is the most urgent.
    - `description` string, required: What is wrong, in plain language.
    - `source_alias` string, nullable, required: The sending source this task covers. Matches senders[].source_alias.
    - `sending_domain` string, nullable, required: The sending domain the task is about, when it has one.
  - `open_tasks_count` integer, required: Total open and pending tasks, which may exceed the array length.
  - `next_step` string, required: The single action Palisade suggests taking next.

---

[API](https://skmtc.dev/palisade/apis/palisade-api.md) · [All operations](https://skmtc.dev/palisade/apis/palisade-api/llms.txt) · [OpenAPI document](https://skmtc.dev/palisade/apis/palisade-api/revisions/37b4ae5a7766?raw)
