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.

1

Create an account

Sign up at app.sniffmail.io

2

Get your API key

Navigate to API Keys and create a new key

3

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_here

X-API-Key Header

x-api-key: sniff_your_api_key_here

Base URL

https://api.sniffmail.io

Verify Email

Verify a single email address. Returns detailed validation results including deliverability, disposable detection, and syntax validation.

POST/verify

Request

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

POST/jobs
curl -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

GET/jobs/:jobId
curl 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

GET/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

POST/jobs/webhooks
curl -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

EventDescription
job.completedFired 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

TypeNameDescription
TriggerJob CompletedFires when a bulk verification job finishes
ActionVerify EmailVerify a single email address
ActionBulk VerifySubmit 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

1

Create a Zap

Go to Sniffmail on Zapier and click "Create a Zap"

2

Connect your Sniffmail account

Enter your API key when prompted. Get your key from API Keys

3

Configure your workflow

Choose a trigger app (e.g., HubSpot new contact), then add Sniffmail's Verify Email action

4

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

FieldTypeDescription
emailstringThe email address that was verified
is_validbooleanOverall validity - true if safe and not disposable
is_reachablestring"safe", "risky", "invalid", "unknown", or "unverified"
is_disposablebooleanWhether the email is from a disposable provider
is_role_accountbooleanWhether it's a role address (info@, support@)
is_deliverablebooleanWhether the mailbox exists and accepts mail
mx_validbooleanWhether the domain has valid MX records
reasonstringHuman-readable explanation of the result

Error Handling

Errors return standard HTTP status codes with descriptive messages.

400

Bad Request

Invalid email format or missing parameters

401

Unauthorized

Missing or invalid API key

429

Too Many Requests

Rate limit exceeded

500

Internal 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.

PlanMonthly LimitRate Limit
Free500 requests10/min
Starter25,000 requests60/min
Pro100,000 requests200/min
Scale200,000 requests200/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 sniffmail

Quick 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.