Email Verification API — Real-Time Email Validation API
Integrate email verification directly into your application with our RESTful API. Sub-500ms response times, 99.9% uptime, and 99.5% accuracy. Verify emails in real-time at signup, in bulk via batch endpoints, or through webhooks.
Request
curl -X POST https://ev.ecomtechbd.com/v1/verify/single \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com"}'
Response
{
"email": "test@example.com",
"valid": true,
"deliverable": true,
"risk_level": "low",
"confidence": 95,
"provider": "example.com",
"details": {
"syntax_valid": true,
"domain_exists": true,
"mx_record": true,
"smtp_valid": true
},
"reason": "verified",
"cached": false
}
API Features
Sub-500ms Response Time
Our API responds in under 500 milliseconds on average for single email verification requests. Real-time validation at user signup without noticeable delay.
99.9% Uptime SLA
Enterprise-grade infrastructure with redundant servers across multiple regions. Our uptime SLA guarantees 99.9% availability with automatic failover.
RESTful JSON API
Clean, intuitive RESTful endpoints with JSON request and response bodies. Standard HTTP status codes and consistent error handling across all endpoints.
Batch Processing
Verify up to 1,000 emails per batch request. Asynchronous processing with webhook callbacks or polling for large batch jobs.
Rate Limiting
Generous rate limits scaled to your plan. Starter: 10 req/sec, Professional: 50 req/sec, Business: 200 req/sec, Enterprise: custom.
Comprehensive Checks
Every API call performs syntax validation, DNS lookup, MX record check, SMTP verification, disposable email detection, role-based detection, and catch-all detection.
Quick Start Guide
Get Your API Key
Sign up for a free account at ev.ecomtechbd.com/pricing. Your API key is available immediately. No credit card required.
Authenticate Requests
Include your API key as a Bearer token: Authorization: Bearer YOUR_API_KEY
Make Your First Request
POST to /v1/verify/single with the email in JSON body. Get the full verification result.
Handle the Response
Check status for: valid, invalid, risky, or unknown.
API Endpoints
POST /v1/verify/single POST /v1/verify — Singlemdash; Single Email Verification
Verify a single email address in real-time. Average response time is under 500ms.
Request:
POST https://ev.ecomtechbd.com/v1/verify/single
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"email": "user@example.com"
}
Response (200 OK):
{
"email": "user@example.com",
"valid": true,
"deliverable": true,
"risk_level": "low",
"confidence": 95,
"provider": "example.com",
"details": {
"syntax_valid": true,
"domain_exists": true,
"mx_record": true,
"smtp_valid": true
},
"reason": "verified",
"cached": false
}
POST /v1/verify/bulk POST /v1/verify/bulk — Batch Verification (up to 1,000)mdash; Bulk Verification
Submit a batch of up to 1,000 email addresses for asynchronous verification. Returns a job_id to check status.
Request:
POST https://ev.ecomtechbd.com/v1/verify/bulk
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"emails": [
"user1@example.com",
"user2@example.com",
"user3@example.com"
],
"webhook_url": "https://yoursite.com/webhook/verification"
}
Response (202 Accepted):
{
"job_id": "batch_abc123def456",
"total_emails": 3,
"estimated_time_seconds": 15,
"status": "processing",
"webhook_url": "https://yoursite.com/webhook/verification"
}
GET /v1/verify/bulk/status/{jobId} — Check Batch Status
Poll for the status and results of a batch verification job.
Request:
GET https://ev.ecomtechbd.com/v1/verify/bulk/status/batch_abc123def456
Authorization: Bearer YOUR_API_KEY
Response (200 OK):
{
"job_id": "batch_abc123def456",
"status": "completed",
"total_emails": 3,
"processed": 3,
"results": {
"valid": 2,
"invalid": 1,
"risky": 0,
"unknown": 0
},
"download_url": "https://ev.ecomtechbd.com/v1/verify/bulk/download/batch_abc123def456",
"expires_at": "2026-03-16T00:00:00Z"
}
GET /api/credits/status GET /v1/account/credits — Check Remaining Creditsmdash; Check Remaining Credits (Auth Required)
Check your current credit balance and usage statistics.
Request:
GET https://ev.ecomtechbd.com/api/credits/status
Authorization: Bearer YOUR_API_KEY
Response (200 OK):
{
"credits_remaining": 9850,
"credits_used_today": 150,
"credits_used_this_month": 4200,
"plan": "professional",
"monthly_limit": 50000,
"rate_limit_per_second": 50
}
Code Examples
Copy-paste examples in your preferred language to get started quickly.
Node.js
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
async function verifyEmail(email) {
const response = await axios.post(
'https://ev.ecomtechbd.com/v1/verify/single',
{ email },
{
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
}
// Usage
verifyEmail('test@example.com')
.then(result => console.log(result.valid))
.catch(err => console.error(err.message));
Python
import requests
API_KEY = 'YOUR_API_KEY'
def verify_email(email):
response = requests.post(
'https://ev.ecomtechbd.com/v1/verify/single',
json={'email': email},
headers={
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
)
return response.json()
# Usage
result = verify_email('test@example.com')
print(result['valid'])
PHP
$apiKey = 'YOUR_API_KEY';
function verifyEmail($email) {
global $apiKey;
$ch = curl_init('https://ev.ecomtechbd.com/v1/verify/single');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['email' => $email]),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json'
],
CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// Usage
$result = verifyEmail('test@example.com');
echo $result['valid'];
Ruby
require 'net/http'
require 'json'
require 'uri'
API_KEY = 'YOUR_API_KEY'
def verify_email(email)
uri = URI('https://ev.ecomtechbd.com/v1/verify/single')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{API_KEY}"
request['Content-Type'] = 'application/json'
request.body = { email: email }.to_json
response = http.request(request)
JSON.parse(response.body)
end
# Usage
result = verify_email('test@example.com')
puts result['valid']
Java
import java.net.http.*;
import java.net.URI;
public class EmailVerifier {
private static final String API_KEY = "YOUR_API_KEY";
private static final String BASE_URL = "https://ev.ecomtechbd.com/v1";
public static String verifyEmail(String email) throws Exception {
HttpClient client = HttpClient.newHttpClient();
String json = String.format("{\"email\":\"%s\"}", email);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/verify"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString()
);
return response.body();
}
public static void main(String[] args) throws Exception {
String result = verifyEmail("test@example.com");
System.out.println(result);
}
}
Response Fields Explained
| Field | Type | Description |
|---|---|---|
email | string | The email address that was verified |
valid | boolean | Whether the email is valid and deliverable |
deliverable | boolean | Whether the email can receive messages |
risk_level | string | Risk assessment: low, medium, or high |
confidence | integer | Confidence score from 0 to 100 |
provider | string | The email domain/provider |
details.syntax_valid | boolean | Whether the email format is valid per RFC 5322 |
details.domain_exists | boolean | Whether the email domain has valid DNS records |
details.mx_record | boolean | Whether MX records exist for the domain |
details.smtp_valid | boolean | Whether the SMTP server confirmed the mailbox exists |
reason | string | Verification reason: verified, mailbox_not_found, disposable, role_based, etc. |
cached | boolean | Whether the result was served from cache |
Error Codes
| HTTP Code | Error Code | Description |
|---|---|---|
| 400 | invalid_email | The email parameter is missing or not a valid email format |
| 401 | unauthorized | API key is missing, invalid, or expired |
| 402 | insufficient_credits | Your account has no remaining verification credits |
| 429 | rate_limit_exceeded | You have exceeded the rate limit for your plan |
| 500 | server_error | An internal server error occurred. Retry the request |
| 503 | service_unavailable | The service is temporarily unavailable for maintenance |
Rate Limiting
| Plan | Requests/Second | Batch Size Limit | Daily Limit |
|---|---|---|---|
| Free Trial | 2 req/sec | 10 emails | 100 emails |
| Starter LTD ($10) | 10 req/sec | 500 emails | 5,000 emails |
| Professional LTD ($20) | 50 req/sec | Unlimited | 1,500/day for life |
| Business LTD ($30) | 200 req/sec | Unlimited | 2,500/day for life |
| Enterprise (custom) | Custom | Custom | Unlimited |
Rate limit headers are included in every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Webhooks for Batch Processing
How Webhooks Work
When you submit a batch verification request, include a webhook_url in the request body. Once the batch is complete, we send a POST request to your webhook URL with the full results.
This eliminates the need for polling and allows your application to process results asynchronously.
Webhook Payload
{
"event": "batch_completed",
"job_id": "batch_abc123def456",
"total_emails": 500,
"results": {
"valid": 420,
"invalid": 55,
"risky": 20,
"unknown": 5
},
"download_url": "https://ev.ecomtechbd.com/v1/verify/bulk/download/batch_abc123def456",
"timestamp": "2026-03-15T12:00:00Z"
}
Webhook requests include an X-Webhook-Signature header for verification. Retries are attempted 3 times with exponential backoff.
Official SDKs
Install our official SDK in your preferred language to get started in minutes.
Node.js
npm install @ecomtech/email-verifier
Python
pip install ecomtech-email-verifier
PHP
composer require ecomtech/email-verifier
Ruby
gem install ecomtech-email-verifier
Java
<dependency>
<groupId>com.ecomtech</groupId>
<artifactId>email-verifier</artifactId>
<version>1.0.0</version>
</dependency>
Go
go get github.com/ecomtech/email-verifier-go
Email Verification API FAQ
Authentication uses API keys passed in the Authorization header as a Bearer token. You can generate and manage API keys from your dashboard. Each key can be scoped with specific permissions and rate limits for security.
Our API provides endpoints for single email verification (GET /v1/verify), batch verification (POST /v1/verify/batch), verification status check (GET /v1/verify/status/:id), domain check (GET /v1/domain/:domain), and account usage (GET /v1/account/usage).
Rate limits depend on your plan: Free (10 requests/minute), Starter (100 requests/second), Professional (500 requests/second), Enterprise (custom limits up to 5,000 requests/second). Batch endpoints allow up to 50,000 emails per request.
Yes, we provide official SDKs for JavaScript/Node.js, Python, PHP, Ruby, Java, Go, and C#. All SDKs are open source on GitHub, include TypeScript definitions where applicable, and handle authentication, retries, and rate limiting automatically.
Yes, webhooks notify your server when batch verification jobs complete. Configure webhook URLs from your dashboard or via the API. Webhooks include HMAC signature verification for security and automatic retry with exponential backoff for failed deliveries.
Submit a batch of up to 50,000 emails via the batch endpoint. The API returns a job ID immediately. Processing happens asynchronously and you can poll the status endpoint or configure a webhook to be notified when results are ready. Results are available for download for 30 days.