How Holehe Checks Social Media Account Availability via Email Verification
Holehe checks whether an email address is already registered on social media platforms by probing registration endpoints—not by testing username availability.
Holehe is an open-source OSINT tool by megadose that verifies email address usage across hundreds of online services. While many users search for "social media account availability," the tool specifically determines email-to-account association rather than username availability. This distinction matters for investigators, security researchers, and penetration testers working with email-based reconnaissance.
What Holehe Actually Checks
Holehe answers a precise question: Is this email address already tied to an existing account? It does not tell you whether a username is free to register. The tool achieves this by programmatically interacting with each platform's registration flow and interpreting server responses.
The verification process works as follows:
- Fetch prerequisite data (CSRF tokens, session cookies, or API keys)
- Submit the target email to the service's signup or recovery endpoint
- Parse the HTTP response to determine if the email is already in use
- Return structured output with
exists,rateLimit, anderrorflags
In holehe/modules/social_media/facebook.py, this pattern is clearly implemented: the module retrieves a CSRF token, posts the email to Facebook's registration API, and examines the JSON response to determine account existence【/cache/repos/github.com/megadose/holehe/master/holehe/modules/social_media/facebook.py#L6-L83】.
Supported Social Media Platforms
Holehe includes dedicated modules for major social platforms under holehe/modules/social_media/:
| Platform | Module Path |
|---|---|
holehe/modules/social_media/facebook.py |
|
holehe/modules/social_media/instagram.py |
|
| Twitter/X | holehe/modules/social_media/twitter.py |
| Snapchat | holehe/modules/social_media/snapchat.py |
| Discord | holehe/modules/social_media/discord.py |
holehe/modules/social_media/pinterest.py |
Each module follows the same architectural pattern: import an httpx.AsyncClient, execute service-specific logic, and append a result dictionary to the output list.
How Holehe Loads and Executes Social Media Checks
The core orchestration happens in holehe/core.py through three key functions:
Dynamic module discovery — import_submodules recursively walks holehe.modules to load every social media checker:
# From holehe/core.py lines 37-47
def import_submodules(package, recursive=True):
# Recursively imports all submodules in holehe.modules
# Including holehe.modules.social_media and its children
Function extraction — get_functions identifies callable check functions from each loaded module【/cache/repos/github.com/megadose/holehe/master/holehe/core.py#L50-L63】:
# Returns list of functions like instagram.instagram, facebook.facebook, etc.
Asynchronous execution — launch_module spawns coroutines for each service with a shared httpx.AsyncClient【/cache/repos/github.com/megadose/holehe/master/holehe/core.py#L66-L71】:
async def launch_module(module, email, client, out):
await module(email, client, out)
This design allows holehe to check dozens of social media platforms concurrently without blocking.
Command-Line Usage for Social Media Verification
Check an email against all services and filter to existing accounts only:
holehe alice@example.com --only-used
Output shows which social platforms have registered accounts:
[+] instagram.com (exists: True)
[+] twitter.com (exists: True)
[+] facebook.com (exists: False)
[+] snapchat.com (rateLimit: True)
Programmatic Social Media Checking
For targeted verification of a single platform, import the module directly:
import httpx
import trio
from holehe.modules.social_media import instagram
async def check_instagram_email(email: str):
async with httpx.AsyncClient() as client:
results = []
await instagram.instagram(email, client, results)
return results[0]
# Run the check
result = trio.run(check_instagram_email, "target@example.com")
print(result)
Sample result structure:
{
'name': 'instagram',
'domain': 'instagram.com',
'method': 'register',
'frequent_rate_limit': False,
'rateLimit': False,
'exists': True, # Email already registered
'error': False,
'others': None
}
Interpreting Holehe Results for OSINT
Each social media check returns a standardized dictionary with these key fields:
exists: True— The email is registered to an account on this platformrateLimit: True— The service throttled the request; retry latererror: True— An unexpected response occurred (network, parsing, or API change)
The others field may contain additional platform-specific metadata when available.
Key Source Files for Social Media Verification
| File | Purpose |
|---|---|
holehe/core.py |
Orchestrates async execution and module loading【/cache/repos/github.com/megadose/holehe/master/holehe/core.py#L1-L34】 |
holehe/modules/social_media/__init__.py |
Package initializer exposing all social check functions |
holehe/modules/social_media/facebook.py |
Reference implementation of email verification flow【/cache/repos/github.com/megadose/holehe/master/holehe/modules/social_media/facebook.py】 |
holehe/localuseragent.py |
Rotates browser-like User-Agent strings to avoid detection【/cache/repos/github.com/megadose/holehe/master/holehe/localuseragent.py】 |
Limitations of Holehe for Account Availability
Holehe cannot determine username availability because:
- It never attempts username registration—only email verification
- Most platforms don't expose username availability via email-based endpoints
- Username enumeration typically requires separate, often rate-limited endpoints
For username availability checks, specialized tools or manual platform-specific methods are required.
Summary
- Holehe verifies email-to-account association on social media platforms, not username availability
- The tool probes registration endpoints and interprets HTTP responses to determine if an email is already registered
- Social media modules live in
holehe/modules/social_media/with consistent async patterns - Core orchestration in
holehe/core.pyhandles dynamic loading and concurrent execution viahttpx.AsyncClient - Results return structured data with
exists,rateLimit, anderrorboolean flags
Frequently Asked Questions
Can holehe check if a username is available on Instagram or Twitter?
No. Holehe only verifies whether an email address is already registered to an account. It does not test username availability. The tool interacts with registration and recovery endpoints that respond to email input, not username queries.
Is holehe detection accurate for all social media platforms?
Accuracy depends on the stability of each platform's registration endpoint. The megadose/holehe repository requires active maintenance as services change their APIs. Results marked with error: True indicate potential detection avoidance or API changes that need module updates.
What does "rateLimit: True" mean in holehe results?
The target platform throttled the request, typically due to too many checks from the same IP. The rateLimit flag in the result dictionary indicates you should retry with delays, proxy rotation, or from a different network. Some modules set frequent_rate_limit: True to warn that a platform aggressively limits requests.
Can holehe distinguish between active and deleted social media accounts?
Generally no. Holehe reports whether an email is registered in the platform's database, not account status. A deleted account may still return exists: True if the platform retains the email association for anti-abuse purposes. The result reflects database presence, not account activity.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →