Skip to main content

Free, open-source Apollo alternative: a universal entityโ†’verified-email engine with pluggable free data sources (founders, developers, doctors, researchers) and an interactive chat CLI.

Project description

๐Ÿงฒ OpenLeads

The free, open-source Apollo alternative โ€” for everyone.

Find founders, developers, doctors, researchers โ€” anyone โ€” and verify their emails, using only free, public data. No paid APIs. No API keys. No seat fees. Now with an interactive chat CLI.

License: PolyForm NC Python 3.8+ Zero-dependency core PyPI CI PRs Welcome Stars


Apollo, Hunter, RocketReach, and ZoomInfo all sell the same two things: a contact database and email verification. Their moat is the database. OpenLeads inverts it.

OpenLeads is a universal entity โ†’ verified email engine, fed by a registry of pluggable, free, keyless public data sources.

The email engine doesn't care who you're looking for. So coverage grows by adding small source plugins, not by paying for a database. v2.0 ships sources for startup founders, open-source developers, U.S. doctors, and academic researchers โ€” and you can add any vertical (lawyers, podcasters, real-estate agentsโ€ฆ) by dropping a single .py file in a folder.

All for $0, in code you can read in one sitting.

openleads> find 25 AI founders, verified emails only
  plan  source=yc  count=25  filter=AI  verified-only  parser=rule
  โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”“
  โ”ƒ # โ”ƒ โœ“  โ”ƒ Email           โ”ƒ Name         โ”ƒ Title   โ”ƒ Org     โ”ƒ Score โ”ƒ
  โ”กโ”โ”โ”โ•‡โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”ฉ
  โ”‚ 1 โ”‚ OK โ”‚ ada@acme.ai     โ”‚ Ada Lovelace โ”‚ Founder โ”‚ Acme    โ”‚  96   โ”‚
  โ”‚ 2 โ”‚ ~CAโ”‚ grace@cobol.dev โ”‚ Grace Hopper โ”‚ CEO     โ”‚ COBOLwx โ”‚  71   โ”‚
  โ””โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  25 leads ยท 18 verified ยท /export FILE to save

OK = SMTP-verified ยท ~CA = catch-all best-guess ยท ~PG = MX-only pattern guess ยท Score = 0โ€“100 confidence


โœจ Why OpenLeads

OpenLeads Apollo / Hunter (free tier)
Cost $0, forever Credit-limited, then paid
API key required โŒ None โœ… Required
Who you can find Founders, devs, doctors, researchers, + any vertical you plug in Their database only
Email verification โœ… Live SMTP RCPT + 0โ€“100 score Paid feature
Catch-all detection โœ… Yes Sometimes
Interactive chat CLI โœ… Yes (openleads chat) โŒ
You own the code โœ… Readable, hackable, extensible โŒ Black box
Output โœ… CSV / JSON / NDJSON Often gated
Core dependencies Zero (stdlib only) โ€”

๐Ÿš€ Install

# Python (recommended) โ€” zero-dependency engine + plain CLI
pip install openleads

# โ€ฆwith the pretty interactive chat TUI
pip install "openleads[chat]"

# โ€ฆwith the cold-email companion too
pip install "openleads[all]"

Prefer Node? A thin wrapper lets you run it with npx (it installs the Python package on first use):

npx openleads find "50 fintech founders verified only"
# or: npm i -g openleads

โšก Quickstart

# Launch the interactive chat โ€” just type what you want
openleads

# Or go one-shot, non-interactive:
openleads find "50 fintech founders, verified only" --out leads.csv
openleads find --source npi --keyword pediatric --location CA --format json
openleads find "rust developers in Berlin" --source github --format ndjson --out devs.ndjson

# Verify specific addresses
openleads verify ada@acme.io grace@cobol.dev

# See what you can search
openleads sources

No signup, no key, no database fees.

๐Ÿ’ฌ The chat CLI

openleads chat (or just openleads) opens a Claude-Code-style REPL. Type requests in plain English and refine conversationally:

openleads> pediatricians in California
openleads> only verified
openleads> /source github
openleads> machine learning researchers as ndjson
openleads> /export leads.ndjson
  • Works fully offline. A rule-based intent parser understands counts, verticals, locations, filters, and verified only โ€” no API key needed.
  • Optionally smarter. Set OPENROUTER_API_KEY (a free model works) and free-form input is parsed by an LLM. The active mode is always shown.
  • Slash commands for precision: /source, /count, /verified, /format, /export, /sources, /cache, /help, /quit.

๐Ÿงฉ Sources (and adding your own)

$ openleads sources
  github       [people ] developers & open-source orgs
  npi          [people ] U.S. doctors & healthcare providers
  openalex     [people ] researchers & academics
  producthunt  [company] trending products & startups
  yc           [company] startup founders (Y Combinator)

All are keyless and free. Want a vertical we don't ship โ€” recruiters, lawyers, real-estate agents, your CRM export? Drop a *.py file in ~/.openleads/sources/:

from openleads.sources.base import Source
from openleads.models import Entity, Query

class LawyersSource(Source):
    name = "lawyers"
    kind = "people"
    vertical = "attorneys"
    description = "State bar directory."

    def search(self, query: Query):
        for row in fetch_from_some_free_directory(query):
            yield Entity(full_name=row["name"], organization=row["firm"],
                         domain=row["firm_domain"], source=self.name)

Run openleads sources and it's there. The email engine handles the rest. Full guide: docs/sources.md.

๐Ÿ“ฆ Output formats

openleads find "20 founders" --format csv     # default; CRM/mail-merge ready
openleads find "20 founders" --format json    # array, includes score + signals
openleads find "20 founders" --format ndjson  # one lead per line, streamable
openleads find "20 founders" --format json --out -   # write to stdout

The CSV schema is a superset of v1's, so the cold-email companion and any existing tooling keep working.

๐Ÿ” How it works

flowchart LR
    Q[Your request<br/>chat or CLI] --> I[Intent parser<br/>rule-based ยฑ LLM]
    I --> S[Source plugin<br/>yc ยท github ยท npi ยท openalex ยท โ€ฆ]
    S --> E[Email engine<br/>multi-resolver MX โ†’ permutations โ†’ SMTP RCPT]
    E --> C[Confidence score 0โ€“100<br/>+ honest label]
    C --> O[CSV ยท JSON ยท NDJSON]
    E <--> K[(SQLite cache<br/>MX ยท SMTP ยท datasets)]

The crown jewel is the email engine (deep dive): MX cross-checked across two DNS-over-HTTPS resolvers, common name permutations, and a real SMTP RCPT probe (no message is ever sent) with catch-all detection. Results carry an explainable 0โ€“100 score. A SQLite cache avoids re-probing domains and mail servers between runs.

๐Ÿ“ก SMTP verification needs outbound port 25. Works on most servers; some home ISPs block it, in which case OpenLeads gracefully falls back to MX-validated pattern guesses.

๐Ÿ“จ Bonus: cold-email companion

openleads campaign turns leads.csv into personalized outreach โ€” LLM-drafted (free OpenRouter models supported), clean formatting, placeholder guards, sends over your own SMTP, and saves a copy to Sent. Dry-run by default; --live to send.

pip install "openleads[campaign]"
cp .env.example .env        # add your SMTP + OpenRouter creds
openleads campaign          # dry run (preview)
openleads campaign --live   # send for real

โš ๏ธ This is the only part that touches your mailbox. The lead engine never sends anything.

๐Ÿงญ Responsible use

OpenLeads is for legitimate outreach, recruiting, research, and prospecting. Some verticals carry extra weight โ€” e.g. healthcare providers (NPI) and academics โ€” so please read docs/responsible-use.md. You are responsible for anti-spam law (CAN-SPAM, GDPR, CASL) and each source's terms.

๐Ÿ—บ๏ธ What's new in v2.0

  • โœ… Installable package + openleads CLI (pip & npx)
  • โœ… Interactive chat REPL (rule-based, LLM-optional)
  • โœ… Pluggable sources + 4 new keyless verticals (GitHub, NPI, OpenAlex, ProductHunt)
  • โœ… Confidence scoring (0โ€“100) with multi-resolver MX cross-checks
  • โœ… SQLite caching layer
  • โœ… --format json/ndjson output

See the full CHANGELOG.

๐Ÿค Contributing

PRs very welcome โ€” see CONTRIBUTING.md. The easiest high-impact contribution is a new source plugin (guide) โ€” that's literally how OpenLeads becomes "Apollo for everyone."

๐Ÿ“„ License

PolyForm Noncommercial 1.0.0 โ€” free for personal, research, educational, and nonprofit use. Commercial use? See COMMERCIAL-LICENSE.md.

๐Ÿ™ Acknowledgements

yc-oss/api ยท OpenAlex ยท NPI Registry ยท GitHub & ProductHunt public data ยท and everyone who has ever rage-quit a "request a demo" button.

If OpenLeads saved you a subscription, consider leaving a โญ โ€” it genuinely helps.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

openleads-2.0.0.tar.gz (52.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

openleads-2.0.0-py3-none-any.whl (51.3 kB view details)

Uploaded Python 3

File details

Details for the file openleads-2.0.0.tar.gz.

File metadata

  • Download URL: openleads-2.0.0.tar.gz
  • Upload date:
  • Size: 52.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for openleads-2.0.0.tar.gz
Algorithm Hash digest
SHA256 baf4de7a4b726fb12f13fc7e5982f6dd2eab22c9645ae11ac299b931b8c7eb22
MD5 85e119b6a6ff4e9da2e69243560c5354
BLAKE2b-256 b3e4eb4ef1ca846590cf657c838d690975272c5cb7f05df91490c301b433fa46

See more details on using hashes here.

File details

Details for the file openleads-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: openleads-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 51.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for openleads-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7958b69fe516d345102488949287f2a8d34b2dad2dc5503013464270b1abf4f8
MD5 5c8950d784242af857f238ad1440cf8a
BLAKE2b-256 80326c3524766949a8e7b815b86f9838bf0d318aa51078ee3cc3dcb759aeb204

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page