Skip to main content

aprf-reader

Reads APRF (Aggregate Performance Reporting) reports and tells you where the mail you signed landed: how much reached the inbox, how much was treated as unwanted, and how recipients reacted, day by day and per DKIM selector.

Status: 0.2, beta. Reads reports in the format of draft-ietf-mailmaint-aprf-00.

What APRF is

APRF is a proposed standard for a daily report from a mailbox provider about the mail you signed with DKIM. It is an IETF working group draft, draft-ietf-mailmaint-aprf, adopted by the Mail Maintenance (MAILMAINT) working group in October 2026. Reports arrive by email as small JSON files, one per day per signing domain and selector. Comcast sends them today in a beta for comcast.net mail.

A plain-language introduction: What APRF inbox placement reports tell you, and what they don't.

Use it

Python 3.11 or later, no other dependencies. Install with pipx, which keeps command line tools in their own environment, or with pip (pip3 on some systems) inside a virtual environment.

pipx install aprf-reader
aprf-reader reports/                      # Markdown summary to the terminal
aprf-reader reports/ --html summary.html  # and a page you can open or share
aprf-reader APRF.mbox                     # a mail folder exported as mbox

Point it at report files (.json, .json.gz), saved report emails (.eml), mailbox exports (.mbox), or folders of them. The easiest way to collect reports is a mail filter that moves them into one folder, then an export of that folder: Gmail through Google Takeout (pick Mail and the label), Thunderbird with the ImportExportTools NG add-on, or Apple Mail's Mailbox > Export Mailbox. Comcast's reports come from aprf-noreply@alerts.xfinity.com with subjects starting APRF:. Folders are searched recursively. Files it skips are listed on stderr and at the end of the summary, each with a reason.

Each stream (provider, signing domain, selector) gets a table with one row per day and segment, a trend line per count, and a row for each day with no report. A change in the report's version field is called out, since the draft uses it to mark a change in what a category counts.

What it does

  • Read report files (.json, .json.gz, .eml and .mbox) or a folder of them, and skip duplicates and files it cannot read, with a reason for each.
  • Summarise placement per signing domain and selector: inbox, unwanted and recipient reactions, by day and as a trend.
  • Treat the counts as what the draft says they are: rounded into buckets, so they are a signal, not exact rates.
  • Write a Markdown summary and a single self-contained HTML page you can open or share. Nothing is uploaded anywhere.
  • Follow the draft as it changes. The report format lives in one module (src/aprf_reader/report.py), so a new draft revision is a small update.
  • When the same day arrives twice, keep the first copy and say so. The draft has not yet decided whether a resend replaces the original.
  • dns-audit.com checks a domain for an APRF record and where its reports would go.

License

MIT

Metadata

Release files for aprf-reader 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aprf-reader 0.2.0
File Size Uploaded Provenance
aprf_reader-0.2.0.tar.gz 15.2 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for aprf-reader 0.2.0
File Interpreter ABI Platform
aprf_reader-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 28.0 kB

Release files / aprf_reader-0.2.0.tar.gz

Download URL aprf_reader-0.2.0.tar.gz
Size 15.2 kB
Tags Source
SHA-256 checksum
How to use checksums
59bd1ebb9084020fdf35c484ff0c1c998eb2b2da35374ca4b1bb835f1897e561
BLAKE2b-256 checksum
How to use checksums
2ec587c2abc6b171e0be1796f531036a7abf05249a90c8cd0701b2f1b1c2774a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / aprf_reader-0.2.0-py3-none-any.whl

Download URL aprf_reader-0.2.0-py3-none-any.whl
Size 12.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3edb1dc682815cc903222305eb57b4e7807c4258aedc4ea1b27c45f732629287
BLAKE2b-256 checksum
How to use checksums
78957b4a21dae855382818d3de05b5a56be85160029fdeaa1675753b691b94bc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Security for aprf-reader 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for aprf_reader-0.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page