Skip to main content

List Building Playbook

Build a fresh, enriched prospecting list across your entire ICP — from zero to CRM-ready in one workflow.
Most “list building” workflows are painful because they require two passes: first build a company list (Company Search), then loop over each company to fetch employees (Employee Finder), then enrich each person. Find People collapses the first two steps into one call. This recipe shows how to go from a blank ICP definition to a fully-enriched prospecting list ready to push to your CRM or sequencer.

What You’ll Build

A repeatable pipeline that:
  1. Takes a single ICP definition (industry + size + geography + persona).
  2. Calls Find People with cursor-based pagination to collect every matching decision-maker.
  3. Enriches each person with a verified work email (and optionally a US phone).
  4. Outputs a clean CSV / CRM payload.

Step 1 — Define the ICP

The ICP lives entirely in the Find People request body. Combine company filters (who you sell to) with people filters (who you talk to inside those companies).
{
  "company": {
    "industry": { "include": ["IT Services and IT Consulting", "Software Development"] },
    "employee_range": ["51-200", "201-500"],
    "hq": { "sales_region": ["EMEA"] },
    "type": { "include": ["Privately Held"] }
  },
  "people": {
    "job_level": ["VP", "Director"],
    "job_function": ["Sales & Business Development", "Advertising & Marketing"],
    "min_connections": 200
  },
  "max_results": 50
}
Iterate this JSON like you would iterate a SQL query. Loosen one filter at a time (employee_range, then industry, then min_connections) until your total_results lands in the right ballpark for your campaign volume.

Step 2 — Paginate with the cursor

Find People uses cursor-based pagination. Loop until the API returns cursor: null. Each call returns up to max_results (max 50).
async function buildIcpList(icp) {
  let cursor = null;
  const people = [];

  do {
    const res = await blitzRequest("POST", "/v2/search/people", {
      ...icp,
      max_results: 50,
      cursor,
    });

    people.push(...res.results);
    cursor = res.cursor;
  } while (cursor !== null);

  return people;
}

Step 3 — Enrich emails (and phones)

Find People returns LinkedIn profile URLs but no contact points. Pass each linkedin_url to the enrichment endpoints.
1

Work email

POST /v2/enrichment/email with person_linkedin_url. Returns a verified email or found: false.
2

Mobile phone (US only)

POST /v2/enrichment/phone with person_linkedin_url. Skip people whose location.country_code is not US.
Emails returned by /v2/enrichment/email are already verified at source — they’re re-tested against mail servers at least once every 30 days. You can push them straight to your sequencer without an additional validation step.
async function enrichPerson(person) {
  const email = await blitzRequest("POST", "/v2/enrichment/email", {
    person_linkedin_url: person.linkedin_url,
  });

  const phone =
    person.location?.country_code === "US"
      ? await blitzRequest("POST", "/v2/enrichment/phone", {
          person_linkedin_url: person.linkedin_url,
        })
      : null;

  return { ...person, email: email.email ?? null, phone: phone?.phone ?? null };
}
Run enrichment in parallel but respect the 5 RPS rate limit (use the rate-limited client from Code Examples).

Step 4 — Output for CRM / Sequencer

Map the Find People + enrichment payload to the columns your CRM expects:
CRM FieldSource
first_nameperson.first_name
last_nameperson.last_name
titleperson.experiences[0].job_title (current role)
companyperson.experiences[0].company_linkedin_url → enrich later
linkedin_urlperson.linkedin_url
emailenrichment.email
phoneenrichment.phone (US only)
countryperson.location.country_code
seniorityderived from experiences[0].job_title

When to Re-Run

Re-run the same ICP definition on a schedule (weekly or monthly) to capture net-new decision-makers as people change roles. Diff against your existing CRM by linkedin_url to insert only new contacts. For cleaning existing CRM contacts (vs. sourcing new ones), use the CRM Hygiene Playbook instead.

Find People (concept)

Full filter reference and response schema.

Account Breakthrough

Need to penetrate a named account list instead? Use the Waterfall recipe.

CRM Hygiene

Clean and re-enrich your existing contacts on a schedule.

Field Normalization

Case-sensitive enums for industry, job level, job function, sales region.