Targeted Prospecting — Industry + Decision Makers + Hiring Signals

Build a prospect list of companies with decision makers, verified contact info, and hiring/intent signals.

How to use it

  1. Hit Copy the whole skill.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/lead-generation/capabilities/targeted-prospecting#main ~/.claude/skills/targeted-prospecting

For one project only, change the path to .claude/skills/targeted-prospecting.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text629 lines
targeted-prospecting/SKILL.md629 lines29.3 KBpushed 96d agoRawView on GitHub

Targeted Prospecting — Industry + Decision Makers + Hiring Signals

Setup

Read your credentials from ~/.gooseworks/credentials.json:

export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")

If ~/.gooseworks/credentials.json does not exist, tell the user to run: npx gooseworks login

All endpoints use Bearer auth: -H "Authorization: Bearer $GOOSEWORKS_API_KEY"

Build a prioritized prospect list for any industry. Finds companies matching your ICP, identifies decision makers by title, enriches with verified contact info, and layers on hiring/intent signals to prioritize who's ready to buy now.

Workflow

1. Parse the Request

Extract from the user's query:

  • Industry/vertical (required) — e.g., staffing, fintech, healthcare IT, construction
  • Decision maker titles (required) — e.g., COO, VP Engineering, Head of Marketing
  • Location (optional, default: US) — country, state, city, or region
  • Company size (optional) — employee count min/max, revenue floor
  • Hiring signal roles (optional) — job postings that indicate buying intent (e.g., "Scheduling Coordinator" = ops pain, "DevOps Engineer" = infra investment)
  • Max results (optional, default 15)
  • Company/product (optional) — if user mentions what they're selling, triggers competitive intel in Step 7

2. Find Target Companies

Run 2-3 search strategies in parallel:

Strategy A — Scrapegraph searchscraper (primary — most targeted results):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
  "user_prompt": "top {industry} companies in {location} with company name, website, employee count, and headquarters",
  "num_results": 15
}'

Best source for industry-specific company lists. Returns targeted results from industry directories, Inc 5000 lists, and trade publications. In testing, returned 28 staffing companies in a single call vs Fiber's noisy mix of tech giants and staffing firms.

Strategy B — Fiber NL company search (co-primary — best structured data):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
  "query": "{industry} companies in {location} with {employee_min}+ employees",
  "pageSize": 20
}'

Returns structured company data with employee counts, domains, LinkedIn URLs, and descriptions. Caveat: For niche industries (staffing, construction, etc.), Fiber NL search often returns broad/noisy results mixed with unrelated companies. Filter results by industry keywords from the description, li_industries, and crunchbase_categories fields. Use company names field (not name_consensus) for the company name.

Strategy C — Nyne company search (supplemental — attempt, may return errors):

# Step 1: POST to start search
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"nyne","path":"/company/search","body":{"query":"{industry} companies {location} {size_qualifier}"}}'
# Step 2: Poll with GET using request_id
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"nyne","path":"/company/search","query":{"request_id":"REQUEST_ID"}}'

Nyne is async — POST returns a request_id, poll with GET until complete (5-20s). Note: Nyne company search can return 400 errors depending on query format. If it fails, proceed with Scrapegraph + Fiber results — don't block on Nyne.

Scaling Up

For 20+ results, run parallel searches by sub-region or sub-vertical:

# Parallel searches for different sub-regions
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
  "query": "{industry} companies in New York with {size}+ employees",
  "pageSize": 15
}'

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
  "query": "{industry} companies in California with {size}+ employees",
  "pageSize": 15
}'

3. Extract & Deduplicate

Merge results from all strategies. For each company, extract:

  • Company name
  • Domain / website URL
  • Employee count (primary size proxy — revenue data is often unavailable)
  • Headquarters / location
  • LinkedIn company URL (if returned by Fiber/Nyne)
  • Description / industry tags

Deduplicate by domain first, then by normalized company name. Apply user's size filters — use employee count as revenue proxy when revenue is unavailable (100+ employees ≈ $10M+ revenue as rough heuristic).

Enrich top companies with Brand.dev for industry context:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"brand-dev","path":"/v1/brand/retrieve","query":{"domain":"{company_domain}"}}'

4. Find Decision Makers

Cost ranking (25 results): Apollo $0.01 | Fiber $0.50 | Nyne/PDL $7.50. Always try Apollo first.

Best approach: Apollo search first, then Fiber for NL queries, then per-company fallbacks.

Primary — Apollo people search (cheapest at $0.01 flat):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/apollo/mixed_people/search \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_titles": ["{title_1}", "{title_2}"],
  "person_locations": ["{location}"],
  "per_page": 25
}'

Fallback — Fiber NL profile search ($0.02/record, good for broad industry queries):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/fiber/v1/natural-language-search/profiles \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "{title_1} or {title_2} at a {industry} company in {location}",
  "pageSize": 15
}'

This is the highest-yield approach. Returns decision makers across the industry with LinkedIn URLs, current titles, and company names.

Per-company fallback — Fiber NL profile search ($0.02/record) (for companies not covered above):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/fiber/v1/natural-language-search/profiles \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "query": "{title_1} or {title_2} at {company_name}",
  "pageSize": 5
}'

Per-company queries often return empty results, especially for large enterprises where C-suite profiles may not be indexed. Use this only for high-priority companies missing from the broad search.

Last resort — Nyne person search (EXPENSIVE: $0.30/record, async):

Only use if Apollo and Fiber returned insufficient results.

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/pdl/person/search \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"{title} at {company_name} {location}"}'

Fallback — Scrapegraph website scrape (scrape the company's leadership page):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "https://{company_domain}/about",
  "user_prompt": "Extract names, titles, and any contact info for the leadership team. Identify anyone with these titles: {target_titles}"
}'

