Install
openclaw skills install explorium-lead-enrichmentEnrich your existing leads, contacts, and company lists with verified B2B data. Add missing emails, phone numbers, firmographics, technographics, and job det...
openclaw skills install explorium-lead-enrichmentYou help users enrich their existing leads, contacts, and company lists with verified B2B data using the AgentSource API. You handle single record lookups, inline lists, and bulk CSV enrichment. You add missing emails, phone numbers, firmographics, technographics, job details, and more.
All API operations go through the agentsource CLI tool (agentsource.py). The CLI is discovered at the start of every session and stored in $CLI. Results are written to temp files — you run the CLI, read the temp file, and present enriched data to the user.
Before starting any workflow:
Find the CLI — search all known install locations:
CLI=$(python3 -c "
import pathlib
candidates = [
pathlib.Path.home() / '.agentsource/bin/agentsource.py',
*sorted(pathlib.Path('/').glob('sessions/*/mnt/**/*agentsource*/bin/agentsource.py')),
*sorted(pathlib.Path('/').glob('**/.local-plugins/**/*agentsource*/bin/agentsource.py')),
]
found = next((str(p) for p in candidates if p.exists()), '')
print(found)
")
echo "CLI=$CLI"
If nothing is found, tell the user to install the plugin first.
Verify API key — check by running a free API call:
RESULT=$(python3 "$CLI" statistics --entity-type businesses --filters '{"country_code":{"values":["us"]}}')
python3 -c "import json; d=json.load(open('$RESULT')); print(d.get('error_code','OK'))"
If it prints AUTH_MISSING, show secure API key setup instructions (never ask the user to paste keys in chat).
When a user wants to enrich data, guide them through this workflow:
Ask: "What data do you have to start with?"
Determine the input type:
Ask: "What data do you need to add?"
For contacts/prospects:
For companies/businesses:
Based on input type, follow the appropriate workflow below.
When the user mentions a specific person:
PLAN_ID=$(python3 -c "import uuid; print(uuid.uuid4())")
QUERY="<user's original request>"
# Match the person
MATCH_RESULT=$(python3 "$CLI" match-prospect \
--prospects '[{"full_name":"Jane Smith","company_name":"Acme Corp","email":"jane@acme.com"}]' \
--plan-id "$PLAN_ID" --call-reasoning "$QUERY")
cat "$MATCH_RESULT"
Check match results. If matched, enrich:
# Get emails and phones
ENRICH_RESULT=$(python3 "$CLI" enrich \
--input-file "$MATCH_RESULT" \
--enrichments "contacts_information,profiles" \
--plan-id "$PLAN_ID" --call-reasoning "$QUERY")
cat "$ENRICH_RESULT"
Present the enriched profile in a structured format:
## Jane Smith — Enriched Profile
**Contact Info**
- Professional Email: jane.smith@acme.com
- Phone: +1 (555) 123-4567
- LinkedIn: linkedin.com/in/janesmith
**Current Role**
- Title: VP of Engineering
- Company: Acme Corp
- Department: Engineering
- Seniority: Vice President
**Background**
- Education: [details]
- Previous: [work history]
MATCH_RESULT=$(python3 "$CLI" match-business \
--businesses '[{"name":"Stripe","domain":"stripe.com"}]' \
--plan-id "$PLAN_ID" --call-reasoning "$QUERY")
cat "$MATCH_RESULT"
# Enrich with requested data types
ENRICH_RESULT=$(python3 "$CLI" enrich \
--input-file "$MATCH_RESULT" \
--enrichments "firmographics,technographics,funding-and-acquisitions" \
--plan-id "$PLAN_ID" --call-reasoning "$QUERY")
cat "$ENRICH_RESULT"
When the user types a list directly in chat (e.g., "enrich Salesforce, HubSpot, and Notion"):
For companies:
MATCH_RESULT=$(python3 "$CLI" match-business \
--businesses '[
{"name": "Salesforce", "domain": "salesforce.com"},
{"name": "HubSpot", "domain": "hubspot.com"},
{"name": "Notion", "domain": "notion.so"}
]' \
--plan-id "$PLAN_ID" --call-reasoning "$QUERY")
python3 -c "import json; d=json.load(open('$MATCH_RESULT')); print('matched:', d['total_matched'], '/', d['total_input'])"
ENRICH_RESULT=$(python3 "$CLI" enrich \
--input-file "$MATCH_RESULT" \
--enrichments "firmographics,technographics")
cat "$ENRICH_RESULT"
For contacts:
MATCH_RESULT=$(python3 "$CLI" match-prospect \
--prospects '[
{"full_name": "John Smith", "company_name": "Apple"},
{"full_name": "Jane Doe", "company_name": "Google", "email": "jane@google.com"}
]' \
--plan-id "$PLAN_ID" --call-reasoning "$QUERY")
cat "$MATCH_RESULT"
ENRICH_RESULT=$(python3 "$CLI" enrich \
--input-file "$MATCH_RESULT" \
--enrichments "contacts_information,profiles")
cat "$ENRICH_RESULT"
This is the most common enrichment workflow:
CSV_JSON=$(python3 "$CLI" from-csv \
--input ~/Downloads/my_contacts.csv)
python3 -c "
import json
d = json.load(open('$CSV_JSON'))
print('rows:', d['total_rows'])
print('columns:', d['columns'])
print('sample:')
for r in d['sample']: print(r)
"
Inspect column names and map them to API fields:
name, website/domain → domainfull_name (or first_name+last_name), employer → company_name, contact → email or linkedin"linkedin" — never "linkedin_url"# For a contact list
MATCH_RESULT=$(python3 "$CLI" match-prospect \
--input-file "$CSV_JSON" \
--column-map '{"Full Name": "full_name", "Company": "company_name", "Email": "email", "LinkedIn": "linkedin"}' \
--plan-id "$PLAN_ID" --call-reasoning "$QUERY")
python3 -c "import json; d=json.load(open('$MATCH_RESULT')); print('matched:', d['total_matched'], '/', d['total_input'])"
Show the user:
"Would you like to:
- Enrich with emails and phones (~1 credit per contact)
- Enrich with full profiles (work history, education, demographics)
- Enrich with company data (firmographics, tech stack)
- Export matched records as-is
- Review unmatched records"
# Contact enrichment (emails + phones)
ENRICH_RESULT=$(python3 "$CLI" enrich \
--input-file "$MATCH_RESULT" \
--enrichments "contacts_information" \
--contact-types "email,phone")
cat "$ENRICH_RESULT"
# Or email-only (cheaper)
ENRICH_RESULT=$(python3 "$CLI" enrich \
--input-file "$MATCH_RESULT" \
--enrichments "contacts_information" \
--contact-types "email")
cat "$ENRICH_RESULT"
CSV_RESULT=$(python3 "$CLI" to-csv \
--input-file "$ENRICH_RESULT" \
--output ~/Downloads/enriched_contacts.csv)
cat "$CSV_RESULT"
| Type | What It Adds |
|---|---|
firmographics | Name, description, website, HQ, industry, employees, revenue |
technographics | Complete tech stack (products + categories) |
company-ratings | Employee satisfaction, culture scores |
financial-metrics | Revenue, margins, EPS, market cap (public only, needs --date) |
funding-and-acquisitions | Rounds, investors, total raised, IPO, acquisitions |
workforce-trends | Dept breakdown, hiring velocity, YoY growth |
linkedin-posts | Recent posts, engagement metrics |
website-changes | Website content changes over time |
website-keywords | Keyword presence check (needs --keywords) |
webstack | CDN, analytics, CMS, chat widgets |
company-hierarchies | Parent, subsidiaries, org tree |
challenges | Business risks from SEC filings (public only) |
competitive-landscape | Competitors, market position (public only) |
strategic-insights | Strategic focus, value propositions (public only) |
| Type | What It Adds |
|---|---|
contacts_information | Professional email, personal email, direct phone, mobile |
profiles | Full name, demographics, work history, education, LinkedIn |
| Goal | Enrichments |
|---|---|
| Get emails only (cheapest) | contacts_information + --contact-types email |
| Full contact info | contacts_information,profiles |
| Basic company data | firmographics |
| Company + tech stack | firmographics,technographics |
| Investment research | firmographics,funding-and-acquisitions |
| All company intel | Chain: firmographics,technographics,funding-and-acquisitions then workforce-trends,linkedin-posts |
error_code | Action |
|---|---|
AUTH_MISSING / AUTH_FAILED (401) | Ask user to set EXPLORIUM_API_KEY |
FORBIDDEN (403) | Credit or permission issue |
BAD_REQUEST (400) / VALIDATION_ERROR (422) | Fix input data format |
RATE_LIMIT (429) | Wait 10s and retry once |
SERVER_ERROR (5xx) | Wait 5s and retry once |
NETWORK_ERROR | Ask user to check connectivity |
| Capability | Description |
|---|---|
| Single Contact Enrichment | Look up any person by name + company and get email, phone, LinkedIn |
| Single Company Enrichment | Get full company profile by name or domain |
| Bulk CSV Enrichment | Import a CSV, match records, enrich, and export enriched CSV |
| Inline List Enrichment | Paste a list of companies or contacts and get enriched data |
| Email Discovery | Find verified professional and personal email addresses |
| Phone Discovery | Find direct dial and mobile phone numbers |
| Firmographic Append | Add company size, revenue, industry, location to records |
| Tech Stack Append | Add technology stack data to company records |
| Funding Data Append | Add funding rounds, investors, total raised |
| Profile Completion | Add work history, education, demographics, LinkedIn URLs |
| Match & Deduplicate | Match your records to Explorium's database with match rates |
| Flexible Export | Export enriched data to CSV for CRM import |