# Validate email addresses

> Heuristic email validation to run before sending: catches invalid syntax, dead domains (no MX/A records), disposable inboxes, role-based addresses (info@, contacto@, sales@), and addresses already on your project's suppression list. Use it to clean a list before a broadcast and keep your bounce rate low.

`POST https://api.zavu.dev/v1/introspect/email`

Heuristic email validation to run before sending: catches invalid syntax, dead domains (no MX/A records), disposable inboxes, role-based addresses (info@, contacto@, sales@), and addresses already on your project's suppression list. Use it to clean a list before a broadcast and keep your bounce rate low.

No mailbox-level (SMTP) probe is performed, so a `deliverable` verdict is not a delivery guarantee — it means no negative signal was found. Treat `risky` addresses with care and drop `undeliverable` ones.

Accepts a single `email` or an `emails` batch (max 100 per request).

## Body

- `email` (string): Single email address to validate.
- `emails` (string[]): Batch of email addresses to validate (max 100).

## Responses

### 200

Validation results, one per submitted address.

- `results` (object[], required): One result per submitted address, in the same order.
  - `email` (string, required): The address exactly as submitted.
  - `normalized` (string, required, nullable): Lowercased, trimmed form of the address. Null when the syntax is invalid.
  - `domain` (string, required, nullable): Domain part of the address. Null when the syntax is invalid.
  - `verdict` (string, required): Validation verdict. - `deliverable`: nothing suggests the address will bounce. - `risky`: sendable, but a signal predicts elevated bounce/complaint odds (role address, disposable domain, MX-less domain, prior soft bounce). - `undeliverable`: will bounce or is blocked (invalid syntax, dead domain, or the address is on your suppression list after a hard bounce/complaint). One of: `deliverable`, `risky`, `undeliverable`.
  - `reasons` (string[], required): Signals behind the verdict. Empty for a clean `deliverable` address. One of: `invalid_syntax`, `domain_not_found`, `domain_no_mx`, `disposable_domain`, `role_address`, `suppressed_hard_bounce`, `suppressed_soft_bounce`, `suppressed_complaint`, `suppressed_manual`, `suppressed_unsubscribe`.
- `summary` (object, required)
  - `total` (integer, required)
  - `deliverable` (integer, required)
  - `risky` (integer, required)
  - `undeliverable` (integer, required)

### 400

Invalid request body (no addresses, or more than 100).

- `code` (string, required)
- `message` (string, required)
- `details` (object)

### 401

Unauthorized.

- `code` (string, required)
- `message` (string, required)
- `details` (object)

## Example

```bash
curl -X POST "https://api.zavu.dev/v1/introspect/email" \
  -H "Authorization: Bearer $ZAVUDEV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "maria@example.com"
}'
```

```typescript
import Zavudev from "@zavudev/sdk";

const zavu = new Zavudev({ apiKey: process.env.ZAVUDEV_API_KEY });

const result = await zavu.introspect.validateEmail({
  email: "maria@example.com",
});

console.log(result);
```