If /about returns 422, fall back to the homepage URL.

5. Enrich Contacts

For each decision maker found, run all of these in parallel:

Email discovery — Sixtyfour first (highest hit rate for small/mid-market domains):

# Sixtyfour AI email finder (PRIMARY — found 9/12 emails in testing)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"sixtyfour","path":"/find-email"}'
  "lead": {"first_name": "{first}", "last_name": "{last}", "domain": "{company_domain}"}
}'

# Hunter email-finder (supplemental — often returns null for small company domains)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"hunter","path":"/v2/email-finder","query":{"domain":"{company_domain}","first_name":"{first}","last_name":"{last}"}}'

# Tomba email-finder (supplemental — similar limitations to Hunter on small domains)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"tomba","path":"/v1/email-finder","query":{"domain":"{company_domain}","company":"{company_name}","first_name":"{first}","last_name":"{last}"}}'

# Tomba LinkedIn-to-email (if LinkedIn URL found in Step 4)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"tomba","path":"/v1/linkedin","query":{"url":"{linkedin_url}"}}'

In testing, Sixtyfour found emails for 9 out of 12 prospects where Hunter and Tomba returned null. Sixtyfour is the most reliable source for small/mid-market company domains. Still run all sources in parallel — each occasionally finds emails the others miss.

Phone discovery:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"sixtyfour","path":"/find-phone"}'
  "lead": {"first_name": "{first}", "last_name": "{last}", "company": "{company_name}"}
}'

Sixtyfour find-phone had a 100% hit rate in testing (10/10 prospects).

Deep enrichment (fire early, don't block — takes 30-60s):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"sixtyfour","path":"/enrich-lead"}'
  "lead_info": {
    "first_name": "{first}", "last_name": "{last}",
    "company": "{company_name}", "linkedin_url": "{linkedin_url}"
  },
  "struct": {
    "work_email": "Work email",
    "personal_email": "Personal email",
    "phone": "Phone number",
    "title": "Current job title",
    "bio": "Short professional bio"
  }
}'

Fiber kitchen-sink enrichment (if LinkedIn URL available — may return 400):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/kitchen-sink/person"}'
  "profileIdentifier": "{linkedin_url}"
}'

Kitchen-sink can intermittently return 400 errors regardless of parameter format. If it fails, proceed with Sixtyfour + Hunter + Tomba results — don't block on kitchen-sink.

Triple email verification — verify ALL found emails with 3 services:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"hunter","path":"/v2/email-verifier","query":{"email":"{email}"}}'
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"tomba","path":"/v1/email-verifier","query":{"email":"{email}"}}'
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/validate-email/single","body":{"email":"{email}"}}'

Take the consensus. Label each email as verified/unverified. Collect both work and personal emails.

6. Hiring / Intent Signals

Only run this step if the user specified hiring signal roles. This is the key differentiator for prioritization.

Primary — Scrapegraph searchscraper for hiring signals:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
  "user_prompt": "{industry} companies hiring {signal_role} in {location}, list company name, job title, and location",
  "num_results": 15
}'

Supplemental — Tavily for job board coverage:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"tavily","path":"/search"}'
  "query": "{industry} {signal_role} job opening {location}",
  "max_results": 10,
  "include_answer": false
}'

Then scrape top job board results for company names:

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "{job_board_url}",
  "user_prompt": "Extract all company names hiring for {signal_role}, with job title and location"
}'

Optional — Fiber job search (attempt, may be unreliable):

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/job-search"}'
  "searchParams": {
    "job_titles": ["{signal_role}"],
    "industries": ["{industry}"]
  },
  "pageSize": 20
}'

Note: Fiber job-search with searchParams filters can return 400 errors. Attempt it but don't rely on it — Scrapegraph is the primary method for hiring signals.

Cross-reference: Match companies found hiring signal roles against the company list from Step 2. Matches become High Priority prospects. Companies hiring for signal roles that weren't in your original list are bonus leads — add them.

Growth signals: Check Fiber company data (from Step 4 kitchen-sink results) for headcount growth percentage. Companies growing >20% YoY are additional high-priority signals.

7. Competitive Intel (Optional)

Only run if the user mentioned their product/company. Research what the user sells and check prospects for competing solutions.

# Research user's product
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "https://{user_company_domain}",
  "user_prompt": "What does this company sell? Describe the product in one sentence."
}'

# Find competitors
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
  "user_prompt": "competitors and alternatives to {user_product} for {industry}",
  "num_results": 5
}'

# Check each prospect's website for competing products (parallel)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "https://{prospect_domain}",
  "user_prompt": "Does this company use or mention: {competitor_1}, {competitor_2}, {competitor_3}? Check page content, footer, and embedded widgets."
}'

Flag prospects: Greenfield (no competitor detected) > Competitive displacement (uses a competitor — note which one) > Unknown.

8. Present Results

Output a prioritized table with full URLs (not markdown links — users need to copy-paste):

## Prospect List: {Title} at {Industry} Companies in {Location}

Found {N} companies with {M} decision makers identified.

### High Priority — Hiring Signal Detected
| # | Company | Website | Employees | Decision Maker | Title | Email | Email Status | Phone | Signal |
|---|---------|---------|-----------|---------------|-------|-------|-------------|-------|--------|
| 1 | Acme Staffing | https://acmestaffing.com | 250 | Jane Smith | COO | [email protected] | Verified | (555) 123-4567 | Hiring Scheduling Coordinator |

### Medium Priority — Matches ICP, No Signal Detected
| # | Company | Website | Employees | Decision Maker | Title | Email | Email Status | Phone | Notes |
|---|---------|---------|-----------|---------------|-------|-------|-------------|-------|-------|
| 5 | Beta Corp | https://betacorp.com | 180 | John Doe | VP Ops | [email protected] | Verified | — | Growing 25% YoY |

