# DMARC Report Reader (`sky_technologies/dmarc-report-reader`) Actor

Turns DMARC aggregate (RUA) report files (.xml, .gz, .zip) into a plain-English summary: who is sending email as your domain, what passes, what fails, and exactly what to fix.

- **URL**: https://apify.com/sky_technologies/dmarc-report-reader.md
- **Developed by:** [Jashan Sandhu](https://apify.com/sky_technologies) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 report parseds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## DMARC Report Reader

Turn the unreadable DMARC aggregate report files in your inbox into a plain-English answer to three questions:

1. **Who is sending email as my domain?**
2. **Is my legitimate email passing?**
3. **What exactly do I need to fix, and am I ready to move to `p=quarantine` or `p=reject`?**

Once you publish a DMARC record with an `rua=` address, Google, Microsoft, Yahoo and others send you daily `.xml`, `.xml.gz` or `.zip` reports. They're full of IP addresses and pass/fail codes that are hard to read. This Actor reads them for you.

### What you get

- **A readable HTML report** (key-value store → `REPORT`) with pass rate, every sending service, a verdict for each, and a prioritised to-do list.
- **A JSON summary** (key-value store → `OUTPUT`) for automations and dashboards.
- **Every report row** in the dataset, exportable to CSV, Excel or JSON.

#### Sender verdicts

| Verdict | Meaning |
|---|---|
| **OK** | Authenticated and aligned with your domain. |
| **Needs setup** | A real service (SendGrid, Mailchimp, HubSpot, etc.) sending for you without DKIM/SPF set up for your domain. The report tells you which fix it needs. |
| **Partly failing** | Some mail passes, some fails. Worth checking. |
| **Forwarded** | Your mail passed through a forwarder or mailing list. Usually harmless. |
| **Suspicious** | Fails every check and isn't a recognised mail service. Likely spoofing. |

Senders are identified by reverse DNS and DKIM signing domain, with 35+ common services recognised by name (Google Workspace, Microsoft 365, Amazon SES, SendGrid, Mailgun, Mailchimp, Postmark, HubSpot, Salesforce, Zendesk, Klaviyo, Shopify, Zoho and more).

### Input

| Field | Description |
|---|---|
| **Report file URLs** | Direct-download links to report files. `.xml`, `.xml.gz` and `.zip` (with one or many reports inside) all work. Mix reports from different providers and domains in one run. |
| **Or paste report XML** | Paste a single report's XML instead. |
| **Identify senders** | Look up who owns each sending IP (default on). |
| **Save individual rows** | Store every row in the dataset (default on). |

Supports both the original DMARC report format (RFC 7489) and the newer DMARCbis format.

### Example output (summary)

```json
{
  "total_messages": 172,
  "pass_rate": 69.8,
  "senders": [
    { "sender": "Unknown sender (185.220.101.7)", "messages": 6, "pass_rate": 0.0, "verdict": "Suspicious" },
    { "sender": "SendGrid", "messages": 34, "pass_rate": 0.0, "verdict": "Needs setup",
      "action": "Legitimate service that isn't fully configured: set up DKIM for your domain in SendGrid; ..." },
    { "sender": "Google Workspace / Gmail", "messages": 120, "pass_rate": 100.0, "verdict": "OK" }
  ],
  "recommendations": [
    "SendGrid: Legitimate service that isn't fully configured: set up DKIM for your domain in SendGrid; ...",
    "skytechnologies.ca: stay on p=none until the services above are fixed, then move to p=quarantine."
  ]
}
```

### Automate it

Schedule this Actor or call it from Make, Zapier or n8n: point a mailbox rule at the reports, save attachments to cloud storage, and pass the links in. Combine with a Slack or email integration to get a weekly "who's sending as us" digest.

### Privacy & safety

Reports are processed in memory during the run and only saved to your own Apify storage. The XML parser rejects malicious files (external entities, entity-expansion and zip bombs). The Actor never contacts the sending servers; it only performs reverse-DNS lookups.

### Pricing

Pay per report parsed. No subscription.

# Actor input Schema

## `reportUrls` (type: `array`):

Links to DMARC aggregate report files (.xml, .xml.gz or .zip), exactly as Google, Microsoft, Yahoo and others email them. Any direct-download link works (S3, Dropbox with dl=1, Apify key-value store, etc.).

## `reportXml` (type: `string`):

Paste the contents of a single .xml report here instead of providing a URL.

## `resolveSenders` (type: `boolean`):

Look up the reverse DNS of each sending IP to name the service (Google Workspace, Microsoft 365, SendGrid, etc.).

## `outputRecords` (type: `boolean`):

Also save every report row to the dataset for export to CSV/Excel/JSON.

## Actor input object example

```json
{
  "reportUrls": [],
  "resolveSenders": true,
  "outputRecords": true
}
```

# Actor output Schema

## `report` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `rows` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "reportUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sky_technologies/dmarc-report-reader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "reportUrls": [] }

# Run the Actor and wait for it to finish
run = client.actor("sky_technologies/dmarc-report-reader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "reportUrls": []
}' |
apify call sky_technologies/dmarc-report-reader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sky_technologies/dmarc-report-reader"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/tiAWEXBiNJ6hAlHb2/builds/4zR7NwFo14F0rv1Pb/openapi.json
