The problem
AI agents increasingly recommend products, stores, and URLs to users. But when an agent says "this store looks good," there's no automatic check of whether the store is a scam.
Commercial services like WHOISXML, IPQualityScore, and CheckPhish sell domain reputation data — but they're paid, require API keys, and are black boxes. You can't see why they flagged a domain.
What we built
A free domain reputation checker with transparent heuristics. No API key. No registration. CORS open.
Try it live: https://www.marketnow.site/scam-checker.html
API:
curl "https://www.marketnow.site/api/scam-check?domain=example.com"
Response:
{
"domain": "example.com",
"decision": "TRUSTED",
"risk_score": 0,
"reasons": [],
"checks": {
"url_shortener": { "triggered": false, "detail": "Not a known URL shortener" },
"suspicious_tld": { "triggered": false, "detail": "TLD not in suspicious list" },
"typosquatting": { "triggered": false, "detail": "No typosquatting pattern matched" },
...
}
}
What it checks (8 heuristics)
- URL shorteners — bit.ly, tinyurl, t.co and 20+ others. Destination hidden, cannot inspect final URL.
- Suspicious TLDs — .zip, .xyz, .top, .click and 20+ others commonly abused for spam.
- Punycode/IDN — internationalized domains that imitate legitimate brands (homograph attacks).
- Typosquatting — amaz0n, paypa1, app1e. Uses Levenshtein distance to detect 1-character typos of popular brands.
- Domain age — checks if domain is in known-popular list (established domains).
- Subdomain abuse — deep subdomain chains and brands in subdomains of unrelated roots.
- HTTP tokens — @, //, long numeric sequences in the domain.
- SSL — checks if domain is in popular list (SSL assumed valid).
How agents should use this
import requests
def is_safe_to_recommend(url):
result = requests.get(
f"https://www.marketnow.site/api/scam-check?domain={url}"
).json()
if result["decision"] == "SUSPICIOUS":
return False, result["reasons"]
elif result["decision"] == "CAUTION":
return None, result["reasons"] # Let user decide
else:
return True, []
Honest limitations
This is heuristic v1. No threat feeds. A new, clean scam returns UNKNOWN, not TRUSTED.
What this means:
- We can detect patterns that scammers commonly use (shorteners, suspicious TLDs, typosquatting)
- We cannot detect a brand-new scam site that uses a normal TLD and doesn't typosquat
- The check is transparent — every decision shows exactly which heuristics triggered and why
This is not a substitute for commercial threat intelligence. It's a free, transparent first check that agents can call without an API key.
Why this is different
| Feature | Commercial (WHOISXML, IPQualityScore) | UTA Scam Checker |
|---|---|---|
| Price | Paid | Free |
| API key | Required | Not required |
| Transparency | Black box | Every check shows its reasoning |
| CORS | Usually closed | Open |
| Cacheable | No | Yes (5 min cache) |
| Registration | Required | Not required |
Use case: AI agents that recommend products
If you're building an agent that recommends products or stores (product research, dropshipping, affiliate), the agent should check the domain before recommending:
# Before the agent recommends a store
safe, reasons = is_safe_to_recommend("suspicious-store.xyz")
if not safe:
agent_response = f"I cannot recommend this store. Reasons: {reasons}"
else:
agent_response = f"This store looks safe to explore."
Try it
- Live checker: https://www.marketnow.site/scam-checker.html
-
API:
GET https://www.marketnow.site/api/scam-check?domain=example.com - GitHub: https://github.com/alicelabs-llc/universal-trust-adapter
This is the first "policy pack" for UTA (Universal Trust Adapter). The scam checker runs alongside the credential verification pipeline. Both are free, no auth, CORS open.
Top comments (0)