Documentation
GTM & leads
Find companies, find the people at them, reveal and verify their work emails, and qualify accounts with hiring and news signals — nine data vendors behind one endpoint, each priced per call. The routing on this page encodes measured head-to-head evals, not vendor marketing: Exa first for people, a Prospeo → Tomba → Icypeas email waterfall, and a hard rule that nothing gets sent to an unverified address.
When to use which
People and emails
| Need | Call | Price | Mode |
|---|---|---|---|
| Find people by ICP — primary | exa/search with category: "people" | 1¢/query | sync |
| Find people by ICP — fallback | prospeo/search-people | 5¢/page | sync |
| Reveal a work email — try first | exa/search + exa/contents | 1¢ + 0.1¢/URL | sync |
| Reveal a verified email — fallback | prospeo/enrich | 5¢ (free on miss) | sync |
| Email from name + company — rung after a Prospeo miss | tomba/email-finder | 4¢ | sync |
| Email — next rung, different infrastructure | icypeas/email-search | 4¢ + 1¢/poll | async |
| Email — final backup (needs a paid Apollo plan) | apollo/person-enrich | 10¢ | sync |
| Deliverability — primary, any address | tomba/email-verifier | 2¢ | sync |
| Deliverability — second opinion | icypeas/email-verification | 2¢ + 1¢/poll | async |
| Deliverability — Prospeo-indexed emails only | prospeo/verify | 5¢ | sync |
| All emails at a company + its pattern | tomba/domain-search | 4¢ | sync |
| Generic inboxes at a domain (contact@, support@…) | icypeas/domain-scan | 4¢ + 1¢/poll | async |
| Email behind a LinkedIn profile | tomba/linkedin-finder | 5¢ | sync |
| Article author + their email | tomba/author-finder | 4¢ | sync |
| Email → person + company (cheap reverse lookup) | tomba/enrich | 4¢ | sync |
| Phone by email / domain / LinkedIn | tomba/phone-finder | 10¢ | sync |
| Deep person enrich / reverse lookup incl. phones | nyne/person-enrich | 55¢ (lite 30¢) | async |
Companies and signals
| Need | Call | Price | Mode |
|---|---|---|---|
| Companies like your best customers (≤100) | openfunnel/lookalikes | ~1¢/company | sync |
| Whole-market TAM from an ICP (thousands) | openfunnel/tam-build | per company delivered | async |
| Companies running a tech (from job posts) | openfunnel/tech-companies | 40¢/page | sync |
| Tech + LLM-verified buying intent | openfunnel/tech-intent | 20¢/qualified | async |
| Qualify one account against a question | openfunnel/deep-research | 20¢ | sync |
| Raw job postings by title/tech/salary/date | theirstack/jobs | 40¢/≤10 jobs | sync |
| Companies by tech stack + active hiring | theirstack/companies | 60¢/≤5 companies | sync |
| One company’s tech stack with confidence + dates | theirstack/technographics | 25¢ | sync |
| One company’s buying-intent topics | theirstack/buying-intents | 25¢ | sync |
| Deep private-company profile — pick sections | akta/company-enrich | 4–35¢/section | sync |
| Entity-resolved news with sentiment | akta/news | ~2¢/10 articles | sync |
| Alt-data: reviews, headcount, traffic, jobs, social | akta/employee-reviews … | 11–21¢ | sync |
| Company firmographics + phone by domain | apollo/org-enrich | 5¢ | sync |
| Investor intel (thesis, partners, check size) | nyne/company-funders | 30¢ | async |
| Who follows / replied to a profile or post | nyne/person-interactions | 30¢ | async |
The chain that works: OpenFunnel answers which companies, exa/search with category: "people" answers who to talk to there, and the email waterfall turns names into verified contacts. For emails the waterfall order is Exa (cheapest) → prospeo/enrich (free on a miss) → tomba/email-finder → icypeas/email-search → apollo/person-enrich as the final backup. Verify every address before a real send: tomba/email-verifier for any address, prospeo/verify only for an email Prospeo itself just enriched.
exa — people discovery (try it first)
- Price
- 1¢/query ·
exa/contents0.1¢/URL - Latency
- fast
- Query style
- free text — no canonicalizing needed
Exa is the primary people-discovery engine. Phrase an open ICP query — role + seniority + industry + company size + geography — and run one query per role; read each profile’s name, title, company, and /in/ URL from the returned text.
curl -X POST https://vaaya.ai/api/run/exa/search \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "VP Sales at fintech companies with 21-100 employees in India — LinkedIn profiles",
"category": "people",
"numResults": 50,
"contents": { "text": true }
}'- To reveal an email, try Exa first:
exa/searchthe person + company, thenexa/contents(0.1¢/URL) on the best hits to pull the address off the page. Full Exa params on Web search. - Prospeo (below) is the fallback for people data; a scrape or web search is the fallback for information — an email on a page, not in a database. See Web scraping.
- Exa takes free-text values like “Midwest” or “fintech” — only the Prospeo fallback needs its filters canonicalized.
prospeo — find, enrich, verify (the people fallback)
- Price
- suggest free · search 5¢/page · enrich 5¢ (free on miss) · verify 5¢
- Latency
- fast
- Mode
- sync
Use Prospeo when Exa surfaces too few people, or when Exa can’t resolve the email. Prospeo’s filters use fixed vocabularies, so canonicalize free text first with prospeo/suggest (free) and use the returned name verbatim — exactly one of location_search / job_title_search / industry_search / technology_search per suggest call.
curl -X POST https://vaaya.ai/api/run/prospeo/search-people \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"job_titles": ["VP Sales"],
"seniority": ["Vice President"],
"headcount": ["21-50", "51-100"],
"person_locations": ["India"]
}'prospeo/enrich (5¢, free on a miss) reveals the masked email by LinkedIn URL: {"linkedin_url": "https://www.linkedin.com/in/..."}. prospeo/verify (5¢) checks deliverability of a Prospeo-indexed email — person.email.status of VERIFIED means safe to send.
Gotchas
seniorityvocabulary:C-Suite, Director, Entry, Founder/Owner, Head, Intern, Manager, Partner, Senior, Vice President.headcountuses fixed buckets:1-10, 11-20, 21-50, 51-100, 101-200, 201-500, 501-1000, 1001-2000, 2001-5000, 5001-10000, 10000+— there is no51-200.- Never use bulk enrich endpoints — bulk charges on misses; per-find is free on a miss.
- Enrich results vary run to run — on a miss, fall through to
tomba/email-finderinstead of retrying Prospeo. prospeo/verifyNO_MATCHes most arbitrary addresses — for anything Prospeo didn’t just enrich, usetomba/email-verifier(2¢, works on any address) instead.
tomba — the cheap email-intelligence rung
- Price
- 2–10¢ per call
- Latency
- ~2s (
email-finder) · ~12s (linkedin-finder) - Mode
- sync
Tomba and Prospeo are complementary, not substitutes: in a head-to-head on 12 cold leads, Prospeo found 8 emails and Tomba found 3 that Prospeo missed — running Prospeo first and Tomba on the miss lifted coverage from 67% to 92%. Tomba also covers two things no other vendor here does: every known email at a company plus its pattern (domain-search), and article URL → author + email (author-finder).
tomba/email-verifier(2¢) — the primary deliverability check: real SMTP/MX verification on any address. Readdata.email.result(deliverable/undeliverable/risky).tomba/email-finder(4¢) — name + company/domain → most likely email with a confidence score. The best rung after aprospeo/enrichmiss; preferdomainovercompanywhen known.tomba/linkedin-finder(5¢) — LinkedIn profile URL → email (full: truereturns all associated emails). Use afteremail-finder, not instead of it.tomba/domain-search(4¢) — company/domain → all known emails + the domain’s pattern. Optionaldepartment(engineering/sales/finance/hr/it/marketing/operations/management),country(2-letter),page/limit(10|20|50). Good first step when you only know the company.tomba/author-finder(4¢) — article/blog URL → author name, email, socials. The hook for content-based prospecting.tomba/enrich(4¢) — email → person + company profile in one call. Escalate tonyne/person-enrichonly when you need phone/social depth.tomba/phone-finder(10¢) — email/domain/LinkedIn → phone. The cheap rung before Nyne when only a number is missing.
# 1) name + domain → likely email
curl -X POST https://vaaya.ai/api/run/tomba/email-finder \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "stripe.com", "full_name": "Jane Doe"}'
# 2) verify before any real send
curl -X POST https://vaaya.ai/api/run/tomba/email-verifier \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "jane.doe@stripe.com"}'Gotchas
linkedin-finderis slow (~12s median) and throws transient upstream 5xx on ~20% of calls — a retry usually clears it.linkedin-findercan return a personal-domain or previous-company email — always runtomba/email-verifieron the answer and sanity-check the domain against the target company.
icypeas — the second rung, on different infrastructure
- Price
- finder 4¢ · verifier 2¢ · domain scan 4¢ · poll 1¢
- Latency
- usually a few seconds end to end
- Mode
- async — launch, then poll
icypeas/result
Icypeas prices match Tomba (finder 4¢, verifier 2¢) but run on different infrastructure — fall through Tomba ↔ Icypeas on a miss, or cross-check a risky Tomba verdict before a send that matters. All Icypeas searches are async: the launch returns { "item": { "_id": ... } } immediately; poll icypeas/result (1¢) with that id every 3–5 seconds until items[0].status leaves NONE/SCHEDULED/IN_PROGRESS.
# launch → { "item": { "_id": "..." } }
curl -X POST https://vaaya.ai/api/run/icypeas/email-search \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"firstname": "Jane", "lastname": "Doe", "domainOrCompany": "stripe.com"}'
# poll every 3-5s (1¢ per poll)
curl -X POST https://vaaya.ai/api/run/icypeas/result \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id": "<item._id>"}'icypeas/email-search(4¢) — name + company/domain → professional email with a certainty grade (ultra_sure/sure/…) and MX provider. Prefer a bare domain indomainOrCompany.icypeas/email-verification(2¢) — SMTP-level deliverability on any address; the second opinion when Tomba saysrisky.icypeas/domain-scan(4¢) — a domain’s role-based/generic inboxes (contact@, support@, admin@…). Complementstomba/domain-search, which lists people — use this when any reachable inbox will do.icypeas/result(1¢) — fetch/poll byid, or list recent searches with{"mode": "single", "limit": 10}.
Gotchas
- Status semantics:
FOUND/DEBITED= hit (readitems[0].results);NOT_FOUND/DEBITED_NOT_FOUND= processed but empty;BAD_INPUT/INSUFFICIENT_FUNDS/ABORTED= terminal errors. - The vendor caps result reads at 30/minute — poll every 3–5 seconds, no tighter.
nyne — deep enrich, reverse lookup, investor intel
- Price
- person 55¢ (lite 30¢) · funders 30¢ · interactions 30¢
- Latency
- async — polls usually complete in under a second
- Polling
nyne/result— free- Match rate
- ~92%
All Nyne actions are async: the submit returns 202 with a request_id; poll nyne/result (free) with the same endpoint name until status is "completed", then read result. nyne/person-enrich is the reverse lookup: “who is this email / phone number / Instagram handle?” — pass any one identifier (email, phone, social_media_url, or name + company) and get back best work/personal emails, alternate emails, phone numbers, social profiles, work history, and seniority.
# reverse lookup from any one identifier
curl -X POST https://vaaya.ai/api/run/nyne/person-enrich \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "jane@acme.com"}'
# → 202 + request_id; poll until status is "completed" (free)
curl -X POST https://vaaya.ai/api/run/nyne/result \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"endpoint": "person/enrichment", "request_id": "req_..."}'nyne/person-enrich(55¢, or 30¢ withlite_enrich: true) — LinkedIn, X, Instagram, GitHub, and Facebook URLs all work insocial_media_url; for a bare handle, build the profile URL first.nyne/company-funders(30¢) — investor intel for a fundraise: pass the investor’scompany_nameorcompany_domain→ thesis, partners with LinkedIn URLs, average check size, rounds, recent investments. Qualify funds before outreach.nyne/person-interactions(30¢) — engagement mining:social_media_url+typeofreplies|followers|following(plustweet_idfor one post) → the people engaging with a launch or topic, with the engagement as the outreach hook.
Gotchas
- Billing happens at submit, not at poll — the poll itself is free.
- Escalate here from
tomba/enrich(4¢) only when you need phone numbers or social depth — it’s a 14× price jump.
apollo — org enrich and the final person backup
- Price
- 5¢ (
org-enrich) · 10¢ (person-enrich) - Mode
- sync
apollo/org-enrich(5¢) — company firmographics + phone by domain.apollo/person-enrich(10¢) — the final email backup after Exa, Prospeo, Tomba, and Icypeas all miss. It requires a paid Apollo plan; plan-gated calls count as free misses.
openfunnel — company discovery
- Price
- lookalikes ~1¢/company · tech pages 40¢ · intent 20¢/qualified
- Mode
- sync shortlists · async at scale
- Polling
openfunnel/results— free helper
Exa, Prospeo, and Nyne find people; OpenFunnel finds companies. The chain: OpenFunnel (which companies) → exa/search with category: "people" at those companies (who to talk to) → the email waterfall (verified contacts).
curl -X POST https://vaaya.ai/api/run/openfunnel/lookalikes \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"seed_domains": ["stripe.com", "brex.com"],
"limit": 50,
"locations": ["USA"]
}'openfunnel/lookalikes(sync, ≤100, ~1¢/company) — companies resemblingseed_domains(≤10 — your closed-won accounts) and/or aquery. Filters:min_employees/max_employees,funding_stages,locations.openfunnel/lookalikes-bulk(async, ≤2000/call) — for more than 100 results. Never paginate the sync action to get there.openfunnel/tam-build(async) — the entire market for a plain-English ICP, thousands of companies, billed per company delivered. Pollopenfunnel/resultswith{"kind": "tam"}, page viacursor, and useopenfunnel/job-control(pause/cancel) to cap spend. Reach for it when the question is “everyone we could sell to”, not for shortlists.openfunnel/tech-companies(sync, 40¢/page of 50) — companies whose recent job posts mention a tech.variationscovers alternate phrasings;include_evidencereturns the job-post snippet — the outreach hook. The competitor-displacement and “sells-to-users-of-X” play.openfunnel/tech-intent(async, 20¢/qualified) — same, but an LLM verifies each company against anactivity(“migrating off Redshift”). Keeplimit≤25 — it’s the priciest, highest-precision signal.openfunnel/deep-research(sync, 20¢) — qualify one domain against anactivity_question(job posts) and/orqualifier_question(LinkedIn org). Run it before drafting to a big account — the answer plus sources feed the message hook.- Free helpers —
openfunnel/lookup-companies(canonicalize ≤100),openfunnel/options(filter vocabularies),openfunnel/results,openfunnel/job-control,openfunnel/balance.
Gotchas
limitonlookalikesdefaults to 10 upstream — always set it.locationstakes ISO alpha-3 codes:USA, notUS.lookup-companiestakes objects like{"domain": "x.com"}or{"name": "X"}— never bare strings.- Async semantics: the submit returns a
job_id; pollopenfunnel/resultsuntilstatusis"completed"— a null cursor on a running job does not mean done. Empty results are never billed; cancelling keeps and bills only what was already delivered.
theirstack — job postings and technographics
- Price
- jobs 40¢ · companies 60¢ · per-company lookups 25¢
- Billing
- per row returned —
limitis required - Mode
- sync
TheirStack is the raw data layer under the hiring-signal tools: direct filter queries over job postings themselves, plus cheap per-company tech-stack and buying-intent lookups with confidence and first/last-seen dates. Routing versus the neighbors: openfunnel/tech-companies and tech-intent answer “which companies use/need X” with LLM qualification; akta/job-posts returns one company’s postings inside an Akta profile; TheirStack is for precise posting-level filters — title, description, salary band, seniority, remote, posting date, tech mentioned.
curl -X POST https://vaaya.ai/api/run/theirstack/jobs \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"job_title_or": ["Head of Sales"],
"job_country_code_or": ["US"],
"posted_at_max_age_days": 14,
"limit": 10
}'theirstack/jobs(40¢, ≤10 postings) — search job posts across thousands of career sites and boards. The hiring-signal primitive: who’s hiring for role X with tech Y right now.theirstack/companies(60¢, ≤5 companies) — companies by firmographics (industry, headcount, revenue, funding stage), tech stack, and active hiring (job_filters+min_num_jobs_found), with the matching jobs and techs attached. The displacement/ABM finder: “Series B US companies hiring for Kubernetes”.theirstack/technographics(25¢) — one company (bycompany_domain) → its technologies with confidence (low/medium/high), job-mention counts, and first/last dates seen. The evidence-dated alternative toakta/company-enrichwithsections: ["technology"]when you want the raw stack.theirstack/buying-intents(25¢) — one company → buying-intent topics detected in its job posts, with confidence and dates. The cheaper single-account rung when a topic-level signal is enough and you don’t needopenfunnel/deep-research’s LLM answer.theirstack/tech-catalog(1¢) — resolve free text to the case-sensitive slugs the filters need:{"q": "kubernetes"}, withkeyword_type: "technology"for techs only orkeyword_type_not: "technology"for intent topics only.
Gotchas
- The vendor bills per row returned —
limitis required (≤10 on jobs, ≤5 on companies). Page withpagerather than raising limits. - Technology-slug filters are case-sensitive — always resolve slugs through
theirstack/tech-catalogfirst. theirstack/jobsmust include a date filter (posted_at_max_age_days) or a company filter (company_domain_or) — upstream rejects unbounded queries.
akta — private-company depth and news signals
- Price
- 4–35¢ per section · news ~2¢ per 10 articles
- Coverage
- 20M+ private companies, 70+ datapoints
- Mode
- sync
OpenFunnel finds which companies; Akta tells you everything about one — rich narrative sections with sources, plus de-duped, entity-resolved news. akta/company-search and akta/industry-search (both free) resolve a name (“Canva”) or free-text industry (“warehouse automation”) to Akta’s uuid or taxonomy code; domains work directly. Request only the sections you need:
curl -X POST https://vaaya.ai/api/run/akta/company-enrich \
-H "Authorization: Bearer $VAAYA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"company": "canva.com", "sections": ["firmographic", "funding_detail"]}'| Price | Sections |
|---|---|
| 4¢ | trust_signal · company_hierarchy · digital_presence · financial_estimate · location |
| 7¢ | customer_profile · industry |
| 11¢ | management_profile · strategic_signal |
| 14¢ | firmographic · business_model · company_assessment · product_offering · technology |
| 21¢ | funding_detail |
| 35¢ | mna_and_investment |
akta/news(~2¢ per 10 articles,limit≤100) — de-duped, entity-resolved news with sentiment, an AI summary, and tagged company mentions. Scope bycompany(website URL),industry(code fromindustry-search), or free-textquery. Additive filters:sentiment_list(positive/negative/neutral),type_list(tag codes —CM01fund-raising,WT01strategic hiring,SD01product launches,SD02partnerships),news_score_list(High/Medium/Low relevance), andstart_date(YYYY-MM-DD) for incremental polls.- Alt-data by domain or uuid —
akta/employee-reviews(11¢, ≤50/page) ·akta/product-reviews(11¢) ·akta/headcount-trends(18¢) ·akta/website-traffic(11¢) ·akta/job-posts(21¢) ·akta/social-posts(11¢). Hiring, growth, culture, and demand signals for qualifying accounts.
Gotchas
- Section names are singular —
firmographic, notfirmographics. - Run
akta/company-search(free) first when a company name is ambiguous.
Outreach discipline
Rules that keep deliverability — and your sender reputation — intact:
- Verify before every send.
tomba/email-verifier→deliverable(orprospeo/verify→VERIFIEDfor a just-enriched Prospeo email) is the gate; cross-check ariskyverdict withicypeas/email-verificationwhen the send matters. - Personalize every send. Generic blasts get sender accounts flagged — reference something real: their post, their product, the trigger event.
- No bought lists. They bounce, and bounces kill deliverability — build lists with search + enrichment instead.
- No cold WhatsApp, ever — it burns numbers and trust.
- Respect LinkedIn caps — roughly 25 invites/week and 30 DMs/day per account. Volume beyond that means a longer timeline or an email-first mix.
- Per-find enrichment only, never bulk — bulk charges on misses; per-find is free on a miss.
- Sharpen a vague ICP before burning paid search — nail down the revenue band, geography, and titles first. Exa takes free text; only the Prospeo fallback needs
prospeo/suggest.