Domain Typosquatting Audit avatar

Domain Typosquatting Audit

Pricing

Pay per usage

Go to Apify Store
Domain Typosquatting Audit

Domain Typosquatting Audit

Audit bounded lookalike-domain mutations with DNS-only A, AAAA, MX, NS, and UNKNOWN evidence.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Chris Prosser

Chris Prosser

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Categories

Share

Audit lookalike-domain mutations with bounded, DNS-only evidence. The Actor returns observed A, AAAA, MX, and NS records plus an explicit UNKNOWN state for resolver failures. It does not determine domain availability, use HTTP or browser scanning, query WHOIS/RDAP, recommend purchases, or make a phishing verdict.

Use it as a typosquat checker, lookalike-domain inventory, domain impersonation review, brand-protection input, or reproducible DNS audit. Treat every result as a point-in-time DNS observation, not as ownership, intent, or registrability evidence.

Input

FieldRequiredDefaultContract
domainsYesexample.com in the Store UIOne to five ICANN registrable root domains
mutationFamiliesNobitsquatting, hyphenation, omission, transpositionAllowlisted dnstwist mutation families
maxVariantsPerDomainNo200Deterministic hard cap, range 25400
dnsTimeoutMsNo1000Per-record timeout, capped by the remaining run deadline
overallDeadlineSecNo60One absolute deadline for the full batch, range 5300

Example:

{
"domains": ["example.com"],
"mutationFamilies": ["bitsquatting", "hyphenation"],
"maxVariantsPerDomain": 100,
"dnsTimeoutMs": 1000,
"overallDeadlineSec": 60
}

Domains are normalized to lowercase ASCII IDNA. The Actor accepts only an ICANN eTLD+1 recognized by the offline Public Suffix List bundled with pinned tld==0.13.2. It rejects URLs, credentials, ports, IPs, subdomains, public suffixes, unknown or reserved suffixes, and PSL PRIVATE-section hosting suffixes before mutation generation or DNS work.

Dataset rows

Each variant row contains:

  • normalized inputDomain, generated variantDomain, and fuzzer;
  • status: REGISTERED_EVIDENCE, NO_DNS_EVIDENCE, or UNKNOWN;
  • DNS arrays dnsA, dnsAAAA, dnsMX, and dnsNS;
  • hasMx, evidenceAt, latencyMs, and exact queryCount;
  • domain-level scanStatus, stable failureCode, and truncation state.

REGISTERED_EVIDENCE means at least one target DNS record was observed without a resolver anomaly. NO_DNS_EVIDENCE means a complete NODATA pass or authoritative NXDOMAIN produced no target record. It does not mean the domain is available. Timeout, SERVFAIL, REFUSED, missing nameservers, and other DNS faults remain UNKNOWN; they are never rewritten as no-evidence results.

Non-result conditions use the same flat schema with rowType = DIAGNOSTIC. Trustworthy rows are retained when a later deadline, billing, or runtime failure stops the run.

OUTPUT summary

The OUTPUT key-value record contains run and per-domain completeness, generated/selected/scanned/query counts, typed status counts, and:

{
"billing": {
"pricingModel": "FREE",
"eventName": "domain-audit-completed",
"eligibleDomainCount": 1,
"chargedDomainCount": 0,
"billingLimitReached": false,
"billingFailureCode": null
}
}

No price, user budget, token, account information, raw resolver exception, or monitoring payload is emitted.

Pay per event behavior

The same source supports private FREE operation and pay-per-event operation. Charging is dormant unless the effective Apify pricing model is PPE. When PPE is active, the only custom event is domain-audit-completed, issued at most once for one domain after its dataset rows and latest OUTPUT are durable.

A domain is eligible only when it is COMPLETE, generated and scanned at least one variant, has unknownCount == 0, and was not truncated or stopped by a deadline, generator, PSL, billing, or persistence failure. The exact Store daily test—one example.com with all schema defaults—is non-billable. Diagnostics, summaries, UNKNOWN, incomplete domains, and synthetic events are not separately charged.

Before each PPE domain, the Actor checks the remaining event budget. If it cannot fund another event, it performs no mutation or DNS work for that domain or any remaining domain, returns BILLING_LIMIT_REACHED, and preserves an INCOMPLETE summary. A failed charge never changes the DNS status and fails the run with BILLING_CHARGE_FAILED after preserving the result.

Determinism, safety, and limits

  • Python 3.14, 512 MiB, and a 360-second platform timeout are the release contract; the Actor's own maximum input deadline is 300 seconds.
  • Mutations come from official elceef/dnstwist tag 20250130, commit 4e6e477e95049067a7fe41fd8512e332abe26e95, then are normalized, deduplicated, sorted, and capped.
  • The Actor uses platform DNS only. There is no user-controlled resolver, executable, argument list, URL, proxy, secret, task, schedule, or Standby mode.
  • A durable same-run execution guard blocks resurrection or retry from repeating DNS work or billing.

Attribution and validation

The upstream Apache-2.0, tld tri-license, and Public Suffix List MPL-2.0 notices are preserved in NOTICE. Runtime dependencies and the Python 3.14 base image are pinned by exact versions, hashes, and image digest.

In a full source checkout, the dependency-free contract suite is:

~/.codex/bin/codex-python -m unittest discover -s tests -v
~/.codex/bin/codex-python -m compileall -q dnstwist_actor tests scripts

Dependency installation, apify run, Docker, live DNS canaries, benchmarks, private cloud builds, and browser QA run only through the registered OpenClaw workspace. Tests, operational scripts, receipts, GO cards, and monitor state are excluded from the Actor upload.