---
title: "Get detailed report"
method: GET
path: "/report/{id}"
tags: ["reports"]
---

# Get detailed report

`GET /report/{id}`

Retrieve comprehensive deliverability analysis report

## Path parameters

- `id` string, required — Base32-encoded test ID (with hyphens)

## Response `200`

Report retrieved successfully

- Report
  - `id` string, required — Report identifier (base32-encoded with hyphens)
  - `test_id` string, required — Associated test ID (base32-encoded with hyphens)
  - `score` integer, required — Overall deliverability score as percentage (0-100)
  - `grade` 'A+' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F', required — Letter grade representation of the score (A+ is best, F is worst)
  - `summary` ScoreSummary
    - `dns_score` integer, required — DNS records score (in percentage)
    - `dns_grade` 'A+' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F', required — Letter grade representation of the score (A+ is best, F is worst)
    - `authentication_score` integer, required — SPF/DKIM/DMARC score (in percentage)
    - `authentication_grade` 'A+' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F', required — Letter grade representation of the score (A+ is best, F is worst)
    - `spam_score` integer, required — SpamAssassin score (in percentage)
    - `spam_grade` 'A+' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F', required — Letter grade representation of the score (A+ is best, F is worst)
    - `blacklist_score` integer, required — Blacklist check score (in percentage)
    - `blacklist_grade` 'A+' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F', required — Letter grade representation of the score (A+ is best, F is worst)
    - `header_score` integer, required — Header quality score (in percentage)
    - `header_grade` 'A+' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F', required — Letter grade representation of the score (A+ is best, F is worst)
    - `content_score` integer, required — Content quality score (in percentage)
    - `content_grade` 'A+' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F', required — Letter grade representation of the score (A+ is best, F is worst)
  - `authentication` AuthenticationResults
    - `spf` AuthResult
      - `result` 'pass' | 'fail' | 'none' | 'neutral' | 'softfail' | 'temperror' | 'permerror', required — Authentication result
      - `domain` string — Domain being authenticated
      - `selector` string — DKIM selector (for DKIM only)
      - `details` string — Additional details about the result
    - `dkim` AuthResult[]
      - `result` 'pass' | 'fail' | 'none' | 'neutral' | 'softfail' | 'temperror' | 'permerror', required — Authentication result
      - `domain` string — Domain being authenticated
      - `selector` string — DKIM selector (for DKIM only)
      - `details` string — Additional details about the result
    - `dmarc` AuthResult
      - `result` 'pass' | 'fail' | 'none' | 'neutral' | 'softfail' | 'temperror' | 'permerror', required — Authentication result
      - `domain` string — Domain being authenticated
      - `selector` string — DKIM selector (for DKIM only)
      - `details` string — Additional details about the result
    - `bimi` AuthResult
      - `result` 'pass' | 'fail' | 'none' | 'neutral' | 'softfail' | 'temperror' | 'permerror', required — Authentication result
      - `domain` string — Domain being authenticated
      - `selector` string — DKIM selector (for DKIM only)
      - `details` string — Additional details about the result
    - `arc` ARCResult
      - `result` 'pass' | 'fail' | 'none', required — Overall ARC chain validation result
      - `chain_valid` boolean — Whether the ARC chain signatures are valid
      - `chain_length` integer — Number of ARC sets in the chain
      - `details` string — Additional details about ARC validation
  - `spamassassin` SpamAssassinResult
    - `version` string — SpamAssassin version
    - `score` number, float, required — SpamAssassin spam score
    - `required_score` number, float, required — Threshold for spam classification
    - `is_spam` boolean, required — Whether message is classified as spam
    - `tests` string[] — List of triggered SpamAssassin tests
    - `test_details` object, required — Map of test names to their detailed results
    - `report` string — Full SpamAssassin report
  - `dns_results` DNSResults
    - `from_domain` string, required — From Domain name
    - `rp_domain` string — Return Path Domain name
    - `from_mx_records` MXRecord[] — MX records for the From domain
      - `host` string, required — MX hostname
      - `priority` integer, required — MX priority (lower is higher priority)
      - `valid` boolean, required — Whether the MX record is valid
      - `error` string — Error message if validation failed
    - `rp_mx_records` MXRecord[] — MX records for the Return-Path domain
      - `host` string, required — MX hostname
      - `priority` integer, required — MX priority (lower is higher priority)
      - `valid` boolean, required — Whether the MX record is valid
      - `error` string — Error message if validation failed
    - `spf_records` SPFRecord[] — SPF records found (includes resolved include directives)
      - `domain` string — Domain this SPF record belongs to
      - `record` string — SPF record content
      - `valid` boolean, required — Whether the SPF record is valid
      - `all_qualifier` '+' | '-' | '~' | '?' — Qualifier for the 'all' mechanism: + (pass), - (fail), ~ (softfail), ? (neutral)
      - `error` string — Error message if validation failed
    - `dkim_records` DKIMRecord[] — DKIM records found
      - `selector` string, required — DKIM selector
      - `domain` string, required — Domain name
      - `record` string — DKIM record content
      - `valid` boolean, required — Whether the DKIM record is valid
      - `error` string — Error message if validation failed
    - `dmarc_record` DMARCRecord
      - `record` string — DMARC record content
      - `policy` 'none' | 'quarantine' | 'reject' | 'unknown' — DMARC policy
      - `subdomain_policy` 'none' | 'quarantine' | 'reject' | 'unknown' — DMARC subdomain policy (sp tag) - policy for subdomains if different from main policy
      - `percentage` integer — Percentage of messages subjected to filtering (pct tag, default 100)
      - `spf_alignment` 'relaxed' | 'strict' — SPF alignment mode (aspf tag)
      - `dkim_alignment` 'relaxed' | 'strict' — DKIM alignment mode (adkim tag)
      - `valid` boolean, required — Whether the DMARC record is valid
      - `error` string — Error message if validation failed
    - `bimi_record` BIMIRecord
      - `selector` string, required — BIMI selector
      - `domain` string, required — Domain name
      - `record` string — BIMI record content
      - `logo_url` string, uri — URL to the brand logo (SVG)
      - `vmc_url` string, uri — URL to Verified Mark Certificate (optional)
      - `valid` boolean, required — Whether the BIMI record is valid
      - `error` string — Error message if validation failed
    - `errors` string[] — DNS lookup errors
  - `blacklists` object — Map of IP addresses to their blacklist check results (array of checks per IP)
  - `content_analysis` ContentAnalysis
    - `has_html` boolean — Whether email contains HTML part
    - `has_plaintext` boolean — Whether email contains plaintext part
    - `html_issues` ContentIssue[] — Issues found in HTML content
      - `type` 'broken_html' | 'missing_alt' | 'excessive_images' | 'obfuscated_url' | 'suspicious_link' | 'dangerous_html', required — Type of content issue
      - `severity` 'critical' | 'high' | 'medium' | 'low' | 'info', required — Issue severity
      - `message` string, required — Human-readable description
      - `location` string — Where the issue was found
      - `advice` string — How to fix this issue
    - `links` LinkCheck[] — Analysis of links found in the email
      - `url` string, uri, required — The URL found in the email
      - `status` 'valid' | 'broken' | 'suspicious' | 'redirected' | 'timeout', required — Link validation status
      - `http_code` integer — HTTP status code received
      - `redirect_chain` string[] — URLs in the redirect chain, if any
      - `is_shortened` boolean — Whether this is a URL shortener
    - `images` ImageCheck[] — Analysis of images in the email
      - `src` string — Image source URL or path
      - `has_alt` boolean, required — Whether image has alt attribute
      - `alt_text` string — Alt text content
      - `is_tracking_pixel` boolean — Whether this appears to be a tracking pixel (1x1 image)
    - `text_to_image_ratio` number, float — Ratio of text to images (higher is better)
    - `has_unsubscribe_link` boolean — Whether email contains an unsubscribe link
    - `unsubscribe_methods` string[] — Available unsubscribe methods
  - `header_analysis` HeaderAnalysis
    - `has_mime_structure` boolean — Whether body has a MIME structure
    - `headers` object — Map of header names to their check results (e.g., "from", "to", "dkim-signature")
    - `received_chain` ReceivedHop[] — Chain of Received headers showing email path
      - `from` string — Sending server hostname
      - `by` string — Receiving server hostname
      - `with` string — Protocol used
      - `id` string — Message ID at this hop
      - `timestamp` string, date-time — When this hop occurred
      - `ip` string — IP address of the sending server (IPv4 or IPv6)
      - `reverse` string — Reverse DNS (PTR record) for the IP address
    - `domain_alignment` DomainAlignment
      - `from_domain` string — Domain from From header
      - `return_path_domain` string — Domain from Return-Path header
      - `dkim_domains` string[] — Domains from DKIM signatures
      - `aligned` boolean — Whether all domains align
      - `issues` string[] — Alignment issues
    - `issues` HeaderIssue[] — Issues found in headers
      - `header` string, required — Header name
      - `severity` 'critical' | 'high' | 'medium' | 'low' | 'info', required — Issue severity
      - `message` string, required — Human-readable description
      - `advice` string — How to fix this issue
  - `raw_headers` string — Raw email headers
  - `created_at` string, date-time, required

