Format, line type and country detection for every calling code on earth — in under 100ms. Catch VoIP, premium-rate and impossible numbers before they burn your OTP budget. 100 free checks every month.
No credit card. No sales call. Live key in under a minute.
curl -X POST https://fishymails.com/api/public/v1/verify \
-H "Authorization: Bearer fm_live_xxx" \
-H "Content-Type: application/json" \
-d '{"kind":"phone","value":"+31 6 12345678"}'
{
"kind": "phone",
"status": "valid",
"score": 95,
"checks": {
"country": "NL",
"type": "MOBILE",
"e164": "+31612345678",
"formatted_international": "+31 6 12345678",
"is_valid": true
},
"latency_ms": 41
}Wrong length, missing country code, a typo'd digit — the SMS never lands, the user never onboards, and nobody finds out until support gets the ticket.
Fraud rings push signups through premium-rate and VoIP ranges and take a cut of every message you send. Bills spike overnight.
Reps dial dead numbers, dashboards count contacts that can never be reached, and routing rules fire on the wrong country.
Sign up free, copy your key from the dashboard. No credit card, no sales call.
POST kind: 'phone' with the raw number. Add an optional country hint for local formats.
E.164 format, country, line type, validity and a 0-100 score come back in one JSON body.
// Mix phones with emails and IPs in one bulk call
await fetch("https://fishymails.com/api/public/v1/verify/bulk", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.FISHYMAILS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
items: [
{ kind: "phone", value: "0612345678", country: "NL" },
{ kind: "phone", value: "+1 900 555 0199" },
{ kind: "email", value: "jane@acme.io" },
],
}),
});
{
"count": 3,
"results": [
{ "value": "0612345678", "status": "valid", "score": 95 },
{ "value": "+1 900 555 0199","status": "risky", "score": 40 },
{ "value": "jane@acme.io", "status": "valid", "score": 95 }
]
}Full international numbering-plan coverage with optional country hints for local-format input.
Mobile, fixed line, VoIP, toll-free, premium rate and shared cost — returned explicitly on every check.
Validation runs in-process with no third-party hop, fast enough to sit inline on a signup form.
Every valid number comes back in canonical E.164 plus a human-readable international format.
Send phones, emails and IPs together, up to 100 items per call, processed in parallel.
One credit per number. 100 free every month, then $29 for 1,000. Cancel any time.
Set up in 5 minutes. Your first 100 checks are free.
Protecting OTP flows and CRM data for teams like: