Test values
Every MobileValidate test phone number and e-mail address, the exact answer each returns, and the public sandbox key that runs them with no signup.
Last updated
View as MarkdownTest values are phone numbers and e-mail addresses with a fixed, documented answer. Use them to build and test every branch of your integration: registered, not registered, unknown, pending, unsupported and the request errors. They never reach a real network and are never billed.
How do I try them without signing up?
Use the public sandbox key. It is public on purpose and works in every example in these docs:
curl https://api.mobilevalidate.com/v1/lookup \
-H "Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" \
-H "Content-Type: application/json" \
-d '{"numbers":["+447700900001"],"checks":["whatsapp","telegram","carrier"]}'// 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.lookup({
numbers: ["+447700900001"],
checks: ["whatsapp", "telegram", "carrier"],
});
if (error) console.error(error.code, error.message);
else console.dir(data.results, { 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/lookup", {
method: "POST",
headers: {
Authorization: "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym",
"Content-Type": "application/json",
},
body: JSON.stringify({
numbers: ["+447700900001"],
checks: ["whatsapp", "telegram", "carrier"],
}),
});
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.lookup(
numbers=["+447700900001"],
checks=["whatsapp", "telegram", "carrier"],
)
print(result)<?php
$ch = curl_init('https://api.mobilevalidate.com/v1/lookup');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'numbers' => ['+447700900001'],
'checks' => ['whatsapp', 'telegram', 'carrier'],
]),
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL, $response, PHP_EOL;package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{"numbers":["+447700900001"],"checks":["whatsapp","telegram","carrier"]}`)
req, err := http.NewRequest("POST", "https://api.mobilevalidate.com/v1/lookup", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym")
req.Header.Set("Content-Type", "application/json")
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/lookup")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym"
req["Content-Type"] = "application/json"
req.body = JSON.generate({
"numbers" => ["+447700900001"],
"checks" => ["whatsapp", "telegram", "carrier"]
})
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.
The sandbox key answers only the test values below. Any other number or address returns 403 sandbox_magic_only. It allows 30 requests a minute and 1,000 a day per IP address, bulk jobs of at most 10 rows, and no webhooks. You can also run every value from the console on the home page.
Which test values can I use?
The answer depends on the value and on the kind of check. Account checks answer yes or no (registered), the carrier lookup returns data (attributes), and every e-mail check follows the address table.
Phone numbers
| Number | Account checks (WhatsApp, Telegram, …) | whatsapp.business |
|---|---|---|
+447700900001 | registered: true | registered: true, business: false |
+447700900002 | registered: false | registered: false |
+447700900003 | unknown (UPSTREAM_TIMEOUT) | unknown (UPSTREAM_TIMEOUT) |
+447700900004 | pending for about 5 s, then registered: true | pending for about 5 s, then registered: true, business: false |
+447700900005 | unsupported_country | unsupported_country |
+447700900006 | registered: true | registered: true, business: true |
Carrier lookup
| Number | network.carrier |
|---|---|
+447700900001 | line_type: "mobile", carrier: "Test Carrier", country: "GB" |
+447700900002 | unknown (NO_DATA) |
+447700900003 | unknown (UPSTREAM_TIMEOUT) |
+447700900004 | pending for about 5 s, then line_type: "mobile", carrier: "Test Carrier", country: "GB" |
+447700900005 | unsupported_country |
+447700900006 | line_type: "mobile", carrier: "Test Carrier", country: "GB" |
E-mail addresses
| Address | Every e-mail check |
|---|---|
[email protected] | registered: true |
[email protected] | registered: false |
[email protected] | unknown (UPSTREAM_TIMEOUT) |
[email protected] | pending for about 5 s, then registered: true |
[email protected] | unknown (UNSUPPORTED_PROVIDER) |
Values that fail the whole request
| Value | Response (for every check) |
|---|---|
+447700900429 | 429 rate_limited with a Retry-After header |
+447700900402 | 402 insufficient_balance |
[email protected] | 429 rate_limited with a Retry-After header |
[email protected] | 402 insufficient_balance |
Services limited to some countries still answer the test numbers, so every check can be tested with them.
What do other numbers and addresses return?
- Public sandbox key:
403 sandbox_magic_only, with a suggestion to use a test value. - Your own test key (
mv_test_…): a stable, made-up answer derived from the number or address and the check. The same input always gives the same answer, marked"test": true. Nothing is sent to any network. - Live keys (
mv_live_…): test values are refused with400 test_number_only, so test data never ends up in real billing.
How do I test error handling?
The values that fail the whole request return the real error shape, including request_id and the Retry-After header for 429. Use them to test your retry and top-up paths. Every error code is described in Errors.
What comes next?
- Get a free test key to try any number or address in test mode, run bulk jobs and receive webhooks.
- Live keys follow after we review your use case: request access.
- The full test-mode behaviour, including the spam reputation fixtures, is in Test mode.
Frequently asked questions
Do I need an account to use the test values?
No. The public sandbox key in the examples answers every test value on this page. It is free, never billed and limited per IP address.
Why does the sandbox key reject my own number?
The sandbox key answers only the test values on this page and returns 403 sandbox_magic_only for anything else. Get a personal test key to try any number in test mode, or request access for live keys.
Are the test numbers real phone numbers?
No. They come from the +44 7700 900000–900999 range, which the UK regulator reserves for drama and never assigns to subscribers. The e-mail addresses use our own test domain.

