uSpeedo BatchVerifyEmail API: A Complete Developer Guide
What Is BatchVerifyEmail?
BatchVerifyEmail is a synchronous REST API provided by uSpeedo for real-time email address validation. It performs a full chain of checks — from basic syntax validation to live SMTP mailbox probing — and returns a detailed verdict for each address.
Because the API runs synchronously (typically 5–30 seconds per request), it is best suited for server-side integrations such as sign-up flows, CRM data cleansing, and list hygiene before campaigns.
API Specification
| Item | Detail |
|---|---|
| Method | POST |
| Endpoint | https://api.uspeedo.com/api/v1/email/BatchVerifyEmail |
| Authentication | HTTP Basic Auth — ACCESSKEY_ID:ACCESSKEY_SECRET |
| Content-Type | application/json |
| Rate Limit | 5 QPS (requests per second) |
| Batch Size | Maximum 1 email per request |
The
Emailsfield accepts an array format, but only a single entry is supported per call. Sending more than one address triggers error214405.
Supported Domains
The following domains return definitive results (ResultStatus: 0 or 1):
gmail.com · outlook.com · hotmail.com · qq.com · 163.com · gmx.de · alice.it
All other domains typically return ResultStatus: 2 (Uncertain). Your application logic should handle this case explicitly.
Making Your First Request
curl -X POST "https://api.uspeedo.com/api/v1/email/BatchVerifyEmail" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Basic $(echo -n 'ACCESSKEY_ID:ACCESSKEY_SECRET' | base64)" \
-d '{
"Emails": [
"user@example.com"
]
}'
Understanding the Response
A successful call returns:
{
"RetCode": 0,
"Message": "Success",
"RequestUuid": "unique-request-id",
"Action": "BatchVerifyEmail",
"Data": {
"SessionNo": "batch-uuid",
"TotalCount": 1,
"SuccessCount": 1,
"FailCount": 0,
"Results": [
{
"Email": "user@example.com",
"ResultStatus": 0,
"RiskTag": 0,
"SyntaxStatus": 1,
"DnsStatus": 1,
"SmtpStatus": 1
}
],
"FailContent": []
}
}
Status Field Reference
ResultStatus — Overall Verdict
| Value | Meaning |
|---|---|
0 |
Valid — email is deliverable |
1 |
Invalid — email is undeliverable |
2 |
Uncertain — result cannot be determined |
3 |
High-risk — flagged address |
4 |
In progress — verification not yet complete |
RiskTag — Risk Classification
| Value | Meaning |
|---|---|
0 |
No risk detected |
1 |
Disposable / temporary email |
2 |
Garbled or randomly generated address |
3 |
Spam trap address |
4 |
Public free email provider |
Sub-Check Status (SyntaxStatus / DnsStatus / SmtpStatus)
| Value | Meaning |
|---|---|
0 |
Pending — check not yet executed |
1 |
Passed |
2 |
Failed |
3 |
Skipped — check was bypassed |
4 |
Unknown — result unavailable |
Error Codes
| Code | Description |
|---|---|
214403 |
Missing required Emails parameter |
214405 |
Array contains more than 1 email (batch limit exceeded) |
215209 |
Rate limit exceeded (over 5 QPS) |
214406 |
Internal service error |
Best Practices
1. Call from server-side only
This is a blocking synchronous API. Never invoke it directly from browser or mobile client code — use a backend proxy or queue worker instead.
2. One email per request
Despite the array parameter name, each request must contain exactly one email address. Batch multiple addresses by issuing sequential or parallel requests with your own rate limiting.
3. Respect the 5 QPS limit
Exceeding the rate limit returns error 215209 and may result in temporary IP blocking. Implement exponential backoff or a token bucket limiter in your integration.
4. Handle ResultStatus: 2 explicitly
For domains outside the officially supported list, the API returns an uncertain result. Treat these as "needs manual review" rather than valid or invalid.
5. Use all fields together
Rely only on ResultStatus and you'll miss important signal. For example, a ResultStatus: 0 with RiskTag: 1 (disposable email) may still warrant attention in a sign-up flow. Combine SyntaxStatus, DnsStatus, SmtpStatus, and RiskTag to build a complete quality score.
6. Cache results
Email addresses don't change status frequently. Cache verification results for 7–30 days to reduce redundant API calls and stay within rate limits.