The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the OpenLeads listing page.
Type who you want ("dentists in Austin", "fintech founders", "law firms in London") and OpenLeads searches OpenStreetMap, Y Combinator, GitHub, OpenAlex, SEC EDGAR, Wikidata and company websites, finds the real people, and tells you honestly which emails are confirmed and which are guesses. Then it can write and send the emails on a schedule. It runs on your machine.
Website · Docs · Live benchmark · Changelog
A real test run in openleads web: 6 dentists found, 6 safe addresses, 6 drafts, exported to Sheets, nothing sent.
Output shape from a real run; businesses and people renamed.
Apollo, Hunter and ZoomInfo sell a contact database and email verification, then charge again for sending. OpenLeads does all three for free, from public data, on your laptop. Two things matter most:
It's honest about every email. Most free finders label a first.last@ guess as
"valid". OpenLeads marks each address:
| Evidence | Meaning |
|---|---|
| found | Published on the web, or confirmed by the mail server |
| pattern | Built from the format a real address at that company uses |
| guessed | A common format, unconfirmed. It's labelled, so you decide |
Those feed a send decision: safe (send it), risky (held back unless you opt in), bad (dropped). Read how the scoring works.
It's measured against live data every night. Unit tests can't tell you whether
"dentists in Austin" returns dentists. openleads bench runs 12 real
queries against the live sources and publishes the results:
| Real query | v4.0 | v4.5 |
|---|---|---|
| "marketing agencies in Miami" | 6 of 20 "people" were page headings ("Refund Policy") | 0 junk names |
| "dentists in Austin" | chiropractors and transport companies, 0 usable | 10 dentists |
| "machine learning researchers" | 0 results | 10 researchers |
| "rust developers in Berlin" | still running after 4 min | 10 in 5s |
Latest full run (12 queries, 10 leads each): 12/12 return results · 84% fill · 0% junk names · 32% of emails found or pattern-backed, the rest labelled guessed · 54s median. Full scoreboard →
One query fans out across the sources that fit it. You never pick a source, but
-s name pins one.
| Ask for | Searched | Example |
|---|---|---|
| Local businesses, any city | OpenStreetMap (Overpass + Nominatim) | "accountants in Toronto" |
| Startup founders, companies hiring | Y Combinator, Hacker News | "AI startup founders" |
| Companies by industry | Wikidata, SEC EDGAR | "fintech companies" |
| Developers | GitHub | "rust developers in Berlin" |
| Researchers | OpenAlex | "machine learning researchers" |
| Everyone at one company | the company's own site | "emails at stripe.com" |
| US healthcare providers | NPI Registry | "pediatricians" |
Each company is turned into named people from its team and about pages. Every address then goes through the email checks: published-address harvest, learned company pattern, MX/SPF/DMARC, Gravatar, and SMTP where port 25 is open.
Need a source we don't have? A source is one Python file.
OpenLeads is an MCP server. Your AI assistant can find and verify leads mid-conversation:
"Find 10 law firms in London with emails we can actually send to, and draft a two-line intro for each."
openleads web opens a local dashboard with search, a CRM, analytics, and
Workflows: each saved search is drawn as a node canvas, like n8n. Click a node
to edit it (who to find, what to offer, when to run, where to export), then hit
Test run and watch every node fill in from the live engine. Test runs never
send. Workflows guide →
Export nodes push leads to CSV, Google Sheets, Notion, Airtable, or any webhook, so the rest of your stack (n8n, Zapier, Make) can take it from there.
Schedules can be plain English (every 2h, mon,thu 14:00) or cron. Sends stay
inside your daily cap, warmup ramp and business-hour windows, and stop for anyone
who replies. Failed runs send a desktop alert, plus a webhook if you set one.
Timed runs →
Rather run it in CI? There's a GitHub Action:
Full walkthrough: docs/quickstart.md.
Sending is a dry run by default everywhere. Add --live to send.
The core is Python standard library only. Everything, including your leads, drafts,
mailbox credentials, learned patterns and CRM, lives in ~/.openleads. There's no
hosted backend, no account and no telemetry. Details: docs/architecture.md.
OpenLeads is for legitimate prospecting, recruiting and research. You're responsible for anti-spam law (CAN-SPAM, GDPR, CASL) and each source's terms. It ships the guardrails: dry-run by default, suppression list, one-click unsubscribe, warmup caps, no tracking pixels. Read docs/responsible-use.md.
Open source under AGPL-3.0. Using OpenLeads is free, including at your company. If you embed it in a closed-source product, or run a modified version as a service without publishing your changes, you need a commercial license. Releases up to 4.0.1 were PolyForm Noncommercial.
The highest-impact PR is a new source (guide). The second is a
query that openleads bench scores badly, along with the fix.
See CONTRIBUTING.md.
OpenStreetMap contributors ·
OpenAlex · yc-oss/api ·
NPI Registry · SEC EDGAR · Wikidata · Gravatar ·
US Social Security Administration (given-name data).
If OpenLeads found you a customer, a ⭐ helps other people find it.