ravn
Claude skill

Build a prospect list from an ICP

Turn a description of the ideal buyer ("VPs of Operations at 51-200 person logistics companies in Texas") into a list of named people with verified work emails, using search_people for the profiles and Ravn's own checks for the emails.

Download SKILL.md Start free

Install

One command.

Installs into ~/.claude/skills for Claude Code. In Claude, upload the downloaded file under Settings → Capabilities → Skills.

npx ravn skill install build-prospect-list

When to use

  • The user has no list yet and wants one built from criteria.
  • "Find me 50 heads of marketing at Series A SaaS companies in Canada."
  • If the user already has target companies, use find-decision-makers instead.

Before you start

  1. Check the connection: call get_account with {} or run npx ravn whoami. Note lookups left this window.
  2. search_people needs your own provider key connected — run ravn keys add pdl first; these tools run on your own provider account. If it returns 403 provider_key_required, stop and tell the human to add their key. search_business_email_by_name and email verification are ours and need no key. Every call is one lookup; misses are free.
  3. Agree on a target size with the user.

Steps

  1. Turn the ICP into filters. Lists mean OR within a field and AND across fields. - title: the job titles, with common variants. - seniority: Intern, Entry, Senior, Manager, Director, VP, Head, C Suite, Owner, Partner. - industry, country, state, city, department. - employee_range: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001+. - Exclusions: exclude_company_domain (existing customers), exclude_industry, exclude_seniority.
  2. Run a small test page first to check the filters return the right people.
{
  "title": ["VP Operations", "Head of Operations", "Director of Operations"],
  "industry": "logistics",
  "state": "Texas",
  "employee_range": ["51-200"],
  "exclude_company_domain": ["currentcustomer.com"],
  "limit": 5
}
  1. Show the user the five results and total. If they are off target, adjust the filters before spending more. If status is not_found, loosen one filter at a time.
  2. Page through with limit up to 25 and the cursor set to the previous next_cursor, until you reach the target size or next_cursor is empty.
  3. Each profile may include business_email and business_email_risk_score. For people without an email, call search_business_email_by_name with their name and company.domain:
{ "first_name": "Maria", "last_name": "Lopez", "company": "lonestarfreight.com" }
  1. Verify every email you plan to use with one validate_emails call (up to 1,000 addresses):
{ "emails": ["maria.lopez@lonestarfreight.com", "j.chen@haulpoint.com"] }
  1. Keep valid. Mark risky and unknown for review and leave them out of the send list.
  2. Save the list as a CSV.

Output

A CSV with one row per person:

  • full_name, title, seniority, company_name, company_domain, company_size, city, state, country, linkedin_url
  • email, email_source (search_people or search_business_email_by_name)
  • rw_verdict (valid, invalid, risky, unknown) and rw_risk_score
  • rw_status (ok or not_found) for the email step

Also report: filters used, total matches available, people pulled, verified emails, and lookups used.

Rules

  • People who opted out are removed from the data already. Also remove anyone the user knows has asked not to be contacted. See /privacy#optout.
  • Drop invalid and risky emails before the list is used for outreach.
  • No FCRA uses: never build lists to screen people for credit, employment, insurance or housing.
  • This is for building a working prospect list, not bulk exporting the database. Pull what the campaign needs.
  • On a 429 fair_use_exhausted or a 403 provider_key_required, stop and tell the human.

Example prompt

Build me a list of 40 operations leaders (director and up) at 51-200 person logistics companies in Texas, skip our current customers in customers.txt, with verified emails.