Integrate email lookup, username search, breach detection, and OSINT enrichment into your applications through a single REST API — built for security, fraud-prevention, and authorized investigation teams.
Revealer.US is not a consumer reporting agency. API results may not be used for any FCRA-covered purpose, including employment, credit, tenant screening, or insurance eligibility. See our Terms of Service.
API access is on the Unlimited plan. Contact sales to get set up.
Send authenticated REST requests
Receive structured JSON responses
Include your API key in the Authorization header:
Authorization: Bearer sk_live_your_api_keySecurity: Never expose your API key in client-side code. Make API calls from your backend.
import json
import requests
API_KEY = "sk_live_..."
BASE_URL = "https://revealer.us"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Verify your API key first
def verify_api_key():
response = requests.get(f"{BASE_URL}/api/v1/verify", headers=headers)
return response.json()
# Resolve a username/handle
# /api/resolve answers with Server-Sent Events, not a single JSON body:
# read the "data: " frames and keep the final {"type": "complete"} one.
def resolve_handle(handle):
with requests.post(
f"{BASE_URL}/api/resolve",
headers={**headers, "Accept": "text/event-stream"},
json={"handle": handle},
stream=True
) as response:
for line in response.iter_lines(decode_unicode=True):
if not line or not line.startswith("data: "):
continue
frame = json.loads(line[6:])
if frame.get("type") == "complete":
return frame.get("data")
return None
# Search breach records
def search_breaches(search_type, term):
response = requests.post(
f"{BASE_URL}/api/database/search",
headers=headers,
json={"type": search_type, "term": term}
)
return response.json()
# Search stealer logs (Unlimited plan — contact sales)
def search_stealer_logs(search_type, term, limit=35):
response = requests.post(
f"{BASE_URL}/api/stealer-logs/search",
headers=headers,
json={"type": search_type, "term": term, "limit": limit}
)
return response.json()
# Example usage
result = search_breaches("email", "[email protected]")
if result.get("success"):
print(f"Found {result['data']['found']} records")/api/v1/infoPublicGet API information, available endpoints, and your detected IP address (no auth required)
/api/v1/verifyUnlimitedVerify API key is working and check your access level
/api/resolveUnlimitedResolve a handle/username to associated profiles, breach data, and device exposures (Server-Sent Events stream)
/api/socialscrape/platformsPublicSocialScrape module catalog — every id you can pass in platforms (public, no API key required)
/api/socialscrape/scrapeUnlimitedSocialScrape JSON lookup — one username module, a subset, all of them, or an all-modules email/phone lookup
/api/socialscrape/streamUnlimitedServer-Sent Events version of the same lookup — each module result arrives as it lands
/api/database/searchUnlimitedSearch breach records across connected sources for exposed credentials and personal data
/api/stealer-logs/searchUnlimitedSearch device exposures for compromised credentials (full results require the Unlimited plan — contact sales)
/api/stealer-logs/file/[id]/[type]UnlimitedBrowse detailed contents of a stealer log file
/api/discord/lookupUnlimitedLookup Discord user profiles by user ID
/api/saved-incidentsUnlimitedList all saved credentials/incidents
/api/saved-incidentsUnlimitedSave a credential/incident to your account
/api/saved-incidents/[id]UnlimitedDelete a saved incident by ID
/api/auth/meUnlimitedGet current account information, tier, quota, and verify API key
| Plan | API | Breach Lookups | Social Lookups | Device Exposures | Rate | IPs |
|---|---|---|---|---|---|---|
| Free | — | 1/day | 1/day | — | — | — |
| Starter ($12.99/mo) | — | 50/day | 25/day | — | — | — |
| Basic | — | Unlimited | 150/day | — | — | — |
| Pro | — | Unlimited | 500/day | Previews | — | — |
| Elite (no longer sold) | — | Unlimited | Unlimited | 100/day | — | — |
| Unlimited | ✓ | ∞ | ∞ | ∞ | ∞ | ∞ |
API access: Available from the Pro plan and up (3 whitelisted IPs on Pro; more on higher tiers). For volume or enterprise needs, contact sales. Once enabled, configure allowed IPs in Dashboard → Settings → API Access before using the API.
| Code | Status | Description |
|---|---|---|
| 400 | Bad Request | Invalid request body or missing required parameters |
| 401 | Unauthorized | Missing or invalid API key |
| 403 | Forbidden | IP not whitelisted or insufficient tier access |
| 404 | Not Found | Resource not found |
| 409 | Conflict | Resource already exists (e.g., duplicate saved incident) |
| 429 | Too Many Requests | Rate limit or quota exceeded |
| 500 | Internal Server Error | Server error - contact support if persistent |
Error Response Format:
{
"success": false,
"error": "Error message",
"message": "Human-readable description"
}Rate limit information is included in response headers:
If you receive 403 errors or see Cloudflare challenge pages:
GET /api/v1/infoGET /api/v1/verifyYour server's outgoing IP may differ from local, especially with:
API access is available on the Unlimited plan. Get in touch and we'll set you up.