Input
--input <path>- Read newline, comma, or space-separated domains.
--stdin- Read domains from standard input.
--labels <a,b,c>- Add known candidate tracking labels.
--preserve-hostname- Scan the supplied hostname instead of its base domain.
DOCUMENTATION
Learn the CLI, understand every confidence level, and run careful public DNS research at scale.
Node.js 20 or newer is the only runtime requirement. Run vendorprint directly from npm without installing it globally.
npx vendorprint@latest example.com --pretty
Install vendorprint globally when you use it regularly. Add
--findings-only for compact output without raw DNS detail.
npm install --global vendorprint
vendorprint example.com --findings-only --pretty
vendorprint queries the configured recursive DNS resolver. It does not request company websites, tracking endpoints, login pages, or application APIs.
Use positional domains for quick scans, or file and stream inputs for larger jobs.
--input <path>--stdin--labels <a,b,c>--preserve-hostname--mode <value>--timeout <ms>--concurrency <n>--max-inflight-dns <n>--qps <n>--ct--ct-cache <path>--findings-only--format <value>--output <path>--pretty--include-unclassified--resume <path>--help0Scan completed. Individual domains may still contain DNS errors.1The CLI input was invalid.URLs and hostnames normalize to the registrable company domain using the Public Suffix List.
https://www.example.co.uk/pricing
example.co.uk
Use --preserve-hostname only when a delegated hostname is intentionally the scan target. Invalid inputs are retained under invalidInputs instead of silently disappearing.
Compact output keeps evidence, confidence, and safety diagnostics while omitting raw DNS answers.
{
"domain": "string",
"status": "ok | error",
"email": {
"provider": "string | Unknown",
"confidence": "low | medium | high",
"securityGateways": []
},
"infrastructure": {
"dnsProvider": {},
"domainVerifications": [],
"authorizedEmailSenders": [],
"dmarcMonitoringServices": [],
"cnameServices": []
},
"querySafety": {},
"technologyProfile": {
"aiWorkspaces": [],
"crm": [],
"marketingAutomation": [],
"emailDelivery": [],
"salesEngagement": [],
"customerData": [],
"productAnalytics": [],
"customerSupport": [],
"eventsAndWebinars": [],
"inferenceGraph": {}
},
"technologyFingerprint": "sha256:...",
"salesEngagement": {
"status": "detected | not_detected",
"detected": []
}
}
domain, status, and normalized input diagnostics.
Mail routing, ownership proofs, sending authorization, CNAME services, and sales engagement.
Normalized categories plus explicit inferred findings and non-exhaustive candidate sets.
Query budgets, skipped labels, retries, and wildcard-like CNAME diagnostics.
Inspect the versioned catalog, find recurring unknown records offline, and compare two scan snapshots.
vendorprint signatures --pretty
vendorprint signatures audit findings.ndjson --pretty
vendorprint diff before.json after.json --pretty
Audit output contains aggregate unknown prefixes and target domains only. It excludes account domains and verification tokens, and it performs no network requests.
vendorprint separates direct observations from derived relationships and unresolved candidates.
A vendor-owned MX or CNAME target, or a self-identifying ownership proof.
A product dependency or suite relationship, with rationale and caveats attached.
A non-exhaustive set that may be prioritized by independent corroborating evidence.
platform_configuration
An attributable custom hostname points to vendor infrastructure.
domain_relationship
A vendor-specific TXT record proves that domain ownership was configured.
sending_authorization
SPF authorizes a service to send mail but does not prove broader product use.
DNS cannot list arbitrary subdomains. Proxies, disabled branded tracking, and customer-selected labels can hide an otherwise active product.
Use NDJSON for long-running jobs. Each completed domain is appended immediately and becomes a durable checkpoint.
vendorprint --input accounts.txt \
--format ndjson \
--findings-only \
--output findings.ndjson
vendorprint --input accounts.txt \
--findings-only \
--resume findings.ndjson
Resume skips normalized domains already present, tolerates one partial final line, and appends only remaining results. New output files are created without overwriting an existing file.
Import the scanner without invoking the CLI, or consume completion-order events as an async iterator.
import { scanDomains } from "vendorprint";
const report = await scanDomains(["example.com"], {
concurrency: 4,
maxInflightDns: 32,
qps: 100,
});
import { scanDomainEvents } from "vendorprint";
for await (const event of scanDomainEvents(domains)) {
process.stdout.write(`${JSON.stringify(event)}\n`);
}
Keep the evidence attached, preserve unknown values, and use the built-in DNS limits.
Only research domains you are permitted to process. Follow applicable law, provider terms, data-governance rules, and retention policies.
These constraints protect the resolver and keep downstream decisions honest.
A configured record can remain after a tool is no longer actively used.
Cloudflare and other proxies can hide the vendor-owned CNAME target.
Wildcard-like answers are collapsed so repeated guesses do not inflate evidence.
A platform relationship does not prove a specific module, plan, seat, or recent activity.