@sellable/mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +355 -0
  4. package/dist/api.d.ts +21 -0
  5. package/dist/api.js +73 -0
  6. package/dist/auth.d.ts +60 -0
  7. package/dist/auth.js +246 -0
  8. package/dist/engage-memory.d.ts +63 -0
  9. package/dist/engage-memory.js +354 -0
  10. package/dist/index-dev.d.ts +2 -0
  11. package/dist/index-dev.js +17 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +8 -0
  14. package/dist/server.d.ts +1 -0
  15. package/dist/server.js +499 -0
  16. package/dist/skills.d.ts +11 -0
  17. package/dist/skills.js +97 -0
  18. package/dist/tools/auth.d.ts +30 -0
  19. package/dist/tools/auth.js +124 -0
  20. package/dist/tools/blueprint-commit.d.ts +174 -0
  21. package/dist/tools/blueprint-commit.js +286 -0
  22. package/dist/tools/bootstrap.d.ts +64 -0
  23. package/dist/tools/bootstrap.js +246 -0
  24. package/dist/tools/campaigns.d.ts +589 -0
  25. package/dist/tools/campaigns.js +892 -0
  26. package/dist/tools/cells.d.ts +58 -0
  27. package/dist/tools/cells.js +48 -0
  28. package/dist/tools/context.d.ts +88 -0
  29. package/dist/tools/context.js +271 -0
  30. package/dist/tools/csv-domains.d.ts +73 -0
  31. package/dist/tools/csv-domains.js +464 -0
  32. package/dist/tools/csv-linkedin.d.ts +102 -0
  33. package/dist/tools/csv-linkedin.js +712 -0
  34. package/dist/tools/direct-campaigns.d.ts +240 -0
  35. package/dist/tools/direct-campaigns.js +250 -0
  36. package/dist/tools/engage-bootstrap.d.ts +94 -0
  37. package/dist/tools/engage-bootstrap.js +205 -0
  38. package/dist/tools/engage-discovery.d.ts +78 -0
  39. package/dist/tools/engage-discovery.js +150 -0
  40. package/dist/tools/engage-memory.d.ts +181 -0
  41. package/dist/tools/engage-memory.js +143 -0
  42. package/dist/tools/engage-state.d.ts +72 -0
  43. package/dist/tools/engage-state.js +62 -0
  44. package/dist/tools/enrichment.d.ts +167 -0
  45. package/dist/tools/enrichment.js +174 -0
  46. package/dist/tools/flow-preflight.d.ts +68 -0
  47. package/dist/tools/flow-preflight.js +138 -0
  48. package/dist/tools/framework.d.ts +44 -0
  49. package/dist/tools/framework.js +153 -0
  50. package/dist/tools/interaction-mode.d.ts +27 -0
  51. package/dist/tools/interaction-mode.js +102 -0
  52. package/dist/tools/leads.d.ts +2417 -0
  53. package/dist/tools/leads.js +2307 -0
  54. package/dist/tools/linkedin.d.ts +210 -0
  55. package/dist/tools/linkedin.js +229 -0
  56. package/dist/tools/navigation.d.ts +91 -0
  57. package/dist/tools/navigation.js +381 -0
  58. package/dist/tools/one-off.d.ts +229 -0
  59. package/dist/tools/one-off.js +273 -0
  60. package/dist/tools/processing.d.ts +70 -0
  61. package/dist/tools/processing.js +56 -0
  62. package/dist/tools/prompts.d.ts +211 -0
  63. package/dist/tools/prompts.js +210 -0
  64. package/dist/tools/provider-preflight.d.ts +21 -0
  65. package/dist/tools/provider-preflight.js +59 -0
  66. package/dist/tools/readiness.d.ts +261 -0
  67. package/dist/tools/readiness.js +510 -0
  68. package/dist/tools/rows.d.ts +126 -0
  69. package/dist/tools/rows.js +105 -0
  70. package/dist/tools/rubrics.d.ts +497 -0
  71. package/dist/tools/rubrics.js +681 -0
  72. package/dist/tools/senders.d.ts +44 -0
  73. package/dist/tools/senders.js +69 -0
  74. package/dist/tools/sequencer.d.ts +127 -0
  75. package/dist/tools/sequencer.js +194 -0
  76. package/dist/tools/tables.d.ts +35 -0
  77. package/dist/tools/tables.js +36 -0
  78. package/dist/tools/verify-row.d.ts +36 -0
  79. package/dist/tools/verify-row.js +38 -0
  80. package/dist/tools/workspaces.d.ts +140 -0
  81. package/dist/tools/workspaces.js +139 -0
  82. package/dist/utils/workspace-root.d.ts +1 -0
  83. package/dist/utils/workspace-root.js +39 -0
  84. package/package.json +46 -0
  85. package/skills/building-gtm-tables/SKILL.md +216 -0
  86. package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
  87. package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
  88. package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
  89. package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
  90. package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
  91. package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
  92. package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
  93. package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
  94. package/skills/building-gtm-tables/references/verify-loop.md +74 -0
  95. package/skills/campaign-messages/SKILL.md +173 -0
  96. package/skills/campaign-messages/flow.v1.json +75 -0
  97. package/skills/craft-message/SKILL.md +401 -0
  98. package/skills/create-campaign/ARCHITECTURE.md +232 -0
  99. package/skills/create-campaign/DISCUSS.md +296 -0
  100. package/skills/create-campaign/FLOW_ASCII.md +240 -0
  101. package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
  102. package/skills/create-campaign/README.md +142 -0
  103. package/skills/create-campaign/SKILL.md +286 -0
  104. package/skills/create-campaign/context/README.md +67 -0
  105. package/skills/create-campaign/context/_TEMPLATE.md +12 -0
  106. package/skills/create-campaign/context/context.md +35 -0
  107. package/skills/create-campaign/context/learnings.md +16 -0
  108. package/skills/create-campaign/context/registry.json +19 -0
  109. package/skills/create-campaign/core/flow.v1.json +217 -0
  110. package/skills/create-campaign/core/policy.md +191 -0
  111. package/skills/create-campaign/core/providers/apollo.json +35 -0
  112. package/skills/create-campaign/core/providers/prospeo.json +34 -0
  113. package/skills/create-campaign/core/providers/registry.json +31 -0
  114. package/skills/create-campaign/core/providers/sales-nav.json +37 -0
  115. package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
  116. package/skills/create-campaign/references/brief-template.md +64 -0
  117. package/skills/create-campaign/references/campaign-quality.md +84 -0
  118. package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
  119. package/skills/create-campaign/references/offer-patterns.md +108 -0
  120. package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
  121. package/skills/create-campaign/references/question-examples.md +167 -0
  122. package/skills/create-campaign/references/token-fill-examples.md +81 -0
  123. package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
  124. package/skills/create-campaign-brief/DISCUSS.md +64 -0
  125. package/skills/create-campaign-brief/README.md +176 -0
  126. package/skills/create-campaign-brief/SKILL.md +537 -0
  127. package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
  128. package/skills/create-campaign-brief/references/brief-template.md +220 -0
  129. package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
  130. package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
  131. package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
  132. package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
  133. package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
  134. package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
  135. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
  136. package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
  137. package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
  138. package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
  139. package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
  140. package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
  141. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
  142. package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
  143. package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
  144. package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
  145. package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
  146. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
  147. package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
  148. package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
  149. package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
  150. package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
  151. package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
  152. package/skills/create-campaign-v2/SKILL.md +1619 -0
  153. package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
  154. package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
  155. package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
  156. package/skills/create-campaign-v2/core/policy.md +82 -0
  157. package/skills/create-campaign-v2/references/ai-tells.md +253 -0
  158. package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
  159. package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
  160. package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
  161. package/skills/create-campaign-v2/references/filter-leads.md +495 -0
  162. package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
  163. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
  164. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
  165. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
  166. package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
  167. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
  168. package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
  169. package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
  170. package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
  171. package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
  172. package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
  173. package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
  174. package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
  175. package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
  176. package/skills/create-campaign-v2-validation/SKILL.md +296 -0
  177. package/skills/create-post/SKILL.md +1308 -0
  178. package/skills/create-rubric/SKILL.md +251 -0
  179. package/skills/engage/SKILL.md +549 -0
  180. package/skills/engage/core/README.md +23 -0
  181. package/skills/engage/core/proven-searches.json +11 -0
  182. package/skills/engage/core/style-guide.template.md +47 -0
  183. package/skills/engage/core/tracked-people.json +10 -0
  184. package/skills/enrich-prospects/SKILL.md +97 -0
  185. package/skills/find-leads/SKILL.md +467 -0
  186. package/skills/generate-messages/SKILL.md +2361 -0
  187. package/skills/interview/SKILL.md +132 -0
  188. package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
  189. package/skills/interview/core/ICP.template.md +54 -0
  190. package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
  191. package/skills/providers/apollo.md +520 -0
  192. package/skills/providers/prospeo.md +398 -0
  193. package/skills/providers/sales-nav.md +372 -0
  194. package/skills/providers/signal-discovery.md +495 -0
  195. package/skills/research/SKILL.md +258 -0
  196. package/skills/research/config.json +9 -0
  197. package/skills/research/override.md +13 -0
  198. package/skills/research-prospect/SKILL.md +99 -0
  199. package/skills/research-sender/SKILL.md +158 -0
  200. package/skills/workflow-sequences/SKILL.md +85 -0
