# Bulk DMARC Record Lookup
> Check email security (DMARC) configuration for one or many domains in a single request.

## Agent Summary
- FQN: `dmarc-lookup.underscoredone.com`
- Category: validation
- Operator: _done
- Version: 1.0.0
- Endpoints: 1
- Pricing: $0.01
- Page: https://underscoredone.com/dmarc_lookup
- Markdown: https://dmarc-lookup.underscoredone.com/index.md
- OpenAPI: https://dmarc-lookup.underscoredone.com/openapi.json

## Service URL
https://dmarc-lookup.underscoredone.com

## Use Case
Give this tool a list of domain names and it will instantly check each one's DMARC email security record. DMARC is a standard that tells email providers how to handle fake or spoofed emails pretending to come from your domain. For each domain you submit, you get back whether a valid record exists, what the policy is (none, quarantine, or reject), whether reporting addresses are set up, and the full raw record text. Perfect for auditing many domains at once without any setup.

## How to Call
Call this endpoint with a comma-separated list of bare domain names (no http:// or www) in the 'domains' query parameter. Each domain in the response will have: 'domain' (the input domain), 'recordStatus' ('Valid', 'Invalid', or 'Not Found'), 'domainPolicy' (the p= tag value such as 'none', 'quarantine', 'reject', or empty string if not found), 'reportingEnabled' (true if rua or ruf tags are present), and 'rawRecord' (the full TXT record string, or empty string if none). A 'Valid' record has both v=DMARC1 and a p= tag. 'Invalid' means a record was found but is missing one of those required tags. 'Not Found' means no TXT record exists at _dmarc.{domain}. DNS failures for a specific domain are returned as 'Not Found' rather than errors. A 400 is only returned if the domains parameter is missing or all values are unparseable.

## Endpoint
| Method | URL | Price | Description |
|--------|-----|-------|-------------|
| GET | `https://dmarc-lookup.underscoredone.com/dmarc-lookup` | $0.01/request | Look up DMARC email security records for one or many domains at once. |

## Example Request
?domains=onescales.com,hillms.com


## Example Response
```json
{
  "api_version": "1.0.0",
  "results": [
    {
      "domain": "onescales.com",
      "recordStatus": "Valid",
      "domainPolicy": "reject",
      "reportingEnabled": true,
      "rawRecord": "v=DMARC1;p=reject;rua=mailto:3e873edd60aa449aa519421775786d39@dmarc-reports.cloudflare.net,mailto:dmarc@onescales.com,mailto:27da9b4b47@rua.easydmarc.us;ruf=mailto:27da9b4b47@ruf.easydmarc.us;fo=1;"
    },
    {
      "domain": "hillms.com",
      "recordStatus": "Valid",
      "domainPolicy": "reject",
      "reportingEnabled": true,
      "rawRecord": "v=DMARC1;p=reject;rua=mailto:info@hillms.com;"
    }
  ],
  "total": 3,
  "valid_count": 2,
  "invalid_count": 0,
  "not_found_count": 1
}
```

## Errors
| Status | Meaning |
|--------|---------|
| 400 | The domains field was empty, contained only whitespace, or every entry was a blank string after splitting by commas. |
| 422 | The required 'domains' query parameter was not included in the request at all. |
| 402 | Payment required — send X-PAYMENT header |