## Other responses

- `404` — Report not found

## Changes

- **2025-10-23** `2ff707f6d044` — 1 info
  - added the optional property `dns_results/spf_records/items/all_qualifier` to the response with the `200` status
- **2025-10-23** `5be0f19ce4de` — 4 info
  - added the optional property `dns_results/dmarc_record/dkim_alignment` to the response with the `200` status
  - added the optional property `dns_results/dmarc_record/percentage` to the response with the `200` status
  - added the optional property `dns_results/dmarc_record/spf_alignment` to the response with the `200` status
  - added the optional property `dns_results/dmarc_record/subdomain_policy` to the response with the `200` status
- **2025-10-23** `d5cd542c4498` — 2 info
  - added the optional property `header_analysis/received_chain/items/ip` to the response with the `200` status
  - added the optional property `header_analysis/received_chain/items/reverse` to the response with the `200` status
- **2025-10-22** `4cafdb7cd290` — 1 breaking, 1 warning, 4 info
  - removed the required property `dns_results/domain` from the response with the `200` status
  - removed the optional property `dns_results/mx_records` from the response with the `200` status
  - added the optional property `dns_results/from_mx_records` to the response with the `200` status
  - added the optional property `dns_results/rp_domain` to the response with the `200` status
  - …2 more
- …earlier changes not shown

[Full history](https://skmtc.dev/happydomain/apis/happydeliver-api/changes/report/:id/get.md)

---

[API](https://skmtc.dev/happydomain/apis/happydeliver-api.md) · [All operations](https://skmtc.dev/happydomain/apis/happydeliver-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/happydomain/happydeliver-api/revisions/2ff707f6d044/schema)
