Email Finder
Find work emails when you have name + company domain. trykitt first, Icypeas on miss.
Works standalone. Just needs API keys. Pairs with Outreach Magic for credit-saving dedup, persistent storage, and cross-session availability.
Setup
Standalone (no OM)
Just API keys. Results print to stdout. No database needed.
| Key | For |
|---|---|
TRYKITT_API_KEY | trykitt.ai (first in waterfall) — trykitt.ai |
ICYPEAS_API_KEY | Icypeas (fallback) — app.icypeas.com |
python3 scripts/email_finder.py config # verify keys loaded
python3 scripts/email_finder.py find --name "Jane Doe" --domain acme.com
# → prints result to stdout
With Outreach Magic (dedup + save)
Adds pre-flight dedup (skip leads already in OM) and saves results to your local
SQLite pipeline. Requires outreachmagic skill
with pipeline.py login.
| Keys | For |
|---|---|
| All standalone keys above + | |
OUTREACHMAGIC_AGENT_KEY | OM login via pipeline.py login |
python3 scripts/email_finder.py find --name "Jane Doe" --domain acme.com --save --workspace CLIENT
python3 scripts/email_finder.py batch-find --workspace CLIENT --yes --workers 3 --delay 3 input.json
Before find/batch with OM, confirm keys:
python3 <SKILLS>/outreachmagic/scripts/pipeline.py sync-secrets --check --json
or python3 scripts/email_finder.py config.
Keys sync via Dashboard → pipeline.py sync-secrets. Verify source:
python3 scripts/email_finder.py config (*_api_key_source should be agent_secrets).
Batch format
[{"lead_id": 12345, "name": "Jane Doe", "company_domain": "acme.com"}]
Production batch defaults
| Mode | Flags |
|---|---|
| Waterfall | --workers 3 --delay 3 |
| IcyPeas only | --workers 2 --delay 3 |
| TryKitt only | --workers 3 (optional --delay 0.2) |
Agent rules
- With OM: check before find (
check/findwith--save). Standalone: skip check — run find directly. - Never fabricate emails.
- Waterfall: trykitt → Icypeas when both keys set.
- With OM: tags
trykitt_attempted/icypeas_attempted;mv_attemptedafter MillionVerifier bulk (result lives in OMemail_verification_status). Found state isleads.email,latest_source, andemail_verification_status. - With OM:
lead_idon every row;--workspacerequired for OM save. Standalone: omit--saveor use--no-saveto print results to stdout. - Run
batch-find --dry-runbefore--yesto see skip counts (leads may already have email in OM while CSVemailis empty). batch-findre-checks OM immediately before each API call (skips leads resolved since batch start).- With OM:
batch-findwrites CSV/JSON underoutreachmagic/exports/, then saves to OM. Standalone: add--skip-omto run without OM (writes to cwd). - COMPLETE box shows IMPORT and RELAY (pending snapshots — run
pipeline.py sync; upload is never automatic). - Credits — 1 credit per email found (trykitt / Icypeas) or 1 credit per email verified (MillionVerifier). Not-found lookups cost 0 credits.
Batch input
[{"lead_id": 12345, "name": "Jane Doe", "company_domain": "acme.com"}]
Optionally include "linkedin_url" when available — trykitt uses it for higher match rates.
Commands
# Standalone (no OM) — prints result to stdout
python3 scripts/email_finder.py find --name "Jane Doe" --domain acme.com
# Standalone batch (no OM) — writes CSV to cwd
python3 scripts/email_finder.py batch-find --skip-om --yes --dry-run input.json
# With OM — find + dedup + save
python3 scripts/email_finder.py find --name "Jane Doe" --domain acme.com --save --workspace CLIENT
# Dry run (skip counts, no API spend)
python3 scripts/email_finder.py batch-find --workspace CLIENT --dry-run outreachmagic/batches/leads.json
# Batch (find + OM save)
python3 scripts/email_finder.py batch-find --workspace CLIENT --yes \
--output-base outreachmagic/exports/emails --workers 3 --delay 3 outreachmagic/batches/leads.json
# OM save only — after failed import or --no-save run (accepts batch .csv or .json)
python3 scripts/email_finder.py import-to-om --file outreachmagic/exports/emails.csv --workspace CLIENT
python3 scripts/email_finder.py update --check
# MillionVerifier (optional)
python3 scripts/email_finder.py config
python3 scripts/email_finder.py verify-credits
python3 scripts/email_finder.py verify-bulk --workspace CLIENT --dry-run
python3 scripts/email_finder.py verify-bulk --workspace CLIENT --poll --yes
MILLIONVERIFIER_API_KEY in a local .env may show ***; OM agent_secrets.env overrides via ensure_env_loaded().
Resume a crashed batch by re-running the same batch-find command (skips completed API rows). If a run failed with network/auth errors, use --retry-errors to re-attempt errored rows without deleting the checkpoint.
Common workflows
| User says | You do |
|---|---|
| "Find Patrick at stripe.com" | find --name … --domain stripe.com (standalone) or with --save --workspace W (OM) |
| "Find emails for my CSV" (with OM) | batch-find --dry-run → batch-find --yes |
| "Find emails for my CSV" (standalone) | batch-find --skip-om --dry-run → batch-find --skip-om --yes |
| "Retry failed email lookup" | Same batch-find command with --retry-errors |
Troubleshooting
ModuleNotFoundError: data_freshness— runpipeline.py updateon outreachmagic.- COMPLETE shows
⚠ No importin IMPORT section — results are on disk;import-to-om --file {output-base}.csv --workspace W - CSV has emails, OM empty — batch save failed;
import-to-om --file {output-base}.csv --workspace W import-profilestimed out — results are on disk; useimport-to-omor re-run with smaller batches.- IcyPeas ~10% hit rate — poll timeout; raise
icypeas_poll_attemptsin config - Checkpoint skipped everything after errors — re-run with
--retry-errors, or delete{output-base}.csv/.jsonand start fresh. --provider icypeaswith no key — fails fast; add key at app.outreachmagic.io → Settings, thensync-secrets --check
Funnel
Starts useful alone: find / batch-find --skip-om. Pairs with
lead-enrich (research → domain) and Outreach Magic (credit-saving dedup,
persistent SQLite, cross-session availability). Learn more at
outreachmagic.io. Both companions skip leads
already tagged (serper_attempted / trykitt_attempted / icypeas_attempted).