SFOLN

Catalogue / Web toolkit for agents

Domain WHOIS & DNS Lookup

sfoln/domain-intelligence · Developer tools, SEO tools, Automation

Bulk WHOIS and DNS lookup: registrar, creation and expiry dates (RDAP), availability, DNS records, SPF/DMARC and mail provider, SSL certificate, plus the homepage security-header grade and tech hints, one JSON record per domain. $3 per 1,000 domains; unregistered domains are free.

About

What it does

Look up any list of domains and get one complete record per domain: registration data (registrar, creation and expiry dates, status, nameservers, DNSSEC) from RDAP — the official successor of WHOIS — plus availability (can the domain be registered?), DNS records (A, AAAA, MX, NS, TXT), email security (SPF, DMARC policy, detected mail provider), the SSL/TLS certificate (issuer, expiry, SANs, protocol) and a homepage check (HTTP status, redirects, final URL, title, security-header grade A–F, favicon and detected technologies). Built for lead qualification, security and compliance audits, domain portfolio monitoring, brand protection and AI agents.

Price

Price per delivered record

EventPricePer 1,000Charged for
Domain report
domain-intelligence
$0.003$3 / 1,000Charged once per domain for which at least one of the checks (RDAP registration data, DNS, SSL certificate, homepage) returned data.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~domain-intelligence/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains":["apify.com","wikipedia.org"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/domain-intelligence"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~domain-intelligence/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Who is the registrar of apify.com, when does it expire, which mail provider does it use, and is example-brand-name-zz9.com still available?

Input

Input fields

Paste domains or URLs (one per line). Each domain produces one dataset record combining registration (RDAP), availability, DNS, email-security, SSL and homepage data.

