# Where Are Site-Specific Detection Modules Located in the Holehe Repository?

> Locate Holehe site-specific detection modules within the holehe.modules package. Explore subdirectories for social media, shopping, and forum detectors.

- Repository: [Palenath/holehe](https://github.com/megadose/holehe)
- Tags: internals
- Published: 2026-08-26

---

**All site-specific detection logic in Holehe resides under the `holehe.modules` package, organized by service category in subdirectories like `social_media/`, `shopping/`, and `forum/`.**

Holehe is an open-source OSINT tool for checking whether an email address is registered on various websites. Understanding exactly where the site-specific detection modules are located in the Holehe repository is essential for developers who want to add new services, debug existing checkers, or integrate specific modules into custom workflows.

## The Root Location: `holehe/modules/`

The base path `holehe/modules/` serves as the root package for all detection logic. Every site-specific checker lives within this directory tree, maintaining a consistent structure that separates concerns by service type. The package initializer at [`holehe/modules/__init__.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/__init__.py) establishes this namespace for imports.

## Category-Based Directory Layout

Within `holehe/modules/`, the code is grouped by the type of service. Each sub-directory contains a Python file for every supported site, and each category includes an [`__init__.py`](https://github.com/megadose/holehe/blob/main/__init__.py) that exposes its detection functions for clean imports.

- **Social Media**: `holehe/modules/social_media/` contains [[`twitter.py`](https://github.com/megadose/holehe/blob/main/twitter.py)](https://github.com/megadose/holehe/blob/master/holehe/modules/social_media/twitter.py)
- **Shopping**: `holehe/modules/shopping/` contains [[`dominosfr.py`](https://github.com/megadose/holehe/blob/main/dominosfr.py)](https://github.com/megadose/holehe/blob/master/holehe/modules/shopping/dominosfr.py)
- **Forums**: `holehe/modules/forum/` contains [[`thevapingforum.py`](https://github.com/megadose/holehe/blob/main/thevapingforum.py)](https://github.com/megadose/holehe/blob/master/holehe/modules/forum/thevapingforum.py)
- **Music**: `holehe/modules/music/` contains [[`spotify.py`](https://github.com/megadose/holehe/blob/main/spotify.py)](https://github.com/megadose/holehe/blob/master/holehe/modules/music/spotify.py)
- **Programming**: `holehe/modules/programing/` contains [[`github.py`](https://github.com/megadose/holehe/blob/main/github.py)](https://github.com/megadose/holehe/blob/master/holehe/modules/programing/github.py) (note the "programing" spelling in the repository)
- **Adult Content**: `holehe/modules/porn/` contains [[`pornhub.py`](https://github.com/megadose/holehe/blob/main/pornhub.py)](https://github.com/megadose/holehe/blob/master/holehe/modules/porn/pornhub.py)

Category initializers like [`holehe/modules/social_media/__init__.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/social_media/__init__.py) and [`holehe/modules/shopping/__init__.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/shopping/__init__.py) handle the exposure of these functions at the package level.

## Standardized Module Interface

Every site-specific detector follows a strict asynchronous function signature defined in the source. Each Python file defines exactly one primary function matching the site name:

```python
async def <site_name>(email: str, client, out: list):
    """Detect if <site> has an account for the given email."""
    ...

```

The parameters follow a consistent convention:
- **email**: The target email address as a string
- **client**: An `httpx.AsyncClient` (or compatible) instance for HTTP requests
- **out**: A list to which the function appends a result dictionary indicating registration status

## Importing and Using Detection Modules

To invoke a specific checker directly, import the module from its category and call the async function with an active HTTP client:

```python
import asyncio
import httpx
from holehe.modules.social_media import twitter
from holehe.modules.shopping import dominosfr

async def check_email(email: str):
    async with httpx.AsyncClient() as client:
        results = []

        # Call the site-specific detectors

        await twitter(email, client, results)
        await dominosfr(email, client, results)

        return results

if __name__ == "__main__":
    email_to_test = "example@example.com"
    detections = asyncio.run(check_email(email_to_test))
    for r in detections:
        print(r)

```

This pattern allows you to import only the specific services you need, minimizing overhead and enabling targeted email investigations.

## Summary

- **Site-specific detection modules** are located under `holehe/modules/` in the Holehe repository
- Modules are categorized into folders like `social_media/`, `shopping/`, `forum/`, and `programing/` (note the single "m")
- Each site is implemented as a Python file containing an **async function** with the signature `async def site_name(email: str, client, out: list)`
- The `client` parameter requires an `httpx.AsyncClient` instance for asynchronous HTTP operations
- Category-level [`__init__.py`](https://github.com/megadose/holehe/blob/main/__init__.py) files expose modules for clean imports (e.g., `from holehe.modules.social_media import twitter`)

## Frequently Asked Questions

### What is the exact file path for the Twitter detection module in Holehe?

According to the Holehe source code, the Twitter detector is located at [`holehe/modules/social_media/twitter.py`](https://github.com/megadose/holehe/blob/main/holehe/modules/social_media/twitter.py). This file defines the async `twitter` function that checks email registration against Twitter's API endpoints.

### How do I add a new site-specific detection module to Holehe?

Create a new Python file under the appropriate category directory within `holehe/modules/`, implement the standard async function signature `async def site_name(email: str, client, out: list)`, and ensure the category's [`__init__.py`](https://github.com/megadose/holehe/blob/main/__init__.py) exposes your function. The module will automatically inherit the HTTP client handling and result formatting conventions used by existing checkers.

### Why are the modules organized into categories like `social_media` and `shopping`?

This categorical structure groups related services together, making the codebase maintainable and allowing users to import specific types of checkers for targeted investigations. For example, you can import only `holehe.modules.shopping` modules if you are investigating e-commerce accounts associated with an email address.

### Are Holehe detection modules synchronous or asynchronous?

All detection modules are **asynchronous**, requiring `async/await` syntax. Each function receives an `httpx.AsyncClient` instance as the `client` parameter to perform non-blocking HTTP requests, making the tool efficient when checking dozens of sites concurrently.