Skip to main content

Dark Web APIs

FullHunt's Dark Web APIs provide comprehensive monitoring of your organization's presence on the dark web, including compromised credentials, phishing domains, typosquatting, and exposed email addresses.

info

These API endpoints are available for enterprise accounts only.

Compromised Credentials

Monitor for compromised credentials and leaks within your organization.

HTTP Request

GET https://fullhunt.io/api/v1/enterprise/darkweb/compromised-credentials

Query Parameters

ParameterRequiredTypeDescription
queryYesstringEmail or domain search string
pageNointegerPagination page number

Example Request

curl "https://fullhunt.io/api/v1/enterprise/darkweb/compromised-credentials?query=john.smith@acme.com" \
-H "X-API-KEY: xxxx-xxxx-xxxx-xxxxxx"

Example Response

{
"query": {
"query": "john.smith@acme.com"
},
"results": [
{
"id": "LEAK-7394",
"address": "123 Corporate Drive, Phoenix, AZ 85001",
"darkweb_metadata_count": 157834291,
"darkweb_metadata_date": "2023-12-10 00:00:00",
"darkweb_metadata_description": "In December 2023, a large-scale data compilation was discovered containing records from multiple corporate data breaches. The compilation included various data points from company directories and internal systems.",
"darkweb_metadata_leaked_data": "Email addresses, Passwords, Physical addresses, Names",
"darkweb_metadata_name": "CorporateDataDump_2023",
"database_name": "BreachCompilation",
"date_added": "2024-02-15 14:22:31",
"domain": "acme.com",
"email": "john.smith@acme.com",
"hash_type": "bcrypt",
"hashed_password": "$2a$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewvfbrgSP3nXnm3m",
"ipaddress": "192.168.1.100",
"name": "John Smith",
"password": "rocket2023",
"phone": "+1-555-0123-4567",
"username": "jsmith",
"vin": "1HGCM82633A123456"
}
],
"total_query_results": 4
}

Potential Phishing Domains

Search for potentially malicious domains that may be used in phishing attacks targeting your organization.

HTTP Request

GET https://fullhunt.io/api/v1/enterprise/darkweb/potential-phishing

Query Parameters

ParameterRequiredTypeDescription
queryNostringDomain name search string
pageNointegerPagination page number

Example Request

curl "https://fullhunt.io/api/v1/enterprise/darkweb/potential-phishing" \
-H "X-API-KEY: xxxx-xxxx-xxxx-xxxxxx"

Example Response

{
"results": {
"items": [
{
"id": "LEAK-123",
"domain_name": "acme-login.com",
"date_added": "2024-03-15 10:30:45",
"last_seen": "2024-03-15 10:30:45",
"type": "DomainName"
}
],
"total": 15,
"page": 1,
"per_page": 10
}
}

Typosquatting Domains

Detect and monitor potential typosquatting domains that could be used for phishing attacks or brand impersonation.

HTTP Request

GET https://fullhunt.io/api/v1/enterprise/darkweb/typosquatting

Query Parameters

ParameterRequiredTypeDescription
queryNostringDomain name search string
pageNointegerPagination page number

Example Request

curl "https://fullhunt.io/api/v1/enterprise/darkweb/typosquatting" \
-H "X-API-KEY: xxxx-xxxx-xxxx-xxxxxx"

Example Response

{
"results": {
"items": [
{
"id": "LEAK-123",
"domain_name": "acmecorp.com",
"date_added": "2024-03-15",
"last_seen": "2024-03-15",
"type": "TypoSquatting"
}
],
"total": 23,
"page": 1,
"per_page": 10
}
}

Discovered Emails

Monitor and detect email addresses associated with your organization that have been exposed on the dark web.

HTTP Request

GET https://fullhunt.io/api/v1/enterprise/darkweb/discovered-emails

Query Parameters

ParameterRequiredTypeDescription
queryNostringEmail or domain search string
pageNointegerPagination page number

Example Request

curl "https://fullhunt.io/api/v1/enterprise/darkweb/discovered-emails" \
-H "X-API-KEY: xxxx-xxxx-xxxx-xxxxxx"

Example Response

{
"results": {
"items": [
{
"id": "LEAK-123",
"email": "john.smith@acme.com",
"domain": "acme.com",
"date_added": "2024-03-15",
"breaches": ["DataVault_2023_Q1"]
}
],
"total": 42,
"page": 1,
"per_page": 10
}
}

Integration Example

import requests
import time
from datetime import datetime