FieldTypeDefaultMeaning
domains *arrayrequiredDomains or URLs
Domain names (apify.com) or URLs (https://www.apify.com/store). The host is extracted, "www." removed and duplicates dropped. Registration data is looked up for the registrable domain. Accounts on the Apify free plan can process up to 10 domains per run.
checkTlsbooleantrueCheck SSL/TLS certificate
Open a TLS connection on port 443 and report issuer, validity dates, SANs and protocol.
checkHomepagebooleantrueCheck homepage
Fetch the homepage (https, falling back to http; 8 s timeout, first 512 KB) for HTTP status, redirects, final URL, title, security-header grade (HSTS, CSP, X-Frame-Options, …), favicon and detected technologies.
maxDomainsinteger1000Max domains
Safety cap on the number of domains processed in this run. Range 1–50000.
concurrencyinteger5Concurrency
How many domains are analysed in parallel. Some registries rate-limit RDAP; lower this for very large lists of one TLD. Range 1–10.
includeRawbooleanfalseInclude raw RDAP response
Attach the unmodified RDAP JSON to each record as raw.rdap (larger output).
Example input
{
  "domains": [
    "apify.com",
    "wikipedia.org"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstringInput
Domain or URL as submitted.
domainstring | nullDomain
Normalized host (lower-case, without www.). e.g. "apify.com"
registrableDomainstringRegistrable domain
Registrable domain from the Public Suffix List (ICANN section), used for the RDAP lookup. e.g. "apify.com"
registeredboolean | nullRegistered
true = an RDAP record or DNS data exists (for the host or its registrable domain); false = the registry's RDAP service has no record and NXDOMAIN; null = undetermined.
availableboolean | nullAvailable
true = the registrable domain answers NXDOMAIN and RDAP has no record (it can be registered); false = it resolves or RDAP has a record; null = undetermined (the registry did not answer or offers no RDAP service, or the name is outside the Public Suffix List).
registrarstring | nullRegistrar
createdAtstring | nullCreated
expiresAtstring | nullExpires
domainAgeDaysinteger | nullDomain age (days)
mailProviderstring | nullMail provider
google | microsoft | zoho | proton | yahoo | icloud | fastmail | yandex | mimecast | proofpoint | amazon-ses | other | none (null MX) | null (no MX).
spfRecordstring | nullSPF record
dmarcPolicystring | nullDMARC policy
none | quarantine | reject | null (no DMARC record).
sslIssuerstring | nullSSL issuer
sslValidTostring | nullSSL valid to
sslDaysUntilExpiryinteger | nullSSL days left
httpStatusinteger | nullHTTP status
finalUrlstring | nullFinal URL
titlestring | nullHomepage title
techHintsarrayTechnology hints
Technologies detected on the homepage (headers, cookies, meta tags, scripts, HTML), most specific first.
securityHeadersobject | nullSecurity headers
Homepage security-header summary: { grade (A–F), score (0–100: HSTS 25, CSP 25, X-Frame-Options 15, X-Content-Type-Options 15, Referrer-Policy 10, Permissions-Policy 10), present[], missing[] }; null when the homepage was not fetched.
faviconUrlstring | nullFavicon
Icon declared by the homepage (<link rel=icon>), absolute URL.
sectionsobjectSection status
Per check: ok | not_found | error | skipped (rdap, dns, tls, http).
whoisobject | nullRegistration (RDAP)
registrar, registrarIanaId, createdAt, updatedAt, expiresAt, domainAgeDays, daysUntilExpiry, statuses, nameservers, dnssec, registrantOrganization, registrantCountry, abuseEmail.
dnsobject | nullDNS
a, aaaa, mx[{priority,exchange}], ns, txt, spf{record,allQualifier,includes,multipleRecords}, dmarc{record,policy,subdomainPolicy,pct,rua}, hasMx, nxdomain.
tlsobject | nullSSL/TLS certificate
issuer, issuerOrganization, subjectCommonName, subjectAltNames, sanCount, validFrom, validTo, daysUntilExpiry, expired, coversHost, trusted, trustError, protocol, serialNumber, fingerprint256.
httpobject | nullHomepage
status, finalUrl, redirects, redirectChain, https, hsts, server, poweredBy, contentType, title, generator, techHints.
warningsarrayWarnings
Checks that failed for this domain.
statusstringStatus
ok | not_found (not_registered, host_not_found) | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
errorobjectError
{ code, message, provider? } when status is not ok: not_registered, host_not_found, all_checks_failed, invalid_domain; runtime codes: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed.
chargedEventstringCharged event
domain-intelligence when charged.
chargedbooleanCharged
sourcestringSource
fetchedAtstringFetched at
Example record
Example record
{
  "input": "apify.com",
  "domain": "apify.com",
  "registrableDomain": "apify.com",
  "registered": true,
  "available": false,
  "registrar": "Amazon Registrar, Inc.",
  "createdAt": "2009-06-02T17:14:10Z",
  "expiresAt": "2035-06-02T17:14:10Z",
  "domainAgeDays": 6342,
  "mailProvider": "google",
  "spfRecord": "v=spf1 a mx include:_spf.google.com include:mailgun.org -all",
  "dmarcPolicy": "reject",
  "sslIssuer": "R11",
  "sslValidTo": "2026-12-01T12:00:00.000Z",
  "sslDaysUntilExpiry": 48,
  "httpStatus": 200,
  "finalUrl": "https://apify.com/",
  "title": "Apify: Full-stack web scraping and data extraction platform",
  "techHints": [
    "Algolia",
    "Node.js",
    "Next.js",
    "React",
    "Amazon Cloudfront",
    "HSTS",
    "Intercom"
  ],
  "securityHeaders": {
    "grade": "B",
    "score": 85,
    "present": [
      "Strict-Transport-Security",
      "Content-Security-Policy",
      "X-Frame-Options",
      "X-Content-Type-Options",
      "Permissions-Policy"
    ],
    "missing": [
      "Referrer-Policy"
    ]
  },
  "faviconUrl": "https://apify.com/favicon.ico",
  "sections": {
    "rdap": "ok",
    "dns": "ok",
    "tls": "ok",
    "http": "ok"
  },
  "whois": {
    "registrar": "Amazon Registrar, Inc.",
    "registrarIanaId": "468",
    "updatedAt": "2026-05-16T16:53:04Z",
    "daysUntilExpiry": 3153,
    "statuses": [
      "client transfer prohibited"
    ],
    "nameservers": [
      "ns-449.awsdns-56.com",
      "…"
    ],
    "dnssec": true,
    "registrantOrganization": null,
    "registrantCountry": null,
    "abuseEmail": "trustandsafety@support.aws.com"
  },
  "dns": {
    "a": [
      "143.204.204.5"
    ],
    "aaaa": [
      "2600:9000:…"
    ],
    "mx": [
      {
        "priority": 1,
        "exchange": "aspmx.l.google.com"
      }
    ],
    "ns": [
      "…"
    ],
    "txt": [
      "…"
    ],
    "spf": {
      "record": "v=spf1 …",
      "allQualifier": "-all",
      "includes": [
        "_spf.google.com",
        "mailgun.org"
      ],
      "multipleRecords": false
    },
    "dmarc": {
      "record": "v=DMARC1; p=reject; …",
      "policy": "reject",
      "subdomainPolicy": "reject",
      "pct": 100,
      "rua": [
        "mailto:…"
      ]
    },
    "hasMx": true,
    "nxdomain": false
  },
  "tls": {
    "issuer": "R11",
    "issuerOrganization": "Let's Encrypt",
    "subjectCommonName": "apify.com",
    "sanCount": 2,
    "validFrom": "…",
    "validTo": "…",
    "daysUntilExpiry": 48,
    "expired": false,
    "coversHost": true,
    "trusted": true,
    "protocol": "TLSv1.3"
  },
  "http": {
    "status": 200,
    "finalUrl": "https://apify.com/",
    "redirects": 0,
    "https": true,
    "hsts": true,
    "server": null,
    "title": "…",
    "generator": null,
    "techHints": [
      "…"
    ]
  },
  "status": "ok",
  "charged": true,
  "chargedEvent": "domain-intelligence",
  "source": "public-rdap-dns-tls",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

FAQ

Questions

How is availability decided?
DNS first: a registrable domain that answers NXDOMAIN is a candidate, and the registry's RDAP service confirms it by having no record (HTTP 404). Then available is true. A domain that resolves or has an RDAP record is not available. When the registry does not answer (rate limits, ccTLDs without RDAP), or the name is outside the Public Suffix List, available is null. Unregistered domains are never charged.
Why is a subdomain returned as not_found?
When the host itself does not exist in DNS (for example a typo like shpo.example.com) while its registrable domain is registered, the record says so with error code host_not_found and is not charged. Look up the registrable domain to get its registration data.

Machine-readable

This page for agents