This page describes the current DMARC flow in Tools for DNSBL-related review work.
It is not a normal end-user blacklist form. The intended callers are:
dnsbl-engineTools can ingest DMARC aggregate reports and place them in an admin review queue instead of publishing directly from the incoming payload.
That queue lets an operator:
16)84)This keeps the final blacklist decision manual.
POST /api/dnsbl/dmarc/reportThe request uploads one DMARC payload for intake.
Supported payload forms include:
message/rfc822 mails that contain the DMARC XML/ZIP attachment inside nested MIME parts{
"payload_base64": "H4sIAAAAA...",
"source_type": "dnsbl_engine_dmarc",
"source_name": "dnsbl-engine",
"original_filename": "mailru-report.xml.gz",
"content_type": "application/gzip",
"content_encoding": "gzip"
}
payload_base64 is required and must decode to a non-empty payload.source_type is optional caller metadata.source_name is optional human-readable caller metadata.original_filename is optional and helps the reviewer identify the uploaded file.content_type and content_encoding are optional hints about the original file format.The current DMARC intake path accepts these modes:
X-Dnsbl-Token or dnsbl_tokencan_add=true)provider=tornevall_dnsbl) are also accepted through the same token transport401.403 reason="insufficient_dnsbl_scope".duplicate: true with the existing report metadata.payload_hash at nearly the same time; callers now still receive the existing report instead of a raw SQL duplicate-key failure.422.dnsbl-engine upload is denied, the local DMARC mail/file is kept in the spool for retry instead of being deleted.{
"ok": true,
"duplicate": false,
"message": "DMARC payload ingested for admin review.",
"report": {
"id": 12,
"report_id": "33491921110551199191685577600",
"org_name": "Mail.Ru",
"policy_domain": "tornevall.net",
"status": "pending",
"record_count": 1,
"source_ip_count": 1,
"date_begin": "2023-06-01T00:00:00+00:00",
"date_end": "2023-06-02T00:00:00+00:00",
"created_at": "2026-04-19T21:03:00+00:00"
},
"records": [
{
"id": 99,
"source_ip": "60.13.8.218",
"message_count": 1,
"disposition": "reject",
"dkim_result": "fail",
"spf_result": "fail",
"recommended_action": "spam_fraud",
"status": "pending"
}
]
}
After intake, the report is available in:
/admin/dnsbl/dmarcFrom there an admin can open the report details page and inspect:
p, sp, adkim, aspf, pct)Aggregate XML or Forensic notice)Each source-IP row exposes these actions:
1684A DMARC report can appear with statuses such as:
pending - no rows reviewed yetpartial - some rows handled, some still pending or mixedreviewed - rows were handled with a mixed published/ignored outcomepublished - every row ended up publishedignored - every row ended up ignoredA single source-IP row can appear as:
pendingpublishedignoredfailedWhen a publish attempt has been made, the UI also shows the last stored publish result for that row.
Typical failure cases:
401 missing_dnsbl_token - no DNSBL token was supplied401 invalid_dnsbl_token - the supplied value did not resolve to an active DNSBL token401 inactive_dnsbl_token - the DNSBL token exists but is not active403 insufficient_dnsbl_scope - the DNSBL token is active but does not have add/write permission403 wrong_token_type - the supplied value matched another Tools token type instead of a DNSBL token422 invalid_payload - payload_base64 did not decode into a usable payload422 invalid_dmarc_report - the uploaded payload could not be parsed as a DMARC reportDuplicate uploads do not fail. They return a normal success response with duplicate: true.
POST /api/dnsbl/dmarc/report with an active DNSBL token that has add permission./admin/dnsbl/dmarc.Last Updated: 2026-04-20