linkedin-secret-sauce 0.12.0 → 0.12.2

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 (44) hide show
  1. package/README.md +50 -21
  2. package/dist/cosiall-client.d.ts +1 -1
  3. package/dist/cosiall-client.js +1 -1
  4. package/dist/enrichment/index.d.ts +3 -3
  5. package/dist/enrichment/index.js +19 -2
  6. package/dist/enrichment/matching.d.ts +29 -9
  7. package/dist/enrichment/matching.js +545 -142
  8. package/dist/enrichment/providers/bounceban.d.ts +82 -0
  9. package/dist/enrichment/providers/bounceban.js +447 -0
  10. package/dist/enrichment/providers/bouncer.d.ts +1 -1
  11. package/dist/enrichment/providers/bouncer.js +19 -21
  12. package/dist/enrichment/providers/construct.d.ts +1 -1
  13. package/dist/enrichment/providers/construct.js +22 -38
  14. package/dist/enrichment/providers/cosiall.d.ts +27 -0
  15. package/dist/enrichment/providers/cosiall.js +109 -0
  16. package/dist/enrichment/providers/dropcontact.d.ts +15 -9
  17. package/dist/enrichment/providers/dropcontact.js +188 -19
  18. package/dist/enrichment/providers/hunter.d.ts +8 -1
  19. package/dist/enrichment/providers/hunter.js +52 -28
  20. package/dist/enrichment/providers/index.d.ts +10 -7
  21. package/dist/enrichment/providers/index.js +12 -1
  22. package/dist/enrichment/providers/ldd.d.ts +1 -10
  23. package/dist/enrichment/providers/ldd.js +20 -97
  24. package/dist/enrichment/providers/smartprospect.js +28 -48
  25. package/dist/enrichment/providers/snovio.d.ts +1 -1
  26. package/dist/enrichment/providers/snovio.js +29 -31
  27. package/dist/enrichment/providers/trykitt.d.ts +63 -0
  28. package/dist/enrichment/providers/trykitt.js +210 -0
  29. package/dist/enrichment/types.d.ts +234 -17
  30. package/dist/enrichment/types.js +60 -48
  31. package/dist/enrichment/utils/candidate-parser.d.ts +107 -0
  32. package/dist/enrichment/utils/candidate-parser.js +173 -0
  33. package/dist/enrichment/utils/noop-provider.d.ts +39 -0
  34. package/dist/enrichment/utils/noop-provider.js +37 -0
  35. package/dist/enrichment/utils/rate-limiter.d.ts +103 -0
  36. package/dist/enrichment/utils/rate-limiter.js +204 -0
  37. package/dist/enrichment/utils/validation.d.ts +75 -3
  38. package/dist/enrichment/utils/validation.js +164 -11
  39. package/dist/linkedin-api.d.ts +40 -1
  40. package/dist/linkedin-api.js +160 -27
  41. package/dist/types.d.ts +50 -1
  42. package/dist/utils/lru-cache.d.ts +105 -0
  43. package/dist/utils/lru-cache.js +175 -0
  44. package/package.json +25 -26
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * TryKitt.ai Email Finder Provider
4
+ *
5
+ * AI-powered email finding with enterprise identity server verification.
6
+ * FREE for individuals with unlimited searches.
7
+ *
8
+ * Features:
9
+ * - Email finding by name + domain
10
+ * - Enterprise identity server catch-all verification (more accurate than SMTP)
11
+ * - <0.1% bounce rate claimed
12
+ * - 2-5x faster than traditional SMTP verification
13
+ *
14
+ * API Endpoints:
15
+ * - POST /job/find-email - Find email by name + domain
16
+ * - POST /job/verify-email - Verify existing email
17
+ *
18
+ * Rate Limits (Free tier):
19
+ * - 2 requests/second
20
+ * - 120 requests/minute
21
+ * - Unlimited monthly quota
22
+ *
23
+ * @see https://trykitt.ai
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.createTryKittProvider = createTryKittProvider;
27
+ exports.findEmailWithTryKitt = findEmailWithTryKitt;
28
+ exports.verifyEmailWithTryKitt = verifyEmailWithTryKitt;
29
+ const http_retry_1 = require("../utils/http-retry");
30
+ const candidate_parser_1 = require("../utils/candidate-parser");
31
+ const noop_provider_1 = require("../utils/noop-provider");
32
+ const DEFAULT_API_URL = "https://api.trykitt.ai";
33
+ const DEFAULT_TIMEOUT_MS = 30000;
34
+ /**
35
+ * Extract TryKitt-specific inputs from candidate using shared parser
36
+ */
37
+ function extractTryKittInputs(candidate) {
38
+ const name = (0, candidate_parser_1.extractName)(candidate);
39
+ const { domain } = (0, candidate_parser_1.extractCompany)(candidate);
40
+ const linkedin = (0, candidate_parser_1.extractLinkedIn)(candidate);
41
+ // Build LinkedIn URL from username if URL not available
42
+ const linkedinUrl = linkedin.url ||
43
+ (linkedin.username ? (0, candidate_parser_1.buildLinkedInUrl)(linkedin.username) : null);
44
+ return {
45
+ fullName: name.fullName || null,
46
+ firstName: name.firstName || null,
47
+ lastName: name.lastName || null,
48
+ domain,
49
+ linkedinUrl,
50
+ };
51
+ }
52
+ /**
53
+ * Map TryKitt confidence to our 0-100 scale
54
+ * TryKitt returns confidence as 0-1 decimal OR 0-100 percentage
55
+ */
56
+ function normalizeConfidence(confidence) {
57
+ // If confidence is <= 1, treat as decimal and convert to percentage
58
+ if (confidence <= 1) {
59
+ return Math.round(confidence * 100);
60
+ }
61
+ // Already a percentage
62
+ return Math.round(confidence);
63
+ }
64
+ /**
65
+ * Create the TryKitt.ai email finder provider
66
+ *
67
+ * This provider uses TryKitt's AI-powered email finding with enterprise
68
+ * identity server verification for catch-all domains.
69
+ */
70
+ function createTryKittProvider(config) {
71
+ const { apiKey, apiUrl = DEFAULT_API_URL, timeoutMs = DEFAULT_TIMEOUT_MS, } = config;
72
+ if (!apiKey) {
73
+ return (0, noop_provider_1.createNoOpProvider)("trykitt");
74
+ }
75
+ /**
76
+ * Find email for a candidate
77
+ */
78
+ async function findEmail(candidate) {
79
+ const { fullName, domain, linkedinUrl } = extractTryKittInputs(candidate);
80
+ // Need at least name and domain to search
81
+ if (!(0, http_retry_1.truthy)(fullName) || !(0, http_retry_1.truthy)(domain)) {
82
+ return null;
83
+ }
84
+ try {
85
+ // Build request body
86
+ const body = {
87
+ full_name: fullName,
88
+ domain: domain,
89
+ };
90
+ // Add LinkedIn URL if available (improves accuracy)
91
+ if (linkedinUrl) {
92
+ body.linkedin_url = linkedinUrl;
93
+ }
94
+ const response = await (0, http_retry_1.postWithRetry)(`${apiUrl}/job/find-email`, body, {
95
+ Authorization: `Bearer ${apiKey}`,
96
+ }, {
97
+ retries: 2,
98
+ backoffMs: 500,
99
+ timeoutMs,
100
+ retryOnStatus: [429, 500, 502, 503, 504],
101
+ });
102
+ // Check if job completed successfully
103
+ if (response.status !== "completed") {
104
+ return null;
105
+ }
106
+ // Check if email was found
107
+ if (!response.result || !response.result.email) {
108
+ return null;
109
+ }
110
+ const result = response.result;
111
+ // Map confidence score
112
+ const confidence = normalizeConfidence(result.confidence_score ?? result.confidence ?? 0);
113
+ // Determine verification status
114
+ // TryKitt verifies emails, so if confidence is high, consider verified
115
+ const verified = confidence >= 80 &&
116
+ result.verification_type !== "unverified" &&
117
+ !result.is_catchall;
118
+ return {
119
+ email: result.email,
120
+ verified,
121
+ score: confidence,
122
+ };
123
+ }
124
+ catch {
125
+ // Silently fail - let other providers try
126
+ return null;
127
+ }
128
+ }
129
+ // Mark provider name for orchestrator
130
+ findEmail.__name = "trykitt";
131
+ return findEmail;
132
+ }
133
+ /**
134
+ * Standalone function to find email via TryKitt.ai
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * const result = await findEmailWithTryKitt('John Doe', 'example.com', {
139
+ * apiKey: process.env.TRYKITT_API_KEY,
140
+ * });
141
+ * console.log(result?.email); // john.doe@example.com
142
+ * ```
143
+ */
144
+ async function findEmailWithTryKitt(fullName, domain, config, linkedinUrl) {
145
+ const { apiKey, apiUrl = DEFAULT_API_URL, timeoutMs = DEFAULT_TIMEOUT_MS, } = config;
146
+ if (!apiKey) {
147
+ return null;
148
+ }
149
+ try {
150
+ const body = {
151
+ full_name: fullName,
152
+ domain: domain,
153
+ };
154
+ if (linkedinUrl) {
155
+ body.linkedin_url = linkedinUrl;
156
+ }
157
+ const response = await (0, http_retry_1.postWithRetry)(`${apiUrl}/job/find-email`, body, {
158
+ Authorization: `Bearer ${apiKey}`,
159
+ }, {
160
+ retries: 2,
161
+ backoffMs: 500,
162
+ timeoutMs,
163
+ });
164
+ return response;
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ }
170
+ /**
171
+ * Verify an email address via TryKitt.ai
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * const result = await verifyEmailWithTryKitt('john@example.com', {
176
+ * apiKey: process.env.TRYKITT_API_KEY,
177
+ * });
178
+ * console.log(result?.result?.valid); // true
179
+ * console.log(result?.result?.is_catchall); // false
180
+ * ```
181
+ */
182
+ async function verifyEmailWithTryKitt(email, config) {
183
+ const { apiKey, apiUrl = DEFAULT_API_URL, timeoutMs = DEFAULT_TIMEOUT_MS, } = config;
184
+ if (!apiKey) {
185
+ return null;
186
+ }
187
+ try {
188
+ const response = await (0, http_retry_1.postWithRetry)(`${apiUrl}/job/verify-email`, { email }, {
189
+ Authorization: `Bearer ${apiKey}`,
190
+ }, {
191
+ retries: 2,
192
+ backoffMs: 500,
193
+ timeoutMs,
194
+ });
195
+ if (response.status !== "completed" || !response.result) {
196
+ return null;
197
+ }
198
+ return {
199
+ valid: response.result.valid,
200
+ deliverable: response.result.deliverable,
201
+ confidence: normalizeConfidence(response.result.confidence),
202
+ isCatchAll: response.result.is_catchall ?? false,
203
+ isDisposable: response.result.is_disposable ?? false,
204
+ isRoleAccount: response.result.is_role_account ?? false,
205
+ };
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ }
@@ -45,7 +45,7 @@ export interface ProviderMultiResult {
45
45
  /**
46
46
  * Email type classification
47
47
  */
48
- export type EmailType = 'business' | 'personal' | 'disposable' | 'role' | 'unknown';
48
+ export type EmailType = "business" | "personal" | "disposable" | "role" | "unknown";
49
49
  /**
50
50
  * Individual enriched email with full metadata
51
51
  */
@@ -112,6 +112,9 @@ export interface EnrichmentCandidate {
112
112
  linkedin_url?: string;
113
113
  linkedinId?: string;
114
114
  linkedin_id?: string;
115
+ /** LinkedIn handle/vanity (e.g., "john-doe" from linkedin.com/in/john-doe) - best for Hunter.io */
116
+ linkedinHandle?: string;
117
+ linkedin_handle?: string;
115
118
  numericLinkedInId?: string;
116
119
  numeric_linkedin_id?: string;
117
120
  objectUrn?: string;
@@ -160,6 +163,197 @@ export interface LddConfig {
160
163
  export interface DropcontactConfig {
161
164
  apiKey: string;
162
165
  }
166
+ /**
167
+ * TryKitt.ai provider configuration
168
+ *
169
+ * TryKitt.ai provides AI-powered email finding with enterprise identity server
170
+ * verification for catch-all domains. FREE for individuals, unlimited searches.
171
+ *
172
+ * Features:
173
+ * - Email finding by name + domain
174
+ * - Enterprise identity server catch-all verification
175
+ * - <0.1% bounce rate claimed
176
+ * - 2-5x faster than traditional SMTP verification
177
+ *
178
+ * @see https://trykitt.ai
179
+ */
180
+ export interface TryKittConfig {
181
+ /** TryKitt API key (Bearer token) */
182
+ apiKey: string;
183
+ /** API URL override (default: https://api.trykitt.ai) */
184
+ apiUrl?: string;
185
+ /** Timeout in ms (default: 30000) */
186
+ timeoutMs?: number;
187
+ }
188
+ /**
189
+ * TryKitt.ai find email response result
190
+ */
191
+ export interface TryKittFindEmailResult {
192
+ /** Found email address */
193
+ email: string;
194
+ /** First name */
195
+ first_name?: string;
196
+ /** Last name */
197
+ last_name?: string;
198
+ /** Domain searched */
199
+ domain: string;
200
+ /** Confidence score (0-1 decimal or 0-100 percentage) */
201
+ confidence: number;
202
+ /** Confidence as percentage (0-100) */
203
+ confidence_score?: number;
204
+ /** Sources used to find email */
205
+ sources?: string[];
206
+ /** Verification type: "smtp_verified", "enterprise_identity_server", etc. */
207
+ verification_type?: string;
208
+ /** Whether domain is catch-all */
209
+ is_catchall?: boolean;
210
+ /** Whether email is a role account (info@, support@) */
211
+ is_role_account?: boolean;
212
+ /** Company name if found */
213
+ company?: string;
214
+ /** Job title if found */
215
+ title?: string;
216
+ }
217
+ /**
218
+ * TryKitt.ai API response for find-email endpoint
219
+ */
220
+ export interface TryKittFindEmailResponse {
221
+ /** Job ID */
222
+ id: string;
223
+ /** Status: "completed", "pending", "failed" */
224
+ status: string;
225
+ /** When job was created */
226
+ created_at: string;
227
+ /** When job completed */
228
+ completed_at?: string;
229
+ /** Result data (null if not found) */
230
+ result: TryKittFindEmailResult | null;
231
+ /** Error message if failed */
232
+ error?: string;
233
+ /** Error code */
234
+ error_code?: string;
235
+ /** Custom data passed in request */
236
+ custom_data?: Record<string, unknown>;
237
+ }
238
+ /**
239
+ * TryKitt.ai verify email response result
240
+ */
241
+ export interface TryKittVerifyEmailResult {
242
+ /** Email verified */
243
+ email: string;
244
+ /** Whether email is valid */
245
+ valid: boolean;
246
+ /** Whether email is deliverable */
247
+ deliverable: boolean;
248
+ /** Confidence score (0-1) */
249
+ confidence: number;
250
+ /** Verification type used */
251
+ verification_type?: string;
252
+ /** Whether domain is catch-all */
253
+ is_catchall?: boolean;
254
+ /** Whether email is disposable */
255
+ is_disposable?: boolean;
256
+ /** Whether email is a role account */
257
+ is_role_account?: boolean;
258
+ /** Whether email is from free provider (Gmail, Yahoo) */
259
+ is_free_email?: boolean;
260
+ /** SMTP status */
261
+ smtp_status?: string;
262
+ /** Bounce type: "none", "soft", "hard" */
263
+ bounce_type?: string;
264
+ /** Suggested correction for typos */
265
+ suggestion?: string;
266
+ /** Whether domain has MX records */
267
+ domain_mx?: boolean;
268
+ /** Whether domain has SPF record */
269
+ domain_spf?: boolean;
270
+ /** Whether domain has DMARC record */
271
+ domain_dmarc?: boolean;
272
+ }
273
+ /**
274
+ * TryKitt.ai API response for verify-email endpoint
275
+ */
276
+ export interface TryKittVerifyEmailResponse {
277
+ /** Job ID */
278
+ id: string;
279
+ /** Status: "completed", "pending", "failed" */
280
+ status: string;
281
+ /** When job was created */
282
+ created_at: string;
283
+ /** When job completed */
284
+ completed_at?: string;
285
+ /** Result data */
286
+ result: TryKittVerifyEmailResult | null;
287
+ /** Custom data passed in request */
288
+ custom_data?: Record<string, unknown>;
289
+ }
290
+ /**
291
+ * BounceBan provider configuration
292
+ *
293
+ * BounceBan specializes in catch-all email verification with 85-95% accuracy
294
+ * using proprietary algorithms WITHOUT sending actual emails.
295
+ *
296
+ * Features:
297
+ * - Catch-all domain verification (industry-leading)
298
+ * - DeepVerify mode for pattern-guessed emails
299
+ * - Waterfall endpoint with free 30-min retry window
300
+ * - Single email verification is FREE
301
+ *
302
+ * @see https://bounceban.com
303
+ */
304
+ export interface BounceBanConfig {
305
+ /** BounceBan API key */
306
+ apiKey: string;
307
+ /** API URL override (default: https://api.bounceban.com) */
308
+ apiUrl?: string;
309
+ /** Waterfall API URL (default: https://api-waterfall.bounceban.com) */
310
+ waterfallApiUrl?: string;
311
+ /** Timeout in ms (default: 80000 for waterfall, 30000 for standard) */
312
+ timeoutMs?: number;
313
+ /** Use DeepVerify mode when company domain is confirmed (default: false) */
314
+ useDeepVerify?: boolean;
315
+ /** Use waterfall endpoint for better catch-all handling (default: true) */
316
+ useWaterfall?: boolean;
317
+ }
318
+ /**
319
+ * BounceBan verification result
320
+ */
321
+ export type BounceBanResult = "deliverable" | "risky" | "undeliverable" | "unknown";
322
+ /**
323
+ * BounceBan API response for single verification
324
+ */
325
+ export interface BounceBanVerifyResponse {
326
+ /** Unique verification ID */
327
+ id: string;
328
+ /** Status: "success", "pending", "error" */
329
+ status: string;
330
+ /** Email that was verified */
331
+ email: string;
332
+ /** Verification result */
333
+ result: BounceBanResult;
334
+ /** Deliverability score (0-100) */
335
+ score: number;
336
+ /** Whether email is from disposable domain */
337
+ is_disposable: boolean;
338
+ /** Whether domain is catch-all (accept-all) */
339
+ is_accept_all: boolean;
340
+ /** Whether email is a role account */
341
+ is_role: boolean;
342
+ /** Whether email is from free provider */
343
+ is_free: boolean;
344
+ /** MX records for the domain */
345
+ mx_records?: string[];
346
+ /** SMTP provider name (e.g., "Google", "Microsoft") */
347
+ smtp_provider?: string;
348
+ /** Verification mode used */
349
+ mode?: "regular" | "deepverify";
350
+ /** When verification completed */
351
+ verify_at?: string;
352
+ /** Credits consumed for this verification */
353
+ credits_consumed?: number;
354
+ /** Remaining credits */
355
+ credits_remaining?: number;
356
+ }
163
357
  /**
164
358
  * Bouncer.io provider configuration
165
359
  *
@@ -179,11 +373,11 @@ export interface BouncerConfig {
179
373
  /**
180
374
  * Bouncer verification result status
181
375
  */
182
- export type BouncerStatus = 'deliverable' | 'undeliverable' | 'risky' | 'unknown';
376
+ export type BouncerStatus = "deliverable" | "undeliverable" | "risky" | "unknown";
183
377
  /**
184
378
  * Bouncer verification result reason
185
379
  */
186
- export type BouncerReason = 'accepted_email' | 'rejected_email' | 'invalid_domain' | 'invalid_email' | 'unavailable_smtp' | 'dns_error' | 'low_deliverability' | 'low_quality' | 'catch_all' | 'full_mailbox' | 'role_account' | 'disposable' | 'timeout' | 'unknown';
380
+ export type BouncerReason = "accepted_email" | "rejected_email" | "invalid_domain" | "invalid_email" | "unavailable_smtp" | "dns_error" | "low_deliverability" | "low_quality" | "catch_all" | "full_mailbox" | "role_account" | "disposable" | "timeout" | "unknown";
187
381
  /**
188
382
  * Bouncer API response for single email verification
189
383
  */
@@ -232,7 +426,7 @@ export interface SnovioConfig {
232
426
  /**
233
427
  * Snov.io email verification status
234
428
  */
235
- export type SnovioVerificationStatus = 'valid' | 'not_valid' | 'catch_all' | 'unverifiable' | 'unknown';
429
+ export type SnovioVerificationStatus = "valid" | "not_valid" | "catch_all" | "unverifiable" | "unknown";
236
430
  /**
237
431
  * Snov.io email result
238
432
  */
@@ -244,7 +438,7 @@ export interface SnovioEmailResult {
244
438
  position?: string;
245
439
  sourcePage?: string;
246
440
  companyName?: string;
247
- type?: 'prospect' | 'personal';
441
+ type?: "prospect" | "personal";
248
442
  status?: string;
249
443
  }
250
444
  /**
@@ -274,6 +468,16 @@ export interface ConstructConfig {
274
468
  /** Delay between SMTP verification checks in ms (default: 2000) */
275
469
  smtpVerifyDelayMs?: number;
276
470
  }
471
+ /**
472
+ * Cosiall Profile Emails provider configuration
473
+ *
474
+ * Uses Cosiall FlexIQ Profile Emails API to lookup emails for LinkedIn profiles.
475
+ * This is FREE - no API key needed (uses global Cosiall config).
476
+ */
477
+ export interface CosiallConfig {
478
+ /** Whether to enable the provider (default: true) */
479
+ enabled?: boolean;
480
+ }
277
481
  /**
278
482
  * All provider configurations
279
483
  */
@@ -281,10 +485,16 @@ export interface ProvidersConfig {
281
485
  construct?: ConstructConfig;
282
486
  ldd?: LddConfig;
283
487
  smartprospect?: SmartProspectConfig;
488
+ /** Cosiall Profile Emails (FREE - uses global Cosiall config) */
489
+ cosiall?: CosiallConfig;
490
+ /** TryKitt.ai AI email finder (FREE for individuals, unlimited) */
491
+ trykitt?: TryKittConfig;
284
492
  hunter?: HunterConfig;
285
493
  dropcontact?: DropcontactConfig;
286
494
  /** Bouncer.io for SMTP email verification (99%+ accuracy) */
287
495
  bouncer?: BouncerConfig;
496
+ /** BounceBan catch-all verification (FREE single, 85-95% accuracy) */
497
+ bounceban?: BounceBanConfig;
288
498
  /** Snov.io for email finding (98% delivery rate) */
289
499
  snovio?: SnovioConfig;
290
500
  }
@@ -365,21 +575,25 @@ export interface EnrichmentClient {
365
575
  /**
366
576
  * Available provider names
367
577
  */
368
- export type ProviderName = "construct" | "ldd" | "smartprospect" | "hunter" | "dropcontact" | "bouncer" | "snovio";
578
+ export type ProviderName = "construct" | "ldd" | "smartprospect" | "cosiall" | "trykitt" | "hunter" | "dropcontact" | "bouncer" | "bounceban" | "snovio";
369
579
  /**
370
- * Default provider order - 2-Phase Strategy
580
+ * Default provider order - 3-Phase Strategy
371
581
  *
372
582
  * PHASE 1 - Free lookups (run in parallel):
373
583
  * - ldd: LinkedIn Data Dump - real verified emails (FREE with subscription)
374
584
  * - smartprospect: SmartLead API - real verified emails (FREE with subscription)
585
+ * - cosiall: Cosiall Profile Emails - emails from LinkedIn profiles (FREE)
586
+ * - trykitt: TryKitt.ai - AI email finder (FREE for individuals, unlimited)
587
+ *
588
+ * PHASE 2 - Pattern guessing + verification (if Phase 1 < 80% confidence):
375
589
  * - construct: Pattern guessing + MX check (FREE)
590
+ * - bounceban: BounceBan catch-all verification (FREE single, $0.003/bulk)
376
591
  *
377
- * PHASE 2 - Paid verification/finding (only if Phase 1 inconclusive):
378
- * - bouncer: SMTP verify constructed emails ($0.006/email)
379
- * - snovio: Email finder for catch-all domains ($0.02/email)
380
- * - hunter: Hunter.io fallback ($0.005/email)
592
+ * PHASE 3 - Paid finders (only if Phase 2 inconclusive):
593
+ * - hunter: Hunter.io email finder ($0.005/email)
594
+ * - snovio: Snov.io email finder ($0.02/email)
381
595
  *
382
- * Note: dropcontact available but not in default order (expensive at $0.01)
596
+ * Note: bouncer, dropcontact available but not in default order
383
597
  */
384
598
  export declare const DEFAULT_PROVIDER_ORDER: ProviderName[];
385
599
  /**
@@ -388,7 +602,10 @@ export declare const DEFAULT_PROVIDER_ORDER: ProviderName[];
388
602
  * Costs based on 2025 pricing:
389
603
  * - ldd: FREE (subscription-based)
390
604
  * - smartprospect: FREE (included in SmartLead subscription)
605
+ * - cosiall: FREE (uses global Cosiall config)
606
+ * - trykitt: FREE (unlimited for individuals, $0.005/email high volume)
391
607
  * - construct: FREE (pattern guessing + MX check)
608
+ * - bounceban: FREE single / $0.003/email bulk (catch-all specialist)
392
609
  * - bouncer: $0.006/email (SMTP verification, 99%+ accuracy)
393
610
  * - snovio: $0.02/email (email finding + verification)
394
611
  * - hunter: $0.005/email
@@ -492,23 +709,23 @@ export interface SmartProspectSearchFilters {
492
709
  /**
493
710
  * SmartProspect Department values (exact API values)
494
711
  */
495
- export type SmartProspectDepartment = 'Engineering' | 'Finance & Administration' | 'Human Resources' | 'IT & IS' | 'Marketing' | 'Operations' | 'Other' | 'Support' | 'Sales';
712
+ export type SmartProspectDepartment = "Engineering" | "Finance & Administration" | "Human Resources" | "IT & IS" | "Marketing" | "Operations" | "Other" | "Support" | "Sales";
496
713
  /**
497
714
  * SmartProspect Level/Seniority values (exact API values)
498
715
  */
499
- export type SmartProspectLevel = 'Staff' | 'Manager-Level' | 'Director-Level' | 'VP-Level' | 'C-Level';
716
+ export type SmartProspectLevel = "Staff" | "Manager-Level" | "Director-Level" | "VP-Level" | "C-Level";
500
717
  /**
501
718
  * SmartProspect Headcount ranges (exact API values)
502
719
  */
503
- export type SmartProspectHeadcount = '0 - 25' | '25 - 100' | '100 - 250' | '250 - 1000' | '1K - 10K' | '10K - 50K' | '50K - 100K' | '> 100K';
720
+ export type SmartProspectHeadcount = "0 - 25" | "25 - 100" | "100 - 250" | "250 - 1000" | "1K - 10K" | "10K - 50K" | "50K - 100K" | "> 100K";
504
721
  /**
505
722
  * SmartProspect Revenue ranges (exact API values)
506
723
  */
507
- export type SmartProspectRevenue = '$0 - 1M' | '$1 - 10M' | '$10 - 50M' | '$50 - 100M' | '$100 - 250M' | '$250 - 500M' | '$500M - 1B' | '> $1B';
724
+ export type SmartProspectRevenue = "$0 - 1M" | "$1 - 10M" | "$10 - 50M" | "$50 - 100M" | "$100 - 250M" | "$250 - 500M" | "$500M - 1B" | "> $1B";
508
725
  /**
509
726
  * SmartProspect Industry values (exact API values)
510
727
  */
511
- export type SmartProspectIndustry = 'Software & Internet' | 'Business Services' | 'Real Estate & Construction' | 'Financial Services' | 'Healthcare, Pharmaceuticals, & Biotech' | 'Retail' | 'Consumer Services' | 'Education' | 'Media & Entertainment' | 'Travel, Recreation, and Leisure' | 'Transportation & Storage' | 'Manufacturing' | 'Wholesale & Distribution' | 'Non-Profit' | 'Energy & Utilities' | 'Government' | 'Agriculture & Mining' | 'Computers & Electronics' | 'Telecommunications' | 'Other';
728
+ export type SmartProspectIndustry = "Software & Internet" | "Business Services" | "Real Estate & Construction" | "Financial Services" | "Healthcare, Pharmaceuticals, & Biotech" | "Retail" | "Consumer Services" | "Education" | "Media & Entertainment" | "Travel, Recreation, and Leisure" | "Transportation & Storage" | "Manufacturing" | "Wholesale & Distribution" | "Non-Profit" | "Energy & Utilities" | "Government" | "Agriculture & Mining" | "Computers & Electronics" | "Telecommunications" | "Other";
512
729
  /**
513
730
  * SmartProspect Sub-Industry values (exact API values - partial list)
514
731
  * Note: This is a subset of available sub-industries. The API accepts many more.