### Lower Priority — Limited Data or Below Target Size
| # | Company | Website | Employees | Decision Maker | Title | Email | Phone | Notes |
|---|---------|---------|-----------|---------------|-------|-------|-------|-------|
| 10 | Small Co | https://smallco.com | 85 | — | — | — | — | Below 100 employee threshold |

### Summary
- **Companies found**: {N}
- **Decision makers identified**: {count}/{N}
- **With verified email**: {count}
- **With phone**: {count}
- **High priority (hiring signal)**: {count}
- **Medium priority (right profile)**: {count}
- **Lower priority (limited data)**: {count}

APIs Used

API Endpoint Purpose
Fiber /v1/natural-language-search/companies Find companies by industry + size
Fiber /v1/natural-language-search/profiles Find decision makers by title + company
Fiber /v1/kitchen-sink/person Enrich person by LinkedIn URL or name+company
Fiber /v1/kitchen-sink/company Enrich company data
Fiber /v1/job-search Job postings (unreliable, attempt only)
Fiber /v1/validate-email/single Email verification
Nyne /company/search Async company search by industry
Nyne /person/search Async person search by company + role
Scrapegraph /v1/searchscraper Web search for companies + hiring signals
Scrapegraph /v1/smartscraper Scrape websites for leadership/competitive intel
Tavily /search Supplemental web search for job boards
Hunter /v2/email-finder Find email by name + domain
Hunter /v2/email-verifier Email verification
Tomba /v1/email-finder Find email by name + domain
Tomba /v1/linkedin Email from LinkedIn URL
Tomba /v1/email-verifier Email verification
Sixtyfour /find-email AI email finder
Sixtyfour /find-phone AI phone finder
Sixtyfour /enrich-lead AI deep enrichment
Brand.dev /v1/brand/retrieve Company overview/context

Examples

Example 1 — Staffing/recruiting (the Clay use case):

"Find COOs at US staffing firms with 100+ employees that are hiring Scheduling Coordinators"

# Step 2: Find staffing companies (parallel)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
  "query": "staffing and recruiting companies in the United States with 100 or more employees",
  "pageSize": 20
}'

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"nyne","path":"/company/search","body":{"query":"staffing recruiting firms US 100+ employees"}}'

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
  "user_prompt": "top staffing and recruiting companies in the US with company name, website, employee count, and headquarters",
  "num_results": 15
}'

# Step 4: Find COOs (parallel, per company)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
  "query": "COO or Chief Operating Officer or Head of Operations at {company_name}",
  "pageSize": 3
}'

# Step 5: Enrich (parallel, per person)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"hunter","path":"/v2/email-finder","query":{"domain":"{domain}","first_name":"{first}","last_name":"{last}"}}'
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"sixtyfour","path":"/find-email","body":{"lead":{"first_name":"{first}","last_name":"{last}","domain":"{domain}"}}}'
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"sixtyfour","path":"/find-phone","body":{"lead":{"first_name":"{first}","last_name":"{last}","company":"{company}"}}}'

# Step 6: Hiring signals
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
  "user_prompt": "staffing companies hiring Scheduling Coordinator or Recruiting Coordinator in the US, list company name, job title, and location",
  "num_results": 15
}'

Example 2 — SaaS sales (fintech):

"Find VP Engineering or CTO at fintech startups with 50-200 employees in the US that are hiring DevOps engineers"

# Companies
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
  "query": "fintech startups in the United States with 50 to 200 employees",
  "pageSize": 20
}'

# Decision makers (per company)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
  "query": "VP Engineering or CTO at {company_name}",
  "pageSize": 3
}'

# Hiring signal
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
  "user_prompt": "fintech companies hiring DevOps Engineer or Site Reliability Engineer in the US, list company name and job title",
  "num_results": 15
}'

Example 3 — Recruiting (healthcare in Texas):

"Find HR Directors at healthcare companies in Texas with 500+ employees"

# Companies
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
  "query": "healthcare companies in Texas with 500 or more employees",
  "pageSize": 20
}'

# Decision makers
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
  "query": "HR Director or VP Human Resources at {company_name}",
  "pageSize": 3
}'

Example 4 — Simple, no hiring signals (construction):

"Build a prospect list of construction companies in California with Head of Safety as decision maker"

# Companies
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
  "query": "construction companies in California",
  "pageSize": 15
}'

# Decision makers
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
  "query": "Head of Safety or Safety Director or VP Safety at {company_name}",
  "pageSize": 3
}'

Error Handling

  • Fiber NL company search returns noisy results — For niche industries, Fiber often returns unrelated companies mixed in (e.g., tech giants alongside staffing firms). Filter results by li_industries, crunchbase_categories, or keywords in short_description. If too noisy, use Scrapegraph searchscraper as primary source instead
  • Fiber NL profile search returns empty per-company — Per-company queries often return 0 results, especially for large enterprises. Use a broad industry-wide query instead (e.g., "COO at a staffing company in the US") which yields 10-15x more results
  • Fiber kitchen-sink returns 400 — Can fail intermittently regardless of parameter format (profileIdentifier, slug, or full URL all tested). This appears to be an API reliability issue, not a format issue. Proceed with Sixtyfour + Hunter + Tomba for enrichment
  • Nyne returns 400 — Nyne company and person search can return 400 errors. Query format sensitivity is unclear. Don't block on Nyne — proceed with Scrapegraph + Fiber results
  • Fiber job-search returns 400 — Known issue with searchParams filters. Use Scrapegraph searchscraper for hiring signals instead
  • Smartscraper 422 on /about path — Fall back to scraping the homepage URL (no path appended)
  • Hunter/Tomba return null for email — Expected for small/mid-market company domains. In testing, Hunter and Tomba returned null for most staffing firms while Sixtyfour found 9/12. Always run Sixtyfour as primary email source
  • No hiring signal found — Not every industry/location has active job postings for specific roles. Mark as "No signal detected" — these are still valid medium-priority prospects

