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.
- package/README.md +50 -21
- package/dist/cosiall-client.d.ts +1 -1
- package/dist/cosiall-client.js +1 -1
- package/dist/enrichment/index.d.ts +3 -3
- package/dist/enrichment/index.js +19 -2
- package/dist/enrichment/matching.d.ts +29 -9
- package/dist/enrichment/matching.js +545 -142
- package/dist/enrichment/providers/bounceban.d.ts +82 -0
- package/dist/enrichment/providers/bounceban.js +447 -0
- package/dist/enrichment/providers/bouncer.d.ts +1 -1
- package/dist/enrichment/providers/bouncer.js +19 -21
- package/dist/enrichment/providers/construct.d.ts +1 -1
- package/dist/enrichment/providers/construct.js +22 -38
- package/dist/enrichment/providers/cosiall.d.ts +27 -0
- package/dist/enrichment/providers/cosiall.js +109 -0
- package/dist/enrichment/providers/dropcontact.d.ts +15 -9
- package/dist/enrichment/providers/dropcontact.js +188 -19
- package/dist/enrichment/providers/hunter.d.ts +8 -1
- package/dist/enrichment/providers/hunter.js +52 -28
- package/dist/enrichment/providers/index.d.ts +10 -7
- package/dist/enrichment/providers/index.js +12 -1
- package/dist/enrichment/providers/ldd.d.ts +1 -10
- package/dist/enrichment/providers/ldd.js +20 -97
- package/dist/enrichment/providers/smartprospect.js +28 -48
- package/dist/enrichment/providers/snovio.d.ts +1 -1
- package/dist/enrichment/providers/snovio.js +29 -31
- package/dist/enrichment/providers/trykitt.d.ts +63 -0
- package/dist/enrichment/providers/trykitt.js +210 -0
- package/dist/enrichment/types.d.ts +234 -17
- package/dist/enrichment/types.js +60 -48
- package/dist/enrichment/utils/candidate-parser.d.ts +107 -0
- package/dist/enrichment/utils/candidate-parser.js +173 -0
- package/dist/enrichment/utils/noop-provider.d.ts +39 -0
- package/dist/enrichment/utils/noop-provider.js +37 -0
- package/dist/enrichment/utils/rate-limiter.d.ts +103 -0
- package/dist/enrichment/utils/rate-limiter.js +204 -0
- package/dist/enrichment/utils/validation.d.ts +75 -3
- package/dist/enrichment/utils/validation.js +164 -11
- package/dist/linkedin-api.d.ts +40 -1
- package/dist/linkedin-api.js +160 -27
- package/dist/types.d.ts +50 -1
- package/dist/utils/lru-cache.d.ts +105 -0
- package/dist/utils/lru-cache.js +175 -0
- 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 =
|
|
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 =
|
|
376
|
+
export type BouncerStatus = "deliverable" | "undeliverable" | "risky" | "unknown";
|
|
183
377
|
/**
|
|
184
378
|
* Bouncer verification result reason
|
|
185
379
|
*/
|
|
186
|
-
export type BouncerReason =
|
|
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 =
|
|
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?:
|
|
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 -
|
|
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
|
|
378
|
-
* -
|
|
379
|
-
* - snovio:
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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.
|