@@ -0,0 +1,398 @@
1
+ # Prospeo Enrichment Provider
2
+
3
+ Prospeo is a data enrichment API for finding verified emails and company data. Use it as an alternative to Apollo for lead enrichment.
4
+
5
+ ## Search + Import (MCP)
6
+
7
+ Prospeo supports search + import in the campaign builder flow.
8
+
9
+ ## Domain Filters (ABM / Account-Based Targeting)
10
+
11
+ When a user gives company domains:
12
+
13
+ 1. If the domains already live in a CSV file on disk, call `load_csv_domains`.
14
+ 2. If the user pasted raw domains into chat, call `save_domain_filters`.
15
+ 3. Report validation feedback.
16
+ 4. Pass the returned `domainFilterId` into `search_prospeo`.
17
+
18
+ **IMPORTANT:** NEVER pass raw domains to `search_prospeo`. ALWAYS create a `domainFilterId` first with `load_csv_domains` or `save_domain_filters`.
19
+
20
+ If a user gives company names instead of domains:
21
+
22
+ 1. Resolve each company to its official website domain (use web search).
23
+ 2. Build the include/exclude domain lists from those resolved domains.
24
+ 3. If the domains are now in a CSV file, call `load_csv_domains`; otherwise call `save_domain_filters`.
25
+ 4. Use returned `domainFilterId` in `search_prospeo`.
26
+
27
+ Example:
28
+
29
+ ```json
30
+ load_csv_domains({
31
+ "filePath": "/absolute/path/to/accounts.csv"
32
+ })
33
+ ```
34
+
35
+ ```json
36
+ load_csv_domains({
37
+ "filePath": "/absolute/path/to/accounts.csv",
38
+ "confirmed": true,
39
+ "confirmationToken": "preview-token"
40
+ })
41
+ ```
42
+
43
+ ```json
44
+ save_domain_filters({
45
+ "include": ["stripe.com", "notion.so", "linear.app"],
46
+ "exclude": ["competitor.com"]
47
+ })
48
+ ```
49
+
50
+ ```json
51
+ search_prospeo({
52
+ "campaignOfferId": "cmp_123",
53
+ "domainFilterId": "clx_abc123",
54
+ "filters": {
55
+ "person_seniority": { "include": ["Vice President"] }
56
+ }
57
+ })
58
+ ```
59
+
60
+ - Use `search_prospeo` with filters (and optional `domainFilterId`) to find leads.
61
+ - `search_prospeo` in MCP rejects raw domain inputs (`domains`) and nested company targeting (`filters.company.websites`, `filters.company.names`). Always use `load_csv_domains` for CSV-on-disk input or `save_domain_filters` for pasted/raw domain lists first.
62
+ - Pass `searchId` on subsequent pages to paginate.
63
+ - Use `import_leads` with `provider: \"prospeo\"` and the `searchId` to create a lead list and start import.
64
+ - **IMPORTANT:** If `import_leads` returns `needsModeSelection: true`, use `AskUserQuestion` to ask "add to existing leads or replace?" Do NOT assume.
65
+ - After the list finishes and the user confirms it looks good, call `confirm_lead_list` with the `jobId` and `targetLeadCount` from `import_leads` to import into the campaign table.
66
+ - Post-confirm routing order is required:
67
+ 1. `update_campaign({ currentStep: "filter-choice" })`
68
+ 2. `wait_for_campaign_table_ready({ campaignId })`
69
+ 3. `get_campaign_context({ campaignId, refresh: true })` then `get_rows_minimal(...)` for recommendation
70
+
71
+ **Required:** Always include `campaignOfferId` on new `search_prospeo` calls so searches persist in watch mode.
72
+
73
+ ## Prospeo Filters (search_prospeo)
74
+
75
+ Prospeo filters are split into person vs company. Most filters use `include` / `exclude` arrays, with a few special cases called out below.
76
+
77
+ ### Filter Selection Strategy (recommended order)
78
+
79
+ 1. Start with 2-3 anchors: role (`person_job_title` OR `person_department` + `person_seniority`) + company fit (`company_industry` or `domainFilterId`) + company size (`company_headcount_range`).
80
+ 2. Add geography: prefer `person_location_search`; use `company_location_search` only when HQ is part of ICP.
81
+ 3. Add precision filters last: `company_technology`, `company_funding`, `company_revenue`, `person_job_change`, `max_person_per_company`.
82
+ 4. Iterate one filter at a time:
83
+ - Too broad: add one narrowing filter.
84
+ - Too narrow: remove one hard constraint (exact title, tech, location, or funding) first.
85
+ 5. For function-specific lanes, prefer explicit function-title anchors before seniority widening:
86
+ - good: `Head of Security`, `Director of Security Operations`, `VP of Demand Gen`
87
+ - risky: bare `Head`, `Director`, `VP` plus a department guess
88
+ - if you widen with seniority, keep a matching department/function check and inspect the sample for `Head of X` leakage
89
+
90
+ Preference rules:
91
+
92
+ - For ABM lists, use `load_csv_domains` + `domainFilterId` when the accounts are already in a CSV file on disk.
93
+ - For pasted/raw domain lists, use `save_domain_filters` + `domainFilterId` instead of inline domains or `company.websites.include`.
94
+ - If user input starts as company names, resolve names to domains first, then use `save_domain_filters`.
95
+ - Prefer comprehensive `person_job_title.include` lists (synonyms + role variants) for role precision.
96
+ - Use `person_department + person_seniority` as supporting constraints when title variance is expected.
97
+ - In security, AppSec, SOC, RevOps, Demand Gen, and similar function-specific lanes, do not rely on bare `Head` / `Director` / `VP` widening by itself. Pair seniority with explicit function keywords in `person_job_title` and verify the sample for off-function titles like `Head of Social Media`.
98
+ - Prefer `company_headcount_range` for most sizing; use `company_headcount_custom` for precise numeric bounds.
99
+ - Prefer `company_industry` before `company_keywords`; use keywords for refinement, not first-pass targeting.
100
+
101
+ ### Person Filters
102
+
103
+ - `person_name`: include/exclude names
104
+ - `person_name_or_job_title`: string quick search
105
+ - `person_job_title`: use include/exclude OR `boolean_search` (not both)
106
+ - `person_seniority`: include-only (do not mix include + exclude)
107
+ - `person_department`: include-only (do not mix include + exclude)
108
+ - `person_location_search`: include/exclude location strings from Search Suggestions (accept raw `name` or `name #ISO`)
109
+ - `person_year_of_experience`, `person_time_in_current_role`, `person_time_in_current_company`: `{ min, max }`
110
+ - `person_contact_details`: `{ email: [], mobile: [], operator: "OR" | "AND" }`
111
+ - `person_job_change`: `{ timeframe_days, only_promotion, only_new_company }`
112
+ - `max_person_per_company`
113
+
114
+ Job title boolean syntax for `person_job_title.boolean_search`:
115
+ `term`, `"term"`, `'term'`, `!term`, `AND`, `OR`, `()`. Do not mix AND/OR at the same level without parentheses.
116
+
117
+ ### Company Filters (allowed inside /search-person)
118
+
119
+ - `company_industry`, `company_technology`, `company_email_provider`, `company_naics`, `company_sics`
120
+ - `company_headcount_range`: array of size strings (e.g., `["51-100", "101-200"]`)
121
+ - `company_headcount_custom`: `{ min, max }`
122
+ - `company_location_search`: include/exclude location strings from Search Suggestions
123
+ - `company_type`: single string (`"Private" | "Public" | "Non profit" | "Other"`)
124
+ - `company_funding`:
125
+ - `stage`: array of funding stages
126
+ - `funding_date`: days since last funding (`90`, `180`, `270`, `365`)
127
+ - `last_funding` / `total_funding`: `{ min, max }` string buckets (`"<100K"`, `"100K"`, `"500K"`, `"1M"`, `"5M"`, `"10M"`)
128
+ - `company_keywords`, `company_attributes`, `company_revenue`, `company_founded`, `company_headcount_growth`
129
+ - `company_job_posting_hiring_for`, `company_job_posting_quantity`, `company_headcount_by_department`
130
+
131
+ Domain note for MCP:
132
+
133
+ - Do NOT use `company.websites.include` or `company.names.include` in `search_prospeo`.
134
+ - Domain targeting in MCP must use `load_csv_domains` or `save_domain_filters` to create a `domainFilterId` first.
135
+
136
+ ### Example
137
+
138
+ ```json
139
+ search_prospeo({
140
+ "campaignOfferId": "cmp_123",
141
+ "searchName": "VP Sales at SaaS 50-200",
142
+ "domainFilterId": "clx_abc123",
143
+ "filters": {
144
+ "person_seniority": { "include": ["Vice President"] },
145
+ "person_department": { "include": ["Sales"] },
146
+ "person_location_search": { "include": ["United States"] },
147
+ "company_headcount_range": ["51-100", "101-200"],
148
+ "company_industry": { "include": ["Software Development"] },
149
+ "company_funding": { "stage": ["Series A"], "funding_date": 180 }
150
+ }
151
+ })
152
+ ```
153
+
154
+ ## Archetype Starters (quick recipes)
155
+
156
+ 1. Vertical SaaS (mid-market): Sales/Operations leaders, 51-500 employees, target vertical industry.
157
+ 2. Devtools: Engineering leadership titles, 51-1000 employees, technology include/exclude for stack fit.
158
+ 3. Recruiting/Staffing: TA/HR leadership titles, 201-5000 employees, people-location targeting for hiring market.
159
+ 4. Fintech compliance/security: Risk/Compliance/Security leadership with stage/revenue constraints.
160
+ 5. Agencies selling to growth teams: Marketing leadership in SMB/mid-market + industry fit.
161
+
162
+ ## When to Use Prospeo
163
+
164
+ - **Email Finding**: Get verified work emails from LinkedIn URLs
165
+ - **Lead Enrichment**: Add company data, job history, and contact info to leads
166
+ - **Bulk Operations**: Enrich up to 100 leads at once
167
+
168
+ ## Available Tools
169
+
170
+ ### save_domain_filters
171
+
172
+ Save include/exclude domain lists for Prospeo search and return a `domainFilterId`.
173
+
174
+ Inputs:
175
+
176
+ - `include?: string[]` (max 1000)
177
+ - `exclude?: string[]` (max 1000)
178
+
179
+ ### load_csv_domains
180
+
181
+ Preview and confirm a CSV file on disk, then return a `domainFilterId` for `search_prospeo`.
182
+
183
+ Use this when:
184
+
185
+ - the CSV already lives on the MCP host
186
+ - the user wants carryover columns preserved with the domain filter
187
+ - you need a bounded preview before upload
188
+
189
+ Important behavior:
190
+
191
+ - First call previews the file and returns a `confirmationToken`
192
+ - Confirm with the same file and token to create the `domainFilterId`
193
+ - Caps: `5 MB`, `7,500` rows, `1,000` unique candidate domains, `20` carryover columns
194
+ - Duplicate carryover rows are `last_wins`
195
+
196
+ Returns:
197
+
198
+ - `id` (domain filter id)
199
+ - `includeDomains`, `excludeDomains` (validated)
200
+ - `validation` feedback (`includeValid`, `includeInvalid`, `excludeValid`, `excludeInvalid`, `dropped`)
201
+
202
+ ### enrich_with_prospeo
203
+
204
+ Enrich a single person. Preferred input is LinkedIn URL.
205
+
206
+ **Inputs:**
207
+
208
+ - `linkedinUrl` (preferred) - LinkedIn profile URL
209
+ - OR: `firstName` + `lastName` + (`companyName` OR `companyWebsite`)
210
+ - `onlyVerifiedEmail` - Only return verified emails (default: true)
211
+ - `enrichMobile` - Include mobile number, costs 10 credits (default: false)
212
+
213
+ **Returns:**
214
+
215
+ - Person: name, title, headline, email, emailStatus, phone, location
216
+ - Company: name, domain, industry, employeeRange
217
+
218
+ **Cost:** 1 credit (10 if enrichMobile=true)
219
+
220
+ **Example:**
221
+
222
+ ```json
223
+ enrich_with_prospeo({
224
+ "linkedinUrl": "https://linkedin.com/in/johndoe"
225
+ })
226
+ ```
227
+
228
+ **Response:**
229
+
230
+ ```json
231
+ {
232
+ "success": true,
233
+ "creditsUsed": 1,
234
+ "person": {
235
+ "name": "John Doe",
236
+ "title": "VP of Sales",
237
+ "headline": "VP of Sales | B2B SaaS",
238
+ "email": "john.doe@company.com",
239
+ "emailStatus": "VERIFIED",
240
+ "linkedinUrl": "https://linkedin.com/in/johndoe",
241
+ "location": "San Francisco, CA, USA"
242
+ },
243
+ "company": {
244
+ "name": "Company Inc",
245
+ "domain": "company.com",
246
+ "industry": "Software",
247
+ "employeeRange": "51-200"
248
+ }
249
+ }
250
+ ```
251
+
252
+ ### bulk_enrich_with_prospeo
253
+
254
+ Enrich multiple people at once. Each input needs a unique identifier.
255
+
256
+ **Inputs:**
257
+
258
+ - `inputs` - Array of objects with:
259
+ - `identifier` (required) - Unique ID for correlation
260
+ - `linkedin_url` OR name+company fields
261
+ - `onlyVerifiedEmail` (default: true)
262
+
263
+ **Returns:**
264
+
265
+ - `matched` - Array of successful enrichments
266
+ - `notMatched` - Array of identifiers that couldn't be found
267
+ - `summary` - Counts of requested/matched/notMatched
268
+
269
+ **Cost:** 1 credit per match (not per request)
270
+
271
+ **Example:**
272
+
273
+ ```json
274
+ bulk_enrich_with_prospeo({
275
+ "inputs": [
276
+ { "identifier": "lead-1", "linkedin_url": "https://linkedin.com/in/johndoe" },
277
+ { "identifier": "lead-2", "first_name": "Jane", "last_name": "Smith", "company_name": "Acme Corp" }
278
+ ]
279
+ })
280
+ ```
281
+
282
+ **Response:**
283
+
284
+ ```json
285
+ {
286
+ "success": true,
287
+ "totalCost": 2,
288
+ "summary": { "requested": 2, "matched": 2, "notMatched": 0, "invalid": 0 },
289
+ "matched": [
290
+ {
291
+ "identifier": "lead-1",
292
+ "name": "John Doe",
293
+ "email": "john@company.com",
294
+ "emailStatus": "VERIFIED",
295
+ "company": "Company Inc"
296
+ },
297
+ {
298
+ "identifier": "lead-2",
299
+ "name": "Jane Smith",
300
+ "email": "jane@acme.com",
301
+ "emailStatus": "VERIFIED",
302
+ "company": "Acme Corp"
303
+ }
304
+ ],
305
+ "notMatched": [],
306
+ "invalidDatapoints": []
307
+ }
308
+ ```
309
+
310
+ ### get_prospeo_credits
311
+
312
+ Check remaining credits before bulk operations.
313
+
314
+ **Returns:**
315
+
316
+ - `remainingCredits` - Credits available
317
+ - `plan` - Current subscription plan
318
+ - `renewsInDays` - Days until quota resets
319
+
320
+ **Example:**
321
+
322
+ ```json
323
+ get_prospeo_credits({})
324
+ ```
325
+
326
+ **Response:**
327
+
328
+ ```json
329
+ {
330
+ "plan": "Business",
331
+ "remainingCredits": 4500,
332
+ "usedCredits": 500,
333
+ "renewsInDays": 15
334
+ }
335
+ ```
336
+
337
+ ## Workflow Patterns
338
+
339
+ ### Single Lead Enrichment
340
+
341
+ ```
342
+ 1. User provides LinkedIn URL
343
+ 2. Call enrich_with_prospeo with linkedinUrl
344
+ 3. If emailStatus is "VERIFIED", proceed with outreach
345
+ 4. If emailStatus is "UNAVAILABLE" or null, note that no verified email exists
346
+ ```
347
+
348
+ ### Bulk Lead Enrichment
349
+
350
+ ```
351
+ 1. Check credits: get_prospeo_credits
352
+ 2. Prepare inputs with unique identifiers (e.g., row IDs)
353
+ 3. Call bulk_enrich_with_prospeo (max 100 per call)
354
+ 4. Map matched results back using identifier
355
+ 5. Handle notMatched entries (may need Apollo fallback)
356
+ ```
357
+
358
+ ### Email Status Values
359
+
360
+ | Status | Meaning | Action |
361
+ | ------------- | -------------------------------- | ------------------------ |
362
+ | `VERIFIED` | Email confirmed deliverable | Safe to use for outreach |
363
+ | `CATCH_ALL` | Domain accepts all emails | May work, higher risk |
364
+ | `UNAVAILABLE` | No email found | Try alternative methods |
365
+ | `INVALID` | Email exists but not deliverable | Do not use |
366
+
367
+ ## Apollo vs Prospeo Comparison
368
+
369
+ | Feature | Apollo | Prospeo |
370
+ | ------------------ | --------------- | -------------------------- |
371
+ | Best for | Search + enrich | Direct LinkedIn enrichment |
372
+ | LinkedIn URL input | Via bulk_match | Native support |
373
+ | Email verification | Separate step | Included |
374
+ | Mobile numbers | Via enrichment | 10 credits extra |
375
+ | Max bulk size | 10 | 100 |
376
+ | Duplicate handling | Charged | FREE (same record twice) |
377
+
378
+ **Recommendation:** Use Prospeo when you have LinkedIn URLs. Use Apollo when you need to search by filters (titles, company size, industry, etc.).
379
+
380
+ ## Credit Management
381
+
382
+ | Operation | Cost |
383
+ | -------------------- | ---------------------------------- |
384
+ | Single enrich | 1 credit |
385
+ | Bulk enrich | 1 credit per match (not per input) |
386
+ | Mobile number | +10 credits |
387
+ | Account info | FREE |
388
+ | Duplicate enrichment | FREE (same record twice) |
389
+
390
+ Always check `get_prospeo_credits` before large bulk operations.
391
+
392
+ ## Best Practices
393
+
394
+ 1. **Prefer LinkedIn URLs** - Higher match rate than name+company
395
+ 2. **Check credits first** - Avoid failed bulk operations
396
+ 3. **Use identifiers** - Map results back to your data source
397
+ 4. **Handle failures gracefully** - Some leads won't match
398
+ 5. **Batch efficiently** - Use bulk for 10+ leads to reduce API calls