Guides

Messaging-app registration checks: a guide for every app

What a registration check tells you for WhatsApp, Telegram, Viber, Signal, iMessage, RCS, LINE, Zalo and more: modes, unknowns, billing and consent.

By Published 8 min read

On this page

A messaging-app registration check tells you whether a phone number you hold can be associated with an account on an app such as WhatsApp, Telegram, Viber, Signal, LINE or Zalo, or whether it can receive iMessage or RCS. Each answer is registered, not registered or unknown, with the time of the check. Nothing is sent to the number. This guide covers all twelve messaging checks we offer: which ones run in real time and which in bulk only, what a "no" means on each app, why answers come back unknown, how billing works, and how to use them with consent.

What does a registration check answer, and what doesn't it?

It answers one narrow question per app: can an account on this platform be found through this phone number right now? That supports three jobs:

  • Channel selection for messages people already expect, such as passcodes, delivery updates and reminders. See channel selection.
  • Deliverability. A number with a messenger account passed that app's own phone verification at some point, so it's less likely to be a typo or an invented entry.
  • Risk signals at sign-up, as one input among several.

It doesn't answer who owns the number, whether they read messages, whether the phone is switched on, or whether you may contact them. We never return names, photos, usernames, profile links or last-seen times. Every conclusive answer carries checked_at, because accounts come and go and carriers reassign numbers. An answer from this morning is stronger than one from last quarter.

One phone number with three channel options; the messaging app where the number is registered is chosen.One phone number with three channel options; the messaging app where the number is registered is chosen.
Send on the channel where the number is registered.

Which apps can be checked, and in which mode?

This table covers every messaging check in our services reference. Prices change, so see current per-check prices for real-time and bulk on the pricing page.

AppCheck (alias)ModeWhat true means
WhatsAppwhatsappreal time + bulkAn account exists for the number
WhatsApp Businesswhatsapp.businessreal time + bulkAccount exists; business flag says if it's a business account
Telegramtelegramreal time + bulkAn account can be found by the number
Viberviberreal time + bulkAn account exists for the number
Zalozaloreal time + bulkAn account exists for the number
Signalsignalbulk onlyA discoverable account exists
iMessageimessagebulk onlyRegistered for iMessage on an Apple device
RCSrcsbulk onlyThe number could receive RCS at check time; may add device_os
LINElinebulk onlyAn account is associated with the number
Botimbotimbulk onlyAn account exists for the number
MAXmaxbulk onlyAn account exists for the number
Messengermessengerbulk onlyA Messenger account is linked to the number

You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate). All twelve checks accept numbers from every country.

Why are some checks real time and others bulk only?

Real-time checks answer inside the request, usually within seconds, which suits sign-up forms and the moment before you send a passcode. Bulk-only checks gather answers in batches, so they run in bulk jobs: you submit up to 50,000 numbers and e-mails, follow progress, then download the results.

If you send a bulk-only check to the real-time endpoint, it's refused before anything is checked. This is the real test-mode response for POST /v1/lookup with checks: ["imessage"]:

JSON
{"error": {"code": "service_disabled",
  "message": "The check 'imessage.registered' is available in bulk jobs only (POST /v1/jobs).",
  "status": 403, "retryable": false, "param": "checks[0]"}}

The practical rule: use real-time checks at the moment of contact, and run bulk-only checks ahead of time over your opted-in base, for example once a month. Store the answers with their dates and route from your own records. GET /v1/services returns a modes array for each service, so your code never has to hard-code which is which.

What does a "not registered" answer mean on each app?

A conclusive false is not equally strong everywhere. On apps where the phone number is the account, it's informative. On apps where people can hide from number search, it often means "not findable through this number".

AppHow strong is false?Why
WhatsApp, Viber, ZaloStrongThe number is the account. Zalo users can limit who finds them by number, so a small share may not be confirmable
TelegramWeakBy default a number is visible only to the person's contacts, and people control whether they can be found by number (Telegram FAQ)
SignalWeakSince 2024 people can set "Who can find me by my number" to Nobody; then others can't "even know that you have a Signal account" (Signal, 2024)
LINEMediumPeople also connect by LINE ID and QR code, and not every account is findable by number
MessengerWeakA phone number is optional on the account
iMessageMediumfalse is normal for Android users; see our iMessage guide
RCSMedium, and short-livedDepends on carrier, handset and settings; see the RCS guide

