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: applica