Documentation

vaaya / docs / reference

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

NeedCallPriceMode
Find people by ICP — primaryexa/search with category: "people"1¢/querysync
Find people by ICP — fallbackprospeo/search-people5¢/pagesync
Reveal a work email — try firstexa/search + exa/contents1¢ + 0.1¢/URLsync
Reveal a verified email — fallbackprospeo/enrich5¢ (free on miss)sync
Email from name + company — rung after a Prospeo misstomba/email-findersync
Email — next rung, different infrastructureicypeas/email-search4¢ + 1¢/pollasync
Email — final backup (needs a paid Apollo plan)apollo/person-enrich10¢sync
Deliverability — primary, any addresstomba/email-verifiersync
Deliverability — second opinionicypeas/email-verification2¢ + 1¢/pollasync
Deliverability — Prospeo-indexed emails onlyprospeo/verifysync
All emails at a company + its patterntomba/domain-searchsync
Generic inboxes at a domain (contact@, support@…)icypeas/domain-scan4¢ + 1¢/pollasync
Email behind a LinkedIn profiletomba/linkedin-findersync
Article author + their emailtomba/author-findersync
Email → person + company (cheap reverse lookup)tomba/enrichsync
Phone by email / domain / LinkedIntomba/phone-finder10¢sync
Deep person enrich / reverse lookup incl. phonesnyne/person-enrich55¢ (lite 30¢)async

Companies and signals

NeedCallPriceMode
Companies like your best customers (≤100)openfunnel/lookalikes~1¢/companysync
Whole-market TAM from an ICP (thousands)openfunnel/tam-buildper company deliveredasync
Companies running a tech (from job posts)openfunnel/tech-companies40¢/pagesync
Tech + LLM-verified buying intentopenfunnel/tech-intent20¢/qualifiedasync
Qualify one account against a questionopenfunnel/deep-research20¢sync
Raw job postings by title/tech/salary/datetheirstack/jobs40¢/≤10 jobssync
Companies by tech stack + active hiringtheirstack/companies60¢/≤5 companiessync
One company’s tech stack with confidence + datestheirstack/technographics25¢sync
One company’s buying-intent topicstheirstack/buying-intents25¢sync
Deep private-company profile — pick sectionsakta/company-enrich4–35¢/sectionsync
Entity-resolved news with sentimentakta/news~2¢/10 articlessync
Alt-data: reviews, headcount, traffic, jobs, socialakta/employee-reviews11–21¢sync
Company firmographics + phone by domainapollo/org-enrichsync
Investor intel (thesis, partners, check size)nyne/company-funders30¢async
Who follows / replied to a profile or postnyne/person-interactions30¢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-findericypeas/email-searchapollo/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/contents 0.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/search the person + company, then exa/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

  • seniority vocabulary: C-Suite, Director, Entry, Founder/Owner, Head, Intern, Manager, Partner, Senior, Vice President.
  • headcount uses 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 no 51-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-finder instead of retrying Prospeo.
  • prospeo/verify NO_MATCHes most arbitrary addresses — for anything Prospeo didn’t just enrich, use tomba/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. Read data.email.result (deliverable / undeliverable / risky).
  • tomba/email-finder (4¢) — name + company/domain → most likely email with a confidence score. The best rung after a prospeo/enrich miss; prefer domain over company when known.
  • tomba/linkedin-finder (5¢) — LinkedIn profile URL → email (full: true returns all associated emails). Use after email-finder, not instead of it.
  • tomba/domain-search (4¢) — company/domain → all known emails + the domain’s pattern. Optional department (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 to nyne/person-enrich only 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-finder is slow (~12s median) and throws transient upstream 5xx on ~20% of calls — a retry usually clears it.
  • linkedin-finder can return a personal-domain or previous-company email — always run tomba/email-verifier on 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 in domainOrCompany.
  • icypeas/email-verification (2¢) — SMTP-level deliverability on any address; the second opinion when Tomba says risky.
  • icypeas/domain-scan (4¢) — a domain’s role-based/generic inboxes (contact@, support@, admin@…). Complements tomba/domain-search, which lists people — use this when any reachable inbox will do.
  • icypeas/result (1¢) — fetch/poll by id, or list recent searches with {"mode": "single", "limit": 10}.

Gotchas

  • Status semantics: FOUND/DEBITED = hit (read items[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¢ with lite_enrich: true) — LinkedIn, X, Instagram, GitHub, and Facebook URLs all work in social_media_url; for a bare handle, build the profile URL first.
  • nyne/company-funders (30¢) — investor intel for a fundraise: pass the investor’s company_name or company_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 + type of replies | followers | following (plus tweet_id for 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 resembling seed_domains (≤10 — your closed-won accounts) and/or a query. 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. Poll openfunnel/results with {"kind": "tam"}, page via cursor, and use openfunnel/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. variations covers alternate phrasings; include_evidence returns 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 an activity (“migrating off Redshift”). Keep limit ≤25 — it’s the priciest, highest-precision signal.
  • openfunnel/deep-research (sync, 20¢) — qualify one domain against an activity_question (job posts) and/or qualifier_question (LinkedIn org). Run it before drafting to a big account — the answer plus sources feed the message hook.
  • Free helpersopenfunnel/lookup-companies (canonicalize ≤100), openfunnel/options (filter vocabularies), openfunnel/results, openfunnel/job-control, openfunnel/balance.

Gotchas

  • limit on lookalikes defaults to 10 upstream — always set it.
  • locations takes ISO alpha-3 codes: USA, not US.
  • lookup-companies takes objects like {"domain": "x.com"} or {"name": "X"} — never bare strings.
  • Async semantics: the submit returns a job_id; poll openfunnel/results until status is "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 — limit is 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 (by company_domain) → its technologies with confidence (low/medium/high), job-mention counts, and first/last dates seen. The evidence-dated alternative to akta/company-enrich with sections: ["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 need openfunnel/deep-research’s LLM answer.
  • theirstack/tech-catalog (1¢) — resolve free text to the case-sensitive slugs the filters need: {"q": "kubernetes"}, with keyword_type: "technology" for techs only or keyword_type_not: "technology" for intent topics only.

Gotchas

  • The vendor bills per row returned — limit is required (≤10 on jobs, ≤5 on companies). Page with page rather than raising limits.
  • Technology-slug filters are case-sensitive — always resolve slugs through theirstack/tech-catalog first.
  • theirstack/jobs must 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"]}'
PriceSections
trust_signal · company_hierarchy · digital_presence · financial_estimate · location
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 by company (website URL), industry (code from industry-search), or free-text query. Additive filters: sentiment_list (positive/negative/neutral), type_list (tag codes — CM01 fund-raising, WT01 strategic hiring, SD01 product launches, SD02 partnerships), news_score_list (High/Medium/Low relevance), and start_date (YYYY-MM-DD) for incremental polls.
  • Alt-data by domain or uuidakta/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 singularfirmographic, not firmographics.
  • 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-verifierdeliverable (or prospeo/verifyVERIFIED for a just-enriched Prospeo email) is the gate; cross-check a risky verdict with icypeas/email-verification when 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.