people-search
LinkedIn Finder
Find the right people at target companies via Extruct. Produces a people table with LinkedIn profiles — no external API credits needed.
Related Skills
list-segmentation → people-search → email-search → email-generation → email-response-simulation → campaign-sending
After you know WHICH companies to target, this skill finds WHO to contact. The next step (email-search) gets their verified emails and phones.
Environment
| Variable | Service |
|---|---|
EXTRUCT_API_TOKEN |
Extruct API |
Before making API calls, check that EXTRUCT_API_TOKEN is set by running test -n "$EXTRUCT_API_TOKEN" && echo "set" || echo "missing". If missing, ask the user to provide their Extruct API token and set it via export EXTRUCT_API_TOKEN=<value>. Do not proceed until confirmed.
Base URL: https://api.extruct.ai/v1
Inputs
| Input | Source | Required |
|---|---|---|
| Extruct table ID | Company table from list-building or list-enrichment |
yes |
| Target roles | User input or context file ICP | yes |
| Max results per company | User preference (default: 5) | no |
Workflow
Step 0: Verify API reference
- Read local reference: references/api_reference.md
- Fetch live docs: https://www.extruct.ai/docs
- Compare endpoints, params, and response fields (especially
company_people_findercolumn type and child table behavior) - If discrepancies found:
- Update the local reference file
- Flag changes to the user before proceeding
- Proceed with the skill workflow
Step 1: Confirm the table
Fetch table metadata via GET /tables/{table_id}. Show the user: table name, kind, row count.
Step 2: Define roles
Ask the user: "Who are we trying to reach at these companies?"
Then expand into a role list. Use broad role descriptions, not exact titles — Extruct's people finder matches on role semantics, not exact title strings.
Role list guidelines:
- 3-7 roles is the sweet spot
- Use broad terms: "VP Sales" not "Vice President of Enterprise Sales"
- Cover the decision maker + influencer + champion if possible
- Include department variations
Role expansion examples:
User says: "Sales and ops leaders"
→ Roles: ["VP Sales", "Head of Sales", "Sales Operations", "RevOps", "Business Development", "CRO"]
User says: "People who buy data tools"
→ Roles: ["Revenue Operations", "Sales Operations", "Data Operations", "Business Intelligence", "CRM Admin"]
User says: "Innovation and strategy at corporates"
→ Roles: ["Head of Innovation", "VP Strategy", "Corporate Development", "Ventures", "Technology Scouting"]
Read context file for ICP role targets if available:
claude-code-gtm/context/{company}_context.md → ## ICP → Roles column
Step 3: Add company_people_finder column
Create a company_people_finder column on the table via POST /tables/{table_id}/columns.
Column config shape:
{
"kind": "company_people_finder",
"name": "Key Decision Makers",
"key": "decision_makers",
"value": {
"roles": ["VP Sales", "Head of Sales", "Revenue Operations"],
"provider": "research_pro",
"max_results": 5
}
}
| Param | Description | Recommended |
|---|---|---|
roles |
Broad role descriptions to search for | 3-7 roles |
provider |
Search provider | research_pro (always) |
max_results |
Max people per company | 3-5 (more = slower + noisier) |
Step 4: Trigger enrichment run
Run the new column via POST /tables/{table_id}/run scoped to the new column ID. Report: run ID and cells queued.
Step 5: Monitor and discover child table
The company_people_finder column auto-creates a child people table. Fetch the parent table metadata and look at child_relationships for a relationship with relationship_type: "company_people". That gives you the people table ID.
The child people table has auto-created columns:
| Column | Key | Kind | Description |
|---|---|---|---|
| Person Input | input |
input | Raw person context string |
| Full Name | full_name |
agent | Parsed full name |
| Role | role |
agent | Current role/title |
| Profile URL | profile_url |
agent (url) | LinkedIn URL |
Step 6: Optionally add LinkedIn data column
For richer profile data (experience, education, skills), add a linkedin agent column to the people table. Config:
{
"kind": "agent",
"key": "linkedin_data",
"name": "LinkedIn Data",
"value": {
"agent_type": "linkedin",
"prompt": "{profile_url}"
}
}
This is optional — skip if you only need name + role + LinkedIn URL for the email-search step.
Step 7: Fetch and review people data
Fetch data from the people table via GET /tables/{people_table_id}/data. Extract full_name, role, profile_url, and parent_row_id from each row.
Present summary:
- Total companies in table: N
- People found: N
- Avg people per company: N
- Companies with 0 people: N
Show a sample of 10 people for spot-checking:
| Name | Role | LinkedIn URL | Parent Company |
|---|---|---|---|
| ... | ... | ... | ... |
Ask:
- "Does the role mix look right?"
- "Any roles missing? Want to add more?"
- "Ready to proceed to
email-searchfor verified emails?"
Step 8: Export for email-search
Save the people list as CSV at claude-code-gtm/csv/input/{campaign}/people_linkedin.csv with columns: full_name, role, profile_url, parent_row_id.
The email-search skill takes this CSV (or reads the people table directly) and enriches with verified emails via contact enrichment providers (e.g. Prospeo, Fullenrich).
Output
| Output | Format | Location |
|---|---|---|
| People table | Extruct child table | Auto-created, linked to parent |
| People CSV | CSV with name, role, LinkedIn URL | claude-code-gtm/csv/input/{campaign}/people_linkedin.csv |
Key Table IDs to Pass Forward
After this skill completes, pass these to email-search:
- People table ID — for direct API access to people data
- Parent table ID — for cross-referencing company data
- Campaign slug — for file paths
API Reference
See references/api_reference.md for the full company_people_finder column spec, child table behavior, and people table columns.