An open-source, self-hosted, Apollo-style lead-sourcing UI for Blitz API. Search people and companies, filter like Apollo's own search, verify emails, and export straight to CSV/XLSX or a CRM-ready import template — no LLM, no hosted SaaS account, no vendor lock-in. Bring your own Blitz API key, run one Docker command, and you have a working multi-user tool in a couple of minutes.
Blitz API itself has no UI — you talk to it via API/MCP. BlitzProspector is that missing UI: a polished, self-hostable frontend any Blitz API customer (or small team) can stand up themselves.
- Apollo-style search — person and company filters (titles, seniority, industry, location,
employee count, keywords, and more — see
CONTRIBUTING.mdfor the full filter reference), plus a natural-language "describe your ICP" parser. - In-app results — paginated results table for every pull, no spreadsheet round-trip required.
- Pluggable email verification — MillionVerifier by default,
fully optional (searches still work with no verifier configured), and swappable for another
provider (see
CONTRIBUTING.md). - CRM-ready export — CSV/XLSX, plus one-click column-mapped exports for Instantly, Smartlead, and HubSpot/Salesforce-style imports.
- Real accounts — username/password login, admin + member roles, an admin panel for user management. No shared API key as your only access control.
- Shared suppression list — a simple do-not-contact list, shared across your team/deployment. Saved searches work the same way.
- Light/dark theme, a Blitz-credits-used indicator, and a link to the auto-generated API docs
at
/docs. - Google Sheets export stays available as a fully optional secondary output if you configure a
service account; without one, runs just export a local
.xlsx.
Requires Docker and a Blitz API key.
git clone https://github.com/<your-org>/blitzprospector.git
cd blitzprospector
cp backend/.env.example backend/.env
# edit backend/.env and set BLITZ_API_KEY — everything else is optional
docker compose up --build -dOpen http://localhost:8000 — you'll land on a "create admin account" screen the first time
(shown whenever no users exist yet). Create it, log in, paste your Blitz key into Settings if you
didn't set it in .env, and run a search.
docker compose down stops it; your data (SQLite DB + run checkpoints) persists in a named Docker
volume across restarts.
Bootstrap / login![]() |
Search & filters![]() |
Search with a completed pull![]() |
Pulls (in-app results)![]() |
Pulls with completed runs![]() |
Settings (admin-only)![]() |
Admin panel![]() |
A completed pull exports to CSV/XLSX with one row per contact. Below is a redacted sample (real
names, emails, companies, and LinkedIn URLs are synthesized; only the title/city/country
distribution is real) — the full file is at
docs/samples/CXOs_USA_sample.csv.
| first_name | last_name | company_name | title | city | country | |
|---|---|---|---|---|---|---|
| alex.rivers@nimbuslabs.example | Alex | Rivers | Nimbus Labs | CEO | Eagle | US |
| jordan.calloway@cobaltrobotics.example | Jordan | Calloway | Cobalt Robotics | Co-founder CEO | Santa Clara | US |
| taylor.jennings@latticenetworks.example | Taylor | Jennings | Lattice Networks | Co-founder & CEO | Miami-Fort Lauderdale | US |
| morgan.quinlan@vectorworks.example | Morgan | Quinlan | Vector Works | Founder CEO | — | US |
| casey.yardley@harbortechnologies.example | Casey | Yardley | Harbor Technologies | Founder & CEO | Walnut Creek | US |
All configuration lives in backend/.env (copy from backend/.env.example) or, for the fields
marked below, in the in-app Settings screen (admin-only) — env vars always win when non-blank,
so a Docker deploy with real secrets in the environment is never shadowed by an empty DB row.
| Variable | Required | Notes |
|---|---|---|
BLITZ_API_KEY |
Yes | Your Blitz API key. Also settable in Settings. |
MV_API_KEY / EMAIL_VERIFIER_PROVIDER |
No | Email verification; omit for a NoopVerifier. Also settable in Settings. |
GOOGLE_SERVICE_ACCOUNT_JSON / GOOGLE_SHEET_ID |
No | Optional secondary export to Google Sheets. |
APP_API_KEY |
No | Extra shared-secret gate in front of login, for reverse-proxy setups. |
ALLOWED_ORIGINS |
No | Only needed if you run the frontend separately (see Development below) instead of the single Docker container. |
See backend/.env.example for the complete list, including run-tuning knobs for large pulls.
To run the backend and frontend separately (hot reload instead of rebuilding the container) or to
contribute, see CONTRIBUTING.md.
- Reverse proxy / TLS: point a subdomain at the container's port 8000 and terminate TLS in
front of it. Minimal Caddy example:
yourdomain.com { reverse_proxy localhost:8000 } - Secrets via Doppler: since config is just environment variables (Pydantic settings), a
Doppler service token works with zero code changes — inject it in
place of
backend/.env(doppler run -- uvicorn app.main:app ...inside the container's entrypoint, or viaDOPPLER_TOKEN). - Alternative to Docker Compose:
render.yamlis a ready-to-use Render Blueprint that builds the samebackend/Dockerfile.wrangler.jsonclets you deploy just the frontend to Cloudflare Workers/Pages separately if you'd rather split frontend and backend hosts:Also setcd frontend cp .env.production.example .env.production # set VITE_API_BASE to your backend's URL npm ci && npm run build npx wrangler deploy # or: wrangler pages deploy dist
ALLOWED_ORIGINSon the backend to the frontend's origin so the session cookie's CORS check passes.
Deferred, not built yet — contributions welcome:
- Scheduled / recurring searches
- Additional email-verification providers beyond MillionVerifier (the interface is already pluggable
— see
CONTRIBUTING.md) - Additional CRM export profiles beyond Instantly/Smartlead/HubSpot
See CONTRIBUTING.md — includes local dev setup, how to add a new email-verification provider, and
a full filter-field reference. Check the issue tracker
for open work, including anything tagged
good first issue.
By participating, you agree to abide by the CODE_OF_CONDUCT.md.
MIT — see LICENSE.






