start for free
start for free

Find Decision Makers and Contact Information from Company Names

Finds senior decision-makers (Director, VP, Head, C Suite, Owner, Partner) and their emails for a list of companies using MoltSets, filtered by deliverability risk score (A/B/C/D/F). Works for any CSV of company names + domains, not just exhibitor lists. Handles messy real-world data like name collisions, missing domains, and emails that aren't indexed under the obvious search.

example prompts

  • find people at these companies
  • get me contacts for this exhibitor list
  • senior execs at each of these companies

about this skill

What this skill does

Turns a raw list of companies (name + domain, typically from an event exhibitor list) into a table of senior contacts with verified, risk-scored email addresses. Built from hard-won trial and error against messy small-business data — most companies on a list like this are NOT well-indexed, and the naive approach (search_people with a company_domain filter, stop after 2 hits) misses the majority of real, findable emails.

Chain

CSV of company name + domain
  to search_people            (free-text query first, then exact company name for the fuller roster)
  to linkedin_to_best_email / search_business_email_by_name   (chase an email per qualifying person)
  to reverse_linkedin_lookup  (confirm an email genuinely doesn't exist)
  to reverse_email_lookup     (pattern-guess common conventions, batched)
  each email checked against acceptable risk score (A/B/C/D/F) before it counts toward the target

Inputs

  • Company list — name + domain per row (exhibitor list, prospect list, account list)
  • Target seniorities — default: Director, VP, Head, C Suite, Owner, Partner
  • Emails per company — asked up front, never silently defaulted
  • Acceptable risk scores — asked up front; recommended default is A, B, C, F (D excluded, since D means a confirmed bounce, complaint, or spam trap)
  • LinkedIn-only fallback — whether to fill the count with LinkedIn-only rows when an acceptable-score email comes up short

When it activates

  • "find people at these companies"
  • "get me contacts for this exhibitor list"
  • "senior execs at each of these companies"
  • A CSV with company name/website columns uploaded alongside a request for contacts

Output

A CSV: row, company, domain, contact_name, title, seniority, email, email_type, risk_score, verification_status, linkedin_url, notes. Every match is tagged VERIFIED / INFERRED / UNVERIFIED / NOT FOUND so rows are safe to act on — LinkedIn-only fills, stale addresses, and out-of-range risk scores are flagged, not silently mixed in.

Search filters

search_people filters on query, company, company_domain, country, state, city, seniority, department or functional_area, industry, linkedin_industry, naics_code, employee_range, and revenue_range.

  • Filters are free precision - execution cost comes from the free-text query, so a filters-only search runs ~40x cheaper and lands more precisely. A bare query is never the right shape; at minimum it gets country attached (~99% fill rate).
  • Size and revenue apply to the person's current employer - "VPs at 51-200 employee software companies" is one call, not a company search followed by a people search.
  • Three industry vocabularies - broad industry buckets, LinkedIn's ~150 niche labels, or a NAICS code at any depth. Shortening the code widens the net.
  • Sparse filters are the usual cause of a thin result set - seniority/industry/department are ~60% filled and naics_code/linkedin_industry ~50%, and every filter is exact-match, silently dropping records where the field is empty.
  • Sizing is free - count_only: true returns a match count without fetching data or charging tokens, and every response carries results.total to read before paginating.

Tips

  • Free-text query beats the exact company and company_domain filters on messy small-business data — company is an analysed match, so every word you pass must appear in the stored name, and one extra word zeroes the result. Start with query (plus country — never bare), then use the exact stored name to pull the fuller roster. This is the one workflow where a query-led search is right; everywhere else, filters first
  • Chase order per person: email in the search result → linkedin_to_best_email → search_business_email_by_name → reverse_linkedin_lookup → pattern-guessing, checking each result's risk score as it surfaces and moving on if it's outside the acceptable set
  • Pattern-guess a standard 6-convention set through reverse_email_lookup (batched, up to 100 per call, no token cost on misses) before giving up — it finds real emails the forward tools miss
  • Calibrate on a ~20-row batch first; expect roughly half to two-thirds of small/local exhibitors to yield usable contacts