Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 32 additions & 36 deletions skills/build-list/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: build-list
description: Build a list of contacts or companies matching specific criteria. Describe what you're looking for in natural language and get a structured, tabular list you can export. Supports filtering by title, seniority, department, industry, company size, location, tech stack, growth rate, and more. Outputs a clean table artifact.
description: "Build a targeted list of contacts or companies from ZoomInfo matching natural-language criteria. Supports filtering by title, seniority, department, industry, company size, location, tech stack, and growth rate. Outputs a structured, exportable table. Use when the user wants to build a prospect list, generate leads, find people or companies matching specific criteria, or create a sales outreach list."
---

# Build List
Expand All @@ -10,11 +10,9 @@ Build a targeted list of contacts or companies from ZoomInfo and output as a str
## Input

The user will describe what they want via `$ARGUMENTS`. Examples:
- "CTOs at Series B+ startups in SF with 50-200 employees"
- "VP of Sales at healthcare companies using Salesforce with 500+ employees"
- "All SaaS companies in EMEA with $10M-$50M revenue"
- "Directors of Engineering at companies similar to Datadog"
- "Marketing leaders at Fortune 500 companies in financial services"

The user may also specify:
- How many results they want (default: 25)
Expand All @@ -30,56 +28,54 @@ The user may also specify:
- Industry, employee count, revenue, geography, tech stack, company type β†’ company filters
- Growth rate, funding, rankings β†’ company filters

3. **Resolve all filter values** using `lookup` before searching. This is critical β€” do NOT guess values. For every filter you plan to use, call `lookup` with the corresponding field name to get the valid values and use the returned `id` values in your search parameters.
3. **Resolve all filter values** using `lookup` before searching β€” do NOT guess values:

```
lookup({ fields: [{ fieldName: "management-levels" }, { fieldName: "industries" }] })
```
Use the returned `id` values (e.g., `managementLevel: 4` for "VP") in all search parameters. If a lookup returns no matching values for a filter term, inform the user and suggest alternative terms before proceeding.

4. **Execute the search**:
- For **contacts**: Use `search_contacts` with all resolved filters. Sort by `-contactAccuracyScore`. Request up to 100 results.
- For **companies**: Use `search_companies` with all resolved filters. Sort by `-employeeCount` or `-revenue`. Request up to 100 results.
- For **contacts**: Use `search_contacts` with resolved filters. Sort by `-contactAccuracyScore`:

```
search_contacts({
managementLevel: [4],
industryId: [52],
employeeCount: ["501-1000", "1001-5000"],
sortBy: "-contactAccuracyScore",
pageSize: 25
})
```

- For **companies**: Use `search_companies` with resolved filters. Sort by `-employeeCount` or `-revenue`.
- For **both**: Search companies first, then search contacts at the top results.

5. **Enrich top results** if the search returns limited detail:
- Use `enrich_contacts` (batch of 10) or `enrich_companies` (batch of 10) on the top results to fill in emails, phones, and other details.
If the search returns zero results, broaden filters (remove the most restrictive one) and retry. Tell the user which filter was relaxed.

5. **Enrich top results** if the search returns limited detail β€” use `enrich_contacts` or `enrich_companies` (batch of 10) to fill in emails, phones, and other details.

6. **Output as a clean table artifact.** Create a markdown or CSV artifact the user can copy or export.
6. **Output as a clean table artifact** the user can copy or export.

## Output Format

### Search Criteria Applied

Show the user exactly what filters were used so they can verify:

| Filter | Value |
|--------|-------|
| Management Level | Vice President |
| Industry | Computer Software |
| Employee Count | 51-100, 101-250 |
| Metro Region | San Francisco-Oakland-Hayward, CA |
| ... | ... |
Show the exact filters used so the user can verify (table of Filter β†’ Value).

### Contact List (if contact search)
### Results Table

| # | Name | Title | Company | Email | Direct Phone | Accuracy | Location |
|---|------|-------|---------|-------|-------------|----------|----------|
| 1 | | | | | | | |
| 2 | | | | | | | |
For **contacts**: `# | Name | Title | Company | Email | Direct Phone | Accuracy | Location`

### Company List (if company search)

| # | Company | Industry | Employees | Revenue | HQ Location | Website | ZoomInfo ID |
|---|---------|----------|-----------|---------|-------------|---------|-------------|
| 1 | | | | | | | |
| 2 | | | | | | | |
For **companies**: `# | Company | Industry | Employees | Revenue | HQ Location | Website | ZoomInfo ID`

### List Summary

- **Total results found**: X (showing top Y)
- **Filters applied**: [summary]
- **Filters applied**: brief summary
- **Average accuracy score**: X (contacts only)
- **Data quality**: Flag any concerns (low accuracy, stale records)
- Flag any data quality concerns (low accuracy, stale records)

### Refinement Options
If the list is too broad or too narrow, suggest specific filter adjustments:
- "Add `revenue` filter to narrow from 847 to ~200 results"
- "Remove metro region filter to expand from 12 to ~150 results"
- "Try adjacent industries: Information Technology Services, Internet"

If the user wants to iterate, they can re-run with adjusted criteria. Suggest the exact modified command.
If the list is too broad or narrow, suggest specific filter adjustments β€” e.g., "Add `revenue` filter to narrow from 847 to ~200 results" or "Try adjacent industries: Information Technology Services, Internet". Suggest the exact modified command for re-running.