class FullHuntDarkWeb:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://fullhunt.io/api/v1/enterprise/darkweb"
self.headers = {"X-API-KEY": api_key}

def check_compromised_credentials(self, query):
"""Check for compromised credentials."""
url = f"{self.base_url}/compromised-credentials"
params = {"query": query}

response = requests.get(url, headers=self.headers, params=params)

if response.status_code == 200:
return response.json()
else:
print(f"Error: {response.status_code}")
return None

def check_phishing_domains(self, query=None):
"""Check for potential phishing domains."""
url = f"{self.base_url}/potential-phishing"
params = {}
if query:
params["query"] = query

response = requests.get(url, headers=self.headers, params=params)

if response.status_code == 200:
return response.json()
else:
print(f"Error: {response.status_code}")
return None

def check_typosquatting(self, query=None):
"""Check for typosquatting domains."""
url = f"{self.base_url}/typosquatting"
params = {}
if query:
params["query"] = query

response = requests.get(url, headers=self.headers, params=params)

if response.status_code == 200:
return response.json()
else:
print(f"Error: {response.status_code}")
return None

def check_discovered_emails(self, query=None):
"""Check for discovered emails."""
url = f"{self.base_url}/discovered-emails"
params = {}
if query:
params["query"] = query

response = requests.get(url, headers=self.headers, params=params)

if response.status_code == 200:
return response.json()
else:
print(f"Error: {response.status_code}")
return None

def comprehensive_domain_check(self, domain):
"""Perform comprehensive dark web check for a domain."""
print(f"🔍 Comprehensive Dark Web Check for: {domain}")
print("=" * 60)

# Check compromised credentials
print("\n📧 Checking compromised credentials...")
creds = self.check_compromised_credentials(domain)
if creds and creds.get('results'):
print(f" Found {len(creds['results'])} compromised credential records")

for record in creds['results'][:3]: # Show first 3
print(f" - {record['email']} (Database: {record['database_name']})")
print(f" Date Added: {record['date_added']}")
if record.get('password'):
print(f" Password Exposed: Yes")
else:
print(" ✅ No compromised credentials found")

# Check phishing domains
print("\n🎣 Checking potential phishing domains...")
phishing = self.check_phishing_domains(domain)
if phishing and phishing.get('results', {}).get('items'):
items = phishing['results']['items']
print(f" Found {len(items)} potential phishing domains")

for item in items[:3]: # Show first 3
print(f" - {item['domain_name']} (Added: {item['date_added']})")
else:
print(" ✅ No potential phishing domains found")

# Check typosquatting
print("\n🔄 Checking typosquatting domains...")
typo = self.check_typosquatting(domain)
if typo and typo.get('results', {}).get('items'):
items = typo['results']['items']
print(f" Found {len(items)} typosquatting domains")

for item in items[:3]: # Show first 3
print(f" - {item['domain_name']} (Added: {item['date_added']})")
else:
print(" ✅ No typosquatting domains found")

# Check discovered emails
print("\n📨 Checking discovered emails...")
emails = self.check_discovered_emails(domain)
if emails and emails.get('results', {}).get('items'):
items = emails['results']['items']
print(f" Found {len(items)} exposed email addresses")

for item in items[:3]: # Show first 3
print(f" - {item['email']} (Breaches: {', '.join(item.get('breaches', []))})")
else:
print(" ✅ No exposed email addresses found")

print("\n✅ Dark web check completed")

# Usage
api_key = "your-api-key-here"
darkweb = FullHuntDarkWeb(api_key)

# Check specific email
creds = darkweb.check_compromised_credentials("john.doe@acme.com")

# Comprehensive domain check
darkweb.comprehensive_domain_check("acme.com")

Automated Monitoring Script

import requests
import json
import time
from datetime import datetime, timedelta

def setup_darkweb_monitoring(api_key, domains, webhook_url=None):
"""Set up automated dark web monitoring for multiple domains."""

darkweb = FullHuntDarkWeb(api_key)

print("🛡️ Setting up Dark Web Monitoring")
print("=" * 50)

for domain in domains:
print(f"\n📍 Monitoring setup for: {domain}")

# Store baseline counts
baseline = {
'domain': domain,
'timestamp': datetime.now().isoformat(),
'compromised_credentials': 0,
'phishing_domains': 0,
'typosquatting_domains': 0,
'discovered_emails': 0
}

# Get current counts
creds = darkweb.check_compromised_credentials(domain)
if creds and creds.get('total_query_results'):
baseline['compromised_credentials'] = creds['total_query_results']

