How Underhood works

Your DNS leaks your vendor list. Underhood reads what a company's public footprint gives away: a handful of DNS lookups and one homepage request. Everything we show, anyone could see, and every detection comes with the record it came from. We don't run JavaScript or crawl, so tools a page loads later stay invisible. That's on purpose: the footprint is the point.

Signals we read

HTTP headers
Host, CDN, framework
Response headers of one GET to the homepage
header x-vercel-id: iad1::…
HTML & scripts
Framework, site builder, analytics, payment widgets
<script src>, <meta name=generator>, framework markers
script https://js.stripe.com/v3
Cookie names
Analytics, auth, payments
Names from Set-Cookie. Values are discarded unread
cookie __stripe_mid
CNAME
Hosting platform
Apex and www, following the chain
CNAME www → cname.vercel-dns.com
NS
DNS provider
Apex name servers
NS kate.ns.cloudflare.com
MX
Email provider
Apex mail servers
MX aspmx.l.google.com
SPF
Every service allowed to send email as the domain
include: and redirect= in the v=spf1 record (listed, not followed)
SPF include:sendgrid.net
TXT verification
SaaS tools that verified the domain for SSO or a workspace
Apex TXT records
TXT atlassian-domain-verification=…
DMARC
Email-security / DMARC reporting tool
rua= address in _dmarc
TXT _dmarc rua=…@ag.dmarcian.com
IP owner
Cloud or CDN serving the site
ASN of the first A record, via Team Cymru's public DNS service
IP 104.18.40.45 is in AS13335
Subdomains
Status page, trust centre, login, docs, help desk and email-link vendors
Names in public certificate-transparency logs (crt.sh, or Cert Spotter as a fallback), then each one's CNAME
CNAME status.acme.com → x.stspg-customer.com

Matching uses 210 DNS rules of our own (most found by scanning startups and looking at records we didn't recognise yet) and 3,435 page fingerprints from the open webappanalyzer project. TXT, MX and NS are read at the apex only: on www they would follow the CNAME and describe the host instead.

Confidence

● high
Hard proof: DNS verification, SPF, CNAME, MX or a provider's own response header
● medium
Seen in the page: a script, cookie name, meta tag or HTML marker
● low
Indirect: mentioned in an allow-list header or similar hint

No evidence, no detection. When signals disagree we show all of them and keep the strongest. The findings report counts medium and high only.

The rough bill

Each report has a collapsed Rough monthly bill (estimate). It multiplies public list prices by a guess at company size, taken from the site's rank in the Tranco top-sites list: XL is the top 1k, L the top 10k, M the top 100k, S everything else. Headcount guesses are 1–10, 10–100, 100–1,000 and 1,000+ people.

Usage-based services (Stripe, AWS, email volume…) are listed but never given a number, and neither is anything without a published price. Every price links to its source. Treat it as an order of magnitude, nothing more.

What we never do

  • ×Store or show cookie values
  • ×Log in, submit forms or run JavaScript
  • ×Crawl: one homepage request per scan, no links followed
  • ×Guess subdomains or send them requests: names come only from public certificate logs, and we only look up their DNS
  • ×Probe ports (only 80/443 on the homepage, public addresses only)
  • ×Keep page HTML. Only the detections and their evidence are kept
  • ×Guess a database or backend language without direct evidence

What we can't see

  • –Anything behind a login, or what runs inside subdomains like app. (we see where they point, not what they serve)
  • –Tools loaded later by a tag manager (many chat widgets and analytics)
  • –What's behind a CDN like Cloudflare (the origin is hidden)
  • –Tools that need no DNS record or script, which is most SaaS
  • –How much a company uses a tool. A verification record only proves an account exists

So a report is a lower bound: what's listed is there, but plenty more probably is too.

The bot

User agent
UnderhoodBot/0.1 (+https://github.com/yatharth1706/underhood)
Per scan
One GET to the homepage, at most 3 redirects, 4-second timeout, first 1.5 MB read
Caching
Each domain is scanned at most once a day; reports and the API reuse that result
Rate limits
10 API scans and 30 report views per minute per visitor
Batch scans
For the findings report: at most 8 sites at a time, one request each, run by hand, not on a schedule

Opt out

If you run a domain and don't want it scanned, open an opt-out request with the domain name. We may ask you to confirm you control it, for example by adding a TXT record. Once it's on the opt-out list:

Reports
show “opted out”
API
refuses to scan
Batch scans
skip it
Findings
leave it out

Credits