
Security News
Another Round of TEA Protocol Spam Floods npm, But It’s Not a Worm
Recent coverage mislabels the latest TEA protocol spam as a worm. Here’s what’s actually happening.
@emaillistverify/sdk
Advanced tools
Official TypeScript SDK for the EmailListVerify API - Complete email validation and verification service.
Official JavaScript/TypeScript SDK for the EmailListVerify API - Professional email validation and verification service.
✅ Zero dependencies - Uses Node.js 20+ native fetch API
✅ Full TypeScript support - Strict type safety with complete type definitions
✅ ESM & CommonJS - Dual module format for maximum compatibility
✅ All 13 API endpoints - Complete API coverage
✅ 14 error classes - Comprehensive error handling with type guards
✅ Production ready - Thoroughly tested with 161 tests (85 unit + 76 integration)
npm install @emaillistverify/sdk
Requirements:
fetch API)import { EmailListVerifyClient } from '@emaillistverify/sdk';
// Initialize with your API key
const client = new EmailListVerifyClient('your-api-key-here');
// Simple verification - returns just the status
const result = await client.verifyEmail('test@example.com');
console.log(result); // 'ok'
// For detailed info, use verifyEmailDetailed
const detailed = await client.verifyEmailDetailed('test@example.com');
console.log(detailed);
// {
// email: 'test@example.com',
// result: 'ok',
// isRole: false,
// isFree: true,
// firstName: 'Test',
// ...
// }
Get your API key: https://app.emaillistverify.com/signup
verifyEmail(email: string): Promise<string>Simple email verification - returns just the deliverability status as a string.
const result = await client.verifyEmail('john.doe@example.com');
console.log(result); // 'ok' | 'invalid' | 'unknown' | 'disposable' | etc.
// Possible values:
// 'ok' - Email is valid and deliverable
// 'invalid_syntax' - Invalid email format
// 'disposable' - Temporary/disposable email
// 'dead_server' - Domain doesn't exist
// 'email_disabled' - Email disabled
// 'unknown' - Unable to verify
// ... and more (see VerificationResult type)
💳 Credits: See pricing documentation
Note: For detailed information (role, free provider, name detection), use verifyEmailDetailed() instead.
verifyEmailDetailed(email: string): Promise<VerifyEmailDetailedResponse>Detailed verification with additional metadata including name detection and email classification.
const result = await client.verifyEmailDetailed('ceo@company.com');
console.log(result.email); // 'ceo@company.com'
console.log(result.result); // 'ok' | 'invalid' | etc.
console.log(result.mxServer); // MX server hostname
console.log(result.esp); // Email Service Provider (e.g., 'Google', 'Microsoft 365')
console.log(result.isRole); // true/false - role-based email (info@, ceo@)
console.log(result.isFree); // true/false - free email provider
console.log(result.isNoReply); // true/false - no-reply email
console.log(result.firstName); // 'John' (if detected)
console.log(result.lastName); // 'Doe' (if detected)
console.log(result.gender); // 'male' | 'female' | null
console.log(result.account); // Local part of email (before @)
console.log(result.tag); // Email tag (after +)
💳 Credits: See pricing documentation
Use async jobs when you don't need immediate results.
createEmailJob(params: CreateEmailJobRequest): Promise<CreateEmailJobResponse>Create an async email verification job.
const job = await client.createEmailJob({
email: 'test@example.com',
quality: 'standard', // 'standard' or 'high'
});
console.log(job.id); // Job ID for status checking
console.log(job.status); // 'pending' | 'processing' | 'finished' | 'failed'
console.log(job.createdAt); // ISO timestamp
getEmailJob(jobId: string): Promise<EmailJobResponse>Check the status of an async job.
const status = await client.getEmailJob('job-12345');
console.log(status.status); // Job status
console.log(status.finishedAt); // Completion time (if finished)
if (status.status === 'finished') {
console.log(status.result); // EmailVerificationResult
}
Polling Example: See examples/async-jobs.js
Find contact email addresses by name and domain.
findContact(params: FindContactRequest): Promise<FindContactResponse>const contacts = await client.findContact({
firstName: 'John',
lastName: 'Doe', // optional
domain: 'example.com',
});
console.log(contacts.length); // Number of contacts found
contacts.forEach((contact) => {
console.log(contact.email); // Email address
console.log(contact.confidence); // 'low' | 'medium' | 'high' | 'unknown'
});
💳 Credits: See pricing documentation
Use cases: Lead generation, finding decision-makers, building contact lists
Check if a domain is a disposable/temporary email provider.
checkDisposable(domain: string): Promise<CheckDisposableResponse>const result = await client.checkDisposable('tempmail.com');
console.log(result.domain); // 'tempmail.com'
console.log(result.result); // 'disposable' | 'ok' | 'dead_server' | 'invalid_mx' | 'unknown'
console.log(result.mxServer); // MX server hostname
💳 Credits: See pricing documentation
Upload CSV files for batch email verification.
uploadBulkFile(file: Buffer | Blob, filename: string): Promise<string>import { readFileSync } from 'fs';
const fileBuffer = readFileSync('./emails.csv');
const fileId = await client.uploadBulkFile(fileBuffer, 'emails.csv');
console.log(fileId); // Returns file ID as string (e.g., "12345")
// Use this ID to check progress with getBulkProgress()
CSV Format:
email
john@example.com
jane@company.com
test@tempmail.com
getBulkProgress(fileId: string): Promise<MaillistProgressResponse>Check bulk processing progress.
const progress = await client.getBulkProgress('file-12345');
console.log(progress.status); // 'processing' | 'finished' | 'error'
console.log(progress.progress); // Percentage (0-100)
console.log(progress.total); // Total emails in file
console.log(progress.processed); // Emails processed so far
console.log(progress.unique); // Unique emails found
downloadBulkResults(fileId: string, options?: DownloadMaillistOptions): Promise<string | Buffer>Download processed results as CSV.
const results = await client.downloadBulkResults('file-12345');
// Save to file (Node.js)
import { writeFileSync } from 'fs';
if (typeof results === 'string') {
writeFileSync('./results.csv', results);
} else {
writeFileSync('./results.csv', results);
}
// Download with additional columns and duplicates
const detailedResults = await client.downloadBulkResults('file-12345', {
addFirstName: true,
addLastName: true,
addDuplicates: true,
format: 'csv',
});
deleteBulkList(fileId: string): Promise<void>Delete a bulk list after processing.
await client.deleteBulkList('file-12345');
console.log('Bulk list deleted');
Best Practice: Always clean up bulk lists after downloading results.
Complete Example: See examples/bulk-verification.js
Test where your emails land across different email service providers (Gmail, Yahoo, Outlook, etc.).
createPlacementTest(request?: CreatePlacementTestRequest): Promise<CreatePlacementTestResponse>Create a new inbox placement test.
const test = await client.createPlacementTest({
name: 'Q1 2025 Campaign Test',
webhookUrl: 'https://yourapp.com/webhooks/placement-test', // optional
});
console.log(test.code); // "ELV-A1B2C3D4E5" - Include this in your email
console.log(test.emails); // Array of seed emails to send to
console.log(test.status); // 'running'
// Send your test email from YOUR production system to all seed emails
// Make sure to include the tracking code in the subject or body
💳 Credits: 100 per test
How it works:
Refund policy: If no emails are detected (all missing/waiting), 100 credits are refunded automatically.
getPlacementTest(code: string): Promise<PlacementTestResponse>Get placement test results and status.
const results = await client.getPlacementTest('ELV-A1B2C3D4E5');
console.log(results.status); // 'running' | 'complete'
console.log(results.sender); // Auto-detected sender email
console.log(results.summary.inbox); // Percentage that landed in inbox
console.log(results.summary.spam); // Percentage that landed in spam
console.log(results.summary.promotions); // Percentage in promotions/social tab
// Detailed breakdown by recipient
results.recipients.forEach((recipient) => {
console.log(`${recipient.email} (${recipient.esp}): ${recipient.placement}`);
// Example: test@gmail.com (google): inbox
});
// Poll every 30-60 seconds while status is 'running'
while (results.status === 'running') {
await new Promise((resolve) => setTimeout(resolve, 60000)); // Wait 60 seconds
results = await client.getPlacementTest(code);
}
console.log('Test complete!');
💳 Credits: Free - does not consume credits
Response includes:
running or completeinbox - Primary inboxcategory - Promotions/social/updates folderspam - Spam folderwaiting - Not yet detectedmissing - Not found (bounced/blocked)Typical completion time: 5-10 minutes after sending emails
getCredits(): Promise<CreditsResponse>Get your account credit balance.
const credits = await client.getCredits();
console.log('On-demand credits:', credits.onDemand.available);
if (credits.subscription) {
console.log('Subscription credits:', credits.subscription.available);
console.log('Expires at:', credits.subscription.expiresAt);
}
💳 Credits: Free - does not consume credits
The SDK provides 14 specialized error classes for comprehensive error handling.
import {
EmailListVerifyError, // Base error class
AuthenticationError, // 401 - Invalid API key
ForbiddenError, // 403 - Access denied
InsufficientCreditsError, // 403 - Not enough credits
TooManyJobsError, // 403 - Job limit reached
NotFoundError, // 404 - Resource not found
EmailJobNotFoundError, // 404 - Job not found
MaillistNotFoundError, // 404 - Bulk list not found
PlacementTestNotFoundError, // 404 - Placement test not found
BadRequestError, // 400 - Bad request
InvalidFileError, // 400 - Invalid file format
MaillistNotFinishedError, // 400 - Bulk list still processing
RateLimitError, // 429 - Rate limit exceeded
NetworkError, // Network/connection error
TimeoutError, // Request timeout
ValidationError, // Client-side validation error
ParseError, // JSON parse error
} from '@emaillistverify/sdk';
Use type guards for type-safe error handling:
import {
isAuthenticationError,
isInsufficientCreditsError,
isRateLimitError,
isNotFoundError,
isNetworkError,
isValidationError,
} from '@emaillistverify/sdk';
try {
const result = await client.verifyEmail('test@example.com');
} catch (error) {
if (isAuthenticationError(error)) {
console.error('Invalid API key');
} else if (isInsufficientCreditsError(error)) {
console.error('Not enough credits');
const credits = await client.getCredits();
console.log('Available:', credits.onDemand.available);
} else if (isRateLimitError(error)) {
console.error('Rate limit exceeded - retry later');
} else if (isNetworkError(error)) {
console.error('Network error:', error.message);
} else {
console.error('Error:', error.message);
}
}
try {
const result = await client.verifyEmail(email);
// Use result
} catch (error) {
console.error('Error code:', error.code);
console.error('Status:', error.statusCode);
console.error('Message:', error.message);
if (error.response) {
console.error('API response:', error.response);
}
}
Complete Example: See examples/error-handling.js
The SDK is written in TypeScript with full type safety.
import {
EmailListVerifyClient,
VerifyEmailResponse,
VerifyEmailDetailedResponse,
CreateEmailJobResponse,
EmailJobResponse,
FindContactRequest,
FindContactResponse,
CheckDisposableResponse,
BulkUploadResponse,
MaillistProgressResponse,
CreditsResponse,
ClientConfig,
VerificationResult,
} from '@emaillistverify/sdk';
const client = new EmailListVerifyClient('api-key');
// Type-safe API calls
const result: VerifyEmailResponse = await client.verifyEmail('test@example.com');
// result is a string: 'ok' | 'invalid' | 'disposable' | etc.
const detailed: VerifyEmailDetailedResponse =
await client.verifyEmailDetailed('test@example.com');
// detailed is an object with email, result, isRole, isFree, firstName, etc.
const job: CreateEmailJobResponse = await client.createEmailJob({
email: 'test@example.com',
quality: 'standard',
});
const credits: CreditsResponse = await client.getCredits();
const config: ClientConfig = {
baseUrl: 'https://api.emaillistverify.com',
timeout: 30000,
headers: {
'X-Custom-Header': 'value',
},
};
const client = new EmailListVerifyClient('api-key', config);
The SDK includes 5 comprehensive usage examples:
Run examples:
export EMAILLISTVERIFY_API_KEY="your-api-key"
node examples/basic-usage.js
See examples/README.md for detailed usage examples and use cases.
const client = new EmailListVerifyClient(apiKey, {
baseUrl: 'https://api.emaillistverify.com', // API endpoint
timeout: 30000, // Request timeout (ms)
headers: {
// Custom headers
'X-Custom-Header': 'value',
},
});
export EMAILLISTVERIFY_API_KEY="your-api-key-here"
const client = new EmailListVerifyClient(process.env.EMAILLISTVERIFY_API_KEY);
The SDK includes comprehensive test coverage:
npm test
⚠️ Uses real API credits (~50-100 per run)
# 1. Set up API key
cp test-scripts/.env.example test-scripts/.env
# Edit .env and add your API key
# 2. Build the SDK
npm run build
# 3. Run integration tests
npm run test:integration
See test-scripts/README.md for detailed testing documentation.
| Method | Description | Docs |
|---|---|---|
verifyEmail() | Simple email verification | 📖 |
verifyEmailDetailed() | Detailed verification with metadata | 📖 |
createEmailJob() | Create async verification job | 📖 |
getEmailJob() | Check async job status | 📖 |
findContact() | Find contact by name/domain | 📖 |
checkDisposable() | Check if domain is disposable | 📖 |
uploadBulkFile() | Upload CSV for bulk verification | 📖 |
getBulkProgress() | Check bulk processing progress | 📖 |
downloadBulkResults() | Download verification results | 📖 |
deleteBulkList() | Delete bulk list | 📖 |
createPlacementTest() | Create inbox placement test | 📖 |
getPlacementTest() | Get placement test results | 📖 |
getCredits() | Get account credit balance | 📖 |
💳 Credit Costs: See pricing documentation for current credit costs per operation.
The result field can be:
ok - Email is valid and deliverableinvalid - Email format is invalidunknown - Unable to verifyaccept_all - Server accepts all emails (catch-all)disposable - Temporary/disposable emailrole - Role-based email (info@, admin@)email_disabled - Email is disableddead_server - Mail server not respondinginvalid_mx - Domain has invalid MX recordstry {
const result = await client.verifyEmail(email);
} catch (error) {
if (isInsufficientCreditsError(error)) {
// Handle no credits
} else if (isRateLimitError(error)) {
// Implement backoff
}
}
const credits = await client.getCredits();
const available = credits.onDemand.available + (credits.subscription?.available || 0);
if (available < emailCount) {
console.log('Not enough credits');
}
verifyEmail() or verifyEmailDetailed()createEmailJob() + getEmailJob()uploadBulkFile() + pollingtry {
const results = await client.downloadBulkResults(fileId);
// Use results
} finally {
await client.deleteBulkList(fileId);
}
async function verifyWithRetry(email, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await client.verifyEmail(email);
} catch (error) {
if (isRateLimitError(error) && i < maxRetries - 1) {
await sleep(Math.pow(2, i) * 1000); // Exponential backoff
continue;
}
throw error;
}
}
}
Node.js 20+ is required because the SDK uses the native fetch API.
No. The API doesn't support CORS, so it's server-side only (Node.js).
verifyEmail() and verifyEmailDetailed()?verifyEmail() - Basic verificationverifyEmailDetailed() - Includes SMTP check + metadata like name, gender, countrySee pricing documentation for credit costs.
Upload with uploadBulkFile(), then implement polling with getBulkProgress(). See examples/bulk-verification.js.
No. Checking progress with getBulkProgress() is free. Credits are only consumed on upload.
You'll get a MaillistNotFinishedError if you try to download results before processing completes.
Contributions are welcome! Please:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)# Clone the repository
git clone https://github.com/EmailListVerify-com/emaillistverify-sdk-js.git
cd emaillistverify-sdk-js
# Install dependencies
npm install
# Run tests
npm test
# Run linter
npm run lint
# Build the SDK
npm run build
See CHANGELOG.md for version history and release notes.
MIT License - see LICENSE for details.
Built with:
Made with ❤️ for developers by developers
If this SDK helps you, please consider ⭐️ starring the repository!
[1.1.0] - 2025-10-29
New Features:
createPlacementTest() - Create new inbox placement test (100 credits)getPlacementTest() - Get placement test results with detailed breakdownAPI Coverage:
PlacementTestStatus - Test status ('running' | 'complete')PlacementLocation - Email placement result (inbox, spam, category, waiting, missing)PlacementTestESP - Email service provider (google, yahoo, outlook, zoho, other)PlacementTestAccountType - Account type (personal, professional)CreatePlacementTestRequest - Request parameters (optional name and webhookUrl)CreatePlacementTestResponse - Test creation response with tracking codePlacementTestRecipient - Individual recipient placement detailsPlacementTestSummary - Summary percentages of placement resultsPlacementTestResponse - Complete test results with recipients and summaryError Handling:
PlacementTestNotFoundError class for 404 errors on placement testsisPlacementTestNotFoundError() for type-safe error handlingTesting:
Documentation:
Documentation Updates:
FAQs
Official TypeScript SDK for the EmailListVerify API - Complete email validation and verification service.
The npm package @emaillistverify/sdk receives a total of 2 weekly downloads. As such, @emaillistverify/sdk popularity was classified as not popular.
We found that @emaillistverify/sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Recent coverage mislabels the latest TEA protocol spam as a worm. Here’s what’s actually happening.

Security News
PyPI adds Trusted Publishing support for GitLab Self-Managed as adoption reaches 25% of uploads

Research
/Security News
A malicious Chrome extension posing as an Ethereum wallet steals seed phrases by encoding them into Sui transactions, enabling full wallet takeover.