Sniffmail API
Real-time email verification API. Validate emails instantly with SMTP checks, disposable detection, and deliverability scoring.
Disposable Detection
Block 3,000+ temporary email providers
SMTP Verification
Direct mailbox ping for accuracy
Fast Response
Results in milliseconds
Getting Started
Get started with Sniffmail in minutes. Create an account, grab your API key, and start verifying emails.
Create an account
Sign up at app.sniffmail.io
Get your API key
Navigate to API Keys and create a new key
Make your first request
Use the example below to verify an email
Authentication
Authenticate requests using your API key. Include it as a Bearer token or the x-api-key header.
Server-side only
Never expose your API key in client-side code (browser JavaScript). Always call the API from your backend server. If your key is compromised, regenerate it immediately in your dashboard.
Bearer Token (recommended)
Authorization: Bearer sniff_your_api_key_hereX-API-Key Header
x-api-key: sniff_your_api_key_hereBase URL
https://api.sniffmail.ioVerify Email
Verify a single email address. Returns detailed validation results including deliverability, disposable detection, and syntax validation.
/verifyRequest
curl -X POST https://api.sniffmail.io/verify \
-H "Authorization: Bearer sniff_your_api_key" \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com"}'JavaScript / Node.js
const response = await fetch('https://api.sniffmail.io/verify', {
method: 'POST',
headers: {
'Authorization': 'Bearer sniff_your_api_key',
'Content-Type': 'application/json',
},
body: JSON.stringify({ email: 'test@example.com' }),
});
const result = await response.json();
console.log(result);Python
import requests
response = requests.post(
'https://api.sniffmail.io/verify',
headers={'Authorization': 'Bearer sniff_your_api_key'},
json={'email': 'test@example.com'}
)
print(response.json())Bulk Jobs
Verify large lists of emails asynchronously. Submit a job, then poll for status or receive a webhook when complete.
Create a Bulk Job
/jobscurl -X POST https://api.sniffmail.io/jobs \
-H "Authorization: Bearer sniff_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"emails": ["user1@example.com", "user2@example.com", "user3@example.com"],
"webhookUrl": "https://yoursite.com/webhook"
}'Response
{
"jobId": "job_abc123xyz",
"status": "pending",
"totalEmails": 3,
"message": "Job created successfully"
}Check Job Status
/jobs/:jobIdcurl https://api.sniffmail.io/jobs/job_abc123xyz \
-H "Authorization: Bearer sniff_your_api_key"Response
{
"id": "job_abc123xyz",
"status": "completed",
"totalEmails": 3,
"processedEmails": 3,
"validEmails": 2,
"invalidEmails": 1,
"progress": 100,
"createdAt": "2024-01-15T10:30:00Z",
"completedAt": "2024-01-15T10:30:45Z"
}Get Job Results
/jobs/:jobId/results{
"id": "job_abc123xyz",
"totalEmails": 3,
"validEmails": 2,
"invalidEmails": 1,
"results": [
{ "email": "user1@example.com", "status": "valid", "isDeliverable": true, "isDisposable": false },
{ "email": "user2@example.com", "status": "valid", "isDeliverable": true, "isDisposable": false },
{ "email": "user3@tempmail.com", "status": "risky", "isDeliverable": true, "isDisposable": true }
]
}Webhooks
Receive real-time notifications when bulk jobs complete or other events occur. Webhooks are signed with HMAC-SHA256 for security.
Create a Webhook
/jobs/webhookscurl -X POST https://api.sniffmail.io/jobs/webhooks \
-H "Authorization: Bearer sniff_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://yoursite.com/sniffmail-webhook",
"events": ["job.completed"]
}'Response
{
"id": "wh_xyz789",
"secret": "whsec_abc123...",
"message": "Save this secret - it won't be shown again"
}Webhook Payload
When an event occurs, we send a POST request to your URL with the following payload:
{
"event": "job.completed",
"jobId": "job_abc123xyz",
"status": "completed",
"totalEmails": 100,
"validEmails": 85,
"invalidEmails": 15,
"completedAt": "2024-01-15T10:30:45Z"
}Verifying Signatures
Verify webhook authenticity using the X-Sniffmail-Signature header:
import crypto from 'crypto';
function verifyWebhook(payload: string, signature: string, secret: string): boolean {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
// In your webhook handler:
app.post('/sniffmail-webhook', (req, res) => {
const signature = req.headers['x-sniffmail-signature'];
const isValid = verifyWebhook(JSON.stringify(req.body), signature, WEBHOOK_SECRET);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
// Process the webhook...
res.status(200).send('OK');
});Available Events
| Event | Description |
|---|---|
| job.completed | Fired when a bulk verification job finishes |
Integrations
Connect Sniffmail to 7,000+ apps via our native Zapier integration, or integrate directly with your e-commerce and marketing platforms.
Zapier Integration
Sniffmail is officially available on Zapier. Connect with Shopify, Mailchimp, Klaviyo, HubSpot, Google Sheets, and thousands more apps — no code required.
Available Triggers & Actions
| Type | Name | Description |
|---|---|---|
| Trigger | Job Completed | Fires when a bulk verification job finishes |
| Action | Verify Email | Verify a single email address |
| Action | Bulk Verify | Submit multiple emails for batch verification |
Popular Zap Templates
- Google Sheets — Save bulk verification results to a spreadsheet
- Slack — Get notified when verification jobs complete
- HubSpot — Verify new contact emails automatically
- Gmail — Email yourself job completion summaries
Setting Up Zapier
Create a Zap
Go to Sniffmail on Zapier and click "Create a Zap"
Connect your Sniffmail account
Enter your API key when prompted. Get your key from API Keys
Configure your workflow
Choose a trigger app (e.g., HubSpot new contact), then add Sniffmail's Verify Email action
Test and publish
Test your Zap with sample data, then publish to start automating
Using the Verify Email Action
The Verify Email action accepts an email address and returns detailed verification results:
// Zapier returns these fields you can use in subsequent steps:
{
"email": "user@example.com",
"result": "safe", // safe, risky, invalid, unknown, unverified
"is_valid": true,
"is_deliverable": true,
"is_disposable": false,
"is_role_account": false,
"reason": "Valid email"
}Using the Job Completed Trigger
Get notified when bulk verification jobs finish. Great for processing large lists and sending results to other apps.
// Trigger payload when a job completes:
{
"id": "job_abc123xyz",
"status": "completed",
"total_emails": 100,
"valid_emails": 85,
"invalid_emails": 15,
"completed_at": "2024-01-15T10:30:45Z"
}Direct API Integration
For custom integrations, use our REST API directly. See the examples above for single email verification, or use bulk jobs for large lists.
Need help integrating?
Contact us at contact@sniffmail.io for integration support or custom solutions.
Response Format
Successful responses return a JSON object with all validation details.
{
"email": "test@example.com",
"is_valid": true,
"is_reachable": "safe",
"is_disposable": false,
"is_role_account": false,
"is_deliverable": true,
"mx_valid": true,
"reason": "Valid email"
}Response Fields
| Field | Type | Description |
|---|---|---|
| string | The email address that was verified | |
| is_valid | boolean | Overall validity - true if safe and not disposable |
| is_reachable | string | "safe", "risky", "invalid", "unknown", or "unverified" |
| is_disposable | boolean | Whether the email is from a disposable provider |
| is_role_account | boolean | Whether it's a role address (info@, support@) |
| is_deliverable | boolean | Whether the mailbox exists and accepts mail |
| mx_valid | boolean | Whether the domain has valid MX records |
| reason | string | Human-readable explanation of the result |
Error Handling
Errors return standard HTTP status codes with descriptive messages.
400Bad Request
Invalid email format or missing parameters
401Unauthorized
Missing or invalid API key
429Too Many Requests
Rate limit exceeded
500Internal Server Error
Something went wrong on our end
Error Response Example
{
"error": "Validation Error",
"message": "Invalid email format"
}Rate Limits
Rate limits depend on your subscription tier. Limits are applied per-minute.
| Plan | Monthly Limit | Rate Limit |
|---|---|---|
| Free | 500 requests | 10/min |
| Starter | 25,000 requests | 60/min |
| Pro | 100,000 requests | 200/min |
| Scale | 200,000 requests | 200/min |
Need higher limits? Upgrade your plan or contact us for enterprise pricing.
npm Package
For Node.js/TypeScript server-side projects, use our official npm package for a simpler integration with built-in caching, error handling, and disposable email detection.
Installation
npm install sniffmailQuick Start
Note: deep: true enables deep SMTP mailbox verification and requires a paid plan API key. Without it, only syntax, MX record, and disposable domain checks are performed.
import { configure, validateEmail } from 'sniffmail';
// Configure your API key (get one free at sniffmail.io)
configure({
apiKey: process.env.SNIFFMAIL_API_KEY,
});
// Validate with SMTP verification (requires paid plan)
const result = await validateEmail('user@example.com', { deep: true });
if (!result.valid) {
console.log(`Invalid: ${result.reason}`);
// 'invalid_syntax' | 'disposable' | 'no_mx_records' | 'mailbox_not_found'
}Disposable Check (No API Key)
Block burner emails locally without any API calls or costs.
import { isDisposableDomain } from 'sniffmail';
// Instant check against 10,000+ disposable domains
if (isDisposableDomain('tempmail.com')) {
console.log('Blocked!');
}Batch Validation
import { validateEmails } from 'sniffmail';
const { results, summary } = await validateEmails(
['a@gmail.com', 'b@tempmail.com', 'c@company.com'],
{ deep: true, concurrency: 5 }
);
console.log(summary);
// { total: 3, valid: 2, invalid: 0, disposable: 1, unknown: 0 }Ready to get started?
Create your free account and get 500 email verifications per month.