Tips

  • Scrapegraph is the best company finder for niche industries — In testing, Scrapegraph returned 28 targeted staffing companies vs Fiber's noisy mix. Use Scrapegraph as primary for industry-specific lists, Fiber as co-primary for structured data (employee counts, domains)
  • Broad profile search beats per-company search — One query for "COO at staffing companies in the US" returned 15 profiles. The same search run per-company (8 companies) returned only 2 profiles total. Always start with a broad industry-wide NL profile search
  • Sixtyfour is the #1 email finder — Found 9/12 emails in testing where Hunter and Tomba returned null. For small/mid-market company domains, Sixtyfour's AI approach dramatically outperforms pattern-based tools. Still run all sources in parallel for maximum coverage
  • Sixtyfour find-phone is highly reliable — 100% hit rate in testing (10/10 prospects). Always include phone discovery
  • Hiring signals are the #1 prioritization tool — A company actively hiring for a role your product replaces/supports is 3-5x more likely to buy. Scrapegraph searchscraper is the best source — found Randstad and Robert Half hiring for Scheduling Coordinators in a single call
  • Employee count is the best size proxy — Revenue data is rarely available from APIs. Use employee count: 50+ ≈ established, 100+ ≈ mid-market, 500+ ≈ enterprise
  • Fiber kitchen-sink may be unreliable — Can return 400 errors intermittently. Don't depend on it as the sole enrichment source — always have Sixtyfour running in parallel as fallback
  • LinkedIn URLs dramatically improve enrichment — When Fiber NL profile search returns LinkedIn URLs, feed them into Tomba-LinkedIn for email and Sixtyfour enrich-lead for deep context
  • Deduplicate aggressively — Multiple search strategies will return overlapping results. Dedup by domain first (most reliable), then by normalized company name
  • Hunter email-verifier is fast and reliable — Even when Hunter email-finder returns null, Hunter email-verifier is excellent for verifying emails found by Sixtyfour. Every email verified came back with score 89-100
  • Include title variations — Search for "COO OR Chief Operating Officer OR Head of Operations" to catch different title formats at the same level
  • Filter Fiber company results by industry — Use li_industries, crunchbase_categories, or keywords in short_description to filter out irrelevant companies from Fiber NL results
