POST
/verify/batchVerify up to 100 addresses in one call
Verifies up to 100 addresses concurrently and returns per-address results plus a summary count by verdict.
Priced per batch rather than per address, so a full batch costs half the single-address rate.
$0.15 per call120 req/minFree allowance applies
Request
curl -X POST "https://www.twotic.dev/v1/email-verify/verify/batch" \
-H "Authorization: Bearer $TWOTIC_KEY" \
-H "Content-Type: application/json" \
-d '{ "emails": [ "dana@example.com", "info@example.com", "user@gmial.com" ] }'const res = await fetch("https://www.twotic.dev/v1/email-verify/verify/batch", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TWOTIC_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"emails": [
"dana@example.com",
"info@example.com",
"user@gmial.com"
]
}),
})
if (!res.ok) throw new Error(await res.text())
const data = await res.json()
console.log(res.headers.get("X-Twotic-Cost"))import os, requests
res = requests.post(
"https://www.twotic.dev/v1/email-verify/verify/batch",
headers={"Authorization": f"Bearer {os.environ['TWOTIC_KEY']}"},
json={
"emails": [
"dana@example.com",
"info@example.com",
"user@gmial.com"
]
},
)
res.raise_for_status()
data = res.json()
print(res.headers["X-Twotic-Cost"])package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{ "emails": [ "dana@example.com", "info@example.com", "user@gmial.com" ] }`)
req, _ := http.NewRequest("POST", "https://www.twotic.dev/v1/email-verify/verify/batch", body)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+os.Getenv("TWOTIC_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(string(out))
fmt.Println(res.Header.Get("X-Twotic-Cost"))
}<?php
$ch = curl_init("https://www.twotic.dev/v1/email-verify/verify/batch");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("TWOTIC_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => '{ "emails": [ "dana@example.com", "info@example.com", "user@gmial.com" ] }',
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);require "net/http"
require "json"
uri = URI("https://www.twotic.dev/v1/email-verify/verify/batch")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch('TWOTIC_KEY')}"
req["Content-Type"] = "application/json"
req.body = {
"emails": [
"dana@example.com",
"info@example.com",
"user@gmial.com"
]
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(req)
end
puts JSON.parse(res.body)
puts res["X-Twotic-Cost"]{
"mcpServers": {
"email-verify": {
"type": "http",
"url": "https://www.twotic.dev/api/mcp/email-verify",
"headers": { "Authorization": "Bearer tk_live_your_key" }
}
}
}Request body
application/json · required
{
"emails": [
"dana@example.com",
"info@example.com",
"user@gmial.com"
]
}Response
200Results for every address submitted.
{
"count": 3,
"results": [
{
"email": "dana@example.com",
"score": 95,
"verdict": "deliverable"
},
{
"email": "info@example.com",
"score": 55,
"verdict": "risky"
},
{
"email": "user@gmial.com",
"score": 35,
"verdict": "risky",
"didYouMean": "user@gmail.com"
}
],
"summary": {
"risky": 2,
"deliverable": 1,
"undeliverable": 0
}
}400The body is missing, empty, or contains more than 100 addresses.
{
"error": "too_many_emails",
"message": "A batch may contain at most 100 addresses."
}As an agent tool
Connect https://www.twotic.dev/api/mcp/email-verify and this endpoint is exposed as the tool email-verify_verify-batch.
Verify up to 100 email addresses in a single call, returning a per-address verdict plus counts by verdict. Choose this over the single verify tool whenever you have more than a few addresses — cleaning a mailing list, importing contacts, or auditing a CRM. Send a JSON body of {"emails": [...]}, maximum 100 entries.