Skip to content
ZUHAL

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.

Base URL: https://zuhal.io/api/v1/

Adaptive Deep Validation

AUTOMATED FEATURE

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

POST /verify
Example Request Body
{
  "email": "klem@viableview.com"
}
Success Response
{
  "status": "success",
  "message": "Email verified successfully.",
  "data": {
    "request_id": "b3f1c2a0-...",
    "email": "klem@viableview.com",
    "email_status": "valid",
    "credits_used": 1,
    "remaining_credits": 4999
  }
}

email_status values: valid, invalid, catch-all, disposable, unknown.

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.

POST /bulk/upload

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",
  "message": "File uploaded successfully. Use job_id to check status.",
  "data": {
    "job_id": "1502d7c5-7575-4b4a-816c...",
    "job_status": "processing",
    "credits_used": 5000,
    "remaining_credits": 95000,
    "total_records": 5000
  }
}

A maximum of 10 active bulk jobs are allowed per API key at one time.

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.

GET /bulk/status/{uuid}

{uuid} is the job_id returned from the upload response.

Response (Job Completed)
{
  "status": "success",
  "message": "Job status retrieved successfully.",
  "data": {
    "job_id": "1502d7c5...",
    "job_status": "completed",
    "total_emails": 5000,
    "completed": 5000,
    "valid": 4230,
    "invalid": 610,
    "disposable": 95,
    "catch_all": 55,
    "unknown": 10,
    "percentage_complete": "100.00",
    "started_at": "2026-08-10T09:00:00.000000Z",
    "last_updated_at": "2026-08-10T09:04:12.000000Z"
  }
}

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

GET /bulk/download/{uuid}
Success Response
{
  "status": "success",
  "message": "Download link generated successfully.",
  "data": {
    "job_id": "1502d7c5...",
    "job_status": "completed",
    "download_link": "https://zuhal.io/api/v1/bulk/download/1502d7c5.../file"
  }
}

Fetch the download_link directly (as an authenticated request) to stream the CSV.

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 30 days.

DELETE /bulk/delete/{uuid}

Status Codes

Zuhal uses standard HTTP response codes to indicate the success or failure of an API request. Error responses follow the same envelope as success responses, with "status": "error" and a human-readable message; a small number of errors (job/file not found) also include a machine-readable code field (e.g. ERR_NOT_FOUND).

Code Description
200OK. The request was successful.
400Bad Request. Often due to invalid JSON, missing parameters, or a malformed CSV file.
401Unauthorized. Your API key is missing, invalid, or expired.
402Payment Required. You do not have enough credits to perform this verification.
404Not Found. No job or file exists for the given uuid.
422Unprocessable Entity. The uploaded file failed validation (wrong type or unreadable content).
429Rate Limit Exceeded. You are sending too many requests too quickly. Please slow down.
500Server Error. An issue occurred on our end. Please contact support.

Rate Limits

Limits are applied per API key (falling back to IP address if no key is present) and reset every 60 seconds.

Endpoint Limit
POST /verify100 requests / minute
POST /bulk/upload25 requests / minute
GET /bulk/status/{uuid}100 requests / minute
GET /bulk/download/{uuid}100 requests / minute
DELETE /bulk/delete/{uuid}100 requests / minute

Ready to start verifying?

Get a free API key with 100 starter credits — no credit card required.

Get Free API Key View Pricing