Privacy Tools Guide

Your email address serves as a central identity anchor across the internet. Every service you sign up for—social media, cloud storage, newsletters, e-commerce platforms, developer tools—likely ties back to one or more email addresses. Over years of internet usage, this creates a sprawling digital footprint that’s difficult to track manually. This guide provides systematic methods to discover accounts linked to your email, audit their security posture, and manage your digital presence effectively.

Why Digital Footprint Auditing Matters

Data breaches affect millions of users annually. When attackers obtain email addresses from compromised databases, they can perform credential stuffing attacks—testing stolen email/password combinations across numerous services. Knowing exactly which services hold your email allows you to proactively secure or delete unused accounts, reducing your attack surface.

Beyond security, privacy concerns drive digital footprint audits. Services you forgot about may continue collecting data, sharing information with third parties, or maintaining records you no longer want retained. An audit provides visibility into your actual online presence.

Method 1: Using Have I Been Pwned’s API

Have I Been Pwned (HIBP) aggregates breach data from numerous sources. While primarily focused on compromised credentials, the service reveals which email addresses have appeared in known data breaches—indicating account existence at specific services.

#!/usr/bin/env python3
"""
Query HIBP API for breach information
Requires API key from https://haveibeenpwned.com/API/Key
"""

import requests
import os

def check_breaches(email, api_key):
    url = f"https://haveibeenpwned.com/api/v3/breachedaccount/{email}"
    headers = {
        "hibp-api-key": api_key,
        "user-agent": "digital-footprint-audit"
    }
    params = {"truncateResponse": "false"}

    response = requests.get(url, headers=headers, params=params)

    if response.status_code == 200:
        breaches = response.json()
        print(f"Found {len(breaches)} breaches for {email}")
        for breach in breaches:
            print(f"  - {breach['Name']}: {breach['DataClasses']}")
    elif response.status_code == 404:
        print(f"No breaches found for {email}")
    else:
        print(f"Error: {response.status_code}")

email = os.environ.get("TARGET_EMAIL")
api_key = os.environ.get("HIBP_API_KEY")

if email and api_key:
    check_breaches(email, api_key)

This script identifies services where your email appeared in breaches. However, it won’t reveal accounts you created but never had compromised—necessitating additional methods.

Method 2: Password Manager Export Analysis

If you use a password manager, your vault likely contains entries for most active accounts. Exporting your vault provides a direct list of services you consider worth remembering.

# Bitwarden CLI vault export
bw list items --search "@gmail.com" | jq '.[] | {name: .name, login: .login.username}'

# 1Password CLI export
op list items --format json | jq '.[] | select(.overview.title | contains("gmail"))'

For Bitwarden users with self-hosted instances, you can query directly:

# Export and filter for specific email domains
bw export --format json --password $BW_MASTER_PASSWORD | \
  jq '.[] | select(.login.username | contains("@example.com")) | {name: .login.username, url: .login.uri}'

Password managers won’t capture accounts you forgot or abandoned, but they provide the most accurate list of services you actively use.

Method 3: Gmail Account Discovery

Gmail’s built-in tools help identify accounts linked to your Google address. Navigate to Settings > See all settings > Filters to review automated sorting rules—these often indicate newsletter subscriptions and service registrations.

For Google Account holders, visit myaccount.google.com/connections to view connected third-party services and applications. This reveals OAuth grants you’ve authorized over time.

Gmail’s search operators enable finding account registrations:

# Search for account confirmation emails
subject:(confirm OR verify OR welcome OR注册) from:(*@*)

# Search for password reset emails
subject:("password reset" OR "reset your password" OR "change your password")

# Find subscription confirmations
subject:(subscription OR "signed up" OR "account created")

Export your Gmail data via Google Takeout for offline analysis. The resulting MBOX file can be parsed with tools like mailutils:

