# WHOIS & DNS Lookup: MX Records, Email Provider, SPF, DMARC (`hirethomas/domain-whois-dns-email-provider`) Actor

Bulk WHOIS and DNS lookup: registrar, creation and expiry dates (RDAP/WHOIS), nameservers, A and MX records, email provider (Google Workspace, Microsoft 365...), SPF senders, DMARC policy and verified SaaS tools. $2.50 per 1,000 domains.

- **URL**: https://apify.com/hirethomas/domain-whois-dns-email-provider.md
- **Developed by:** [Brindlewave Data](https://apify.com/hirethomas) (community)
- **Categories:** Lead generation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 domain results

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

## Domain WHOIS, DNS & Email Provider Lookup

Paste a list of domains (or website URLs) and get one clean row per domain with:

- **Registration (RDAP, the modern WHOIS):** registrar, creation date, expiry date, last update, domain age in days, days until expiry, status flags, nameservers, DNSSEC
- **DNS:** A and AAAA records, whether the domain resolves, MX records
- **Email provider:** detected from MX (Google Workspace, Microsoft 365, Zoho, Proofpoint, Mimecast, GoDaddy, Namecheap, Fastmail and 20+ more)
- **Email security:** SPF record, `~all`/`-all` policy, senders allowed by SPF (SendGrid, Mailchimp, HubSpot, Amazon SES...), DMARC record and policy (`none` / `quarantine` / `reject`)
- **Verified SaaS tools:** services the domain verified via DNS TXT records (Google Search Console, Meta, Atlassian, Slack, Stripe, DocuSign, OpenAI and more)

No browser, no proxies, no logins: it uses public RDAP registry servers (via the IANA bootstrap list) and DNS-over-HTTPS, so it is fast and cheap.

### Use cases

- **Lead qualification and segmentation:** split a prospect list by email provider (Google Workspace vs Microsoft 365) or by the tools they use
- **Cold email hygiene:** drop domains with no MX records before you send
- **Deliverability and security audits:** find domains with no SPF or a DMARC policy of `none`
- **Domain portfolio monitoring:** expiry dates and registrars across hundreds of domains
- **Market research:** how many companies in a list use a given provider

### Input

| Field | Description |
|---|---|
| `domains` | List of domains or URLs (`https://www.example.com/page` becomes `example.com`) |
| `domainsText` | Optional: paste a list separated by new lines, commas or spaces |
| `includeRegistration` | RDAP registration data (default on) |
| `includeRawTxt` | Also return all raw TXT records |
| `maxDomains` | Safety cap |

### Output example (shortened)

```json
{
  "domain": "stripe.com",
  "registrar": "SafeNames Ltd.",
  "registeredAt": "1995-09-12T04:00:00Z",
  "expiresAt": "2027-09-11T04:00:00Z",
  "domainAgeDays": 11352,
  "nameservers": ["ns-1087.awsdns-07.org", "..."],
  "resolves": true,
  "mxRecords": [{ "priority": 10, "host": "aspmx.l.google.com" }],
  "emailProvider": "Google Workspace",
  "hasSpf": true,
  "spfAll": "~all",
  "hasDmarc": true,
  "dmarcPolicy": "reject",
  "verifiedServices": ["Microsoft 365", "Atlassian", "Google Search Console", "OpenAI"]
}
```

### Notes

- **No personal data.** The actor never returns registrant names, emails, phones or addresses, only registry-level data about the domain.
- Some country-code TLDs (for example `.de`) do not publish RDAP. For those, `rdapError` explains why and the DNS and email fields are still filled.
- Email provider detection is based on MX hostnames. Domains behind a security gateway (Proofpoint, Mimecast) show the gateway, since the mailbox host is not public.
- Results reflect live DNS at run time.

### Questions or a missing provider?

Open an issue in the **Issues** tab and I'll add it.

### Pricing

Pay per result: $2.50 per 1,000 domains, plus $0.00005 per run start. No monthly rental. A domain that cannot be resolved still returns one row and counts as one result.

#### FAQ

##### How do I find which email provider a company uses?

Paste the domains. The Actor reads MX and SPF records and labels the provider (Google Workspace, Microsoft 365, Zoho and others) for each one.

##### Can I do a bulk WHOIS lookup?

Yes. Registration data comes from RDAP (the modern WHOIS) with registrar, creation and expiry dates, for thousands of domains in one run.

##### Can I check SPF and DMARC records in bulk?

Yes. Each row includes the SPF record and senders it authorizes, plus the DMARC policy (none, quarantine or reject).

##### Is this useful for lead generation?

Teams use it to segment lead lists by email provider, find companies using a given SaaS (from verification TXT records) and spot domains about to expire.

# Actor input Schema

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

Domains or website URLs, one per line (e.g. stripe.com, https://www.example.org/page). URLs are reduced to the domain and duplicates are removed.

## `domainsText` (type: `string`):

Optional: paste many domains separated by new lines, commas or spaces.

## `includeRegistration` (type: `boolean`):

Registrar, creation/expiry dates, status, nameservers. Some country TLDs (e.g. .de) do not offer RDAP; DNS and email data are still returned.

## `includeRawTxt` (type: `boolean`):

Also return every raw TXT record of the domain.

## `maxDomains` (type: `integer`):

Safety cap on how many domains to process.

## `concurrency` (type: `integer`):

How many domains are looked up in parallel.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "shopify.com",
    "notion.so"
  ],
  "includeRegistration": true,
  "includeRawTxt": false,
  "maxDomains": 10000,
  "concurrency": 8
}
```

# Actor output Schema

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

One row per domain: registration, DNS, email provider, SPF and DMARC.

# 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": [
        "stripe.com",
        "shopify.com",
        "notion.so"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hirethomas/domain-whois-dns-email-provider").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": [
        "stripe.com",
        "shopify.com",
        "notion.so",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("hirethomas/domain-whois-dns-email-provider").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 '{
  "domains": [
    "stripe.com",
    "shopify.com",
    "notion.so"
  ]
}' |
apify call hirethomas/domain-whois-dns-email-provider --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hirethomas/domain-whois-dns-email-provider"
        }
    }
}
```

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/xjOXiJIYFcDLLkgjt/builds/2hU2CcyIXmbXKgWs1/openapi.json
