API Documentation
Overview
The Zuhal API is a RESTful interface designed for developers who need to verify email addresses programmatically. Whether you need to validate a single email during user registration or clean a list of 1 million contacts, our API scales to meet your needs.
We support JSON responses for all endpoints and use standard HTTP response codes to indicate errors.
https://zuhal.io/api/v1/
Adaptive Deep Validation
AUTOMATED FEATUREStandard verification is fast, but sometimes mail servers return ambiguous "Unknown" results. To solve this, Zuhal includes an automated secondary review layer.
- Trigger Condition: If your uploaded batch exceeds a 15% Unknown/Catch-All rate, the system automatically flags it for deep review.
- How it Works: We re-route these specific emails through specialized residential IP networks and perform manual handshake simulations to determine their true status.
- Impact on Timing: This rigorous process prioritizes accuracy over speed. It may extend the processing time by up to 1 hour, but it drastically reduces bounce rates for difficult lists.
Authentication
Every API request must be authenticated using your unique API Key. You can find or regenerate your key in the Dashboard > Developer Settings.
Pass the key in the HTTP Header of your request. Do not expose this key in client-side code (frontend JavaScript).
Authorization: Bearer YOUR_API_KEY_HERE
1. Single Verification
The Single Verify endpoint is optimized for real-time applications. Use this to validate emails instantly as users type them into your registration forms, newsletter signups, or contact pages.
Best for: Preventing typos, blocking disposable emails, and ensuring high-quality signups.
Example Request Body
{
"email": "klem@viableview.com"
}
Success Response
{
"status": "success",
"data": {
"email": "klem@viableview.com",
"status": "valid",
"score": "0.99",
"is_disposable": false
}
}
2. Bulk Upload
For lists larger than 100 emails, use the Bulk API. This process is asynchronous: you upload the file, we process it in the background, and you download the results later.
How it works:
1. Upload a CSV file via this endpoint.
2. You will receive a unique job_id immediately.
3. Use this ID to poll the status endpoint.
Content-Type: multipart/form-data
File Requirement: A standard CSV file. It must contain a header row with a column named email.
Success Response
{
"status": "success",
"data": {
"job_id": "1502d7c5-7575-4b4a-816c...",
"status": "processing",
"message": "File uploaded successfully. Use job_id to check status."
}
}
3. Check Status
Use this endpoint to monitor the progress of your bulk job. We recommend polling this endpoint every 10-30 seconds.
Note on Deep Validation: If your job triggers the Deep Validation layer, the status will stay as
processing for a longer period (up to 60 mins). Do not abort the job; the system is actively working on hard-to-verify emails.
Response (Job Completed)
{
"status": "success",
"data": {
"job_id": "1502d7c5...",
"status": "completed",
"percentage_complete": "100.00",
"total_records": 5000
}
}
4. Download Results
Once the status returns completed, call this endpoint to retrieve the URL of your verified file.
The file will contain your original data plus new columns for verification status (Valid, Invalid, Unknown, Disposable).
Success Response
{
"status": "success",
"data": {
"download_link": "https://zuhal.io/api/v1/bulk/download/...",
"expires_in": "24 hours"
}
}
5. Delete Job
For security and privacy, you may permanently delete your file and results from our server once you have downloaded them. Otherwise, files are automatically deleted after 7 days.
Status Codes
Zuhal uses standard HTTP response codes to indicate the success or failure of an API request.
| Code | Description |
|---|---|
| 200 | OK. The request was successful. |
| 400 | Bad Request. Often due to invalid JSON, missing parameters, or a malformed CSV file. |
| 401 | Unauthorized. Your API key is missing, invalid, or expired. |
| 402 | Payment Required. You do not have enough credits to perform this verification. |
| 429 | Rate Limit Exceeded. You are sending too many requests too quickly. Please slow down. |
| 500 | Server Error. An issue occurred on our end. Please contact support. |