ready. Try Ready →Sign up

#Validate numbers

Check whether numbers are mobile, landline or disconnected before you import or text them. US and Canada only.

Details

This is the same lookup and price as Clean list on the Contacts page.

#Validate numbers

POST/v1/validate

Checks up to 1,000 numbers. Billed per number that gets an answer.

  • Auth API key with edit_contacts
  • Idempotent Yes, with Idempotency-Key
  • Rate limit About 120 requests/min per account
  • Cost $0.005 per number answered, cached answers included
Important. Checking the same number again, in a later call, is billed again.
Details

A number repeated within one request is looked up and billed once. Malformed numbers and numbers that got no answer aren't billed. The whole batch is checked against your balance first.

Answers are cached for 90 days and shared across Ready accounts, so cached: true can mean another account checked the number.

Example: 100 different numbers that all get an answer cost 100 × $0.005 = $0.50, and the same 100 again cost another $0.50.

Headers

Idempotency-KeystringRecommended
Retry safely without paying twice.

Body parameters

phonesstring[]Required
1 to 1,000 numbers, E.164 or 10 digits.

Returns

data[]object[]
One per number, in the order you sent them.
data[].normalizedE.164 string | null
null when the number can't be read.
data[].validboolean
false if malformed or disconnected; reason is invalid_format, unsupported_country or disconnected.
data[].line_typeenum
mobile, landline or unknown. A line the carrier lookup reports only as "landline or other carrier", which includes most VoIP lines, reads as unknown: it is still an answer and is billed.
data[].carrierstring | null
The carrier, for mobile numbers.
data[].textableboolean | null
null when line_type is unknown: the lookup gave no answer, or could not tell.
data[].cached, checked_atboolean, ISO 8601 string
Whether the answer was cached, and when it was checked.
billed_numbers, charged_usdinteger, number
At the top level: what this call cost.
Detailscharged_usd is exact: $0.005 for each number that got an answer, so one number shows charged_usd: 0.005 and billed_numbers: 1 every time. Your balance is debited in whole cents and the half cent is carried to the next charge. Both are 0 when nothing was charged (for example a test key).

Errors

HTTPCodeWhen
400phones_requiredphones is missing or empty.
400too_many_phonesMore than 1,000 numbers.
402insufficient_creditsBalance can't cover the batch. Nothing checked.
DetailsThe body has required_cents, balance_cents and numbers.
403permission_deniedKey lacks edit_contacts.
429validation_in_progressSame numbers already being checked. Wait Retry-After.
500internal_errorSome may be billed: check your balance first.
503validation_unavailableUnavailable right now. Nothing charged.

#Validate one number

GET/v1/validate/:phone

The same check for one number. This GET is billed like one number above.

  • Auth API key with edit_contacts
  • Rate limit About 120 requests/min per account
  • Cost $0.005 if answered

Path parameters

phonestringRequired
E.164 or 10 digits.
DetailsA value that isn't a phone number answers 200 with valid: false, reason: "invalid_format", not billed.

Returns

dataobject
One result like a data[] item above, plus billed_numbers and charged_usd.

Errors

HTTPCodeWhen
400invalid_phonePath value over 40 characters.
402insufficient_creditsBalance too low.
403READ_ONLY_SESSIONView-only access can't spend money.
403permission_deniedKey lacks edit_contacts.
429validation_in_progressThis number is already being checked. Wait Retry-After.
500internal_errorOur side failed. Retry.
503validation_unavailableUnavailable right now. Nothing charged.