From openfunnel
Enriches OpenFunnel-discovered people with work emails and phone numbers via bash API scripts. Requires prior discovery through signals, enrichment, or ICP matching.
npx claudepluginhub openfunnel/openfunnel-skillsThis skill uses the workspace's default tool permissions.
Enrich people already in OpenFunnel with work email addresses and/or phone numbers. This only works with people discovered through OpenFunnel signals, enrichment, or ICP matching — you cannot enrich arbitrary contacts.
Enriches LinkedIn profiles from people-search with verified emails and phones using providers like Prospeo or Fullenrich. Supports single-provider and waterfall modes; outputs contact CSV.
Implements Apollo.io workflows for free people/org searches by domains, titles, seniorities, locations and paid enrichment. Includes TypeScript/Node.js code examples using correct API endpoints.
Activate for: enrich, CRM enrichment, update CRM, data enrichment, stale data, missing data, contact data, company data, verify email, verify contact, update record, data hygiene, CRM cleanup, enrich leads, refresh accounts, outdated records, data quality. NOT for: prospect research briefs (use prospect-research), lead scoring (use lead-scoring), bulk automated enrichment scheduling (use crm-hygiene-agent), pipeline analysis (use pipeline).
Share bugs, ideas, or general feedback.
Enrich people already in OpenFunnel with work email addresses and/or phone numbers. This only works with people discovered through OpenFunnel signals, enrichment, or ICP matching — you cannot enrich arbitrary contacts.
This skill bundles two scripts in the same directory as this SKILL.md file. Never read or reference API credentials directly.
signup.sh — handles authentication. Writes credentials to .env internally. Never exposes the API key.api.sh — handles all authenticated API calls. Reads credentials from .env internally.First, resolve the script paths relative to this file's location:
SKILL_DIR="$(dirname "$(find ~/.agents/skills -name SKILL.md -path "*/enrich-people-with-email-and-phone/*" 2>/dev/null | head -1)")"
API="$SKILL_DIR/api.sh"
SIGNUP="$SKILL_DIR/signup.sh"
Then use $SIGNUP for auth and $API for all other calls.
api.sh.Before anything, test if credentials are working by running:
bash "$API" POST /api/v1/signal/get-signal-list '{"pagination": {"limit": 1, "offset": 0}}'
If the call succeeds (returns JSON with signals): skip to Step 1.
If the call fails (returns an error or missing credentials message):
### Welcome to OpenFunnel
OpenFunnel turns daily events in your market into pipeline
— using OpenFunnel's Event Intelligence engine.
To get started, I'll authenticate you via the API.
**What's your work email?**
Wait for user input. Then:
bash "$SIGNUP" start "<user_email>"
{"status": "verification_code_sent", "email": "..."} on successI sent a 6-digit verification code to **{email}**. Reply with the code.
bash "$SIGNUP" verify "<user_email>" "<code>"
{"status": "authenticated", "user_id": "..."}. Credentials are written to .env and .gitignore is updated automatically.{"status": "failed", ...}bash "$API" POST /api/v1/signal/get-signal-list '{"pagination": {"limit": 1, "offset": 0}}'The user needs to tell you which people to enrich. There are three ways to get people IDs:
If the user names a company or gives an account ID, fetch people from that account:
bash "$API" POST /api/v2/account/batch '{"account_ids": [<id>], "icp_people_page": 1, "icp_people_page_size": 100}'
The response contains icp_people with person_id for each person.
If the user wants to enrich a filtered set of people (e.g. "all VPs in Engineering"), first get available filters:
bash "$API" GET /api/v1/people/filters
This returns all filterable fields with their valid options. Then fetch matching people IDs:
bash "$API" POST /api/v1/people/list '{"filters": {<user_filters>}, "page": 0, "page_size": 500}'
Returns people_ids array and total_count.
If the user provides people IDs directly (from a previous signal, enrichment, or other skill), use those.
Present the enrichment plan before running:
### Enrichment Plan
**People to enrich:** {count} people
**Enrich emails:** {yes/no}
**Enrich phones:** {yes/no}
⚡ *Only successful finds consume credits. Max 500 people per request.*
Proceed? (yes / no)
If the user has more than 500 people, explain that enrichment will be batched in chunks of 500.
Ask the user what they want enriched if they haven't specified:
What contact info do you need?
1. **Work emails only** (default)
2. **Phone numbers only**
3. **Both emails and phone numbers**
bash "$API" POST /api/v1/enrich/people '{"people_ids": [<ids>], "enrich_emails": true, "enrich_phones": false}'
Then poll for completion:
bash "$API" GET /api/v1/enrich/people/<job_id>
Polling guidance:
status is completed or failedWhen the job completes, present the results:
### Enrichment Complete
**Total processed:** {progress.total}
**Emails found:** {progress.emails_found}
**Phones found:** {progress.phones_found}
**Credits used:** {credits_used.total}
| Name | Email | Phone | Status |
|------|-------|-------|--------|
| {person_name} | {email or "—"} | {phone_number or "—"} | {status} |
| ... | ... | ... | ... |
Status meanings:
enriched — contact info foundalready_enriched — already had this infonot_found — lookup completed but no resultno_linkedin_url — can't enrich without a LinkedIn URLerror — enrichment failed for this person### What would you like to do next?
1. **Enrich more people** — different account, different filters
2. **Export to CRM** — push enriched contacts to Salesforce or HubSpot
3. **Research an account** — deep dive into a specific company