Services reference
Reference of every MobileValidate check: service code, alias, input type, real-time or bulk-only, outputs and country coverage.
Last updated
View as Markdown
This page lists every check you can put in checks, with its code, alias, input type, mode (real time and bulk, or bulk only), outputs and country coverage. Codes and aliases are interchangeable in requests, and responses always use the full code. GET /v1/services returns the live list for your key, with prices. The site's services page may show a live version of this table.
How do I read this table?
- Input:
phoneservices run onnumbers,e-mailservices onemails. - Modes: "real time + bulk" works on
POST /v1/lookupand in jobs. "Bulk only" works in bulk jobs only. "Bulk (real time paused)" works like bulk only for now: real-time requests are paused while our real-time route is unreliable and return 403service_disabled. - Outputs:
registeredmeans the answer is yes/no/unknown. Named attributes appear inattributesfor conclusive answers. - Countries: "all" means any country except sanctioned ones. Numbers outside a service's countries return
unsupported_countryand are not billed. "all except CN" means mainland China (+86) numbers are not covered; "bulk: except CN" means they are covered in real time but not in bulk jobs. Bulk jobs mark such checks before they run: the estimate lists them inunsupported_checks, andGET /v1/serviceslists them per mode inunsupported_countries. - Asking for
whatsapp.registeredandwhatsapp.businesstogether runs onlywhatsapp.business, because it answers both.
Which phone services are there?
| Code | Alias | Modes | Outputs | Countries |
|---|---|---|---|---|
whatsapp.registered | whatsapp | real time + bulk | registered | all (bulk: except CN) |
whatsapp.business | — | real time + bulk | registered, business | all |
telegram.registered | telegram | real time + bulk | registered | all |
viber.registered | viber | bulk (real time paused) | registered | all |
signal.registered | signal | bulk only | registered | all |
imessage.registered | imessage | bulk only | registered | all except CN |
rcs.registered | rcs | bulk only | registered, device_os | all |
line.registered | line | bulk only | registered | all |
zalo.registered | zalo | bulk (real time paused) | registered | all |
botim.registered | botim | bulk only | registered | all |
messenger.registered | messenger | bulk only | registered | all |
facebook.registered | facebook | real time + bulk | registered | all |
instagram.registered | instagram | real time + bulk | registered | all |
threads.registered | threads | real time + bulk | registered | all |
x.registered | x, twitter | real time + bulk | registered | all |
tiktok.registered | tiktok | bulk only | registered | all |
snapchat.registered | snapchat | bulk only | registered | all |
linkedin.registered | linkedin | bulk only | registered | US, IN |
apple.registered | apple | real time + bulk | registered | all (bulk: except CN) |
amazon.registered | amazon | real time + bulk | registered | all |
microsoft.registered | microsoft | real time + bulk | registered | all |
netflix.registered | netflix | real time + bulk | registered | all |
network.carrier (beta) | carrier | real time + bulk | line_type, carrier, original_carrier, country | all (coverage varies) |
network.carrier_us | — | bulk only | line_type, carrier | US, CA |
number.spam | spam | real time + bulk | risk_level, risk_score, reason_regulator, reason_government, reason_community, reason_unassigned, voip_range, top_category, first_seen, last_seen, sources | all (limited access) |
number.hlr | hlr | real time + bulk | status, ported, roaming, network, mcc_mnc, country | all |
number.mnp | mnp, porting | real time + bulk | porting, mcc_mnc, country | all |
number.hlr asks the mobile network live whether a number is reachable, ported or roaming. number.mnp answers only whether a number was ported and which network it belongs to now. See HLR lookup and MNP lookup. Access to number.spam is limited while it is in review. Ask us if you need it. Its report coverage is strongest for North American and European numbers.
Which e-mail services are there?
| Code | Alias | Modes | Outputs |
|---|---|---|---|
email.valid | email | real time + bulk | registered (mailbox exists; major webmail providers, others → UNSUPPORTED_PROVIDER) |
gmail.email | gmail | bulk only | registered |
outlook.email | outlook | bulk only | registered |
yahoo.email | yahoo | bulk only | registered |
apple.email | apple.email | real time + bulk | registered |
amazon.email | — | real time + bulk | registered |
facebook.email | — | real time + bulk | registered |
instagram.email | — | real time + bulk | registered |
netflix.email | — | real time + bulk | registered |
spotify.email | — | real time + bulk | registered |
linkedin.email | — | bulk only | registered |
x.email | — | bulk only | registered |
E-mail services have no country limits. See e-mail checks for normalization and the anti-enumeration rules.
What do the attribute values mean?
| Attribute | Values |
|---|---|
business | true / false: WhatsApp Business account |
device_os | ios, android, unknown: handset platform reported with RCS capability |
line_type | mobile, fixed_line, fixed_line_or_mobile, voip, toll_free, premium_rate, shared_cost, personal, pager, uan, voicemail, unknown |
carrier / original_carrier | Current carrier name / carrier the range was allocated to, when different |
risk_level | high, medium, low, no_reports (no_reports does not mean safe) |
risk_score | integer 0–100 |
top_category | debt_relief, impersonation, robocall, medical, home_services, warranty, sms_spam, dialer, fraud_hacking, other |
first_seen / last_seen | YYYY-MM |
sources | integer 0–10: number of independent signal classes |
status (HLR) | reachable, unreachable, invalid (not assigned), unknown |
ported / roaming | true / false (roaming never includes a location) |
porting (MNP) | ported, not_ported, unknown |
network / mcc_mnc | Current network name / its code (MCC + MNC) |
Each attribute's type (string, boolean, enum, integer), with enum values and integer bounds, is also returned by GET /v1/services. Enums may gain values, so treat unknown values as unknown.
Which countries are never checked?
Numbers from sanctioned countries and regions are never checked, never sent to any network or data source, and never billed. The countries are Cuba, Iran, North Korea, Syria, Russia, Belarus and Venezuela, plus sanctioned regions. Every check on such a number answers unsupported_country, which is free. They don't appear in our coverage tables, country guides or datasets. We review the list when sanctions programmes change.
The same rule applies to e-mail addresses on Russian and Belarusian mail domains. Every e-mail check, including the account checks, answers unsupported_country for an address on:
- a Russian or Belarusian country domain:
.ru,.su,.рф,.byor.бел, and the Russian city and regional domains.рус,.москва,.moscowand.tatar; - a Yandex or Mail.ru (VK) mail domain, for example
yandex.com,yandex.kz,yandex.ua,yandex.com.tr,ya.ru,mail.ru,inbox.ru,list.ru,bk.ruorvk.com.
Subdomains count too (name@sub.mail.ru), and domains are matched without regard to case. These addresses are never sent to any data source and never billed. Job estimates count them as unsupported, not billable.
How do I get the live list?
curl https://api.mobilevalidate.com/v1/services \
-H "Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym"// npm install mobilevalidate · Node.js 20+ · save as check.mjs and run: node check.mjs
import { MobileValidate } from "mobilevalidate";
// Omit apiKey to read MOBILEVALIDATE_API_KEY from the environment.
const mv = new MobileValidate({ apiKey: "mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" });
const { data, error } = await mv.services();
if (error) console.error(error.code, error.message);
else console.dir(data, { depth: null });// Node.js 18+, Deno, Bun or the browser console (ES module: save as .mjs or use "type": "module").
const res = await fetch("https://api.mobilevalidate.com/v1/services", {
headers: {
Authorization: "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym",
},
});
console.log(res.status, res.headers.get("x-request-id"));
console.dir(await res.json(), { depth: null });# pip install mobilevalidate-sdk
from mobilevalidate import MobileValidate
# Omit api_key to read MOBILEVALIDATE_API_KEY from the environment.
mv = MobileValidate(api_key="mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym")
result = mv.services()
print(result)<?php
$ch = curl_init('https://api.mobilevalidate.com/v1/services');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym',
],
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL, $response, PHP_EOL;package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.mobilevalidate.com/v1/services", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}require "net/http"
require "json"
uri = URI("https://api.mobilevalidate.com/v1/services")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.code, res.bodyRuns as pasted with the public sandbox key, which answers the test values only. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.
Each entry ("object": "service") has these fields:
| Field | Meaning |
|---|---|
code | Check code to send in checks, for example whatsapp.registered |
name, platform, description | Display name, the platform or data the check is about, and a one-line description |
family, namespace | Group (messaging, network, email, …) and the part of code before the dot |
input_type | phone (goes in numbers) or email (goes in emails) |
result_kind | boolean (answers registered) or attributes (answers data in attributes) |
fields | The result fields the check fills: registered and/or attribute keys |
attributes | Each attribute's key, type (string, boolean, enum, integer), values for enums, min/max for integers, and description |
realtime, batch, modes | Whether the check runs in POST /v1/lookup and in bulk jobs, and the same as a list |
status, beta | active or unavailable, and whether the check is in beta |
countries | Countries the check covers; an empty list means all countries |
unsupported_countries | {"realtime": [...], "batch": [...]}: countries the check does not cover in that mode (answered unsupported_country, free) |
prices | realtime and batch price per check as money objects with decimal strings; realtime is null for bulk-only checks |
unit | What one price unit is, in words |
Frequently asked questions
Is this table always current?
It reflects the catalog on the date shown. GET /v1/services is authoritative at run time and shows exactly what your key can use, with prices.
What does bulk only mean?
The service answers in bulk jobs (POST /v1/jobs) but not on the real-time endpoint, which refuses it with 403 service_disabled.
Are numbers from sanctioned countries checked?
No. Numbers from Cuba, Iran, North Korea, Syria, Russia, Belarus and Venezuela, plus sanctioned regions, are never checked and never billed. Every check answers unsupported_country.
Are e-mail addresses on Russian or Belarusian domains checked?
No. Addresses on .ru, .su, .рф, .by and .бел domains and on Yandex and Mail.ru (VK) mail domains, such as yandex.com or mail.ru, are never checked and never billed. Every e-mail check on them answers unsupported_country.

