Understanding the holehe `others` Field: What Additional Information Beyond Basic Email Detection Gets Captured
The others field in holehe module output is a flexible dictionary that stores supplementary account metadata beyond simple existence detection, including full names, account creation timestamps, and error messages.
The open-source OSINT tool holehe by megadose checks whether an email address is registered across hundreds of services. While the core detection returns a Boolean exists flag, the holehe others field provides an extensible container for enriched data that services expose during the verification process.
What the holehe others Field Contains
Every holehe module returns a standardized result dictionary. The others key is deliberately designed as None when no extra data surfaces, or as a populated dictionary when services leak account metadata.
Based on the source code in holehe/core.py, the others dictionary may include these keys:
| Key | Description | Source Module Example |
|---|---|---|
| FullName | Real name associated with the email/account | odnoklassniki |
| Date, time of the creation | ISO-formatted timestamp of account registration | odnoklassniki |
| errorMessage | Human-readable error or rate-limit notification | facebook, instagram, and others |
| Service-specific fields | Profile URLs, public IDs, or custom metadata | Varies per module |
The handling logic in holehe.core.print_result (lines 28-45) conditionally displays these fields:
# From holehe/core.py - simplified extraction
if result["others"] is not None:
if "FullName" in result["others"]:
display_line += f" [{result['others']['FullName']}]"
if "Date, time of the creation" in result["others"]:
display_line += f" ({result['others']['Date, time of the creation']})"
if "errorMessage" in result["others"]:
display_line += f" [! {result['others']['errorMessage']}]"
How Modules Populate the others Field
Standard Pattern: Minimal Response
Most modules return no additional metadata. The pattern implemented across holehe/modules/ follows this structure:
# Typical module response when only existence is verified
return [{
"name": "example_service",
"domain": "example.com",
"method": "register",
"frequent_rate_limit": False,
"rateLimit": False,
"exists": True, # or False
"emailrecovery": None,
"phoneNumber": None,
"others": None # No extra data available
}]
Enriched Response: Account Metadata Extraction
The odnoklassniki module (holehe/modules/social_media/odnoklassniki.py) demonstrates full others field utilization. When querying OK.ru, it parses account creation dates and display names from API responses:
# Example structure from odnoklassniki module
others_dict = {
"FullName": "Алексей Петров",
"Date, time of the creation": "2012-07-08T14:23:11Z"
}
return [{
"name": "odnoklassniki",
"domain": "ok.ru",
"exists": True,
"others": others_dict, # Populated with account metadata
# ... remaining fields
}]
Error State Handling
Several modules utilize others to surface diagnostic information when requests fail. Rather than silencing errors, these implementations preserve context:
# Pattern seen in modules handling structured errors
return [{
"name": "facebook",
"exists": False,
"others": {
"errorMessage": "Request blocked: checkpoint required"
},
# ... remaining fields
}]
Accessing others Data Programmatically
The holehe others field is fully exposed in JSON output for downstream processing:
# Execute scan and filter for enriched results
holehe -C target@email.com --only-used -j | jq '.[] | select(.others != null)'
# Sample output
{
"name": "odnoklassniki",
"domain": "ok.ru",
"exists": true,
"others": {
"FullName": "Maria Ivanova",
"Date, time of the creation": "2010-11-30T09:15:00Z"
}
}
For Python integration:
import subprocess
import json
def extract_enriched_accounts(email):
"""Return services with non-trivial `others` data."""
result = subprocess.run(
["holehe", "-C", email, "-j"],
capture_output=True, text=True
)
data = json.loads(result.stdout)
enriched = []
for entry in data:
if entry.get("others") is not None:
enriched.append({
"service": entry["name"],
"exists": entry["exists"],
"metadata": entry["others"]
})
return enriched
# Usage
accounts = extract_enriched_accounts("user@example.com")
for acc in accounts:
print(f"{acc['service']}: {acc['metadata']}")
Core Implementation Details
The result formatting in holehe/core.py explicitly branches on others content type. This implementation (around lines 28-45) ensures backward compatibility—modules returning None skip enrichment, while structured data triggers appropriate formatting:
- Name appending:
FullNamevalues attach bracketed identifiers - Timestamp display: Creation dates render in parentheses
- Error annotation:
errorMessagevalues prepend warning indicators
This design allows the holehe others field to evolve without breaking existing output parsers.
Module Implementation Guidelines
When developing custom holehe modules, the others field accepts any JSON-serializable dictionary. Per the codebase convention:
- Use descriptive keys matching service API field names
- Include timestamps in ISO 8601 format when available
- Reserve
errorMessagefor human-readable failure explanations - Return
Nonerather than empty dictionaries for clean results
Summary
- The
holehe others fieldis an optional dictionary capturing auxiliary account metadata beyond basic email existence detection - FullName and Date, time of the creation are standard keys extracted by services like
odnoklassniki - errorMessage preserves context when requests fail due to rate limits or blocks
- Implementation resides in
holehe/core.pywith module-specific population inholehe/modules/ - All modules return
Noneforotherswhen no supplementary data exists, maintaining output consistency
Frequently Asked Questions
What happens if a service provides unexpected fields in others?
Any additional keys beyond the standard set are preserved in JSON output but not rendered in terminal display. The print_result function explicitly checks for known keys (FullName, Date, time of the creation, errorMessage) while passing through the full dictionary structure. This allows extensibility without breaking existing integrations.
Can others contain nested data structures?
Yes. While most implementations use flat dictionaries, the JSON schema permits nested objects. The terminal formatter in holehe/core.py only surfaces top-level keys it recognizes; complex nested data remains accessible through programmatic JSON consumption via the -j flag.
Why do most modules return None for others?
Services vary dramatically in data leakage patterns. The majority implement registration-check endpoints that reveal only existence state without account metadata. The others field activates only when response analysis yields verifiable auxiliary information, prioritizing accuracy over speculation.
How can I contribute a module that populates others?
Follow the pattern in holehe/modules/social_media/odnoklassniki.py: parse API responses for account creation dates, display names, or profile identifiers; construct a dictionary with descriptive keys; and assign it to the others field in your return statement. Ensure your module handles None gracefully when enrichment data is unavailable.
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 →