- name
- targeted-prospecting
- description
- 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.
- source
- orthogonal
# Targeted Prospecting — Industry + Decision Makers + Hiring Signals
## Setup
Read your credentials from ~/.gooseworks/credentials.json:
```bash
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):
```bash
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):
```bash
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):
```bash
# 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:
```bash
# 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:
```bash
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):**
```bash
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):**
```bash
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):
```bash
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.
```bash
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):
```bash
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):
```bash
# 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:**
```bash
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):
```bash
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": {
View on GitHub