Built to make enrichment extraordinarily intelligent.

An AI agent that descends the waterfall, judges signals, and learns each domain. The cascade is the best way to enrich contacts with AI.

waterfallreach · enrich.py main · 142ms · tier-0-exit
1def enrich(linkedin_url: str) -> Result: 2 # AI agent descends the waterfall, exits early on match 3 seeds = extract_seeds(linkedin_url) 4 5 # Tier 0 — 20+ free signals 6 signals = await gather_free_signals(seeds) 7 candidate = await ai_judge.fuse(signals) 8 9 # SMTP probe with gateway detection 10 verified = await smtp.probe(candidate, mx_aware=True) 11 12 if verified: 13 domain_memory.learn(seeds.domain, candidate.pattern) 14 return Result(email=candidate, tier=0, exit="verified") 15 16 # otherwise descend to T1 → T2 → T3 → T4 17 return await descend(candidate, tier=1)
C
Cascade Agent
RUNNING
Extracted 8 seed permutationsfrom linkedin.com/in/jane-doe
Gathered 20+ free signalsCommonCrawl, GitHub, IRS 990, NPPES, certs · 142ms
AI judge fused signals → ranked candidatejane.doe@acme.com · confidence 0.96
SMTP probe with gateway detectionMX fingerprint: Google Workspace · no catch-all
Verify domain pattern, write to memory
Return result + tier_exited
Pending result
jane.doe@acme.com · tier 0 exit · cost $0.00
// what cascade does

An AI agent. Not a chatbot.

The agent decides which tier to run, fuses signals, ranks LinkedIn sources, and learns every domain it touches. No prompt engineering required.

// AGENT

Runs autonomously

The AI agent decides which tier to run, when to stop, and what to verify. No prompts required.

// JUDGE

Fuses weak signals

Twenty-plus public-records signals are weighed and ranked. The AI judge produces one candidate per row.

// LEARNS

Domain memory

Every successful exit teaches the agent the domain's pattern. Next call on that domain is free.

Try the AI agent.

Free tier · 200 enrichments/month · no credit card required.