Never treat false alone as proof that a number is fake. Combine it with line type and your own signals.

Why do checks come back unknown?

Unknown (registered: null) means no conclusive answer was obtained. The status and reason fields say why:

status / reasonTypical causeWhat to do
unknown / UPSTREAM_TIMEOUTThe answer didn't arrive in timeKeep your default channel; try again later
unsupported_countryThe service doesn't cover the number's countryUse another channel for that country
pendingStill being checked when wait ran outPoll GET /v1/lookups/{id} or use a webhook
number_status: invalid_number or duplicateThe number was never checkedFix the record or drop the duplicate

Two rules keep your data clean. Unknown is never a no: don't route, score or delete on it. And never overwrite a stored conclusive answer with unknown. A timeout today doesn't erase what you learned last month.

What does a real request look like?

A real-time lookup can check several apps at once. This is real test-mode output for three test numbers with checks: ["whatsapp", "telegram", "viber", "zalo"], trimmed to the answers:

Shell
curl https://api.mobilevalidate.com/v1/lookup \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"numbers": ["+447700900001", "+447700900002", "+447700900003"],
       "checks": ["whatsapp", "telegram", "viber", "zalo"], "wait": 5}'
JSON
"+447700900001": {"whatsapp.registered": true,  "telegram.registered": true,  "viber.registered": true,  "zalo.registered": true}
"+447700900002": {"whatsapp.registered": false, "telegram.registered": false, "viber.registered": false, "zalo.registered": false}
"+447700900003": all four "status": "unknown", "registered": null, "reason": "UPSTREAM_TIMEOUT"

For bulk-only apps, the same numbers go into POST /v1/jobs. A real test job for the same three numbers with ["line", "zalo", "botim", "max"] completed at once with "progress": {"total": 3, "checks_total": 12, "done": 12, "conclusive": 8}. Test keys are free and never bill, and test answers are invented.

How do I route checks to real-time lookups and bulk jobs automatically?

Read the catalog once, then send each check where it can run. This Python sketch uses modes from GET /v1/services:

Python
import os, requests

API = "https://api.mobilevalidate.com"
H = {"Authorization": f"Bearer {os.environ['MOBILEVALIDATE_API_KEY']}"}

services = requests.get(f"{API}/v1/services", headers=H, timeout=20).json()["data"]
realtime = {s["code"] for s in services if "realtime" in s["modes"]}
ALIASES = {"whatsapp": "whatsapp.registered", "telegram": "telegram.registered",
           "imessage": "imessage.registered", "rcs": "rcs.registered", "line": "line.registered"}

def split_checks(checks):
    rt = [c for c in checks if ALIASES.get(c, c) in realtime]
    bulk = [c for c in checks if ALIASES.get(c, c) not in realtime]
    return rt, bulk

rt, bulk = split_checks(["whatsapp", "telegram", "imessage", "rcs", "line"])
# rt   → POST /v1/lookup at sign-up (up to 100 numbers per request)
# bulk → POST /v1/jobs nightly or monthly over consented customers (up to 50,000 per job)
print(rt, bulk)   # ['whatsapp', 'telegram'] ['imessage', 'rcs', 'line']

Limits to plan around: 20 checks per request, 2,000 number × check pairs per lookup and 100,000 per job. Call the free POST /v1/jobs/estimate first to see the maximum cost of a job.

How often do registration results change?

It depends on the app. Established messengers where the number is the account change slowly: people keep the same WhatsApp or Viber account for years, until they change number. Some things change faster:

  • RCS capability depends on the carrier, the handset and a setting. Google's RCS documentation notes that a device must have connected to the RCS service within the last 31 days to be reported as capable (Google, 2026).
  • New apps such as MAX gain users quickly, so answers for the same number can flip.
  • Recycled numbers. When a carrier reassigns a number, the old account may linger or disappear.

A practical cadence: refresh messenger checks monthly and after any failed delivery. Use a shorter max_age for RCS. Repeat checks inside the freshness window are served from your account's cache for free (cached: true, billed: false), and max_age: 0 forces a fresh, billed check.

How do I pick which apps to check in each country?

