Know what's behind
any URL.

Domain intelligence for developers and AI agents. One URL in, structured signals out. Your code decides what to do with them.

CLI
$ npx unphurl https://paypa1-secure.xyz/login
Score: 75/100
Brand impersonation: paypal.com (+40)
Domain age: 3 days (+35)
SSL: valid
Parked: no
MX record: none
Redirects: 3 hops
Pipeline check charged: 1 credit
Claude Code + MCP
You: Check this URL someone sent me: https://paypa1-secure.xyz/login
Claude: I'll check that URL with Unphurl.
Score: 75/100
Impersonating paypal.com. Registered 3 days ago. No MX record.
1 credit used. 42 remaining.

Intelligence, not opinions

Unphurl doesn't tell you a URL is safe or dangerous. It tells you the domain is 3 days old, impersonates paypal.com, has no MX record, and scores 80 out of 100 with your weights. You decide what that means.

A parked domain is a non-event for a security bot but a dealbreaker for a cold email campaign. The same signals, scored differently, serve both. That's why Unphurl returns structured data with transparent scoring, not binary verdicts.

Your threshold. Your use case. Your rules.

7 dimensions of analysis

Every unknown domain gets a full pipeline analysis. All checks run in parallel.

Redirect behaviour

Follows up to 10 hops. Detects shortener services, redirect loops, timeouts, and broken chains.

Brand impersonation

Levenshtein distance + homoglyph analysis against 150+ brands across 17 categories.

Domain intelligence

Age, registrar, expiration, status codes, and nameservers via RDAP.

SSL/TLS validity

Real TLS handshake from Cloudflare's edge. Checks certificate validity, not just presence.

Parked detection

4-layer detection: registrar placeholders, for-sale pages, empty content, parking services.

URL structure

Length, path depth, subdomain count, entropy, IP detection, encoded characters, TLD changes.

DNS enrichment

MX record existence. No MX on a business domain means it doesn't receive email.

Your rules, your scoring

Same signals. Different priorities. One URL, scored for your use case.

CLI
$ unphurl profiles create cold-email \
--weights '{"parked":30,"no_mx_record":20,"ssl_invalid":15}'
Profile "cold-email" created with 3 custom weights.
22 signals use defaults. View with: unphurl profiles show cold-email
$ unphurl https://sketchy-biz.xyz --profile cold-email
Score: 65/100 (cold-email profile)
parked +30 (domain is parked)
no_mx_record +20 (no MX record)
ssl_invalid +15 (invalid SSL)
$ unphurl https://sketchy-biz.xyz
Score: 20/100 (default profile)
ssl_invalid +10 (invalid SSL)
domain_entropy_high +5 (high entropy)
no_mx_record +5 (no MX record)
Claude Code + MCP
You: Create a scoring profile for cold email outreach. Boost parked domains, missing MX records, and invalid SSL.
Claude: Done. Profile "cold-email" created with 3 custom weights. The other 19 signals use defaults.
You: Check sketchy-biz.xyz with my cold-email profile.
Claude: Score: 65/100 (cold-email profile)
Parked domain (+30), no MX record (+20), invalid SSL (+15).
With default scoring this would be 20/100. Your cold-email profile flagged it because parked domains and missing email infrastructure matter for outreach.
1 credit used. 44 remaining.

22 configurable scoring weights. Up to 20 named profiles per account. Create profiles for cold email, security, SEO auditing, lead gen, or any other use case. Reference them per request: ?profile=cold-email. The score_breakdown in every response shows exactly which weights were applied.

cold-email
parked, no_mx_record, ssl_invalid
Clean prospect lists before campaigns
security-bot
brand_impersonation, domain_age_7, redirects_5
Protect Slack/Discord channels
seo-audit
chain_incomplete, redirects_3, parked
Audit backlinks and outbound links
lead-gen
parked, no_mx_record, domain_status_bad
Validate scraped domains

Two ways in

Same intelligence, same signals. Choose the door that fits your workflow. No dashboard. No login portal. Your terminal or your AI tool is the interface. That's by design.

I write code

API and CLI

REST API with bearer auth, batch processing for up to 500 URLs, 22 configurable scoring weights, custom profiles per use case. CLI for quick checks and scripting.

  • Batch endpoint with async job polling and webhooks
  • Named scoring profiles (cold-email, security-bot, seo-audit)
  • JSON responses, score breakdowns, full signal data
Read the docs →
I use AI tools

MCP Server

Install the MCP server in Claude Code, Cursor, or Windsurf. Build an Unphurl skill for OpenClaw. Your AI checks URLs as you work. Add the companion skill and it checks them proactively, without being asked.

  • 13 tools: check, batch, profiles, billing, history, stats, verification
  • Sign up, buy credits, manage everything from your AI tool
  • Companion skill for proactive URL safety checking
Set up in Claude →

How Unphurl compares

Domain intelligence built for AI agents and automation, not enterprise sales cycles.

Feature Unphurl Google Safe Browsing VirusTotal WhoisXML API DomainTools SecurityTrails
Structured signals (not verdicts)
Configurable scoring (22 weights)
Brand impersonation detection
Parked domain detection
Data quality signals (MX, expiry)
Free lookups (known + cached)
Batch processing (up to 500 URLs)
CLI tool
MCP server (AI-native)
No subscription required
Fair billing (refund on failure) N/A
Score breakdown transparency
Usage analytics per account
Both security + data quality
Entry price $9 Free Free Quote $99/mo $50/mo
Supported Not supported Limited (hover for details)

Simple, transparent pricing

Most lookups are free. You only pay when Unphurl analyses a domain nobody has checked before. Credits never expire. No subscriptions.

Every new account gets 3 free pipeline checks. No credit card required.
1

Known domain?

Google, Amazon, GitHub, and 100,000 other known domains return instantly. Score 0. Free.

Free
2

Previously analysed?

Cached signals from prior analyses. Scored fresh with your custom profile weights. The cache grows with every pipeline check across all customers.

Free
3

Unknown domain

Full pipeline across 7 dimensions. One pipeline check consumed. Results cached for all future lookups by any customer.

1 credit
Starter
$9
100 pipeline checks
$0.090 per check
Standard
$39
500 pipeline checks
$0.078 per check
Pro
$99
2,000 pipeline checks
$0.050 per check
Scale
$399
10,000 pipeline checks
$0.040 per check

Successful pipeline = credit charged. You got intelligence.

Failed pipeline = credit refunded. Automatically.

Batch deduplication: duplicates processed once, charged once.

Smart summaries when low on credits: know exactly what you need before buying.

Sign up and get 3 free pipeline checks. No credit card required.

$ unphurl signup --email you@example.com --name 'Your Name'

See exactly where your credits go

Every account tracks usage across all three gates. Know your free rate, your pipeline spend, and which URLs got flagged.

CLI
$ unphurl stats
Usage
Total URLs submitted 12,450
Tranco lookups (free) 8,200
Cache lookups (free) 3,890
Pipeline checks (paid) 360
Free rate 97.1%
Scoring
Checks above 50 142
Checks above 75 38
Account
Credits remaining 145
Total purchased 500
Last active 2026-04-08
Claude Code + MCP
You: How am I using my Unphurl credits?
Claude: Here are your usage stats:
You've checked 12,450 URLs total. 97.1% resolved free (8,200 from known domains, 3,890 from cache). Only 360 required pipeline checks.
142 URLs scored above 50. 38 scored above 75.
You have 145 credits remaining out of 500 purchased.

Get started in 30 seconds

Check a URL

$ npx unphurl https://example.com

Create an account

$ unphurl signup --email you@example.com --name 'Your Name'

MCP setup

Add to your .mcp.json in Claude Code, Cursor, or Windsurf:

{
  "mcpServers": {
    "unphurl": {
      "command": "npx",
      "args": ["-y", "@unphurl/mcp-server"],
      "env": {
        "UNPHURL_API_KEY": "uph_your_key_here"
      }
    }
  }
}