Developers

API documentation

Check email addresses from your own code with the InboxVet API: one address in real time, or up to 1,000 per request.

Getting started

The API answers at https://inboxvet.com/api. Every request is a JSON POST and every response is JSON.

  1. Create a free account and buy credits on the pricing page. Each address checked uses one credit; credits never expire.
  2. Create an API key under Dashboard → API keys.
  3. Send it with each request, as below.

For lists bigger than a few thousand addresses, upload a CSV in the dashboard instead: bulk uploads check every address down to the mailbox and you can download the results when they are done.

Authentication

Send your key in the x-api-key header. Keep it secret: anyone with the key can spend your credits. Delete a key in the dashboard to revoke it immediately.

x-api-key: YOUR_API_KEY
Content-Type: application/json

Validate one email

Request
POST https://inboxvet.com/api/validate

{
  "email": "jane@example.com",
  "skipSMTP": false
}
FieldTypeDescription
emailstringRequired. The address to check.
skipSMTPbooleanOptional, default true. With true the check stops after syntax, disposable-domain and MX tests (instant). Send false to also ask the mail server whether the mailbox exists and whether the domain is catch-all; this usually takes 1–10 seconds, up to 30.
Response 200
{
  "success": true,
  "result": {
    "email": "jane@example.com",
    "status": "VALID",
    "syntaxValid": true,
    "isDisposable": false,
    "mxRecordExists": true,
    "isCatchAll": false,
    "smtpValid": true,
    "reason": "Email is valid and deliverable"
  },
  "creditsRemaining": 4210
}

Validate a batch

Up to 1,000 addresses per request. Credits for the whole batch are taken up front and refunded if the request fails.

Request
POST https://inboxvet.com/api/validate/batch

{
  "emails": ["jane@example.com", "nobody@example.com"],
  "skipSMTP": false
}
Response 200
{
  "success": true,
  "results": [
    { "email": "jane@example.com", "status": "VALID", "reason": "Email is valid and deliverable", ... },
    { "email": "nobody@example.com", "status": "INVALID", "reason": "Mailbox does not exist", ... }
  ],
  "creditsRemaining": 4208
}

Each item in results has the same fields as result above, in the order you sent the addresses.

Result fields

FieldTypeMeaning
emailstringThe address, lowercased and trimmed.
statusstringOne of VALID, INVALID, RISKY, UNKNOWN (see below).
syntaxValidbooleanThe address is correctly formed.
isDisposablebooleanThe domain belongs to a throwaway-email service.
mxRecordExistsbooleanThe domain has mail servers.
isCatchAllboolean | nullThe domain accepts mail for any address. null when not checked.
smtpValidboolean | nullThe mail server accepted the mailbox. null when not checked or no clear answer.
reasonstringA plain-English explanation of the status.

Statuses

StatusWhat it meansWhat to do
VALIDThe address exists and accepts mail.Send.
INVALIDBad syntax, no mail servers, the mailbox does not exist, or it is full.Remove it: mail to it bounces.
RISKYA disposable address, or a catch-all domain that accepts every address so the mailbox cannot be confirmed.Send with care, or segment.
UNKNOWNThe mail server did not give a clear answer (greylisting, timeouts, or it refused the check).Try again later; don't treat it as invalid.

Errors

Errors return a JSON body with an error message. No credit is used when a request fails.

HTTP statusWhen
400Missing email or emails, or more than 1,000 addresses in a batch.
401No API key, or the key is not valid.
402Not enough credits. Batch responses also include required and available.
403The account is suspended. Contact support.
500Something went wrong on our side. Retry, and contact support if it persists.

Code examples

cURL
curl -X POST https://inboxvet.com/api/validate \
  -H "x-api-key: $INBOXVET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "jane@example.com", "skipSMTP": false}'
JavaScript (Node 18+)
const response = await fetch("https://inboxvet.com/api/validate", {
  method: "POST",
  headers: {
    "x-api-key": process.env.INBOXVET_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ email: "jane@example.com", skipSMTP: false }),
})
const { result } = await response.json()
console.log(result.status, result.reason)
Python
import os, requests

response = requests.post(
    "https://inboxvet.com/api/validate",
    headers={"x-api-key": os.environ["INBOXVET_API_KEY"]},
    json={"email": "jane@example.com", "skipSMTP": False},
    timeout=40,
)
result = response.json()["result"]
print(result["status"], result["reason"])
PHP
$ch = curl_init("https://inboxvet.com/api/validate");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 40,
    CURLOPT_HTTPHEADER => [
        "x-api-key: " . getenv("INBOXVET_API_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode(["email" => "jane@example.com", "skipSMTP" => false]),
]);
$result = json_decode(curl_exec($ch), true)["result"];
echo $result["status"];

Questions? Email support@inboxvet.com.