# Extract unique sender domains from exported MBOX
formail -s cat ~/Takeout/Mail/all_mail.mbox | \
  grep -i "^From:" | awk '{print $2}' | cut -d@ -f2 | \
  sort | uniq -c | sort -rn > email_domains.txt

Method 4: Automated Account Discovery Scripts

Several open-source tools automate account discovery across services:

Sherlock - Username Enumeration

# Install Sherlock
git clone https://github.com/sherlock-project/sherlock.git
cd sherlock
pip install -r requirements.txt

# Search for username across social networks
python3 sherlock.py --timeout 1 username123

Sherlock checks if a specific username exists across hundreds of services. If you’ve reused usernames across platforms, this reveals your presence.

GoMapEnum - Email to Service Mapping

# Check which services accept a specific email
git clone https://github.com/GRX4/GoMapEnum.git
cd GoMapEnum
pip install -r requirements.txt

python3 main.py --email target@example.com

GoMapEnum queries numerous services to determine if your email is registered, though responses vary based on service privacy policies.

Account Discovery Script Combining Multiple Methods

#!/usr/bin/env python3
"""Comprehensive account discovery script"""

import asyncio
import aiohttp
from typing import Set

SERVICES = {
    "github": "https://api.github.com/users/{email}",
    "reddit": "https://www.reddit.com/api/v1/activate_user.json",
    "npm": "https://registry.npmjs.org/-/user/{email}",
}

async def check_service(session: aiohttp.ClientSession,
                        service: str, email: str) -> bool:
    """Check if email exists on service"""
    url = SERVICES[service].format(email=email.replace('@', '%40'))
    try:
        async with session.get(url) as response:
            return response.status == 200
    except:
        return False

async def main():
    target_email = "your@email.com"
    async with aiohttp.ClientSession() as session:
        tasks = [
            check_service(session, service, target_email)
            for service in SERVICES
        ]
        results = await asyncio.gather(*tasks)

        for service, exists in zip(SERVICES.keys(), results):
            status = "FOUND" if exists else "not found"
            print(f"{service}: {status}")

asyncio.run(main())

Method 5: Manual Verification Through Password Reset

For services you suspect exist but can’t confirm, use password reset functionality. Enter your email on the service’s login page and observe whether it reports “no account found” or sends a reset link.

This method has limitations—some services suppress account existence for security—but works for many platforms. Track results in a spreadsheet with columns: Service Name, URL, Found (Yes/No), Last Verified, Action Required.

Method 6: Checking Connected Third-Party Apps

Review OAuth permissions across major platforms:

Revoke access for services you no longer use. Each connection represents potential data sharing you may have forgotten about.

Method 7: Using Data Broker Removal Services

Data broker sites aggregate public records and create profiles containing your information. While not directly showing account registrations, these profiles often list services you’ve used. Services like DeleteMe, Optery, or manual opt-outs can reduce this exposure.

For manual removal, search yourself on:

Each maintains opt-out processes, though they require periodic repeat submissions.

Building Your Audit Workflow

Combine these methods into a repeatable process:

  1. Export existing data: Pull password manager vault, email archives, and browser bookmarks
  2. Run automated scans: Execute Sherlock, GoMapEnum, and similar tools
  3. Query breach databases: Use HIBP API for known compromises
  4. Manual verification: Test password reset on suspected services
  5. Review OAuth grants: Check each platform for connected applications
  6. Document findings: Maintain a spreadsheet tracking discovered accounts
  7. Take action: Delete unused accounts, secure active ones, enable 2FA

Securing Your Discovered Accounts

With a complete inventory, prioritize security improvements:

For accounts you want to keep but rarely use, consider setting calendar reminders to periodically verify security settings.

Automation: Scheduled Footprint Reviews

Automate recurring audits with scheduled scripts:

# Cron job for weekly breach monitoring
0 9 * * 0 /path/to/hibp_check.sh >> /var/log/footprint_audit.log 2>&1

Regular reviews catch new accounts you create and identify breaches in newly-compromised services.

Built by theluckystrike — More at zovo.one