GTM Enrichment — Deep (Sixtyfour AI Agent)
AI-agent-powered lead enrichment using Sixtyfour as primary source.
How to use it
- Hit Copy the whole skill.
- 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. - Describe your job in plain words. The AI follows the skill from there.
npx degit gooseworks-ai/goose-skills/skills/lead-generation/capabilities/gtm-enrichment-deep#main ~/.claude/skills/gtm-enrichment-deepFor one project only, change the path to .claude/skills/gtm-enrichment-deep.
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.
Paste into Claude, ChatGPT or Cursor.
Show the full text247 lines
GTM Enrichment — Deep (Sixtyfour AI Agent)
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"
Enrich a lead from an email address (+ optional name) using Sixtyfour's AI agents as the primary enrichment source. Returns person data, company data, funding history, and AI/B2B classification.
Cost: ~$0.20-$0.22 per lead Latency: ~30-60s (Sixtyfour AI agents browse the web)
Input
Required:
- email — the lead's email address (e.g.,
[email protected])
Optional:
- name — full name if known (improves match rate)
Workflow
Step 1: Extract Domain
Extract the domain from the email address. Example: [email protected] -> domain: acme.com
Step 2: Run Sixtyfour Enrichment (parallel)
Fire both calls simultaneously. These are the primary data sources.
Enrich Lead ($0.10):
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": {
"email": "{email}",
"first_name": "{first_name_if_known}",
"last_name": "{last_name_if_known}",
"company": "{company_name_if_known}",
"domain": "{domain}"
},
"struct": {
"full_name": "Full legal name of this person",
"first_name": "First name",
"last_name": "Last name",
"title": "Current job title at their company",
"linkedin_url": "LinkedIn profile URL (full URL starting with https://linkedin.com/in/)",
"city": "City where the person is located",
"state": "State or region where the person is located",
"country": "Country where the person is located"
}
}'
Enrich Company ($0.10):
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-company"}'
"target_company": {
"domain": "{domain}"
},
"struct": {
"company_name": "Official company name",
"description": "One-paragraph description of what the company does",
"linkedin_url": "LinkedIn company page URL (full URL starting with https://linkedin.com/company/)",
"hq_city": "Headquarters city",
"hq_state": "Headquarters state or region",
"hq_country": "Headquarters country",
"employee_count": "Approximate number of employees (number only)",
"founded_year": "Year the company was founded (number only)",
"total_funding_amount_usd": "Total funding raised in USD (number only, no $ sign)",
"latest_funding_date": "Date of most recent funding round (YYYY-MM-DD format)",
"latest_funding_stage": "Stage of most recent funding round (e.g., Series A, Series B, Seed)",
"latest_funding_amount_usd": "Amount raised in most recent round in USD (number only)",
"is_ai_company": "true or false - does this company build or primarily use AI/ML technology?",
"ai_evidence": "Brief explanation of why this is or is not an AI company",
"is_b2b_saas": "true or false - is this a B2B SaaS company?",
"b2b_evidence": "Brief explanation of why this is or is not B2B SaaS"
}
}'
Record the status, latency, and any errors for both calls.
Step 3: Fallback — Apollo Person Match (conditional)
ONLY run if Sixtyfour /enrich-lead did NOT return a LinkedIn URL.
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"apollo","path":"/api/v1/people/match"}'
"email": "{email}",
"reveal_personal_emails": true
}'
Cost: $0.01. Extract linkedin_url, and also grab name, title, organization as cross-reference data.
Step 4: Fallback — Apollo Organization Enrich (conditional)
ONLY run if Sixtyfour /enrich-company did NOT return funding data (total_funding_amount_usd is null/empty).
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"apollo","path":"/api/v1/organizations/enrich","query":{"domain":"{domain}"}}'
Cost: $0.01. Extract funding events, total funding, latest funding stage, and latest funding amount.
Step 5: Compile Results
Merge all data into the output format below. Apply these rules:
- Sixtyfour is primary — use its data first for all fields
- Apollo is fallback — only used to fill gaps Sixtyfour missed
- Source tracking — for each field, note whether it came from
sixtyfourorapollo - Confidence:
high— Sixtyfour returned the field directlymedium— Apollo fallback provided the fieldlow— field was inferred or partially matched
Output Format
Present the results as a JSON code block:
{
"person": {
"full_name": "string",
"title": "string",
"linkedin_url": "string",
"location": {"city": "string", "state": "string", "country": "string"},
"email_verified": "unknown",
"confidence": "high | medium | low",
"source": "sixtyfour | apollo"
},
"company": {
"name": "string",
"domain": "string",
"linkedin_url": "string",
"description": "string",
"geo": {"city": "string", "state": "string", "country": "string"},
"employee_count": "number | null",
"founded_year": "number | null",
"funding": {
"total_amount": "number | null",
"total_amount_printed": "string | null",
"latest_round_date": "string | null",
"latest_round_stage": "string | null",
"latest_round_amount": "number | null",
"rounds": [],
"confidence": "high | medium | low"
},
"classification": {
"is_ai": {"value": true, "confidence": "high | medium | low", "evidence": ["string"]},
"is_b2b_saas": {"value": true, "confidence": "high | medium | low", "evidence": ["string"]}
},
"buying_signals": {
"has_enterprise_plan": null,
"has_self_serve": null,
"hiring_enterprise_reps": null,
"website_traffic_rank": null,
"github_stars": null,
"tech_stack": null
},
"confidence": "high | medium | low",
"source": "sixtyfour | apollo | merged"
},
"meta": {
"total_cost": "$0.XX",
"api_calls": [],
"phases_run": [1, 2],
"enrichment_timestamp": "ISO datetime"
}
}
Error Visibility
Track EVERY API call in the meta.api_calls array:
{
"api": "sixtyfour",
"endpoint": "/enrich-lead",
"status": "success | partial | error",
"cost": "$0.10",
"latency_ms": 35000,
"fields_returned": ["full_name", "title", "linkedin_url"],
"fields_missing": ["city"],
"error": null
}
If an API call fails, returns empty data, or times out, include it in the api_calls array with status='error' and a clear error message. Never silently skip failures.
Cost Tracking
Sum all API call costs and report in meta.total_cost:
- Sixtyfour /enrich-lead: $0.10
- Sixtyfour /enrich-company: $0.10
- Apollo /api/v1/people/match: $0.01 (only if used)
- Apollo /api/v1/organizations/enrich: $0.01 (only if used)
Example
Input: [email protected]
Expected flow:
- Extract domain:
acme.com - Fire Sixtyfour /enrich-lead and /enrich-company in parallel
- Check if LinkedIn URL returned — if not, call Apollo /people/match
- Check if funding data returned — if not, call Apollo /organizations/enrich
- Compile and output JSON with all fields, error visibility, and cost
Tips
- Sixtyfour takes 30-60s per call — be patient, do NOT timeout early
- If Sixtyfour returns partial data, still use what it returned and fill gaps with Apollo
- AI/B2B classification comes from Sixtyfour's web research — it reads the company website
- The
structfield in Sixtyfour tells the AI agent exactly what to research — modify fields there if you need different data points
| 1 | |
| 2 | name gtm-enrichment-deep |
| 3 | description AI-agent-powered lead enrichment using Sixtyfour as primary source. Takes an email (+ optional name) and returns comprehensive person + company data with funding, AI/B2B classification, and full error visibility. Higher cost (~$0.20/lead) but simpler architecture. |
| 4 | source orthogonal |
| 5 | |
| 6 | |
| 7 | |
| 8 | # GTM Enrichment — Deep (Sixtyfour AI Agent) |
| 9 | |
| 10 | ## Setup |
| 11 | |
| 12 | Read your credentials from ~/.gooseworks/credentials.json: |
| 13 | |
| 14 | export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])") |
| 15 | export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))") |
| 16 | |
| 17 | |
| 18 | If ~/.gooseworks/credentials.json does not exist, tell the user to run: `npx gooseworks login` |
| 19 | |
| 20 | All endpoints use Bearer auth: `-H "Authorization: Bearer $GOOSEWORKS_API_KEY"` |
| 21 | |
| 22 | |
| 23 | Enrich a lead from an email address (+ optional name) using Sixtyfour's AI agents as the primary enrichment source. Returns person data, company data, funding history, and AI/B2B classification. |
| 24 | |
| 25 | **Cost**: ~$0.20-$0.22 per lead |
| 26 | **Latency**: ~30-60s (Sixtyfour AI agents browse the web) |
| 27 | |
| 28 | ## Input |
| 29 | |
| 30 | Required: |
| 31 | **email** — the lead's email address (e.g., `[email protected]`) |
| 32 | |
| 33 | Optional: |
| 34 | **name** — full name if known (improves match rate) |
| 35 | |
| 36 | ## Workflow |
| 37 | |
| 38 | ### Step 1: Extract Domain |
| 39 | |
| 40 | Extract the domain from the email address. Example: `[email protected]` -> domain: `acme.com` |
| 41 | |
| 42 | ### Step 2: Run Sixtyfour Enrichment (parallel) |
| 43 | |
| 44 | Fire both calls simultaneously. These are the primary data sources. |
| 45 | |
| 46 | **Enrich Lead** ($0.10): |
| 47 | |
| 48 | |
| 49 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 50 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 51 | -H "Content-Type: application/json" \ |
| 52 | -d '{"api":"sixtyfour","path":"/enrich-lead"}' |
| 53 | "lead_info": { |
| 54 | "email": "{email}", |
| 55 | "first_name": "{first_name_if_known}", |
| 56 | "last_name": "{last_name_if_known}", |
| 57 | "company": "{company_name_if_known}", |
| 58 | "domain": "{domain}" |
| 59 | }, |
| 60 | "struct": { |
| 61 | "full_name": "Full legal name of this person", |
| 62 | "first_name": "First name", |
| 63 | "last_name": "Last name", |
| 64 | "title": "Current job title at their company", |
| 65 | "linkedin_url": "LinkedIn profile URL (full URL starting with https://linkedin.com/in/)", |
| 66 | "city": "City where the person is located", |
| 67 | "state": "State or region where the person is located", |
| 68 | "country": "Country where the person is located" |
| 69 | } |
| 70 | }' |
| 71 | |
| 72 | |
| 73 | **Enrich Company** ($0.10): |
| 74 | |
| 75 | |
| 76 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 77 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 78 | -H "Content-Type: application/json" \ |
| 79 | -d '{"api":"sixtyfour","path":"/enrich-company"}' |
| 80 | "target_company": { |
| 81 | "domain": "{domain}" |
| 82 | }, |
| 83 | "struct": { |
| 84 | "company_name": "Official company name", |
| 85 | "description": "One-paragraph description of what the company does", |
| 86 | "linkedin_url": "LinkedIn company page URL (full URL starting with https://linkedin.com/company/)", |
| 87 | "hq_city": "Headquarters city", |
| 88 | "hq_state": "Headquarters state or region", |
| 89 | "hq_country": "Headquarters country", |
| 90 | "employee_count": "Approximate number of employees (number only)", |
| 91 | "founded_year": "Year the company was founded (number only)", |
| 92 | "total_funding_amount_usd": "Total funding raised in USD (number only, no $ sign)", |
| 93 | "latest_funding_date": "Date of most recent funding round (YYYY-MM-DD format)", |
| 94 | "latest_funding_stage": "Stage of most recent funding round (e.g., Series A, Series B, Seed)", |
| 95 | "latest_funding_amount_usd": "Amount raised in most recent round in USD (number only)", |
| 96 | "is_ai_company": "true or false - does this company build or primarily use AI/ML technology?", |
| 97 | "ai_evidence": "Brief explanation of why this is or is not an AI company", |
| 98 | "is_b2b_saas": "true or false - is this a B2B SaaS company?", |
| 99 | "b2b_evidence": "Brief explanation of why this is or is not B2B SaaS" |
| 100 | } |
| 101 | }' |
| 102 | |
| 103 | |
| 104 | Record the status, latency, and any errors for both calls. |
| 105 | |
| 106 | ### Step 3: Fallback — Apollo Person Match (conditional) |
| 107 | |
| 108 | **ONLY run if Sixtyfour /enrich-lead did NOT return a LinkedIn URL.** |
| 109 | |
| 110 | |
| 111 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 112 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 113 | -H "Content-Type: application/json" \ |
| 114 | -d '{"api":"apollo","path":"/api/v1/people/match"}' |
| 115 | "email": "{email}", |
| 116 | "reveal_personal_emails": true |
| 117 | }' |
| 118 | |
| 119 | |
| 120 | Cost: $0.01. Extract `linkedin_url`, and also grab `name`, `title`, `organization` as cross-reference data. |
| 121 | |
| 122 | ### Step 4: Fallback — Apollo Organization Enrich (conditional) |
| 123 | |
| 124 | **ONLY run if Sixtyfour /enrich-company did NOT return funding data** (total_funding_amount_usd is null/empty). |
| 125 | |
| 126 | |
| 127 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 128 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 129 | -H "Content-Type: application/json" \ |
| 130 | -d '{"api":"apollo","path":"/api/v1/organizations/enrich","query":{"domain":"{domain}"}}' |
| 131 | |
| 132 | |
| 133 | Cost: $0.01. Extract funding events, total funding, latest funding stage, and latest funding amount. |
| 134 | |
| 135 | ### Step 5: Compile Results |
| 136 | |
| 137 | Merge all data into the output format below. Apply these rules: |
| 138 | |
| 139 | **Sixtyfour is primary** — use its data first for all fields |
| 140 | **Apollo is fallback** — only used to fill gaps Sixtyfour missed |
| 141 | **Source tracking** — for each field, note whether it came from `sixtyfour` or `apollo` |
| 142 | **Confidence**: |
| 143 | `high` — Sixtyfour returned the field directly |
| 144 | `medium` — Apollo fallback provided the field |
| 145 | `low` — field was inferred or partially matched |
| 146 | |
| 147 | ## Output Format |
| 148 | |
| 149 | Present the results as a JSON code block: |
| 150 | |
| 151 | |
| 152 | { |
| 153 | "person": { |
| 154 | "full_name": "string", |
| 155 | "title": "string", |
| 156 | "linkedin_url": "string", |
| 157 | "location": {"city": "string", "state": "string", "country": "string"}, |
| 158 | "email_verified": "unknown", |
| 159 | "confidence": "high | medium | low", |
| 160 | "source": "sixtyfour | apollo" |
| 161 | }, |
| 162 | "company": { |
| 163 | "name": "string", |
| 164 | "domain": "string", |
| 165 | "linkedin_url": "string", |
| 166 | "description": "string", |
| 167 | "geo": {"city": "string", "state": "string", "country": "string"}, |
| 168 | "employee_count": "number | null", |
| 169 | "founded_year": "number | null", |
| 170 | "funding": { |
| 171 | "total_amount": "number | null", |
| 172 | "total_amount_printed": "string | null", |
| 173 | "latest_round_date": "string | null", |
| 174 | "latest_round_stage": "string | null", |
| 175 | "latest_round_amount": "number | null", |
| 176 | "rounds": [], |
| 177 | "confidence": "high | medium | low" |
| 178 | }, |
| 179 | "classification": { |
| 180 | "is_ai": {"value": true, "confidence": "high | medium | low", "evidence": ["string"]}, |
| 181 | "is_b2b_saas": {"value": true, "confidence": "high | medium | low", "evidence": ["string"]} |
| 182 | }, |
| 183 | "buying_signals": { |
| 184 | "has_enterprise_plan": null, |
| 185 | "has_self_serve": null, |
| 186 | "hiring_enterprise_reps": null, |
| 187 | "website_traffic_rank": null, |
| 188 | "github_stars": null, |
| 189 | "tech_stack": null |
| 190 | }, |
| 191 | "confidence": "high | medium | low", |
| 192 | "source": "sixtyfour | apollo | merged" |
| 193 | }, |
| 194 | "meta": { |
| 195 | "total_cost": "$0.XX", |
| 196 | "api_calls": [], |
| 197 | "phases_run": [1, 2], |
| 198 | "enrichment_timestamp": "ISO datetime" |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | |
| 203 | ## Error Visibility |
| 204 | |
| 205 | Track EVERY API call in the `meta.api_calls` array: |
| 206 | |
| 207 | |
| 208 | { |
| 209 | "api": "sixtyfour", |
| 210 | "endpoint": "/enrich-lead", |
| 211 | "status": "success | partial | error", |
| 212 | "cost": "$0.10", |
| 213 | "latency_ms": 35000, |
| 214 | "fields_returned": ["full_name", "title", "linkedin_url"], |
| 215 | "fields_missing": ["city"], |
| 216 | "error": null |
| 217 | } |
| 218 | |
| 219 | |
| 220 | **If an API call fails, returns empty data, or times out, include it in the api_calls array with status='error' and a clear error message. Never silently skip failures.** |
| 221 | |
| 222 | ## Cost Tracking |
| 223 | |
| 224 | Sum all API call costs and report in `meta.total_cost`: |
| 225 | Sixtyfour /enrich-lead: $0.10 |
| 226 | Sixtyfour /enrich-company: $0.10 |
| 227 | Apollo /api/v1/people/match: $0.01 (only if used) |
| 228 | Apollo /api/v1/organizations/enrich: $0.01 (only if used) |
| 229 | |
| 230 | ## Example |
| 231 | |
| 232 | **Input**: `[email protected]` |
| 233 | |
| 234 | **Expected flow**: |
| 235 | Extract domain: `acme.com` |
| 236 | Fire Sixtyfour /enrich-lead and /enrich-company in parallel |
| 237 | Check if LinkedIn URL returned — if not, call Apollo /people/match |
| 238 | Check if funding data returned — if not, call Apollo /organizations/enrich |
| 239 | Compile and output JSON with all fields, error visibility, and cost |
| 240 | |
| 241 | ## Tips |
| 242 | |
| 243 | Sixtyfour takes 30-60s per call — be patient, do NOT timeout early |
| 244 | If Sixtyfour returns partial data, still use what it returned and fill gaps with Apollo |
| 245 | AI/B2B classification comes from Sixtyfour's web research — it reads the company website |
| 246 | The `struct` field in Sixtyfour tells the AI agent exactly what to research — modify fields there if you need different data points |
| 247 |