phishing = darkweb.check_phishing_domains(domain)
if phishing and phishing.get('results', {}).get('total'):
baseline['phishing_domains'] = phishing['results']['total']

typo = darkweb.check_typosquatting(domain)
if typo and typo.get('results', {}).get('total'):
baseline['typosquatting_domains'] = typo['results']['total']

emails = darkweb.check_discovered_emails(domain)
if emails and emails.get('results', {}).get('total'):
baseline['discovered_emails'] = emails['results']['total']

# Save baseline
with open(f"{domain}_darkweb_baseline.json", "w") as f:
json.dump(baseline, f, indent=2)

print(f" Compromised Credentials: {baseline['compromised_credentials']}")
print(f" Phishing Domains: {baseline['phishing_domains']}")
print(f" Typosquatting Domains: {baseline['typosquatting_domains']}")
print(f" Discovered Emails: {baseline['discovered_emails']}")

# Rate limiting
time.sleep(2)

print("\n✅ Dark web monitoring baselines established")

def check_for_changes(api_key, domains, webhook_url=None):
"""Check for changes since last baseline."""

darkweb = FullHuntDarkWeb(api_key)
changes_detected = False

for domain in domains:
try:
# Load baseline
with open(f"{domain}_darkweb_baseline.json", "r") as f:
baseline = json.load(f)
except FileNotFoundError:
print(f"No baseline found for {domain}. Run setup first.")
continue

print(f"\n🔍 Checking changes for: {domain}")

current = {
'domain': domain,
'timestamp': datetime.now().isoformat()
}

# Check each category
categories = [
('compromised_credentials', 'check_compromised_credentials'),
('phishing_domains', 'check_phishing_domains'),
('typosquatting_domains', 'check_typosquatting'),
('discovered_emails', 'check_discovered_emails')
]

for category, method_name in categories:
method = getattr(darkweb, method_name)

if category == 'compromised_credentials':
result = method(domain)
current_count = result.get('total_query_results', 0) if result else 0
else:
result = method(domain)
current_count = result.get('results', {}).get('total', 0) if result else 0

baseline_count = baseline.get(category, 0)
current[category] = current_count

if current_count > baseline_count:
change = current_count - baseline_count
changes_detected = True

print(f" 🚨 {category.replace('_', ' ').title()}: +{change} new items")

# Send alert if webhook configured
if webhook_url:
alert = {
'domain': domain,
'category': category,
'new_items': change,
'total_items': current_count,
'timestamp': current['timestamp']
}
send_webhook_alert(webhook_url, alert)
else:
print(f" ✅ {category.replace('_', ' ').title()}: No changes")

time.sleep(1) # Rate limiting

# Update baseline
with open(f"{domain}_darkweb_baseline.json", "w") as f:
json.dump(current, f, indent=2)

if not changes_detected:
print("\n✅ No new dark web threats detected")
else:
print("\n⚠️ New threats detected - review alerts above")

def send_webhook_alert(webhook_url, alert_data):
"""Send alert to webhook endpoint."""
try:
response = requests.post(webhook_url, json=alert_data)
if response.status_code == 200:
print(f" 📤 Alert sent to webhook")
else:
print(f" ❌ Failed to send webhook alert: {response.status_code}")
except Exception as e:
print(f" ❌ Webhook error: {e}")

# Usage
api_key = "your-api-key-here"
domains = ["acme.com", "example.org"]
webhook_url = "https://your-webhook-endpoint.com/alerts"

# Initial setup
setup_darkweb_monitoring(api_key, domains, webhook_url)

# Regular monitoring (run this periodically)
check_for_changes(api_key, domains, webhook_url)

Response Field Reference

Compromised Credentials Response

FieldTypeDescription
idstringUnique leak identifier
emailstringCompromised email address
passwordstringPlain text password (if available)
hashed_passwordstringHashed password
hash_typestringType of hash used (bcrypt, MD5, SHA256, etc.)
domainstringAssociated domain
database_namestringSource database/breach name
date_addedstringDate when record was added to database
darkweb_metadata_*stringMetadata about the breach/leak

Domain Monitoring Response

FieldTypeDescription
idstringUnique identifier
domain_namestringSuspicious domain name
date_addedstringDate when domain was first detected
last_seenstringDate when domain was last seen
typestringType of threat (DomainName, TypoSquatting)

Further Reading

  • Error Handling: For details on handling API responses and errors, see our guide on API Error Codes.