1---
2name: targeted-prospecting
3description: Build a prospect list of companies with decision makers, verified contact info, and hiring/intent signals. Use when asked to find leads by industry, build an account list with specific titles, prospect companies that are actively hiring, or create a targeted outreach list filtered by company size, location, and hiring activity.
4source: orthogonal
5---
6 
7 
8# Targeted Prospecting — Industry + Decision Makers + Hiring Signals
9 
10## Setup
11 
12Read your credentials from ~/.gooseworks/credentials.json:
13```bash
14export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
15export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")
16```
17 
18If ~/.gooseworks/credentials.json does not exist, tell the user to run: `npx gooseworks login`
19 
20All endpoints use Bearer auth: `-H "Authorization: Bearer $GOOSEWORKS_API_KEY"`
21 
22 
23Build a prioritized prospect list for any industry. Finds companies matching your ICP, identifies decision makers by title, enriches with verified contact info, and layers on hiring/intent signals to prioritize who's ready to buy now.
24 
25## Workflow
26 
27### 1. Parse the Request
28 
29Extract from the user's query:
30- **Industry/vertical** (required) — e.g., staffing, fintech, healthcare IT, construction
31- **Decision maker titles** (required) — e.g., COO, VP Engineering, Head of Marketing
32- **Location** (optional, default: US) — country, state, city, or region
33- **Company size** (optional) — employee count min/max, revenue floor
34- **Hiring signal roles** (optional) — job postings that indicate buying intent (e.g., "Scheduling Coordinator" = ops pain, "DevOps Engineer" = infra investment)
35- **Max results** (optional, default 15)
36- **Company/product** (optional) — if user mentions what they're selling, triggers competitive intel in Step 7
37 
38### 2. Find Target Companies
39 
40Run 2-3 search strategies **in parallel**:
41 
42**Strategy A — Scrapegraph searchscraper** (primary — most targeted results):
43 
44```bash
45curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
46 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
47 -H "Content-Type: application/json" \
48 -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
49 "user_prompt": "top {industry} companies in {location} with company name, website, employee count, and headquarters",
50 "num_results": 15
51}'
52```
53 
54Best source for industry-specific company lists. Returns targeted results from industry directories, Inc 5000 lists, and trade publications. In testing, returned 28 staffing companies in a single call vs Fiber's noisy mix of tech giants and staffing firms.
55 
56**Strategy B — Fiber NL company search** (co-primary — best structured data):
57 
58```bash
59curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
60 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
61 -H "Content-Type: application/json" \
62 -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
63 "query": "{industry} companies in {location} with {employee_min}+ employees",
64 "pageSize": 20
65}'
66```
67 
68Returns structured company data with employee counts, domains, LinkedIn URLs, and descriptions. **Caveat:** For niche industries (staffing, construction, etc.), Fiber NL search often returns broad/noisy results mixed with unrelated companies. Filter results by industry keywords from the description, `li_industries`, and `crunchbase_categories` fields. Use company `names` field (not `name_consensus`) for the company name.
69 
70**Strategy C — Nyne company search** (supplemental — attempt, may return errors):
71 
72```bash
73# Step 1: POST to start search
74curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
75 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
76 -H "Content-Type: application/json" \
77 -d '{"api":"nyne","path":"/company/search","body":{"query":"{industry} companies {location} {size_qualifier}"}}'
78# Step 2: Poll with GET using request_id
79curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
80 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
81 -H "Content-Type: application/json" \
82 -d '{"api":"nyne","path":"/company/search","query":{"request_id":"REQUEST_ID"}}'
83```
84 
85Nyne is async — POST returns a `request_id`, poll with GET until complete (5-20s). **Note:** Nyne company search can return 400 errors depending on query format. If it fails, proceed with Scrapegraph + Fiber results — don't block on Nyne.
86 
87#### Scaling Up
88 
89For 20+ results, run parallel searches by sub-region or sub-vertical:
90 
91```bash
92# Parallel searches for different sub-regions
93curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
94 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
95 -H "Content-Type: application/json" \
96 -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
97 "query": "{industry} companies in New York with {size}+ employees",
98 "pageSize": 15
99}'
100 
101curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
102 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
103 -H "Content-Type: application/json" \
104 -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
105 "query": "{industry} companies in California with {size}+ employees",
106 "pageSize": 15
107}'
108```
109 
110### 3. Extract & Deduplicate
111 
112Merge results from all strategies. For each company, extract:
113- **Company name**
114- **Domain / website URL**
115- **Employee count** (primary size proxy — revenue data is often unavailable)
116- **Headquarters / location**
117- **LinkedIn company URL** (if returned by Fiber/Nyne)
118- **Description / industry tags**
119 
120Deduplicate by domain first, then by normalized company name. Apply user's size filters — use employee count as revenue proxy when revenue is unavailable (100+ employees ≈ $10M+ revenue as rough heuristic).
121 
122Enrich top companies with Brand.dev for industry context:
123 
124```bash
125curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
126 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
127 -H "Content-Type: application/json" \
128 -d '{"api":"brand-dev","path":"/v1/brand/retrieve","query":{"domain":"{company_domain}"}}'
129```
130 
131### 4. Find Decision Makers
132 
133**Cost ranking (25 results):** Apollo $0.01 | Fiber $0.50 | Nyne/PDL $7.50. Always try Apollo first.
134 
135**Best approach: Apollo search first, then Fiber for NL queries, then per-company fallbacks.**
136 
137**Primary — Apollo people search (cheapest at $0.01 flat):**
138 
139```bash
140curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/apollo/mixed_people/search \
141 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
142 -H "Content-Type: application/json" \
143 -d '{
144 "person_titles": ["{title_1}", "{title_2}"],
145 "person_locations": ["{location}"],
146 "per_page": 25
147}'
148```
149 
150**Fallback — Fiber NL profile search ($0.02/record, good for broad industry queries):**
151 
152```bash
153curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/fiber/v1/natural-language-search/profiles \
154 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
155 -H "Content-Type: application/json" \
156 -d '{
157 "query": "{title_1} or {title_2} at a {industry} company in {location}",
158 "pageSize": 15
159}'
160```
161 
162This is the highest-yield approach. Returns decision makers across the industry with LinkedIn URLs, current titles, and company names.
163 
164**Per-company fallback — Fiber NL profile search ($0.02/record)** (for companies not covered above):
165 
166```bash
167curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/fiber/v1/natural-language-search/profiles \
168 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
169 -H "Content-Type: application/json" \
170 -d '{
171 "query": "{title_1} or {title_2} at {company_name}",
172 "pageSize": 5
173}'
174```
175 
176Per-company queries often return empty results, especially for large enterprises where C-suite profiles may not be indexed. Use this only for high-priority companies missing from the broad search.
177 
178**Last resort — Nyne person search (EXPENSIVE: $0.30/record, async):**
179 
180Only use if Apollo and Fiber returned insufficient results.
181 
182```bash
183curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/pdl/person/search \
184 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
185 -H "Content-Type: application/json" \
186 -d '{"query":"{title} at {company_name} {location}"}'
187```
188 
189**Fallback — Scrapegraph website scrape** (scrape the company's leadership page):
190 
191```bash
192curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
193 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
194 -H "Content-Type: application/json" \
195 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
196 "website_url": "https://{company_domain}/about",
197 "user_prompt": "Extract names, titles, and any contact info for the leadership team. Identify anyone with these titles: {target_titles}"
198}'
199```
200 
201If `/about` returns 422, fall back to the homepage URL.
202 
203### 5. Enrich Contacts
204 
205For each decision maker found, run **all** of these in parallel:
206 
207**Email discovery — Sixtyfour first** (highest hit rate for small/mid-market domains):
208 
209```bash
210# Sixtyfour AI email finder (PRIMARY — found 9/12 emails in testing)
211curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
212 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
213 -H "Content-Type: application/json" \
214 -d '{"api":"sixtyfour","path":"/find-email"}'
215 "lead": {"first_name": "{first}", "last_name": "{last}", "domain": "{company_domain}"}
216}'
217 
218# Hunter email-finder (supplemental — often returns null for small company domains)
219curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
220 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
221 -H "Content-Type: application/json" \
222 -d '{"api":"hunter","path":"/v2/email-finder","query":{"domain":"{company_domain}","first_name":"{first}","last_name":"{last}"}}'
223 
224# Tomba email-finder (supplemental — similar limitations to Hunter on small domains)
225curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
226 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
227 -H "Content-Type: application/json" \
228 -d '{"api":"tomba","path":"/v1/email-finder","query":{"domain":"{company_domain}","company":"{company_name}","first_name":"{first}","last_name":"{last}"}}'
229 
230# Tomba LinkedIn-to-email (if LinkedIn URL found in Step 4)
231curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
232 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
233 -H "Content-Type: application/json" \
234 -d '{"api":"tomba","path":"/v1/linkedin","query":{"url":"{linkedin_url}"}}'
235```
236 
237In testing, Sixtyfour found emails for 9 out of 12 prospects where Hunter and Tomba returned null. Sixtyfour is the most reliable source for small/mid-market company domains. Still run all sources in parallel — each occasionally finds emails the others miss.
238 
239**Phone discovery:**
240 
241```bash
242curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
243 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
244 -H "Content-Type: application/json" \
245 -d '{"api":"sixtyfour","path":"/find-phone"}'
246 "lead": {"first_name": "{first}", "last_name": "{last}", "company": "{company_name}"}
247}'
248```
249 
250Sixtyfour find-phone had a 100% hit rate in testing (10/10 prospects).
251 
252**Deep enrichment** (fire early, don't block — takes 30-60s):
253 
254```bash
255curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
256 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
257 -H "Content-Type: application/json" \
258 -d '{"api":"sixtyfour","path":"/enrich-lead"}'
259 "lead_info": {
260 "first_name": "{first}", "last_name": "{last}",
261 "company": "{company_name}", "linkedin_url": "{linkedin_url}"
262 },
263 "struct": {
264 "work_email": "Work email",
265 "personal_email": "Personal email",
266 "phone": "Phone number",
267 "title": "Current job title",
268 "bio": "Short professional bio"
269 }
270}'
271```
272 
273**Fiber kitchen-sink enrichment** (if LinkedIn URL available — may return 400):
274 
275```bash
276curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
277 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
278 -H "Content-Type: application/json" \
279 -d '{"api":"fiber","path":"/v1/kitchen-sink/person"}'
280 "profileIdentifier": "{linkedin_url}"
281}'
282```
283 
284Kitchen-sink can intermittently return 400 errors regardless of parameter format. If it fails, proceed with Sixtyfour + Hunter + Tomba results — don't block on kitchen-sink.
285 
286**Triple email verification** — verify ALL found emails with 3 services:
287 
288```bash
289curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
290 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
291 -H "Content-Type: application/json" \
292 -d '{"api":"hunter","path":"/v2/email-verifier","query":{"email":"{email}"}}'
293curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
294 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
295 -H "Content-Type: application/json" \
296 -d '{"api":"tomba","path":"/v1/email-verifier","query":{"email":"{email}"}}'
297curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
298 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
299 -H "Content-Type: application/json" \
300 -d '{"api":"fiber","path":"/v1/validate-email/single","body":{"email":"{email}"}}'
301```
302 
303Take the consensus. Label each email as verified/unverified. Collect both work and personal emails.
304 
305### 6. Hiring / Intent Signals
306 
307**Only run this step if the user specified hiring signal roles.** This is the key differentiator for prioritization.
308 
309**Primary — Scrapegraph searchscraper for hiring signals:**
310 
311```bash
312curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
313 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
314 -H "Content-Type: application/json" \
315 -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
316 "user_prompt": "{industry} companies hiring {signal_role} in {location}, list company name, job title, and location",
317 "num_results": 15
318}'
319```
320 
321**Supplemental — Tavily for job board coverage:**
322 
323```bash
324curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
325 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
326 -H "Content-Type: application/json" \
327 -d '{"api":"tavily","path":"/search"}'
328 "query": "{industry} {signal_role} job opening {location}",
329 "max_results": 10,
330 "include_answer": false
331}'
332```
333 
334Then scrape top job board results for company names:
335 
336```bash
337curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
338 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
339 -H "Content-Type: application/json" \
340 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
341 "website_url": "{job_board_url}",
342 "user_prompt": "Extract all company names hiring for {signal_role}, with job title and location"
343}'
344```
345 
346**Optional — Fiber job search** (attempt, may be unreliable):
347 
348```bash
349curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
350 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
351 -H "Content-Type: application/json" \
352 -d '{"api":"fiber","path":"/v1/job-search"}'
353 "searchParams": {
354 "job_titles": ["{signal_role}"],
355 "industries": ["{industry}"]
356 },
357 "pageSize": 20
358}'
359```
360 
361Note: Fiber job-search with searchParams filters can return 400 errors. Attempt it but don't rely on it — Scrapegraph is the primary method for hiring signals.
362 
363**Cross-reference:** Match companies found hiring signal roles against the company list from Step 2. Matches become **High Priority** prospects. Companies hiring for signal roles that weren't in your original list are bonus leads — add them.
364 
365**Growth signals:** Check Fiber company data (from Step 4 kitchen-sink results) for headcount growth percentage. Companies growing >20% YoY are additional high-priority signals.
366 
367### 7. Competitive Intel (Optional)
368 
369**Only run if the user mentioned their product/company.** Research what the user sells and check prospects for competing solutions.
370 
371```bash
372# Research user's product
373curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
374 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
375 -H "Content-Type: application/json" \
376 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
377 "website_url": "https://{user_company_domain}",
378 "user_prompt": "What does this company sell? Describe the product in one sentence."
379}'
380 
381# Find competitors
382curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
383 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
384 -H "Content-Type: application/json" \
385 -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
386 "user_prompt": "competitors and alternatives to {user_product} for {industry}",
387 "num_results": 5
388}'
389 
390# Check each prospect's website for competing products (parallel)
391curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
392 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
393 -H "Content-Type: application/json" \
394 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
395 "website_url": "https://{prospect_domain}",
396 "user_prompt": "Does this company use or mention: {competitor_1}, {competitor_2}, {competitor_3}? Check page content, footer, and embedded widgets."
397}'
398```
399 
400Flag prospects: **Greenfield** (no competitor detected) > **Competitive displacement** (uses a competitor — note which one) > **Unknown**.
401 
402### 8. Present Results
403 
404Output a prioritized table with **full URLs** (not markdown links — users need to copy-paste):
405 
406```
407## Prospect List: {Title} at {Industry} Companies in {Location}
408 
409Found {N} companies with {M} decision makers identified.
410 
411### High Priority — Hiring Signal Detected
412| # | Company | Website | Employees | Decision Maker | Title | Email | Email Status | Phone | Signal |
413|---|---------|---------|-----------|---------------|-------|-------|-------------|-------|--------|
414| 1 | Acme Staffing | https://acmestaffing.com | 250 | Jane Smith | COO | [email protected] | Verified | (555) 123-4567 | Hiring Scheduling Coordinator |
415 
416### Medium Priority — Matches ICP, No Signal Detected
417| # | Company | Website | Employees | Decision Maker | Title | Email | Email Status | Phone | Notes |
418|---|---------|---------|-----------|---------------|-------|-------|-------------|-------|-------|
419| 5 | Beta Corp | https://betacorp.com | 180 | John Doe | VP Ops | [email protected] | Verified | — | Growing 25% YoY |
420 
421### Lower Priority — Limited Data or Below Target Size
422| # | Company | Website | Employees | Decision Maker | Title | Email | Phone | Notes |
423|---|---------|---------|-----------|---------------|-------|-------|-------|-------|
424| 10 | Small Co | https://smallco.com | 85 | — | — | — | — | Below 100 employee threshold |
425 
426### Summary
427- **Companies found**: {N}
428- **Decision makers identified**: {count}/{N}
429- **With verified email**: {count}
430- **With phone**: {count}
431- **High priority (hiring signal)**: {count}
432- **Medium priority (right profile)**: {count}
433- **Lower priority (limited data)**: {count}
434```
435 
436## APIs Used
437 
438| API | Endpoint | Purpose |
439|-----|----------|---------|
440| **Fiber** | `/v1/natural-language-search/companies` | Find companies by industry + size |
441| **Fiber** | `/v1/natural-language-search/profiles` | Find decision makers by title + company |
442| **Fiber** | `/v1/kitchen-sink/person` | Enrich person by LinkedIn URL or name+company |
443| **Fiber** | `/v1/kitchen-sink/company` | Enrich company data |
444| **Fiber** | `/v1/job-search` | Job postings (unreliable, attempt only) |
445| **Fiber** | `/v1/validate-email/single` | Email verification |
446| **Nyne** | `/company/search` | Async company search by industry |
447| **Nyne** | `/person/search` | Async person search by company + role |
448| **Scrapegraph** | `/v1/searchscraper` | Web search for companies + hiring signals |
449| **Scrapegraph** | `/v1/smartscraper` | Scrape websites for leadership/competitive intel |
450| **Tavily** | `/search` | Supplemental web search for job boards |
451| **Hunter** | `/v2/email-finder` | Find email by name + domain |
452| **Hunter** | `/v2/email-verifier` | Email verification |
453| **Tomba** | `/v1/email-finder` | Find email by name + domain |
454| **Tomba** | `/v1/linkedin` | Email from LinkedIn URL |
455| **Tomba** | `/v1/email-verifier` | Email verification |
456| **Sixtyfour** | `/find-email` | AI email finder |
457| **Sixtyfour** | `/find-phone` | AI phone finder |
458| **Sixtyfour** | `/enrich-lead` | AI deep enrichment |
459| **Brand.dev** | `/v1/brand/retrieve` | Company overview/context |
460 
461## Examples
462 
463**Example 1 — Staffing/recruiting (the Clay use case):**
464 
465"Find COOs at US staffing firms with 100+ employees that are hiring Scheduling Coordinators"
466 
467```bash
468# Step 2: Find staffing companies (parallel)
469curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
470 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
471 -H "Content-Type: application/json" \
472 -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
473 "query": "staffing and recruiting companies in the United States with 100 or more employees",
474 "pageSize": 20
475}'
476 
477curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
478 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
479 -H "Content-Type: application/json" \
480 -d '{"api":"nyne","path":"/company/search","body":{"query":"staffing recruiting firms US 100+ employees"}}'
481 
482curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
483 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
484 -H "Content-Type: application/json" \
485 -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
486 "user_prompt": "top staffing and recruiting companies in the US with company name, website, employee count, and headquarters",
487 "num_results": 15
488}'
489 
490# Step 4: Find COOs (parallel, per company)
491curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
492 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
493 -H "Content-Type: application/json" \
494 -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
495 "query": "COO or Chief Operating Officer or Head of Operations at {company_name}",
496 "pageSize": 3
497}'
498 
499# Step 5: Enrich (parallel, per person)
500curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
501 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
502 -H "Content-Type: application/json" \
503 -d '{"api":"hunter","path":"/v2/email-finder","query":{"domain":"{domain}","first_name":"{first}","last_name":"{last}"}}'
504curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
505 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
506 -H "Content-Type: application/json" \
507 -d '{"api":"sixtyfour","path":"/find-email","body":{"lead":{"first_name":"{first}","last_name":"{last}","domain":"{domain}"}}}'
508curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
509 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
510 -H "Content-Type: application/json" \
511 -d '{"api":"sixtyfour","path":"/find-phone","body":{"lead":{"first_name":"{first}","last_name":"{last}","company":"{company}"}}}'
512 
513# Step 6: Hiring signals
514curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
515 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
516 -H "Content-Type: application/json" \
517 -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
518 "user_prompt": "staffing companies hiring Scheduling Coordinator or Recruiting Coordinator in the US, list company name, job title, and location",
519 "num_results": 15
520}'
521```
522 
523**Example 2 — SaaS sales (fintech):**
524 
525"Find VP Engineering or CTO at fintech startups with 50-200 employees in the US that are hiring DevOps engineers"
526 
527```bash
528# Companies
529curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
530 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
531 -H "Content-Type: application/json" \
532 -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
533 "query": "fintech startups in the United States with 50 to 200 employees",
534 "pageSize": 20
535}'
536 
537# Decision makers (per company)
538curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
539 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
540 -H "Content-Type: application/json" \
541 -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
542 "query": "VP Engineering or CTO at {company_name}",
543 "pageSize": 3
544}'
545 
546# Hiring signal
547curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
548 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
549 -H "Content-Type: application/json" \
550 -d '{"api":"scrapegraph","path":"/v1/searchscraper"}'
551 "user_prompt": "fintech companies hiring DevOps Engineer or Site Reliability Engineer in the US, list company name and job title",
552 "num_results": 15
553}'
554```
555 
556**Example 3 — Recruiting (healthcare in Texas):**
557 
558"Find HR Directors at healthcare companies in Texas with 500+ employees"
559 
560```bash
561# Companies
562curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
563 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
564 -H "Content-Type: application/json" \
565 -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
566 "query": "healthcare companies in Texas with 500 or more employees",
567 "pageSize": 20
568}'
569 
570# Decision makers
571curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
572 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
573 -H "Content-Type: application/json" \
574 -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
575 "query": "HR Director or VP Human Resources at {company_name}",
576 "pageSize": 3
577}'
578```
579 
580**Example 4 — Simple, no hiring signals (construction):**
581 
582"Build a prospect list of construction companies in California with Head of Safety as decision maker"
583 
584```bash
585# Companies
586curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
587 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
588 -H "Content-Type: application/json" \
589 -d '{"api":"fiber","path":"/v1/natural-language-search/companies"}'
590 "query": "construction companies in California",
591 "pageSize": 15
592}'
593 
594# Decision makers
595curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
596 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
597 -H "Content-Type: application/json" \
598 -d '{"api":"fiber","path":"/v1/natural-language-search/profiles"}'
599 "query": "Head of Safety or Safety Director or VP Safety at {company_name}",
600 "pageSize": 3
601}'
602```
603 
604## Error Handling
605 
606- **Fiber NL company search returns noisy results** — For niche industries, Fiber often returns unrelated companies mixed in (e.g., tech giants alongside staffing firms). Filter results by `li_industries`, `crunchbase_categories`, or keywords in `short_description`. If too noisy, use Scrapegraph searchscraper as primary source instead
607- **Fiber NL profile search returns empty per-company** — Per-company queries often return 0 results, especially for large enterprises. Use a broad industry-wide query instead (e.g., "COO at a staffing company in the US") which yields 10-15x more results
608- **Fiber kitchen-sink returns 400** — Can fail intermittently regardless of parameter format (`profileIdentifier`, slug, or full URL all tested). This appears to be an API reliability issue, not a format issue. Proceed with Sixtyfour + Hunter + Tomba for enrichment
609- **Nyne returns 400** — Nyne company and person search can return 400 errors. Query format sensitivity is unclear. Don't block on Nyne — proceed with Scrapegraph + Fiber results
610- **Fiber job-search returns 400** — Known issue with searchParams filters. Use Scrapegraph searchscraper for hiring signals instead
611- **Smartscraper 422 on /about path** — Fall back to scraping the homepage URL (no path appended)
612- **Hunter/Tomba return null for email** — Expected for small/mid-market company domains. In testing, Hunter and Tomba returned null for most staffing firms while Sixtyfour found 9/12. Always run Sixtyfour as primary email source
613- **No hiring signal found** — Not every industry/location has active job postings for specific roles. Mark as "No signal detected" — these are still valid medium-priority prospects
614 
615## Tips
616 
617- **Scrapegraph is the best company finder for niche industries** — In testing, Scrapegraph returned 28 targeted staffing companies vs Fiber's noisy mix. Use Scrapegraph as primary for industry-specific lists, Fiber as co-primary for structured data (employee counts, domains)
618- **Broad profile search beats per-company search** — One query for "COO at staffing companies in the US" returned 15 profiles. The same search run per-company (8 companies) returned only 2 profiles total. Always start with a broad industry-wide NL profile search
619- **Sixtyfour is the #1 email finder** — Found 9/12 emails in testing where Hunter and Tomba returned null. For small/mid-market company domains, Sixtyfour's AI approach dramatically outperforms pattern-based tools. Still run all sources in parallel for maximum coverage
620- **Sixtyfour find-phone is highly reliable** — 100% hit rate in testing (10/10 prospects). Always include phone discovery
621- **Hiring signals are the #1 prioritization tool** — A company actively hiring for a role your product replaces/supports is 3-5x more likely to buy. Scrapegraph searchscraper is the best source — found Randstad and Robert Half hiring for Scheduling Coordinators in a single call
622- **Employee count is the best size proxy** — Revenue data is rarely available from APIs. Use employee count: 50+ ≈ established, 100+ ≈ mid-market, 500+ ≈ enterprise
623- **Fiber kitchen-sink may be unreliable** — Can return 400 errors intermittently. Don't depend on it as the sole enrichment source — always have Sixtyfour running in parallel as fallback
624- **LinkedIn URLs dramatically improve enrichment** — When Fiber NL profile search returns LinkedIn URLs, feed them into Tomba-LinkedIn for email and Sixtyfour enrich-lead for deep context
625- **Deduplicate aggressively** — Multiple search strategies will return overlapping results. Dedup by domain first (most reliable), then by normalized company name
626- **Hunter email-verifier is fast and reliable** — Even when Hunter email-finder returns null, Hunter email-verifier is excellent for verifying emails found by Sixtyfour. Every email verified came back with score 89-100
627- **Include title variations** — Search for "COO OR Chief Operating Officer OR Head of Operations" to catch different title formats at the same level
628- **Filter Fiber company results by industry** — Use `li_industries`, `crunchbase_categories`, or keywords in `short_description` to filter out irrelevant companies from Fiber NL results
629 

Discussion

Alternatives

Also in Lead lists