Phone number validation

Half your list
never rings.

ReachReady reads the numbering plan for 240+ territories and returns fourteen fields per number — line type, carrier, region, local time, format. Then it tells you which rows to bin.

<200ms Latency SLA🌍240+ Countries🔒Client-Side Bulk CSV📊14 Returned Fields
Check a number free10 checks a day, no signup
Try:
+·· ····· ·····
Enter a number and hit Verify
Awaiting
Line type
Carrier
Region
Local time
1 credit per check once you sign upGot 50,000 of them?
Sample output

What comes back for each number.

Line type, carrier, and a verdict you can act on — not a single yes/no.

Six real numbers, six real verdicts
67%
valid
17%
risky
17%
invalid
InputE.164TypeCarrierVerdict
098450 12345+919845012345mobileAirtelsms_ok
080-4112-9000+918041129000landlineBSNLcall_ok
07700 900123+447700900123mobileEEsms_ok
(415) 555-2671+14155552671fixed or mobilereview
1-800-555-1212+18005551212toll freecall_ok

Everything the numbering plan knows, in one row.

Competitors return a status. We return the reasoning — so a human can overrule us when it matters.

One call · one credit
All fourteen fields come back together.

No tiered add-ons, no “carrier lookup” upsell. Every check returns the whole picture — in the API response and in your CSV export.

no network call

Core Verdict

The immediate routing decision

Verdict
Final action to take
sms_ok
Status
Plan status
valid
Why
Reason for failure
null

Network & Location

Geographic and carrier routing data

Line type
Device category
mobile
Carrier
Current network operator
Airtel
Country
ISO 3166-1 alpha-2
IN
Region
State or province
Karnataka

Formatting & Dialing

Standardized output formats

E.164
Global routing format
+919845012345
National
Local dialing format
098450 12345
International
Display format
+91 98450 12345
Timezone
IANA timezone identifier
Asia/Calcutta
List validation

Clean a list without uploading it.

Your file is parsed and rebuilt in the browser. Confirm the phone column, validate each distinct number, then download every original row with ReachReady fields appended.

01We suggest the phone column; country hints are optional.
02Duplicate rows reuse the same result. Credits are charged per distinct number.
03Only distinct numbers are sent for validation — the source file stays in your browser.
CSV
outbound-q3-india.csv
52,983 rows · column “phone”
Download ready
Result breakdown
52,983 rows · 51,177 distinct · 51,177 credits · 1,806 duplicates
72% contactable
Good to contact
38,204
sms_ok or call_ok
Needs review
4,117
review before outreach
Do not contact
10,662
invalid or unreachable
Complete results
Original columns first, ReachReady fields appended
Download all
Built for engineers first

Ship it this afternoon.

Keys from the first minute. Batch endpoint for lists, idempotency keys honoured on every POST, and rate limits printed on the page instead of hidden in a support ticket.

Batch endpoint takes 1,000 numbers per call.
The same object comes back from the dashboard, the CSV and the API.
Every response says why — no silent inference, no invented carriers.
A retried call with the same idempotency key charges once.
cURLNodePythonPHPGoRuby
api.reachready.io
POST/v1/validate1 credit
Request
curl https://api.reachready.io/v1/validate \
  -H "Authorization: Bearer pl_live_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"number":"+919845012345"}'
Response
200 OK
{
  "status": "valid",
  "verdict": "sms_ok",
  "line_type": "mobile",
  "carrier": "Airtel",
  "e164": "+919845012345",
  "timezone": "Asia/Calcutta",
  "utc_offset": "+05:30",
  "credits_charged": 1,
  … 12 more fields
}
/validate
single number
/validate/batch
1,000 per call
/account
credit balance

What this cannot tell you.

Most of this category advertises 99.9% accuracy. Here is the honest version.

It can tell you
Returned on every check, every plan
  • Whether the number is correctly formed for its country.
  • Whether the range is actually allocated, not just plausible.
  • Mobile, landline, VoIP, toll-free or premium rate.
  • The carrier the range was allocated to.
  • Country, region, timezone and today’s UTC offset.
It cannot tell you
No format check can
  • Whether the handset is switched on right now.
  • Whether the number was ported since it was allocated.
  • Whether a human still answers it.

You only truly know once a message or call is sent. Where the answer is genuinely ambiguous — in India and much of South East Asia, mobile versus landline often is — we return review instead of guessing.

Pay for answers, not seats.

Prepaid credits, and two ways to get them: commit to a plan for the lower rate, or buy any amount whenever you need it. The price per credit falls as the volume rises.

Pricing is loading

We could not reach the pricing service just now. Start free and every pack size is listed in the app.

Questions

How is this different from a regex check?+
A regex says the shape looks plausible. We say whether the range is actually allocated by the country’s numbering authority, what kind of line it is, which carrier holds the range, and what timezone it sits in.
Do you send an SMS or place a call to verify?+
No. Nothing reaches the number, so nobody is disturbed and there is no per-message cost. That is also the limit: we cannot confirm a handset is switched on.
Why does a number come back as review instead of yes or no?+
Because in some numbering plans the mobile-versus-landline distinction is not available from static data. India and much of South East Asia included. A confident wrong answer costs you more than an uncertain one.
Will my CSV columns get rearranged?+
No. Your columns come back in their original order with ours appended after. Anything indexing your file by position keeps working.
What if a bulk job fails halfway?+
Jobs checkpoint as they run, so a restart resumes from the last completed chunk. You are not charged twice for rows already validated.
Do credits expire?+
No. Buy them, use them whenever. No monthly minimum and no seat pricing.

250 free credits. No card.

Clean a sample of your worst list and see how much of it was never going to ring.