# How Holehe Checks Social Media Account Availability via Email Verification

> Learn how Holehe verifies social media account availability by checking email registration on various platforms. Discover this unique security tool.

- Repository: [Palenath/holehe](https://github.com/megadose/holehe)
- Tags: how-to-guide
- Published: 2026-08-16

---

**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:

1. **Fetch prerequisite data** (CSRF tokens, session cookies, or API keys)
2. **Submit the target email** to the service's signup or recovery endpoint
3. **Parse the HTTP response** to determine if the email is already in use
4. **Return structured output** with `exists`, `rateLimit`, and `error` flags

In [`holehe/modules/social_media/facebook.py`](https://github.com/megadose/holehe/blob/main/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 |
|----------|-------------|
| Facebook | [`holehe/modules/social_media/facebook.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/social_media/facebook.py) |
| Instagram | [`holehe/modules/social_media/instagram.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/social_media/instagram.py) |
| Twitter/X | [`holehe/modules/social_media/twitter.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/social_media/twitter.py) |
| Snapchat | [`holehe/modules/social_media/snapchat.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/social_media/snapchat.py) |
| Discord | [`holehe/modules/social_media/discord.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/social_media/discord.py) |
| Pinterest | [`holehe/modules/social_media/pinterest.py`](https://github.com/megadose/holehe/blob/main/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`](https://github.com/megadose/holehe/blob/main/holehe/core.py) through three key functions:

**Dynamic module discovery** — `import_submodules` recursively walks `holehe.modules` to load every social media checker:

```python

# 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】:

```python

# 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】:

```python
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:

```bash
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:

```python
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:

```python
{
    '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 platform
- **`rateLimit: True`** — The service throttled the request; retry later
- **`error: 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`](https://github.com/megadose/holehe/blob/main/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`](https://github.com/megadose/holehe/blob/main/holehe/modules/social_media/__init__.py) | Package initializer exposing all social check functions |
| [`holehe/modules/social_media/facebook.py`](https://github.com/megadose/holehe/blob/main/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`](https://github.com/megadose/holehe/blob/main/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.py`](https://github.com/megadose/holehe/blob/main/holehe/core.py) handles dynamic loading and concurrent execution via `httpx.AsyncClient`
- Results return structured data with `exists`, `rateLimit`, and `error` boolean 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.