linkedin-secret-sauce 0.12.3 → 0.12.4
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 +6 -49
- package/dist/enrichment/index.d.ts +3 -5
- package/dist/enrichment/index.js +4 -20
- package/dist/enrichment/matching.d.ts +4 -8
- package/dist/enrichment/matching.js +6 -5
- package/dist/enrichment/orchestrator.d.ts +1 -1
- package/dist/enrichment/orchestrator.js +51 -44
- package/dist/enrichment/providers/index.d.ts +0 -2
- package/dist/enrichment/providers/index.js +1 -8
- package/dist/enrichment/providers/snovio.d.ts +4 -4
- package/dist/enrichment/providers/snovio.js +14 -14
- package/dist/enrichment/types.d.ts +8 -71
- package/dist/enrichment/types.js +3 -8
- package/dist/enrichment/utils/rate-limiter.js +0 -2
- package/dist/index.d.ts +2 -4
- package/dist/index.js +2 -2
- package/docs/ENRICHMENT.md +3 -45
- package/docs/INTEGRATION.md +1 -3
- package/docs/PLAYGROUND.md +4 -9
- package/docs/api/assets/hierarchy.js +1 -1
- package/docs/api/assets/navigation.js +1 -1
- package/docs/api/assets/search.js +1 -1
- package/docs/api/classes/LinkedInClientError.html +4 -4
- package/docs/api/functions/_testGetAccountCookies.html +2 -2
- package/docs/api/functions/_testGetAccountEntry.html +2 -2
- package/docs/api/functions/_testGetAllAccountIds.html +2 -2
- package/docs/api/functions/_testGetPoolState.html +2 -2
- package/docs/api/functions/adminResetAccount.html +1 -1
- package/docs/api/functions/adminSetCooldown.html +1 -1
- package/docs/api/functions/buildCookieHeader.html +1 -1
- package/docs/api/functions/clearAllSmartLeadTokens.html +2 -2
- package/docs/api/functions/clearRequestHistory.html +1 -1
- package/docs/api/functions/clearSessionAccount.html +1 -1
- package/docs/api/functions/clearSmartLeadToken.html +2 -2
- package/docs/api/functions/createEnrichmentClient.html +3 -3
- package/docs/api/functions/extractCsrfToken.html +1 -1
- package/docs/api/functions/extractLinkedInHandle.html +2 -2
- package/docs/api/functions/fetchCookiesFromCosiall.html +2 -2
- package/docs/api/functions/fetchProfileEmailsFromCosiall.html +2 -2
- package/docs/api/functions/forceRefreshCookies.html +1 -1
- package/docs/api/functions/getAccountForSession.html +1 -1
- package/docs/api/functions/getAccountsSummary.html +1 -1
- package/docs/api/functions/getCompaniesBatch.html +2 -2
- package/docs/api/functions/getCompanyById.html +2 -2
- package/docs/api/functions/getCompanyByUrl.html +1 -1
- package/docs/api/functions/getConfig.html +1 -1
- package/docs/api/functions/getCookiePoolHealth.html +1 -1
- package/docs/api/functions/getProfileByUrn.html +2 -2
- package/docs/api/functions/getProfileByVanity.html +2 -2
- package/docs/api/functions/getProfilesBatch.html +1 -1
- package/docs/api/functions/getRequestHistory.html +1 -1
- package/docs/api/functions/getSalesNavigatorProfileDetails.html +1 -1
- package/docs/api/functions/getSalesNavigatorProfileFull.html +2 -2
- package/docs/api/functions/getSmartLeadToken.html +1 -1
- package/docs/api/functions/getSmartLeadTokenCacheStats.html +2 -2
- package/docs/api/functions/getSmartLeadUser.html +2 -2
- package/docs/api/functions/getSnapshot.html +1 -1
- package/docs/api/functions/getYearsAtCompanyOptions.html +2 -2
- package/docs/api/functions/getYearsInPositionOptions.html +2 -2
- package/docs/api/functions/getYearsOfExperienceOptions.html +2 -2
- package/docs/api/functions/incrementMetric.html +1 -1
- package/docs/api/functions/initializeCookiePool.html +1 -1
- package/docs/api/functions/initializeLinkedInClient.html +1 -1
- package/docs/api/functions/isBusinessEmail.html +2 -2
- package/docs/api/functions/isDisposableDomain.html +2 -2
- package/docs/api/functions/isDisposableEmail.html +2 -2
- package/docs/api/functions/isPersonalDomain.html +2 -2
- package/docs/api/functions/isPersonalEmail.html +2 -2
- package/docs/api/functions/isRoleAccount.html +2 -2
- package/docs/api/functions/isValidEmailSyntax.html +2 -2
- package/docs/api/functions/parseFullProfile.html +2 -2
- package/docs/api/functions/parseSalesSearchResults.html +1 -1
- package/docs/api/functions/reportAccountFailure.html +1 -1
- package/docs/api/functions/reportAccountSuccess.html +1 -1
- package/docs/api/functions/resolveCompanyUniversalName.html +1 -1
- package/docs/api/functions/searchSalesLeads.html +2 -2
- package/docs/api/functions/selectAccountForRequest.html +1 -1
- package/docs/api/functions/setAccountForSession.html +1 -1
- package/docs/api/functions/typeahead.html +1 -1
- package/docs/api/functions/verifyEmailMx.html +1 -1
- package/docs/api/hierarchy.html +1 -1
- package/docs/api/index.html +3 -3
- package/docs/api/interfaces/AccountCookies.html +2 -2
- package/docs/api/interfaces/BatchEnrichmentOptions.html +8 -8
- package/docs/api/interfaces/CacheAdapter.html +4 -4
- package/docs/api/interfaces/CanonicalEmail.html +8 -8
- package/docs/api/interfaces/Company.html +2 -2
- package/docs/api/interfaces/ConstructConfig.html +5 -5
- package/docs/api/interfaces/CosiallProfileEmailsResponse.html +6 -6
- package/docs/api/interfaces/EnrichmentCandidate.html +4 -4
- package/docs/api/interfaces/EnrichmentClient.html +6 -6
- package/docs/api/interfaces/EnrichmentClientConfig.html +7 -7
- package/docs/api/interfaces/EnrichmentLogger.html +3 -3
- package/docs/api/interfaces/EnrichmentOptions.html +6 -6
- package/docs/api/interfaces/HunterConfig.html +3 -3
- package/docs/api/interfaces/LddConfig.html +3 -3
- package/docs/api/interfaces/LddProfileData.html +2 -2
- package/docs/api/interfaces/LinkedInClientConfig.html +2 -2
- package/docs/api/interfaces/LinkedInCookie.html +2 -2
- package/docs/api/interfaces/LinkedInPosition.html +2 -2
- package/docs/api/interfaces/LinkedInProfile.html +2 -2
- package/docs/api/interfaces/LinkedInSpotlightBadge.html +2 -2
- package/docs/api/interfaces/LinkedInTenure.html +2 -2
- package/docs/api/interfaces/Metrics.html +2 -2
- package/docs/api/interfaces/MetricsSnapshot.html +2 -2
- package/docs/api/interfaces/ProfileEducation.html +2 -2
- package/docs/api/interfaces/ProfileEmailsLookupOptions.html +5 -5
- package/docs/api/interfaces/ProfilePosition.html +2 -2
- package/docs/api/interfaces/ProfileSkill.html +2 -2
- package/docs/api/interfaces/ProviderResult.html +6 -6
- package/docs/api/interfaces/ProvidersConfig.html +6 -9
- package/docs/api/interfaces/RequestHistoryEntry.html +2 -2
- package/docs/api/interfaces/SalesLeadSearchResult.html +2 -2
- package/docs/api/interfaces/SalesNavigatorContactInfo.html +2 -2
- package/docs/api/interfaces/SalesNavigatorPosition.html +2 -2
- package/docs/api/interfaces/SalesNavigatorProfile.html +2 -2
- package/docs/api/interfaces/SalesNavigatorProfileFull.html +4 -4
- package/docs/api/interfaces/SearchSalesResult.html +2 -2
- package/docs/api/interfaces/SmartLeadAuthConfig.html +4 -4
- package/docs/api/interfaces/SmartLeadCredentials.html +2 -2
- package/docs/api/interfaces/SmartLeadLoginResponse.html +2 -2
- package/docs/api/interfaces/SmartLeadUser.html +2 -2
- package/docs/api/interfaces/SmartProspectConfig.html +8 -8
- package/docs/api/interfaces/SmartProspectContact.html +2 -2
- package/docs/api/interfaces/SmartProspectSearchFilters.html +21 -21
- package/docs/api/interfaces/TypeaheadItem.html +2 -2
- package/docs/api/interfaces/TypeaheadResult.html +2 -2
- package/docs/api/interfaces/VerificationResult.html +9 -9
- package/docs/api/types/CostCallback.html +2 -2
- package/docs/api/types/Geo.html +2 -2
- package/docs/api/types/LddApiResponse.html +1 -1
- package/docs/api/types/ProviderFunc.html +2 -2
- package/docs/api/types/ProviderName.html +2 -2
- package/docs/api/types/SalesSearchFilters.html +2 -2
- package/docs/api/types/TypeaheadType.html +1 -1
- package/docs/api/variables/COMPANY_SIZE_OPTIONS.html +1 -1
- package/docs/api/variables/DEFAULT_PROVIDER_ORDER.html +3 -4
- package/docs/api/variables/DISPOSABLE_DOMAINS.html +2 -2
- package/docs/api/variables/FUNCTION_OPTIONS.html +1 -1
- package/docs/api/variables/INDUSTRY_OPTIONS.html +1 -1
- package/docs/api/variables/LANGUAGE_OPTIONS.html +1 -1
- package/docs/api/variables/PERSONAL_DOMAINS.html +2 -2
- package/docs/api/variables/PROVIDER_COSTS.html +3 -5
- package/docs/api/variables/REGION_OPTIONS.html +1 -1
- package/docs/api/variables/SENIORITY_OPTIONS.html +2 -2
- package/docs/api/variables/YEARS_OPTIONS.html +1 -1
- package/package.json +1 -1
- package/dist/enrichment/providers/apollo.d.ts +0 -11
- package/dist/enrichment/providers/apollo.js +0 -181
- package/dist/enrichment/providers/bouncer.d.ts +0 -67
- package/dist/enrichment/providers/bouncer.js +0 -231
- package/dist/enrichment/providers/dropcontact.d.ts +0 -22
- package/dist/enrichment/providers/dropcontact.js +0 -206
- package/docs/api/interfaces/DropcontactConfig.html +0 -3
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Email Enrichment Providers
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.clearSnovioTokenCache = exports.verifyEmailWithSnovio = exports.findEmailsWithSnovio = exports.createSnovioProvider = exports.checkCatchAllWithBounceBan = exports.verifyEmailsBatchWithBounceBan = exports.verifyEmailWithBounceBan = exports.createBounceBanProvider = exports.
|
|
6
|
+
exports.clearSnovioTokenCache = exports.verifyEmailWithSnovio = exports.findEmailsWithSnovio = exports.createSnovioProvider = exports.checkCatchAllWithBounceBan = exports.verifyEmailsBatchWithBounceBan = exports.verifyEmailWithBounceBan = exports.createBounceBanProvider = exports.createHunterProvider = exports.verifyEmailWithTryKitt = exports.findEmailWithTryKitt = exports.createTryKittProvider = exports.createCosiallProvider = exports.createSmartProspectProvider = exports.createLddProvider = exports.createConstructProvider = void 0;
|
|
7
7
|
var construct_1 = require("./construct");
|
|
8
8
|
Object.defineProperty(exports, "createConstructProvider", { enumerable: true, get: function () { return construct_1.createConstructProvider; } });
|
|
9
9
|
var ldd_1 = require("./ldd");
|
|
@@ -18,13 +18,6 @@ Object.defineProperty(exports, "findEmailWithTryKitt", { enumerable: true, get:
|
|
|
18
18
|
Object.defineProperty(exports, "verifyEmailWithTryKitt", { enumerable: true, get: function () { return trykitt_1.verifyEmailWithTryKitt; } });
|
|
19
19
|
var hunter_1 = require("./hunter");
|
|
20
20
|
Object.defineProperty(exports, "createHunterProvider", { enumerable: true, get: function () { return hunter_1.createHunterProvider; } });
|
|
21
|
-
var dropcontact_1 = require("./dropcontact");
|
|
22
|
-
Object.defineProperty(exports, "createDropcontactProvider", { enumerable: true, get: function () { return dropcontact_1.createDropcontactProvider; } });
|
|
23
|
-
var bouncer_1 = require("./bouncer");
|
|
24
|
-
Object.defineProperty(exports, "createBouncerProvider", { enumerable: true, get: function () { return bouncer_1.createBouncerProvider; } });
|
|
25
|
-
Object.defineProperty(exports, "verifyEmailWithBouncer", { enumerable: true, get: function () { return bouncer_1.verifyEmailWithBouncer; } });
|
|
26
|
-
Object.defineProperty(exports, "checkCatchAllDomain", { enumerable: true, get: function () { return bouncer_1.checkCatchAllDomain; } });
|
|
27
|
-
Object.defineProperty(exports, "verifyEmailsBatch", { enumerable: true, get: function () { return bouncer_1.verifyEmailsBatch; } });
|
|
28
21
|
var bounceban_1 = require("./bounceban");
|
|
29
22
|
Object.defineProperty(exports, "createBounceBanProvider", { enumerable: true, get: function () { return bounceban_1.createBounceBanProvider; } });
|
|
30
23
|
Object.defineProperty(exports, "verifyEmailWithBounceBan", { enumerable: true, get: function () { return bounceban_1.verifyEmailWithBounceBan; } });
|
|
@@ -30,8 +30,8 @@ export declare function createSnovioProvider(config: SnovioConfig): (candidate:
|
|
|
30
30
|
* 'Doe',
|
|
31
31
|
* 'example.com',
|
|
32
32
|
* {
|
|
33
|
-
*
|
|
34
|
-
*
|
|
33
|
+
* clientId: process.env.SNOVIO_CLIENT_ID,
|
|
34
|
+
* clientSecret: process.env.SNOVIO_CLIENT_SECRET,
|
|
35
35
|
* }
|
|
36
36
|
* );
|
|
37
37
|
* ```
|
|
@@ -43,8 +43,8 @@ export declare function findEmailsWithSnovio(firstName: string, lastName: string
|
|
|
43
43
|
* @example
|
|
44
44
|
* ```typescript
|
|
45
45
|
* const result = await verifyEmailWithSnovio('test@example.com', {
|
|
46
|
-
*
|
|
47
|
-
*
|
|
46
|
+
* clientId: process.env.SNOVIO_CLIENT_ID,
|
|
47
|
+
* clientSecret: process.env.SNOVIO_CLIENT_SECRET,
|
|
48
48
|
* });
|
|
49
49
|
* ```
|
|
50
50
|
*/
|
|
@@ -68,7 +68,7 @@ function extractNameAndDomain(candidate) {
|
|
|
68
68
|
/**
|
|
69
69
|
* Get OAuth access token from Snov.io
|
|
70
70
|
*/
|
|
71
|
-
async function getAccessToken(
|
|
71
|
+
async function getAccessToken(clientId, clientSecret, apiUrl, timeoutMs) {
|
|
72
72
|
// Return cached token if valid
|
|
73
73
|
if (cachedAccessToken && Date.now() < tokenExpiresAt) {
|
|
74
74
|
return cachedAccessToken;
|
|
@@ -83,8 +83,8 @@ async function getAccessToken(userId, apiSecret, apiUrl, timeoutMs) {
|
|
|
83
83
|
},
|
|
84
84
|
body: JSON.stringify({
|
|
85
85
|
grant_type: "client_credentials",
|
|
86
|
-
client_id:
|
|
87
|
-
client_secret:
|
|
86
|
+
client_id: clientId,
|
|
87
|
+
client_secret: clientSecret,
|
|
88
88
|
}),
|
|
89
89
|
signal: controller.signal,
|
|
90
90
|
});
|
|
@@ -151,8 +151,8 @@ async function findEmailsByName(firstName, lastName, domain, accessToken, apiUrl
|
|
|
151
151
|
* when pattern guessing fails or for catch-all domains.
|
|
152
152
|
*/
|
|
153
153
|
function createSnovioProvider(config) {
|
|
154
|
-
const {
|
|
155
|
-
if (!
|
|
154
|
+
const { clientId, clientSecret, apiUrl = DEFAULT_API_URL, timeoutMs = DEFAULT_TIMEOUT_MS, } = config;
|
|
155
|
+
if (!clientId || !clientSecret) {
|
|
156
156
|
return (0, noop_provider_1.createNoOpProvider)("snovio");
|
|
157
157
|
}
|
|
158
158
|
async function findEmails(candidate) {
|
|
@@ -162,7 +162,7 @@ function createSnovioProvider(config) {
|
|
|
162
162
|
}
|
|
163
163
|
const { firstName, lastName, domain } = nameAndDomain;
|
|
164
164
|
// Get access token
|
|
165
|
-
const accessToken = await getAccessToken(
|
|
165
|
+
const accessToken = await getAccessToken(clientId, clientSecret, apiUrl, timeoutMs);
|
|
166
166
|
if (!accessToken) {
|
|
167
167
|
return null;
|
|
168
168
|
}
|
|
@@ -210,15 +210,15 @@ function createSnovioProvider(config) {
|
|
|
210
210
|
* 'Doe',
|
|
211
211
|
* 'example.com',
|
|
212
212
|
* {
|
|
213
|
-
*
|
|
214
|
-
*
|
|
213
|
+
* clientId: process.env.SNOVIO_CLIENT_ID,
|
|
214
|
+
* clientSecret: process.env.SNOVIO_CLIENT_SECRET,
|
|
215
215
|
* }
|
|
216
216
|
* );
|
|
217
217
|
* ```
|
|
218
218
|
*/
|
|
219
219
|
async function findEmailsWithSnovio(firstName, lastName, domain, config) {
|
|
220
|
-
const {
|
|
221
|
-
const accessToken = await getAccessToken(
|
|
220
|
+
const { clientId, clientSecret, apiUrl = DEFAULT_API_URL, timeoutMs = DEFAULT_TIMEOUT_MS, } = config;
|
|
221
|
+
const accessToken = await getAccessToken(clientId, clientSecret, apiUrl, timeoutMs);
|
|
222
222
|
if (!accessToken) {
|
|
223
223
|
return null;
|
|
224
224
|
}
|
|
@@ -230,14 +230,14 @@ async function findEmailsWithSnovio(firstName, lastName, domain, config) {
|
|
|
230
230
|
* @example
|
|
231
231
|
* ```typescript
|
|
232
232
|
* const result = await verifyEmailWithSnovio('test@example.com', {
|
|
233
|
-
*
|
|
234
|
-
*
|
|
233
|
+
* clientId: process.env.SNOVIO_CLIENT_ID,
|
|
234
|
+
* clientSecret: process.env.SNOVIO_CLIENT_SECRET,
|
|
235
235
|
* });
|
|
236
236
|
* ```
|
|
237
237
|
*/
|
|
238
238
|
async function verifyEmailWithSnovio(email, config) {
|
|
239
|
-
const {
|
|
240
|
-
const accessToken = await getAccessToken(
|
|
239
|
+
const { clientId, clientSecret, apiUrl = DEFAULT_API_URL, timeoutMs = DEFAULT_TIMEOUT_MS, } = config;
|
|
240
|
+
const accessToken = await getAccessToken(clientId, clientSecret, apiUrl, timeoutMs);
|
|
241
241
|
if (!accessToken) {
|
|
242
242
|
return null;
|
|
243
243
|
}
|
|
@@ -167,12 +167,6 @@ export interface LddConfig {
|
|
|
167
167
|
apiUrl: string;
|
|
168
168
|
apiToken: string;
|
|
169
169
|
}
|
|
170
|
-
/**
|
|
171
|
-
* Dropcontact provider configuration
|
|
172
|
-
*/
|
|
173
|
-
export interface DropcontactConfig {
|
|
174
|
-
apiKey: string;
|
|
175
|
-
}
|
|
176
170
|
/**
|
|
177
171
|
* TryKitt.ai provider configuration
|
|
178
172
|
*
|
|
@@ -364,57 +358,6 @@ export interface BounceBanVerifyResponse {
|
|
|
364
358
|
/** Remaining credits */
|
|
365
359
|
credits_remaining?: number;
|
|
366
360
|
}
|
|
367
|
-
/**
|
|
368
|
-
* Bouncer.io provider configuration
|
|
369
|
-
*
|
|
370
|
-
* Bouncer provides SMTP email verification with 99%+ accuracy.
|
|
371
|
-
* Best for verifying pattern-guessed emails on non-catch-all domains.
|
|
372
|
-
*
|
|
373
|
-
* @see https://docs.usebouncer.com
|
|
374
|
-
*/
|
|
375
|
-
export interface BouncerConfig {
|
|
376
|
-
/** Bouncer API key */
|
|
377
|
-
apiKey: string;
|
|
378
|
-
/** API URL override (default: https://api.usebouncer.com/v1.1) */
|
|
379
|
-
apiUrl?: string;
|
|
380
|
-
/** Timeout in ms (default: 30000) */
|
|
381
|
-
timeoutMs?: number;
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Bouncer verification result status
|
|
385
|
-
*/
|
|
386
|
-
export type BouncerStatus = "deliverable" | "undeliverable" | "risky" | "unknown";
|
|
387
|
-
/**
|
|
388
|
-
* Bouncer verification result reason
|
|
389
|
-
*/
|
|
390
|
-
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";
|
|
391
|
-
/**
|
|
392
|
-
* Bouncer API response for single email verification
|
|
393
|
-
*/
|
|
394
|
-
export interface BouncerVerifyResponse {
|
|
395
|
-
status: BouncerStatus;
|
|
396
|
-
reason: BouncerReason;
|
|
397
|
-
email: string;
|
|
398
|
-
domain: string;
|
|
399
|
-
account: string;
|
|
400
|
-
/** Whether this is a free email provider (Gmail, Yahoo, etc.) */
|
|
401
|
-
free: boolean;
|
|
402
|
-
/** Whether this is a disposable email */
|
|
403
|
-
disposable: boolean;
|
|
404
|
-
/** Whether this is a role-based email */
|
|
405
|
-
role: boolean;
|
|
406
|
-
/** Whether domain is catch-all (accepts all emails) */
|
|
407
|
-
acceptAll: boolean;
|
|
408
|
-
/** Did you mean suggestion for typos */
|
|
409
|
-
didYouMean?: string;
|
|
410
|
-
/** DNS information */
|
|
411
|
-
dns?: {
|
|
412
|
-
type: string;
|
|
413
|
-
record: string;
|
|
414
|
-
};
|
|
415
|
-
/** Toxicity score (0-5, higher = more risky) */
|
|
416
|
-
toxicity?: number;
|
|
417
|
-
}
|
|
418
361
|
/**
|
|
419
362
|
* Snov.io provider configuration
|
|
420
363
|
*
|
|
@@ -424,10 +367,10 @@ export interface BouncerVerifyResponse {
|
|
|
424
367
|
* @see https://snov.io/api
|
|
425
368
|
*/
|
|
426
369
|
export interface SnovioConfig {
|
|
427
|
-
/** Snov.io
|
|
428
|
-
|
|
429
|
-
/** Snov.io
|
|
430
|
-
|
|
370
|
+
/** Snov.io OAuth client ID (get from https://app.snov.io/api) */
|
|
371
|
+
clientId: string;
|
|
372
|
+
/** Snov.io OAuth client secret */
|
|
373
|
+
clientSecret: string;
|
|
431
374
|
/** API URL override (default: https://api.snov.io) */
|
|
432
375
|
apiUrl?: string;
|
|
433
376
|
/** Timeout in ms (default: 30000) */
|
|
@@ -500,9 +443,6 @@ export interface ProvidersConfig {
|
|
|
500
443
|
/** TryKitt.ai AI email finder (FREE for individuals, unlimited) */
|
|
501
444
|
trykitt?: TryKittConfig;
|
|
502
445
|
hunter?: HunterConfig;
|
|
503
|
-
dropcontact?: DropcontactConfig;
|
|
504
|
-
/** Bouncer.io for SMTP email verification (99%+ accuracy) */
|
|
505
|
-
bouncer?: BouncerConfig;
|
|
506
446
|
/** BounceBan catch-all verification (FREE single, 85-95% accuracy) */
|
|
507
447
|
bounceban?: BounceBanConfig;
|
|
508
448
|
/** Snov.io for email finding (98% delivery rate) */
|
|
@@ -516,7 +456,7 @@ export interface EnrichmentOptions {
|
|
|
516
456
|
maxCostPerEmail?: number;
|
|
517
457
|
/** Minimum confidence threshold 0-100 (default: 0) */
|
|
518
458
|
confidenceThreshold?: number;
|
|
519
|
-
/** Provider order (default: ['ldd', 'smartprospect', '
|
|
459
|
+
/** Provider order (default: ['ldd', 'smartprospect', 'cosiall', 'trykitt', 'construct', 'bounceban', 'hunter', 'snovio']) */
|
|
520
460
|
providerOrder?: ProviderName[];
|
|
521
461
|
/** Retry delay in ms on transient errors (default: 200) */
|
|
522
462
|
retryMs?: number;
|
|
@@ -585,7 +525,7 @@ export interface EnrichmentClient {
|
|
|
585
525
|
/**
|
|
586
526
|
* Available provider names
|
|
587
527
|
*/
|
|
588
|
-
export type ProviderName = "construct" | "ldd" | "smartprospect" | "cosiall" | "trykitt" | "hunter" | "
|
|
528
|
+
export type ProviderName = "construct" | "ldd" | "smartprospect" | "cosiall" | "trykitt" | "hunter" | "bounceban" | "snovio";
|
|
589
529
|
/**
|
|
590
530
|
* Default provider order - 3-Phase Strategy
|
|
591
531
|
*
|
|
@@ -600,10 +540,9 @@ export type ProviderName = "construct" | "ldd" | "smartprospect" | "cosiall" | "
|
|
|
600
540
|
* - bounceban: BounceBan catch-all verification (FREE single, $0.003/bulk)
|
|
601
541
|
*
|
|
602
542
|
* PHASE 3 - Paid finders (only if Phase 2 inconclusive):
|
|
603
|
-
* - hunter: Hunter.io email finder ($0.
|
|
543
|
+
* - hunter: Hunter.io email finder ($0.015/email)
|
|
604
544
|
* - snovio: Snov.io email finder ($0.02/email)
|
|
605
545
|
*
|
|
606
|
-
* Note: bouncer, dropcontact available but not in default order
|
|
607
546
|
*/
|
|
608
547
|
export declare const DEFAULT_PROVIDER_ORDER: ProviderName[];
|
|
609
548
|
/**
|
|
@@ -616,10 +555,8 @@ export declare const DEFAULT_PROVIDER_ORDER: ProviderName[];
|
|
|
616
555
|
* - trykitt: FREE (unlimited for individuals, $0.005/email high volume)
|
|
617
556
|
* - construct: FREE (pattern guessing + MX check)
|
|
618
557
|
* - bounceban: FREE single / $0.003/email bulk (catch-all specialist)
|
|
619
|
-
* -
|
|
558
|
+
* - hunter: $0.015/email (Growth tier)
|
|
620
559
|
* - snovio: $0.02/email (email finding + verification)
|
|
621
|
-
* - hunter: $0.005/email
|
|
622
|
-
* - dropcontact: $0.01/email (not in default order)
|
|
623
560
|
*/
|
|
624
561
|
export declare const PROVIDER_COSTS: Record<ProviderName, number>;
|
|
625
562
|
/**
|
package/dist/enrichment/types.js
CHANGED
|
@@ -21,10 +21,9 @@ exports.SMARTPROSPECT_SUB_INDUSTRIES = exports.PROVIDER_COSTS = exports.DEFAULT_
|
|
|
21
21
|
* - bounceban: BounceBan catch-all verification (FREE single, $0.003/bulk)
|
|
22
22
|
*
|
|
23
23
|
* PHASE 3 - Paid finders (only if Phase 2 inconclusive):
|
|
24
|
-
* - hunter: Hunter.io email finder ($0.
|
|
24
|
+
* - hunter: Hunter.io email finder ($0.015/email)
|
|
25
25
|
* - snovio: Snov.io email finder ($0.02/email)
|
|
26
26
|
*
|
|
27
|
-
* Note: bouncer, dropcontact available but not in default order
|
|
28
27
|
*/
|
|
29
28
|
exports.DEFAULT_PROVIDER_ORDER = [
|
|
30
29
|
"ldd",
|
|
@@ -46,10 +45,8 @@ exports.DEFAULT_PROVIDER_ORDER = [
|
|
|
46
45
|
* - trykitt: FREE (unlimited for individuals, $0.005/email high volume)
|
|
47
46
|
* - construct: FREE (pattern guessing + MX check)
|
|
48
47
|
* - bounceban: FREE single / $0.003/email bulk (catch-all specialist)
|
|
49
|
-
* -
|
|
48
|
+
* - hunter: $0.015/email (Growth tier)
|
|
50
49
|
* - snovio: $0.02/email (email finding + verification)
|
|
51
|
-
* - hunter: $0.005/email
|
|
52
|
-
* - dropcontact: $0.01/email (not in default order)
|
|
53
50
|
*/
|
|
54
51
|
exports.PROVIDER_COSTS = {
|
|
55
52
|
construct: 0,
|
|
@@ -58,9 +55,7 @@ exports.PROVIDER_COSTS = {
|
|
|
58
55
|
cosiall: 0,
|
|
59
56
|
trykitt: 0, // FREE for individuals
|
|
60
57
|
bounceban: 0.003, // FREE single, $0.003 bulk
|
|
61
|
-
hunter: 0.
|
|
62
|
-
dropcontact: 0.01,
|
|
63
|
-
bouncer: 0.006,
|
|
58
|
+
hunter: 0.015,
|
|
64
59
|
snovio: 0.02,
|
|
65
60
|
};
|
|
66
61
|
/**
|
|
@@ -26,8 +26,6 @@ exports.DEFAULT_RATE_LIMITS = {
|
|
|
26
26
|
hunter: { maxRequests: 10, windowMs: 1000, minDelayMs: 100 },
|
|
27
27
|
snovio: { maxRequests: 60, windowMs: 60000, minDelayMs: 1000 },
|
|
28
28
|
bounceban: { maxRequests: 10, windowMs: 1000, minDelayMs: 100 },
|
|
29
|
-
bouncer: { maxRequests: 10, windowMs: 1000, minDelayMs: 100 },
|
|
30
|
-
dropcontact: { maxRequests: 5, windowMs: 1000, minDelayMs: 200 },
|
|
31
29
|
smartprospect: { maxRequests: 2, windowMs: 1000, minDelayMs: 500 },
|
|
32
30
|
// Free providers have no external limits
|
|
33
31
|
construct: { maxRequests: 100, windowMs: 1000, minDelayMs: 0 },
|
package/dist/index.d.ts
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* const enrichment = createEnrichmentClient({
|
|
31
31
|
* providers: {
|
|
32
32
|
* hunter: { apiKey: process.env.HUNTER_API_KEY },
|
|
33
|
-
*
|
|
33
|
+
* bounceban: { apiKey: process.env.BOUNCEBAN_API_KEY },
|
|
34
34
|
* },
|
|
35
35
|
* });
|
|
36
36
|
*
|
|
@@ -68,7 +68,7 @@ export * from "./constants";
|
|
|
68
68
|
* providers: {
|
|
69
69
|
* construct: {}, // FREE pattern matching
|
|
70
70
|
* hunter: { apiKey: 'xxx' },
|
|
71
|
-
*
|
|
71
|
+
* bounceban: { apiKey: 'xxx' },
|
|
72
72
|
* },
|
|
73
73
|
* onCost: (provider, cost) => console.log(`${provider}: $${cost}`),
|
|
74
74
|
* });
|
|
@@ -108,8 +108,6 @@ HunterConfig,
|
|
|
108
108
|
SmartProspectConfig,
|
|
109
109
|
/** LinkedIn Data Dump configuration */
|
|
110
110
|
LddConfig,
|
|
111
|
-
/** Dropcontact configuration */
|
|
112
|
-
DropcontactConfig,
|
|
113
111
|
/** Construct provider configuration */
|
|
114
112
|
ConstructConfig,
|
|
115
113
|
/** Cache adapter interface */
|
package/dist/index.js
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* const enrichment = createEnrichmentClient({
|
|
32
32
|
* providers: {
|
|
33
33
|
* hunter: { apiKey: process.env.HUNTER_API_KEY },
|
|
34
|
-
*
|
|
34
|
+
* bounceban: { apiKey: process.env.BOUNCEBAN_API_KEY },
|
|
35
35
|
* },
|
|
36
36
|
* });
|
|
37
37
|
*
|
|
@@ -115,7 +115,7 @@ __exportStar(require("./constants"), exports);
|
|
|
115
115
|
* providers: {
|
|
116
116
|
* construct: {}, // FREE pattern matching
|
|
117
117
|
* hunter: { apiKey: 'xxx' },
|
|
118
|
-
*
|
|
118
|
+
* bounceban: { apiKey: 'xxx' },
|
|
119
119
|
* },
|
|
120
120
|
* onCost: (provider, cost) => console.log(`${provider}: $${cost}`),
|
|
121
121
|
* });
|
package/docs/ENRICHMENT.md
CHANGED
|
@@ -96,9 +96,7 @@ PHASE 3 - Paid Finders (Only if needed)
|
|
|
96
96
|
| Provider | Cost | Description | Required Config |
|
|
97
97
|
|----------|------|-------------|-----------------|
|
|
98
98
|
| **BounceBan** | FREE single / $0.003 bulk | Catch-all specialist (85-95% accuracy) | `apiKey` |
|
|
99
|
-
| **Hunter** | $0.
|
|
100
|
-
| **Bouncer** | $0.006/email | SMTP verification (99%+ accuracy) | `apiKey` |
|
|
101
|
-
| **Dropcontact** | $0.01/email | Email finder API | `apiKey` |
|
|
99
|
+
| **Hunter** | $0.015/email | Domain search + email finder | `apiKey` |
|
|
102
100
|
| **Snov.io** | $0.02/email | Email finding + verification | `clientId`, `clientSecret` |
|
|
103
101
|
|
|
104
102
|
---
|
|
@@ -167,18 +165,6 @@ hunter: {
|
|
|
167
165
|
|
|
168
166
|
Get your API key at: https://hunter.io
|
|
169
167
|
|
|
170
|
-
### Bouncer
|
|
171
|
-
|
|
172
|
-
SMTP verification with 99%+ accuracy.
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
bouncer: {
|
|
176
|
-
apiKey: process.env.BOUNCER_API_KEY, // Required
|
|
177
|
-
}
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
Get your API key at: https://bouncer.io
|
|
181
|
-
|
|
182
168
|
### Snov.io
|
|
183
169
|
|
|
184
170
|
```typescript
|
|
@@ -190,16 +176,6 @@ snovio: {
|
|
|
190
176
|
|
|
191
177
|
Get your credentials at: https://snov.io
|
|
192
178
|
|
|
193
|
-
### Dropcontact
|
|
194
|
-
|
|
195
|
-
```typescript
|
|
196
|
-
dropcontact: {
|
|
197
|
-
apiKey: process.env.DROPCONTACT_API_KEY, // Required
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
Get your API key at: https://dropcontact.com
|
|
202
|
-
|
|
203
179
|
### Cosiall
|
|
204
180
|
|
|
205
181
|
Enabled by default using global Cosiall configuration. To disable:
|
|
@@ -249,18 +225,12 @@ TRYKITT_API_KEY=...
|
|
|
249
225
|
# BounceBan (FREE single verification)
|
|
250
226
|
BOUNCEBAN_API_KEY=...
|
|
251
227
|
|
|
252
|
-
# Hunter ($0.
|
|
228
|
+
# Hunter ($0.015/email)
|
|
253
229
|
HUNTER_API_KEY=...
|
|
254
230
|
|
|
255
|
-
# Bouncer ($0.006/email)
|
|
256
|
-
BOUNCER_API_KEY=...
|
|
257
|
-
|
|
258
231
|
# Snov.io ($0.02/email)
|
|
259
232
|
SNOVIO_CLIENT_ID=...
|
|
260
233
|
SNOVIO_CLIENT_SECRET=...
|
|
261
|
-
|
|
262
|
-
# Dropcontact ($0.01/email)
|
|
263
|
-
DROPCONTACT_API_KEY=...
|
|
264
234
|
```
|
|
265
235
|
|
|
266
236
|
---
|
|
@@ -404,16 +374,6 @@ const isCatchAll = await checkCatchAllWithBounceBan('acme.com', config);
|
|
|
404
374
|
const results = await verifyEmailsBatchWithBounceBan(emails, config);
|
|
405
375
|
```
|
|
406
376
|
|
|
407
|
-
### Bouncer
|
|
408
|
-
|
|
409
|
-
```typescript
|
|
410
|
-
import { verifyEmailWithBouncer, checkCatchAllDomain, verifyEmailsBatch } from 'linkedin-secret-sauce';
|
|
411
|
-
|
|
412
|
-
const result = await verifyEmailWithBouncer('john@acme.com', {
|
|
413
|
-
apiKey: process.env.BOUNCER_API_KEY,
|
|
414
|
-
});
|
|
415
|
-
```
|
|
416
|
-
|
|
417
377
|
### Snov.io
|
|
418
378
|
|
|
419
379
|
```typescript
|
|
@@ -492,9 +452,7 @@ console.log(PROVIDER_COSTS);
|
|
|
492
452
|
// cosiall: 0,
|
|
493
453
|
// trykitt: 0,
|
|
494
454
|
// bounceban: 0.003,
|
|
495
|
-
// hunter: 0.
|
|
496
|
-
// dropcontact: 0.01,
|
|
497
|
-
// bouncer: 0.006,
|
|
455
|
+
// hunter: 0.015,
|
|
498
456
|
// snovio: 0.02,
|
|
499
457
|
// }
|
|
500
458
|
```
|
package/docs/INTEGRATION.md
CHANGED
|
@@ -208,9 +208,7 @@ console.log(result.business_email_confidence); // 95
|
|
|
208
208
|
|
|
209
209
|
**PAID Providers:**
|
|
210
210
|
- `bounceban` - FREE single / $0.003 bulk - Catch-all specialist
|
|
211
|
-
- `hunter` - $0.
|
|
212
|
-
- `bouncer` - $0.006/email - SMTP verification (99%+ accuracy)
|
|
213
|
-
- `dropcontact` - $0.01/email - Email finder API
|
|
211
|
+
- `hunter` - $0.015/email - Domain search + email finder
|
|
214
212
|
- `snovio` - $0.02/email - Email finding + verification
|
|
215
213
|
|
|
216
214
|
For complete enrichment documentation, provider configuration, cost tracking, and advanced features, see **[ENRICHMENT.md](./ENRICHMENT.md)**.
|
package/docs/PLAYGROUND.md
CHANGED
|
@@ -89,9 +89,6 @@ HUNTER_API_KEY=your-hunter-key
|
|
|
89
89
|
SNOVIO_CLIENT_ID=your-snovio-client-id
|
|
90
90
|
SNOVIO_CLIENT_SECRET=your-snovio-secret
|
|
91
91
|
|
|
92
|
-
# === Apollo.io ===
|
|
93
|
-
APOLLO_API_KEY=your-apollo-key
|
|
94
|
-
|
|
95
92
|
# === Port Configuration (Optional) ===
|
|
96
93
|
# Auto-increments if ports are busy
|
|
97
94
|
PLAYGROUND_SERVER_PORT=5175
|
|
@@ -227,11 +224,9 @@ Comprehensive email validation and verification utilities.
|
|
|
227
224
|
- **Compare Multiple Providers**:
|
|
228
225
|
- LDD, SmartProspect, TryKitt.ai (FREE)
|
|
229
226
|
- Pattern Guessing + MX validation (FREE)
|
|
230
|
-
- BounceBan (catch-all verification, $0.
|
|
231
|
-
- Hunter.io ($0.
|
|
232
|
-
- Bouncer ($0.006/lookup)
|
|
227
|
+
- BounceBan (catch-all verification, $0.003/lookup)
|
|
228
|
+
- Hunter.io ($0.015/lookup)
|
|
233
229
|
- Snov.io ($0.02/lookup)
|
|
234
|
-
- Dropcontact ($0.01/lookup)
|
|
235
230
|
- **Side-by-Side Results**: See speed, accuracy, and cost for each provider
|
|
236
231
|
- **Configuration Status**: Know which providers are configured
|
|
237
232
|
- **Cost Tracking**: See estimated cost per test run
|
|
@@ -262,7 +257,7 @@ Comprehensive email validation and verification utilities.
|
|
|
262
257
|
- **Intelligent Waterfall**: Queries providers in order until a verified email is found
|
|
263
258
|
1. **Phase 1 (FREE)**: LDD → SmartProspect → Cosiall → TryKitt.ai → Pattern Guessing (parallel)
|
|
264
259
|
2. **Phase 2 (Verification)**: BounceBan for catch-all domains
|
|
265
|
-
3. **Phase 3 (Paid)**: Hunter.io → Snov.io
|
|
260
|
+
3. **Phase 3 (Paid)**: Hunter.io → Snov.io (only if free providers fail)
|
|
266
261
|
- **Step-by-Step Visualization**: Watch each provider execute in real-time
|
|
267
262
|
- **LinkedIn Company Lookup**: Auto-discovers company domain from LinkedIn Company URN
|
|
268
263
|
- **Pattern Guessing**: Generates common email patterns (firstname.lastname@, etc.) + MX validation
|
|
@@ -419,7 +414,7 @@ This enables "Find Email" buttons from search results.
|
|
|
419
414
|
|
|
420
415
|
### Pattern guessing finds too many emails
|
|
421
416
|
- **Cause**: Domain is catch-all (accepts all addresses)
|
|
422
|
-
- **Solution**: Enable BounceBan verification or use Hunter.io
|
|
417
|
+
- **Solution**: Enable BounceBan verification or use Hunter.io for confirmation
|
|
423
418
|
|
|
424
419
|
### SmartProspect matches are inaccurate
|
|
425
420
|
- **Causes**:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.hierarchyData = "eJyVkD0LwjAURf/
|
|
1
|
+
window.hierarchyData = "eJyVkD0LwjAURf/LnaOSthqaUXAUB0fpENKUBNO0JM+p9L9L/UJQpE5vePdyznsDYtdRgjwJnrG85BVDNI03mlwXEuSAvOTTCKo1kNgbik4nMJxdqCGz9YbhEj0kXCATG6VNWj1SS0utB4P2KiVIUKoXU23xik5L63wdTYA8FTyvRoaC55/EY1B9sh3NIz/TMwxGBsGzN+AuRKdtawId+vsXfiM/8v+eLbiobhbizWKrSNt/Vb6X5jxhHK+wh7Ag"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "eJydmttu4zYQQP/FfV1079t23xxbTgR4bUNygqZFYXClsU2EJlWSSuMW/fdCki+
|
|
1
|
+
window.navigationData = "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"
|