How the Holehe Login Method Detects Account Existence on Social Platforms

The Holehe login method detects registered accounts by sending authentication requests with known-invalid passwords to service endpoints, then parsing error responses that distinguish between "account exists" and "account does not exist" conditions.

Holehe is an open-source OSINT tool developed by megadose that checks whether email addresses are registered across hundreds of online services. The tool employs a consistent detection pattern called the login method, where modules simulate failed authentication attempts to trigger distinctive server responses. This approach allows Holehe to verify account existence without requiring valid credentials or bypassing security controls.

Module Structure and the method="login" Constant

Every Holehe module follows a standardized async function signature that accepts three parameters: the target email, an HTTP client for making requests, and a shared results list out. At the top of each module, developers declare service-specific constants that configure the detection behavior.

The critical constant is method = "login", which signals to holehe.core.launch_module that the module will attempt authentication-style detection rather than registration checks or other patterns.

async def snapchat(email, client, out):
    name = "snapchat"
    domain = "snapchat.com"
    method = "login"
    frequent_rate_limit = True
    # ... request logic

When the module completes, it appends a standardized dictionary to out containing detection results, including the method field for traceability.

The Standardized Result Object

All modules return uniform result structures that enable the core aggregator to format output consistently:

out.append({
    "name": name,
    "domain": domain,
    "method": method,
    "frequent_rate_limit": frequent_rate_limit,
    "rateLimit": False,
    "exists": True,  # Determined by response analysis

    "emailrecovery": None,
    "phoneNumber": None,
    "others": None
})

How Login-Style Requests Trigger Account Existence Signals

The login method exploits a behavioral characteristic of authentication endpoints: they typically return different error messages for "user not found" versus "invalid password." By supplying a valid email format with a guaranteed-invalid password, Holehe elicits responses that reveal whether the account exists in the service's database.

Request Construction Pattern

Modules typically follow this sequence:

  1. Preflight requests (if needed): Some services require CSRF tokens or session cookies obtained via GET requests to the login page.
  2. POST construction: The module sends a POST request to the authentication endpoint containing:
    • The target email
    • A known-invalid password (e.g., "invalidpasswordfortest")
    • Headers mimicking legitimate browser traffic (User-Agent, Referer, CSRF tokens)

For example, in holehe/modules/social_media/snapchat.py, the module first retrieves xsrf and web_client_id tokens from the homepage, then posts to https://accounts.snapchat.com/accounts/merlin/login with the target email and a dummy password.

Response Analysis Techniques

After sending the login request, modules parse responses to infer account existence:

  • JSON field inspection: Services like Patreon return structured data at https://www.patreon.com/api/email/available. The module checks the is_available field—when False, the email is already registered (exists: True).

  • Keyword extraction: The Parler implementation in holehe/modules/social_media/parler.py sends a POST to https://api.parler.com/v2/login/new and examines the response text. If the body contains the word "password", the server is indicating that the email exists but the password is wrong.

  • Status code evaluation: Snapchat checks if response.status_code != 204, then examines the JSON for a hasSnapchat boolean flag that confirms account existence.

Integration with Holehe Core Processing

The holehe.core.launch_module function orchestrates execution by importing each module and awaiting its async function. As modules complete, the core aggregates results and generates the terminal output displaying:

  • [+] for confirmed existing accounts
  • [-] for available emails (no account found)
  • [x] for rate-limited requests

The method field in each result object allows the core to categorize detection strategies and handle service-specific behaviors, such as respecting frequent_rate_limit warnings that indicate services requiring slower request pacing.

Concrete Implementation Examples

Snapchat CSRF-Based Detection

Located in holehe/modules/social_media/snapchat.py (lines 5-44), this implementation extracts anti-forgery tokens from the login page HTML before posting credentials. It targets Snapchat's Merlin authentication endpoint and parses the JSON response for the hasSnapchat property.

Patreon Email Availability Endpoint

The Patreon module in holehe/modules/social_media/patreon.py demonstrates a variation where the "login" method actually hits an email validation endpoint rather than a traditional password check. It POSTs to /api/email/available and inverts the boolean logic: when the server responds with "is_available": false, the module sets exists: true.

Parler Text-Based Inference

In holehe/modules/social_media/parler.py (lines 5-55), the module generates a random deviceId, posts to the login API with an invalid password, and performs string matching on the response. The presence of the word "password" in the response body indicates the email exists in Parler's user database.

Summary

  • The login method in Holehe uses method = "login" to flag modules that perform authentication-style detection.
  • Modules send POST requests with known-invalid passwords to trigger distinguishable error responses from existing versus non-existing accounts.
  • Response analysis varies by service: JSON field parsing (Patreon, Snapchat), keyword matching (Parler), and status code checks are common techniques.
  • All modules return standardized result objects through the out parameter, enabling holehe.core to aggregate and format OSINT findings uniformly.
  • File locations such as holehe/modules/social_media/snapchat.py and holehe/core.py contain the concrete implementations and orchestration logic.

Frequently Asked Questions

Is the Holehe login method safe to use without violating terms of service?

The login method sends minimal traffic—typically a single POST request per service—with invalid credentials that fail immediately. However, users should review each platform's Terms of Service and ensure compliance with local regulations regarding automated testing. The frequent_rate_limit flag in modules indicates services where aggressive scanning may trigger defensive mechanisms.

How does Holehe distinguish between "account exists" and "invalid password" responses?

Services typically return semantically different error codes or messages for these states. For example, Patreon's API returns "is_available": false for existing emails, while Parler includes the word "password" in error text only when the email is registered. Holehe modules encode these service-specific heuristics to set the exists boolean accurately.

What happens when a service rate-limits the login method scan?

When a module encounters HTTP 429 responses or connection timeouts, it catches the exception and appends a result with rateLimit: True to the output list. The core controller then displays [x] next to the service name, indicating that the account status remains undetermined due to protective rate-limiting.

How does the login method differ from the register method in Holehe?

While the login method submits credentials to authentication endpoints, the register method (seen in modules like instagram.py) checks email availability during signup flows. Login methods are often more reliable because authentication endpoints have existed longer and return more consistent error messages than registration APIs, which may employ different validation logic or require additional form fields.

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:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →