Validate every phone number before you send the SMS.
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 to start.
No credit card. No sales call. Live key in under a minute.
- <100ms
- Median response time
- 240+
- Country numbering plans
- 100
- Free checks on signup
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
}Try it free, no signup
Paste a phone number on the homepage and see the full result — format, country and line type.
The three things bad data is costing you right now
Undeliverable numbers silently fail
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.
SMS pumping drains your OTP budget
Fraud rings push signups through premium-rate and VoIP ranges and take a cut of every message you send. Bills spike overnight.
Dirty CRM data kills your sales team
Reps dial dead numbers, dashboards count contacts that can never be reached, and routing rules fire on the wrong country.
Stop bad data before it costs you money
Start with 100 free checks to start. No credit card required.
Live in three steps
- 1
Get your API key
Sign up free, copy your key from the dashboard. No credit card, no sales call.
- 2
Send a request
POST kind: 'phone' with the raw number. Add an optional country hint for local formats.
- 3
Get results instantly
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 }
]
}Try the API in under 5 minutes
Create your free account, copy your key and send your first request.
Built for production, priced for prototypes
Every country, every format
Full international numbering-plan coverage with optional country hints for local-format input.
Line type detection
Mobile, fixed line, VoIP, toll-free, premium rate and shared cost — returned explicitly on every check.
Under 100ms
Validation runs in-process with no third-party hop, fast enough to sit inline on a signup form.
E.164 normalisation
Every valid number comes back in canonical E.164 plus a human-readable international format.
Mixed bulk batches
Send phones, emails and IPs together, up to 100 items per call, processed in parallel.
Predictable pricing
One credit per number. 100 free to start, then $29 for 1,000. Cancel any time.
Built for production, free to try
Every feature is available on the free plan. Upgrade only when you grow.
Where teams put this to work
The same endpoint, four very different jobs — and the outcome each one moves.
SMS & OTP delivery
Validate before you spend a message credit, so one-time codes only go to numbers that can actually receive them.
- Fewer undelivered OTPs
- Lower SMS spend
- Higher activation rate
- Cleaner delivery reports
Signup fraud prevention
Flag VoIP and premium-rate numbers at registration, where throwaway numbers are used to farm free trials.
- Block disposable VoIP
- Stop trial abuse
- Fewer chargebacks
- Trustworthy user counts
Sales & call centre data
Normalise every number to E.164 and drop the unreachable ones before they enter the dialler queue.
- More connects per hour
- No wasted dials
- Consistent CRM formatting
- Accurate country routing
Checkout & delivery contact
Confirm the courier can actually reach the customer before the parcel leaves the warehouse.
- Fewer failed deliveries
- Fewer support tickets
- Better contact rate
- Lower return costs
See what clean data does for your funnel
Create a free account and run your first checks in the next two minutes.
Industries that rely on it
Marketplaces
Verified buyers and sellers at onboarding.
Fintech
Reachability checks alongside KYC.
Logistics
Contactable numbers before dispatch.
SaaS platforms
OTP that lands on the first attempt.
Technical specifications
- Median response
- <100ms
- Checks performed
- Format, country, E.164, line type, risk score
- Line types
- Mobile, fixed, VoIP, toll-free, premium
- Bulk batch size
- Up to 100 mixed items per call
- Auth
- Bearer API key
- Coverage
- Global numbering plans
Pricing
Simple credits. No surprises.
Pick a plan. Monthly or annual (2 months free). 1 credit = 1 verification. 100 free checks to start, no credit card required.
Annual subscription
Growth
10,000 credits refilled every month · cancel anytime · billed yearly
Top-Up · 250 credits
One-time purchase · no subscription · credits never expire
Questions developers actually ask
Cut your SMS waste starting with the next signup.
Set up in 5 minutes. Your first 100 checks are free.
Protecting OTP flows and CRM data for teams like: