BroadNet
The JournalEngineering
Engineering

Before you send the code: a pre-send check routine for OTP with MobileValidate and BroadNet

A pre-send check is one lookup between the moment a user types a phone number and the moment you send the code. It catches numbers that cannot receive an OTP, flags risky patterns for extra friction and picks the channel. Here is the routine with MobileValidate and BroadNet, with a decision table for every result.

9 min read
Engineering · Issue 15
9 min read

efore sending a one-time passcode, run one lookup on the number: normalise it, check its line type and carrier, and, if you offer more than SMS, check which of your channels it can receive. Send by default when the answer is mobile or unknown, stop or offer voice when it is fixed-line or toll-free, and add friction when the pattern looks risky. With MobileValidate, a BroadNet brand in private preview, the check is one API request, and the code then goes out through BroadNet's OTP API or MyOTP.App with fallback between channels.

Key takeaways

  • A pre-send check costs one lookup and can save a message that could never arrive, or one that feeds a fraud pattern.
  • Line type is the most useful single signal: mobile goes ahead, fixed-line, toll-free and premium-rate stop, VoIP gets a closer look.
  • Unknown is not a failure: send the code with your normal rate limits. MobileValidate does not charge for unknown answers.
  • A short wait keeps sign-up fast: set the lookup wait to a few seconds and treat anything still pending as unknown.
  • Channel checks (for example Telegram) help choose where to send the code for customers who opted in to that channel.
  • The check supports your fraud defences; it does not replace rate limits, monitoring or fallback.

What should you check before sending an OTP?

CheckWhat it tells youSource
Format and validityWhether the input is a valid number, normalised to E.164, or a duplicateMobileValidate number_status (valid, invalid_number, duplicate)
Line typeMobile, fixed line, VoIP, toll-free, premium rate and othersMobileValidate carrier lookup (beta)
CarrierThe current network and, for a ported number, the original oneMobileValidate carrier lookup (beta)
Channel registrationWhether the number is registered on an app you send codes on, such as TelegramMobileValidate messaging-app checks
Live network statusWhether the line is reachable on its home network nowBroadNet HLR Lookup

MobileValidate's carrier lookup explains why line type matters: a fixed-line, toll-free, premium-rate, shared-cost or UAN number "usually" means SMS will fail or cost money for nothing, and a burst of sign-ups from VoIP numbers or a single small carrier is a common pattern in fake account creation and SMS pumping.

How does the routine work, step by step?

  1. When the user enters a number, before they press "Send code", call POST /v1/lookup with the number and the checks you need, for example carrier plus the app channels you send codes on.
  2. Set wait to a few seconds. The API waits up to 10 seconds by default (30 at most) and returns 202 with pending checks when it runs out of time; treat pending as unknown.
  3. Apply the decision table below to the result.
  4. Send the code through the BroadNet OTP API or MyOTP.App on the chosen channel, with fallback between channels.
  5. Log the lookup result with the verification attempt so you can review outcomes later.
snippet
curl https://api.mobilevalidate.com/v1/lookup \
-H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"numbers": ["+447700900001"], "checks": ["carrier", "telegram"], "wait": 3}'

Each check in the response has registered (true, false or null for unknown), status, a confidence level and checked_at; the carrier check puts line_type, carrier and country in attributes. The number +447700900001 is a MobileValidate test number: test keys answer it with fixed data and are never billed. See real-time lookups for the full response.

What do you do with each result?

ResultSuggested action
line_type mobileSend the code on the user's chosen channel
line_type fixed_line, toll_free, premium_rate, shared_cost or uanDo not send an SMS; offer a voice code where you support it, or ask for a mobile number
line_type voipApply your risk policy: extra verification, a lower attempt limit or manual review
number_status invalid_numberAsk the user to correct the number; nothing is sent or billed
Carrier check unknown or pendingSend the code with your normal rate limits
Registered on Telegram and the user chose TelegramSend through MyOTP.App's Telegram channel, with SMS as fallback
Many new sign-ups on one small carrier or number rangeThrottle that range and review; see SMS pumping defences

Keep the rules in your own policy engine so you can tune them; the lookup supplies signals, not verdicts. A VoIP number can belong to a real customer, so step-up verification is usually better than a hard block.

Does a lookup slow down sign-up?

Only as long as you let it. Run the lookup while the user is still on the phone-number field, cap it with the wait parameter, and treat a pending answer as unknown so the code is never held back. MobileValidate caches answers per account within each service's freshness window, and a cached answer is free, so a user who asks for a second code does not trigger a second billed check.

Put the lookup in front of the send, not in front of the whole sign-up form: if the lookup service is unreachable, fall through to sending the code with your normal limits.

How does it fit with SMS pumping and fraud defences?

SMS pumping (artificially inflated traffic) abuses OTP forms to send messages to numbers that earn the attacker a share of the fee. A pre-send line-type and carrier check removes numbers that should never receive an SMS and makes clusters visible, but it is one layer. Keep rate limits per number, IP address and device, cap attempts per session, monitor destination mixes and set spend alerts. Our guide to SMS pumping and AIT fraud covers the other layers, and what SMS pumping is explains the scheme in short.

MobileValidate does not offer SIM-swap checks. For account-takeover risk on high-value actions, BroadNet covers operator network APIs in SIM swap and Number Verify in the Middle East.

How do you pick the OTP channel?

Offer the channels your users trust and record their choice. MyOTP.App sends codes by SMS, WhatsApp or Telegram from one account with automatic fallback, and the BroadNet OTP API falls back across SMS, WhatsApp, voice and Flash Call. A Telegram registration check helps you show the Telegram option only to users who can receive it; SMS remains the fallback that reaches any mobile number. For a deeper comparison of channels, read our multichannel OTP verification guide.

What does the check cost, and is it lawful?

MobileValidate charges per check and only for conclusive answers: unknown, unsupported country, timeout, invalid and duplicate results are free, as are cache hits and test keys. Current prices, which may change during the private preview, are on the pricing page. Check only what you act on: every extra check on a number can be billed separately.

Screening a number the user just gave you in order to send them a code is fraud prevention, which MobileValidate's acceptable-use policy allows. Under the GDPR, Recital 47 says that "the processing of personal data strictly necessary for the purposes of preventing fraud also constitutes a legitimate interest of the data controller concerned". Other laws differ, so confirm your legal basis for each market; this is general information, not legal advice.

Frequently asked questions

Why check a number before sending an OTP?

To avoid paying for codes that cannot arrive, such as to fixed-line or toll-free numbers, to spot patterns linked to fake sign-ups and SMS pumping, and to choose a channel the user can receive.

Which check matters most?

Line type. A mobile number can receive the code; fixed-line, toll-free and premium-rate numbers usually cannot receive SMS; VoIP numbers deserve a closer look.

What if the lookup returns unknown?

Send the code with your normal rate limits. Unknown answers are not charged by MobileValidate, and blocking on unknown would hurt real users.

Will the lookup slow down sign-up?

It does not have to. Run it when the number is entered, cap it with the wait parameter and treat pending answers as unknown.

Should I block VoIP numbers?

Usually not outright. Use VoIP as a risk signal for extra verification, a lower attempt limit or manual review.

Does MobileValidate check for SIM swaps?

No. MobileValidate states that it does not offer a SIM-swap check; operator network APIs cover that.

Does the check send anything to the user?

No. A MobileValidate check never sends a message, call or e-mail to the number.

Which BroadNet products send the code?

The BroadNet OTP API, with fallback across SMS, WhatsApp, voice and Flash Call, and MyOTP.App, which sends by SMS, WhatsApp or Telegram from one account.

We read every source below on 27 September 2026. See our editorial standards.

Sources

Was this useful?

How we write and review content

Written by

BroadNet Editorial Team

The Editorial Team publishes the BroadNet blog. Articles are written with BroadNet's regulatory affairs, product, engineering, industry research and operator solutions teams, and reviewed under our editorial standards.

The Journal, by email

One essay a month. Nothing else.

Subscribe and we'll send the next piece — engineering, regulation, or industry — the day it ships. No drip campaigns, no product pitches, no third-party sharing. Unsubscribe in one click.

We send one email a month. Unsubscribe anytime. See our privacy policy.

What you'll get
  • Long-form, not link bait
    Six to eleven minutes of focused writing on a single topic.
  • Written by operators
    Engineers, regulatory leads, and product writing in-house.
  • Region-aware
    MENA-grounded view on regulators, operators, and channel mix.
  • Once a month
    No drip campaign. One essay when there is one to share.
Stop reading. Start shipping.

Most of what we write we learned in production.

If this piece made you nod, we should probably talk. Bring the use case, the volumes, the markets — we'll come back with routing, pricing, and a reference customer you can call.

$ curl -X POST https://api.broadnet.me/sms/sendSms