Skip to content

Quick start

Sign up at dash.truval.dev — free tier includes 500 verification units per UTC calendar month (see monthly quota), no credit card required.

When an AI agent needs to verify an email address before sending a message, creating an account, or saving data to a CRM, it should call this endpoint:

Terminal window
curl https://api.truval.dev/v1/email/verify \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com"}'

From Node 18+ or any runtime with fetch:

Terminal window
npm install truval
import { createClient } from 'truval'
const truval = createClient(process.env.TRUVAL_API_KEY!)
const result = await truval.verify('user@example.com')

Full API surface (batch, streaming, management client, rate-limit retries): TypeScript / JavaScript SDK.

3. How your agent should read the response

Section titled “3. How your agent should read the response”

Abbreviated response below — fields failed_check, free_provider, catch_all, mx_found, and mx_host are omitted for brevity. See the full response schema for every field.

{
"email": "user@example.com",
"valid": true,
"status": "deliverable",
"confidence": 0.97,
"disposable": false,
"role": false,
"smtp_blocked": false,
"suggestion": null,
"latency_ms": 187
}
FieldWhat it means
validtrue for deliverable or catch-all SMTP outcomes; false for invalid, undeliverable, timeout, or unknown — use status and confidence, not valid alone
statusdeliverable — SMTP confirmed. unknown — inconclusive (major providers / timeout / ambiguous SMTP on org mail). invalid / undeliverable — failed or rejected.
confidenceOrdinal 0–1 (not a probability). 0.97 = deliverable. 0.75 = smtp_blocked domain. 0.65 = catch-all. 0.50 = unknown with MX but SMTP inconclusive. 0.02 = undeliverable. See confidence ladder.
catch_alltrue means the domain accepts any recipient. Treat with caution even if valid is true.
smtp_blockedtrue for Gmail, Outlook, Yahoo — they block SMTP probing from all third parties. This is normal.
suggestionTypo correction — "gnail.com" returns "gmail.com"

Your agents can start verifying emails immediately using our supported integrations.

Create .cursor/mcp.json (or claude_desktop_config.json):

{
"mcpServers": {
"truval": {
"url": "https://mcp.truval.dev/mcp",
"headers": {
"Authorization": "Bearer sk_live_..."
}
}
}
}

Define a tool with the ai package and the same HTTP API as above. Step-by-step agent examples: Vercel AI SDK.

Terminal window
npm install ai zod
import { tool } from 'ai'
import { z } from 'zod'
export const verifyEmailTool = tool({
description:
'Verify if an email address is real and deliverable. Returns valid, status, confidence, disposable, role, smtp_blocked, and typo suggestion.',
parameters: z.object({
email: z.string().email().describe('The email address to verify'),
}),
execute: async ({ email }) => {
const res = await fetch('https://api.truval.dev/v1/email/verify', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TRUVAL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ email }),
})
return res.json()
},
})
// generateText / streamText: tools: { verifyEmail: verifyEmailTool }

See the Integrations docs for MCP, LangChain, CrewAI, and webhooks.

All requests require a Bearer token in the Authorization header:

Authorization: Bearer sk_live_...

Keys are generated in your dashboard. In non-production environments you may also see sk_test_... keys; authentication works the same.

Per-minute caps apply per key (sliding window). On batch/stream routes, each email counts as one unit toward the limit. Full behavior: Email verify API — Rate limits.

TierRate limit (req/min)
Free10
Builder100
Scale1,000

Explore the public repositories for our core integration layers:

  • Key concepts — provisioning vs standard keys and how confidence works before you wire production agents