Check the channels you could actually send on, and weight them by where your customers live. Published scale figures are few, and they're self-reported: WhatsApp reported two billion users in 2020, Telegram's FAQ says it has over one billion active users, and LY Corporation reports that LINE had about 100 million monthly active users in Japan at the end of March 2026.

Customer baseChecks worth running
Global consumer appwhatsapp, telegram, plus rcs and imessage in bulk for format planning
Japan, Taiwan, Thailandline (bulk), whatsapp
Vietnamzalo, whatsapp
Eastern Europe, Balkansviber, whatsapp, telegram
UAEwhatsapp, botim (bulk)
Russiatelegram, whatsapp, max (bulk)

Then measure registration rates on your own consented base, as our channel-by-country guide shows. Your data beats any country table.

The number usually belongs to a person, so a check is likely to be processing of personal data. This is general guidance, not legal advice (consult counsel about your own situation), but three rules cover most situations:

  1. Check only numbers you hold for a legitimate reason: customers, sign-ups and leads who gave you their number. Under the GDPR you need a lawful basis (Article 6), and data minimisation (Article 5(1)(c)) suggests storing only the answer and its date.
  2. Registration is not consent. The WhatsApp Business Messaging Policy allows businesses to contact only people who gave their number and opted in. Other platforms have similar rules.
  3. No list building. Researchers showed in 2021 that contact discovery can be abused to map who uses an app at scale (NDSS 2021). So the API refuses 20 or more consecutive numbers (403 suspected_enumeration), applies a daily cap per account, and our acceptable use policy forbids finding recipients for unsolicited messages.

People can object through our opt-out form; suppressed numbers are skipped and never charged. Platform names are used descriptively only. MobileValidate is not affiliated with any of the platforms named here.

What are the key takeaways?

  • A registration check returns registered, not registered or unknown with checked_at, and nothing else: no names, profiles or activity.
  • WhatsApp, WhatsApp Business, Telegram, Viber and Zalo run in real time. Signal, iMessage, RCS, LINE, Botim, MAX and Messenger run in bulk jobs only.
  • A false is strong where the number is the account (WhatsApp, Viber) and weak where people can hide from number search (Telegram, Signal, Messenger).
  • Unknown is missing data. It's free, and it should never overwrite a stored answer.
  • Refresh monthly, faster for RCS and new apps, and use the cache to keep repeat checks free.
  • Check only numbers you hold, for messages people expect. Start with the test numbers and the app guides for WhatsApp, Telegram, iMessage and RCS.

Sources

  1. Two Billion Users: Connecting the World Privately — WhatsApp, 2020
  2. Telegram FAQ — Telegram, 2026
  3. Keep your phone number private with Signal usernames — Signal, 2024
  4. What is the difference between iMessage, RCS, and SMS/MMS? — Apple, 2026
  5. Capability checks (RCS for Business) — Google for Developers, 2026
  6. LINE Official Account (LINE monthly active users in Japan) — LY Corporation, 2026
  7. All the Numbers are US: Large-scale Abuse of Contact Discovery in Mobile Messengers (NDSS 2021) — IACR ePrint / NDSS, 2021
  8. WhatsApp Business Messaging Policy — WhatsApp, 2026
  9. General Data Protection Regulation (EU) 2016/679 — European Union, 2016

Frequently asked questions

Which messaging-app checks run in real time?

WhatsApp, WhatsApp Business, Telegram, Viber and Zalo run in real time on POST /v1/lookup and in bulk jobs. Signal, iMessage, RCS, LINE, Botim, MAX and Messenger run in bulk jobs only.

What does unknown mean in a registration check?

It means no conclusive answer was obtained, for example because of a timeout, an unsupported country or a temporary service problem. It is not a no. registered is null, a reason is given, and the check is not charged.

Does a registered answer mean I can message the person on that app?

No. It means an account can be associated with the number. You still need the person's consent for that channel, and each platform has its own business-messaging rules.

Is anything sent to the number when it is checked?

No. Nothing is sent to the number and no name, photo, username or profile is returned. The answer is registered, not registered or unknown, with the time of the check.

How often should I re-check registration?

Monthly is enough for most messenger checks, plus a re-check after a failed delivery. RCS capability and newer apps change faster, so use a shorter max_age for them.

All articles

Know before you send.

Tell us about your use case. We review every request and set you up with test and live keys.