# MX Lookup API (`junipr/mx-lookup`) Actor

Look up MX (Mail Exchange) DNS records for any domain. Verify email server configuration, check mail routing, and validate domain email deliverability.

- **URL**: https://apify.com/junipr/mx-lookup.md
- **Developed by:** [junipr](https://apify.com/junipr) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$1.04 / 1,000 domain checkeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## MX Lookup & Email DNS Checker

### Introduction

MX Lookup & Email DNS Checker performs comprehensive DNS email infrastructure analysis for any domain. Provide a list of domains and the actor looks up MX records, validates SPF records, checks DKIM selectors, verifies DMARC policies, detects the email provider (Google Workspace, Microsoft 365, Zoho, ProtonMail, and more), and scores each domain on a 0-100 email security scale.

**Primary use cases:**

- **Email deliverability auditing** — check your sending domains for SPF, DKIM, and DMARC compliance before launching campaigns
- **Security compliance** — audit your entire domain portfolio for email authentication gaps (missing SPF, weak DMARC, no DKIM)
- **Lead qualification by tech stack** — detect whether a prospect uses Google Workspace (SMB signal) or Microsoft 365 (enterprise signal)
- **MSP domain management** — batch-check hundreds of client domains in one run
- **Pre-outreach verification** — confirm a domain's email infrastructure is configured before cold outreach

**Key differentiators:**

- Batch process up to 10,000 domains per run at $1.00 per 1,000 domains
- Detects 14+ email providers from MX hostnames — no guessing
- Parses SPF mechanisms, counts DNS lookup depth, and flags RFC violations
- Checks 10 DKIM selectors in parallel — finds active DKIM even for non-standard selectors
- DMARC policy parsing: extracts `p=`, `sp=`, `rua=`, `ruf=`, alignment modes
- Actionable misconfiguration codes with specific recommendations
- Uses Node.js built-in `dns` module — zero external API dependencies

---

### Why Use This Actor

Tools like MXToolbox and EasyDMARC are excellent for manual one-off lookups but cost $129+/month for subscriptions and process one domain at a time. This actor is purpose-built for batch workflows.

| Feature | This Actor | MXToolbox | DNSChecker.org | EasyDMARC |
|---------|-----------|-----------|----------------|-----------|
| Price per 1K domains | **$1.00** | $129+/mo | Manual only | $24+/mo |
| Batch processing | **Yes (10K+)** | 1 at a time | 1 at a time | CSV upload |
| MX lookup | Yes | Yes | Yes | Yes |
| SPF validation | **Yes (parsed)** | Yes | Yes | Yes |
| DKIM check | **Yes (10 selectors)** | Yes | No | Yes |
| DMARC parsing | **Yes (full)** | Yes | Yes | Yes |
| Provider detection | **Yes (14+ providers)** | No | No | Partial |
| Structured JSON | **Yes** | HTML only | HTML only | JSON |
| Zero-config | **Yes** | Requires account | Manual | Requires account |
| Apify integration | **Full** | None | None | None |

---

### How to Use

**Zero-config:** Just provide a list of domains. All checks run with sensible defaults.

```json
{
  "domains": ["yourdomain.com", "clientdomain.org", "competitor.io"]
}
````

The actor immediately returns MX records, SPF validation, DKIM status, DMARC policy, provider detection, security scores, and any detected misconfigurations — no API keys required.

**Via Apify API:**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('junipr/mx-lookup').call({
  domains: ['google.com', 'microsoft.com', 'zoho.com'],
  checkTls: false,
  onlyMisconfigured: false,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Audit your sending domains before email campaigns:**

```json
{
  "domains": ["send.yourcompany.com", "campaigns.yourcompany.com", "yourcompany.com"],
  "checkDkim": true,
  "checkDmarc": true,
  "dkimSelectors": ["google", "selector1", "s1", "mail", "default"]
}
```

**Misconfiguration scan across a domain list:**

```json
{
  "domains": ["domain1.com", "domain2.com", "domain3.com"],
  "onlyMisconfigured": true
}
```

***

### Input Configuration

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `domains` | array | `["gmail.com", "outlook.com", "yahoo.com"]` | Domains to check. Email addresses are also accepted — domain is extracted automatically. |
| `checkMx` | boolean | `true` | Look up MX records and detect email provider. |
| `checkSpf` | boolean | `true` | Parse SPF TXT records, validate mechanisms, count DNS lookups. |
| `checkDkim` | boolean | `true` | Check DKIM selectors listed in `dkimSelectors`. |
| `checkDmarc` | boolean | `true` | Parse DMARC policy record from `_dmarc.{domain}`. |
| `checkTls` | boolean | `false` | Test STARTTLS on primary MX server (port 25). Adds ~2-3s per domain. |
| `dkimSelectors` | array | `["google","selector1","selector2","default","k1","k2","s1","s2","dkim","mail"]` | DKIM selectors to probe. |
| `detectProvider` | boolean | `true` | Identify email provider from MX hostnames. |
| `includeRawRecords` | boolean | `false` | Include raw DNS record strings alongside parsed fields. |
| `onlyMisconfigured` | boolean | `false` | Filter dataset to only domains with detected misconfigurations. |
| `maxConcurrency` | integer | `20` | Concurrent DNS lookups. Min 1, max 50. |
| `dnsTimeout` | integer | `5000` | Per-DNS-lookup timeout in milliseconds. Min 1000, max 30000. |
| `dnsServer` | string | null | Custom DNS resolver IP. Empty = system default. |

**Common configurations:**

- **Quick MX check** — `checkSpf: false, checkDkim: false, checkDmarc: false`
- **Full email audit** — all checks enabled, `checkTls: true`
- **Lead qualification** — default settings with `detectProvider: true`
- **Misconfiguration scan** — `onlyMisconfigured: true`

***

### Output Format

One dataset item is produced per domain. A run summary is stored in the Key-Value Store under key `OUTPUT`.

**Example — well-configured domain:**

```json
{
  "domain": "google.com",
  "mx": {
    "records": [{ "priority": 10, "exchange": "aspmx.l.google.com" }],
    "hasMx": true,
    "provider": "Google Workspace",
    "providerType": "google_workspace"
  },
  "spf": {
    "record": "v=spf1 include:_spf.google.com ~all",
    "isValid": true,
    "mechanisms": ["include:_spf.google.com", "~all"],
    "includes": ["_spf.google.com"],
    "policy": "softfail",
    "lookupCount": 1,
    "exceedsLookupLimit": false,
    "errors": []
  },
  "dkim": {
    "selectors": {
      "google": { "found": true, "record": "v=DKIM1; k=rsa; p=...", "keyType": "rsa", "keyLength": 2048 }
    },
    "hasAnyDkim": true,
    "activeSelectors": ["google"]
  },
  "dmarc": {
    "record": "v=DMARC1; p=reject; rua=mailto:dmarc@google.com",
    "isValid": true,
    "policy": "reject",
    "subdomainPolicy": null,
    "percentage": 100,
    "reportingEmails": ["dmarc@google.com"],
    "forensicEmails": [],
    "alignmentMode": { "spf": null, "dkim": null },
    "errors": []
  },
  "tls": null,
  "misconfigurations": [],
  "score": { "overall": 96, "mx": 100, "spf": 85, "dkim": 100, "dmarc": 100 },
  "checkedAt": "2025-01-15T12:00:00.000Z",
  "errors": []
}
```

**Misconfiguration severity levels:**

| Severity | Meaning |
|----------|---------|
| `critical` | Domain cannot receive email or is actively spoofable |
| `warning` | Reduced security posture, deliverability risk |
| `info` | Best practice gaps, not immediately harmful |

**Score breakdown:** Each component (MX, SPF, DKIM, DMARC) contributes 25% to the overall score. A score of 100 means fully configured, enforcing policy, DKIM key ≥ 2048 bits, DMARC policy is `reject`, and aggregate reporting is configured.

***

### Tips and Advanced Usage

**Custom DKIM selectors:** If your email provider uses a non-standard selector (e.g., `acme._domainkey.yourdomain.com`), add `"acme"` to `dkimSelectors`. The actor checks all selectors in parallel, so adding more selectors has minimal time cost.

**Understanding SPF lookup limits:** RFC 7208 limits SPF evaluation to 10 DNS lookups. If your SPF chain exceeds this, some receiving servers may reject or fail your mail. Use a tool like dmarcian's SPF Surveyor to flatten your record.

**DMARC policy progression:** Start with `p=none` to monitor, then move to `p=quarantine` after reviewing aggregate reports for 2-4 weeks, then advance to `p=reject` for maximum protection. The actor flags `none` policy as a warning — use the `onlyMisconfigured` filter to prioritize domains needing attention.

**Lead qualification by email provider:** `providerType: "google_workspace"` typically indicates SMBs and startups. `providerType: "microsoft_365"` often signals mid-market or enterprise organizations. Use this to route leads to the appropriate sales motion.

**Combining with other Junipr actors:** This actor pairs naturally with our [Disposable Email Checker](https://apify.com/junipr/disposable-email-checker) and [Email Validator](https://apify.com/junipr/email-validator) actors for a complete email intelligence pipeline.

***

### Pricing

Pay-Per-Event: **$1.00 per 1,000 domains checked** (billed per domain, $0.001/domain).

Pricing includes all platform compute costs — no hidden fees.

| Batch Size | Estimated Cost |
|------------|---------------|
| 1 domain | $0.001 |
| 10 domains | $0.01 |
| 100 domains | $0.10 |
| 1,000 domains | $1.00 |
| 10,000 domains | $10.00 |

Domains that fail format validation are not billed. Invalid domain inputs are returned with `errors: ["INVALID_DOMAIN_FORMAT"]` at no charge.

***

### FAQ

#### Does this send emails to test deliverability?

No. This actor only performs passive DNS lookups. It queries public DNS records (MX, TXT, CNAME) — no email is sent, no SMTP connection is established (unless `checkTls` is enabled, which only tests the STARTTLS handshake on port 25 without sending any message content).

#### How accurate is email provider detection?

Provider detection is heuristic-based on MX hostnames. It correctly identifies Google Workspace, Microsoft 365, Zoho, ProtonMail, Fastmail, Amazon SES, Mailgun, SendGrid, Mimecast, Proofpoint, and several others. Self-hosted Postfix or obscure providers are returned as `providerType: "other"` with the raw MX hostname in `provider`.

#### What DKIM selectors does it check by default?

The default selectors are: `google`, `selector1`, `selector2`, `default`, `k1`, `k2`, `s1`, `s2`, `dkim`, `mail`. These cover the most common commercial email providers. You can add custom selectors via the `dkimSelectors` input — useful for self-hosted mail servers or custom signing configurations.

#### Can I use this to fix my email deliverability issues?

This actor diagnoses problems but does not fix them. Each misconfiguration includes a `recommendation` field with specific guidance. For SPF and DMARC issues, changes are made in your DNS provider's control panel. For DKIM, changes are made in your email platform and DNS.

#### What does a score of 75 mean?

Scores are calculated per component: MX (25%), SPF (25%), DKIM (25%), DMARC (25%). A score of 75 typically means three components are fully configured and one is missing or weak. Scores below 50 indicate critical gaps. Target 90+ for domains used in email campaigns.

#### Does it check BIMI records?

Not currently. BIMI (Brand Indicators for Message Identification) lookup is on the roadmap. BIMI requires a valid DMARC `reject` policy, so checking DMARC first is a prerequisite anyway.

#### Can I check subdomains separately?

Yes. Subdomains can have their own MX, SPF, and DMARC records. Provide the full subdomain (e.g., `send.yourdomain.com`) and the actor checks it independently. If the subdomain has no DMARC record, the parent domain's `sp=` tag applies.

#### How does this complement the Disposable Email Checker?

The [Disposable Email Checker](https://apify.com/junipr/disposable-email-checker) identifies domains from throwaway email services (Mailinator, Guerrilla Mail, etc.). This actor checks if a domain's email infrastructure is properly configured. Together they answer: "Is this email real?" and "Is this domain's email setup legitimate?" — essential for lead validation and email list hygiene.

# Actor input Schema

## `domains` (type: `array`):

List of domain names to check. You may also provide email addresses — the domain will be extracted automatically. Do not include protocol or path.

## `checkMx` (type: `boolean`):

Look up MX records and detect the email provider (Google Workspace, Microsoft 365, Zoho, etc.).

## `checkSpf` (type: `boolean`):

Look up and parse SPF (TXT) records. Validates policy, mechanisms, and DNS lookup count.

## `checkDkim` (type: `boolean`):

Check DKIM records for common selectors. Validates key type and key length.

## `checkDmarc` (type: `boolean`):

Look up and parse DMARC policy from \_dmarc.<domain>. Validates policy, reporting emails, and alignment mode.

## `checkTls` (type: `boolean`):

Test STARTTLS support on the primary MX server (port 25 connection). Adds ~2-3s per domain. Disabled by default.

## `dkimSelectors` (type: `array`):

List of DKIM selectors to probe. Each selector queries {selector}.\_domainkey.{domain}.

## `detectProvider` (type: `boolean`):

Identify the email provider from MX hostnames (Google Workspace, Microsoft 365, Zoho, ProtonMail, Fastmail, etc.).

## `includeRawRecords` (type: `boolean`):

Include raw DNS record strings in addition to parsed fields.

## `onlyMisconfigured` (type: `boolean`):

Filter output to only include domains that have detected misconfigurations (missing SPF, weak DMARC, no DKIM, etc.).

## `maxConcurrency` (type: `integer`):

Maximum number of concurrent DNS lookups. Higher values are faster but may trigger rate limiting.

## `dnsTimeout` (type: `integer`):

Timeout for each DNS lookup in milliseconds.

## `dnsServer` (type: `string`):

Custom DNS resolver IP address. Leave empty to use the system default. Examples: 8.8.8.8, 1.1.1.1, 9.9.9.9.

## Actor input object example

```json
{
  "domains": [
    "gmail.com",
    "outlook.com",
    "yahoo.com"
  ],
  "checkMx": true,
  "checkSpf": true,
  "checkDkim": true,
  "checkDmarc": true,
  "checkTls": false,
  "dkimSelectors": [
    "google",
    "selector1",
    "selector2",
    "default",
    "k1",
    "k2",
    "s1",
    "s2",
    "dkim",
    "mail"
  ],
  "detectProvider": true,
  "includeRawRecords": false,
  "onlyMisconfigured": false,
  "maxConcurrency": 20,
  "dnsTimeout": 5000
}
```

# Actor output Schema

## `results` (type: `string`):

MX, SPF, DKIM, and DMARC data for each domain checked.

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

Aggregate statistics for the run including totals, provider breakdown, and severity counts.

# 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 = {
    "domains": [
        "gmail.com",
        "outlook.com",
        "yahoo.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("junipr/mx-lookup").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 = { "domains": [
        "gmail.com",
        "outlook.com",
        "yahoo.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("junipr/mx-lookup").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "domains": [
    "gmail.com",
    "outlook.com",
    "yahoo.com"
  ]
}' |
apify call junipr/mx-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=junipr/mx-lookup",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "MX Lookup API",
        "description": "Look up MX (Mail Exchange) DNS records for any domain. Verify email server configuration, check mail routing, and validate domain email deliverability.",
        "version": "1.0",
        "x-build-id": "Cv0i7jPCAoKOPwENi"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/junipr~mx-lookup/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-junipr-mx-lookup",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/junipr~mx-lookup/runs": {
            "post": {
                "operationId": "runs-sync-junipr-mx-lookup",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/junipr~mx-lookup/run-sync": {
            "post": {
                "operationId": "run-sync-junipr-mx-lookup",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "domains": {
                        "title": "Domains",
                        "type": "array",
                        "description": "List of domain names to check. You may also provide email addresses — the domain will be extracted automatically. Do not include protocol or path.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "gmail.com",
                            "outlook.com",
                            "yahoo.com"
                        ]
                    },
                    "checkMx": {
                        "title": "Check MX Records",
                        "type": "boolean",
                        "description": "Look up MX records and detect the email provider (Google Workspace, Microsoft 365, Zoho, etc.).",
                        "default": true
                    },
                    "checkSpf": {
                        "title": "Check SPF Record",
                        "type": "boolean",
                        "description": "Look up and parse SPF (TXT) records. Validates policy, mechanisms, and DNS lookup count.",
                        "default": true
                    },
                    "checkDkim": {
                        "title": "Check DKIM Records",
                        "type": "boolean",
                        "description": "Check DKIM records for common selectors. Validates key type and key length.",
                        "default": true
                    },
                    "checkDmarc": {
                        "title": "Check DMARC Record",
                        "type": "boolean",
                        "description": "Look up and parse DMARC policy from _dmarc.<domain>. Validates policy, reporting emails, and alignment mode.",
                        "default": true
                    },
                    "checkTls": {
                        "title": "Check STARTTLS Support",
                        "type": "boolean",
                        "description": "Test STARTTLS support on the primary MX server (port 25 connection). Adds ~2-3s per domain. Disabled by default.",
                        "default": false
                    },
                    "dkimSelectors": {
                        "title": "DKIM Selectors to Check",
                        "type": "array",
                        "description": "List of DKIM selectors to probe. Each selector queries {selector}._domainkey.{domain}.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "google",
                            "selector1",
                            "selector2",
                            "default",
                            "k1",
                            "k2",
                            "s1",
                            "s2",
                            "dkim",
                            "mail"
                        ]
                    },
                    "detectProvider": {
                        "title": "Detect Email Provider",
                        "type": "boolean",
                        "description": "Identify the email provider from MX hostnames (Google Workspace, Microsoft 365, Zoho, ProtonMail, Fastmail, etc.).",
                        "default": true
                    },
                    "includeRawRecords": {
                        "title": "Include Raw DNS Records",
                        "type": "boolean",
                        "description": "Include raw DNS record strings in addition to parsed fields.",
                        "default": false
                    },
                    "onlyMisconfigured": {
                        "title": "Only Output Misconfigured Domains",
                        "type": "boolean",
                        "description": "Filter output to only include domains that have detected misconfigurations (missing SPF, weak DMARC, no DKIM, etc.).",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of concurrent DNS lookups. Higher values are faster but may trigger rate limiting.",
                        "default": 20
                    },
                    "dnsTimeout": {
                        "title": "DNS Timeout (ms)",
                        "minimum": 1000,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Timeout for each DNS lookup in milliseconds.",
                        "default": 5000
                    },
                    "dnsServer": {
                        "title": "Custom DNS Server",
                        "type": "string",
                        "description": "Custom DNS resolver IP address. Leave empty to use the system default. Examples: 8.8.8.8, 1.1.1.1, 9.9.9.9."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
