Guides

Bangladesh phone numbers: format, mobile prefixes, validation and messaging rules

Bangladesh phone number format: +880 and 01X mobile prefixes, tested validation code, porting since 2018, BTRC's A2P SMS rules and WhatsApp checks with consent.

By Published 13 min read

On this page

Bangladeshi numbers use the country code +880. Mobile numbers have 10 digits after the code and start with 1 (01X when dialled at home), so in E.164 they look like +880 1XXX XXXXXX. The second digit names the operator that holds the range, but porting has been possible since 2018, so it doesn't prove the current network. Bulk SMS must go through a BTRC-enlisted aggregator.

This guide is part of our phone numbers by country series. The tables are generated from libphonenumber's metadata, our MNP atlas and our public catalog. Example numbers are masked with X. We read the Bangladesh Telecommunication Regulatory Commission (BTRC) documents on its website on 2026-10-14; most are scanned, and some are in Bengali only, so we read them page by page. Where we rely on press reports instead, we say so. This is a summary, not legal advice.

What does a Bangladeshi phone number look like?

A mobile number is 01XXX-XXXXXX at home: the trunk prefix 0, a two-digit operator code starting with 1, and eight digits. From abroad it is +880 1XXX XXXXXX. BTRC's numbering plan defines exactly this shape for cellular mobile service: national access code 0, a two-digit operator code 1X, then an eight-digit subscriber number (BTRC National Numbering Plan 2017, section 10.2). Landlines vary in length, from 6 to 10 digits after +880.

<!-- country-data:BD:format:start --> <!-- generated by apps/web/scripts/gen-country-guide-data.mjs (libphonenumber metadata 9.0.39 via libphonenumber-js 1.13.13); edit the script, not this table -->
ItemValue
Country calling code+880
International call prefix (dialling out)00
Trunk prefix (dialling at home)0
Mobile: digits after +88010
Fixed line: digits after +8806–10
Toll-free: digits after +88010
VoIP: digits after +88010
Mobile, national format (masked)018XX-XXXXXX
Mobile, international (masked)+880 18XX XXXXXX
Mobile, E.164 (masked)+88018XXXXXXXX
Fixed line, national format (masked)022XX-XXXXXX
Fixed line, international (masked)+880 22XX XXXXXX
Fixed line, E.164 (masked)+88022XXXXXXXX
<!-- country-data:BD:format:end -->

Store only the E.164 form. Bangladeshi forms often collect numbers as 017XXXXXXXX, 8801XXXXXXXXX without a plus, or with Bengali digits (০১৭…). A numbering-plan library with the default region BD turns most of these into +8801…; the Bengali digits need one extra step in JavaScript, shown below.

A +880 country-code pill feeding delta-like channels into ten digit tiles for the 01X operator codes, with 0 and 2 greyed out; beside it two SIM cards swapping under a 90-day clock and three chat rows answered yes, no and unknown.A +880 country-code pill feeding delta-like channels into ten digit tiles for the 01X operator codes, with 0 and 2 greyed out; beside it two SIM cards swapping under a 90-day clock and three chat rows answered yes, no and unknown.
Bangladeshi mobiles are +880 1X: the code names the range holder, porting can change the network, and checks answer yes, no or unknown.

Which prefixes are mobile numbers, and which operator holds each?

Every mobile number starts 01, and in the plan the second digit is the operator code. For each 2-digit block, the generator counted every 10-digit number that libphonenumber's mobile pattern for BD accepts:

<!-- country-data:BD:prefixes:start --> <!-- generated by apps/web/scripts/gen-country-guide-data.mjs (exact count over the mobile pattern, libphonenumber metadata 9.0.39); edit the script, not this table -->
National prefixInternationalShare of the block that is mobile (10-digit numbers)3-digit sub-blocks that aren't fully mobile
011+880 11100%—
013+880 13100%—
014+880 14100%—
015+880 15100%—
016+880 16100%—
017+880 17100%—
018+880 18100%—
019+880 19100%—
037+880 3790.0%not mobile: 0371
038+880 3890.0%not mobile: 0381
044+880 4490.0%not mobile: 0441
064+880 6410.0%not mobile: 0640–0643, 0645–0649
066+880 6690.0%not mobile: 0661
<!-- country-data:BD:prefixes:end -->

The 01 rows are the ones that matter: 011 and 013 to 019 are fully open, while 010 and 012 aren't mobile ranges. The other rows are an edge case. libphonenumber's mobile pattern also covers most of the 037, 038, 044 and 066 blocks and the 0644 block, which sit among geographic area codes. We found no BTRC document that explains them, so if your product only expects ordinary 01X mobiles, check the prefix as well as the type (the code below does).

01X operator codes and the companies behind them

Schedule C of the numbering plan lists the operator code of each mobile company. Two codes were reserved in that list but given out later, as press reports show:

CodeInternationalRange holderSource and notes
011+880 11Pacific Bangladesh Telecom LimitedPlan, Schedule C. We found no current BTRC list confirming who uses 011 today.
013+880 13GrameenphoneBTRC approved it in August 2016 because 017 was almost full (Daily Star, 2016).
014+880 14BanglalinkLaunched on 29 November 2018 as 019 ran low (Daily Star, 2018).
015+880 15Teletalk BangladeshPlan, Schedule C.
016+880 16Robi (from Airtel)Airtel Bangladesh merged into Robi with effect from 16 November 2016; the plan reserves code 16 two years after the merger "unless and until the Commission decides otherwise".
017+880 17GrameenphonePlan, Schedule C.
018+880 18Robi AxiataPlan, Schedule C.
019+880 19BanglalinkPlan, Schedule C.
010, 012—ReservedNot valid mobile ranges today.

Robi said at the merger that it would keep the 016 prefix and the Airtel brand for at least two years (Daily Star, 2016), and libphonenumber still accepts 016 as mobile. Read this table as "who holds the range". It tells you nothing about the network a ported number is on today.

How do I validate a Bangladeshi number in code?

Use a libphonenumber port with full metadata and the default region BD, then keep only 01X mobiles.

Python (pip install phonenumbers):

Python
import phonenumbers


def normalize_bd(raw: str) -> str | None:
    """E.164 for a Bangladeshi 01X mobile, or None."""
    try:
        n = phonenumbers.parse(raw, "BD")
    except phonenumbers.NumberParseException:
        return None
    if (not phonenumbers.is_valid_number(n) or phonenumbers.region_code_for_number(n) != "BD"
            or phonenumbers.number_type(n) != phonenumbers.PhoneNumberType.MOBILE):
        return None
    e164 = phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)
    return e164 if e164.startswith("+8801") else None  # 01X only, see the prefix table

JavaScript (npm install libphonenumber-js):

JavaScript
import { parsePhoneNumberFromString } from "libphonenumber-js/max";

/** "01XXX-XXXXXX", "+880 1XXX …", "8801…" or Bengali digits → E.164 for a 01X mobile, or null. */
export function normalizeBd(raw) {
  const ascii = String(raw).replace(/[০-৯]/g, (d) => String(d.charCodeAt(0) - 0x09e6)); // ০–৯ → 0–9
  const phone = parsePhoneNumberFromString(ascii, "BD");
  return phone?.isValid() && phone.country === "BD" && phone.getType() === "MOBILE" && phone.number.startsWith("+8801")
    ? phone.number : null;
}

We ran both on 2026-10-14 (Python 3.12 with phonenumbers 9.0.40, Node.js 24 with libphonenumber-js 1.13.13). Both returned an E.164 number for rows 1 to 5 below and nothing for the rest. One difference showed up: Python's library accepted a number typed in Bengali digits, but libphonenumber-js returned nothing until we added the digit conversion above. The shape regex column tests the pattern most tutorials give, after spaces, dashes and brackets are removed:

<!-- country-data:BD:tests:start --> <!-- generated by apps/web/scripts/gen-country-guide-data.mjs (libphonenumber-js 1.13.13, region BD); edit the script, not this table -->
#CaseInput (masked)Shape regex ^(?:\+880|00880|0)?[1346]\d{9}$libphonenumber (BD)
1National, with trunk prefix018XX-XXXXXXpassesvalid, MOBILE
2International, with spaces+880 18XX XXXXXXpassesvalid, MOBILE
3International dialling prefix 0000880 18XX-XXXXXXpassesvalid, MOBILE
4E.164+88018XXXXXXXXpassesvalid, MOBILE
5Dashes and brackets(018XX) XXXXXXpassesvalid, MOBILE
6One digit short018XXXXXXXfailsinvalid
7One digit too many018XXXXXXXXXfailsinvalid
8Mobile shape, unused block 010010XXXXXXXXpassesinvalid
9Fixed line022XX-XXXXXXfailsvalid, FIXED_LINE
10Toll-free range0800-XXXXXXXfailsvalid, TOLL_FREE
<!-- country-data:BD:tests:end -->

Row 8 is the one to remember. 010 is shaped like a mobile number and passes the regex, but it is a reserved code, so an OTP sent to it is wasted. Our post on why an E.164 regex is not enough shows the same problem in other countries, and our Python and JavaScript guides cover more languages.

Does number portability change the carrier?

Yes. Mobile number portability (MNP) went live in Bangladesh on 1 October 2018, run by a third-party clearinghouse licensed by BTRC. At launch, a switch within 72 hours cost Tk 50 plus VAT and required a visit to the new operator's customer care centre (Daily Star, 2018). BTRC's guidelines, issued in July 2017, and the industry code annexed to them set the rules (BTRC MNP guidelines):

  • Mobile to mobile only. Fixed-to-mobile and mobile-to-fixed porting aren't allowed, and every mobile operator must offer porting to prepaid and postpaid subscribers.
  • 90-day wait. A number can be ported once 90 days have passed since it was activated or last ported.
  • Three days at most. The maximum time to complete a port is three days.
  • Routing by query. Operators must use the all-call-query method, so the sending network looks up the current network of every call and SMS.

The Bangladesh row of our MNP atlas:

<!-- country-data:BD:mnp:start --> <!-- generated by apps/web/scripts/gen-country-guide-data.mjs (row from content/datasets/mnp-atlas-2026); edit the script, not this table -->
ItemValue
Mobile number portabilityYes
Mobile porting sincenot verified
Maximum porting timenot verified
Governing ruleBTRC Regulatory and Licensing Guidelines for MNP Services
Published porting volumenone published
Sourcebtrc.gov.bd
Checked2026-09-25
<!-- country-data:BD:mnp:end -->

The atlas row predates this guide. The launch date and the three-day limit come from the sources above. Our MNP atlas compares Bangladesh with other countries. For routing, pricing or fraud rules, look up the current network per number instead of reading the 01X code. Our SMS routing with MNP and HLR use case shows where that pays off.

Which messaging apps and channels reach people?

SMS reaches every active mobile. For WhatsApp, Meta changed how it prices Bangladesh on 1 October 2026: the country left the "Rest of Asia Pacific" region to get its own rate card, with lower utility and authentication rates, plus a new authentication-international rate that is higher than the regional authentication rate it replaced (Meta pricing, read on 2026-10-14). If you send OTPs to Bangladesh from a business based abroad, compare both rates. Our WhatsApp Business API pricing post covers the new rates.

We didn't find a published source that measures messaging-app use in Bangladesh in a way we can verify, so we don't quote shares. The practical answer is to measure your own opted-in customers. Check which apps they are registered on, route each person to the channel they use, and keep SMS as the fallback. Our channel-by-country guide shows the method.

How do I check WhatsApp registration for a Bangladeshi customer list?

Normalise every row first, then run one check per number. A check tells you whether a number is registered at the time of the check. Like any registration check, it can't tell you whether the person wants your messages:

AnswerWhat it meansWhat to do
registered: trueThe number has a WhatsApp account at checked_atOffer WhatsApp to customers who opted in to it
registered: falseNo account at checked_atUse SMS or another channel
unknownNo conclusive answer (not billed)Keep the current channel; retry later
invalid_numberFailed format validation (not billed)Fix the data at the source

For lists, use a bulk job. WhatsApp checks get the bulk price only for groups of at least 132 numbers from the same country in one job, so collect a day's Bangladeshi numbers into one job rather than sending many small ones. Upload a CSV whose numbers are written nationally (01XXX-XXXXXX) with default_country=BD:

Bulk WhatsApp check for a customer CSV
curl https://api.mobilevalidate.com/v1/jobs \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -F file=@customers.csv -F checks=whatsapp,carrier -F default_country=BD

Send the same body to POST /v1/jobs/estimate first: it is free and shows the maximum cost before anything runs. Unknown or inconclusive results are never charged; see current prices. Our bulk WhatsApp number check post walks through the whole flow.

What are the rules for SMS, sender IDs and OTP?

These summarise BTRC documents as we read them on 2026-10-14, plus one press report where we couldn't find the directive itself. Not legal advice; ask counsel how they apply to you.

Enlisted A2P aggregators

Application-to-person (A2P) SMS goes through aggregators that BTRC enlists under the Bangladesh Telecommunication Act, 2001. BTRC's list, last updated on 17 September 2026, names 152 enlisted companies. Under the enlistment they may provide one-way, machine-generated SMS: promotional, transactional and notification messages (BTRC A2P list).

The list changes. On 5 August 2026, BTRC cancelled the enlistment of seven aggregators that hadn't started operating or renewed in time. It said any further operation under a cancelled certificate is illegal and asked mobile operators to disconnect those companies' SMS connections (BTRC notice, 2026). Before you sign with an SMS provider for Bangladesh, find it on the current list.

Unwanted promotional messages

In September 2018, BTRC ordered mobile operators to stop sending commercial and promotional messages to subscribers who don't want them, and to tell users how to block such messages. As reported, the directive also banned these messages between 12am and 8am, even for customers who had agreed to receive them (Daily Star, 2018). We couldn't find that directive on BTRC's current website, so we can't confirm whether it is still in force. Treat it as a floor: send marketing only to people who opted in, make opting out easy, and don't send overnight.

Personal data

Parliament passed the Personal Data Protection Act, 2026 (Act No. 63 of 2026), published in the Bangladesh Gazette on 10 April 2026 and republished on BTRC's website (BTRC). We haven't summarised its consent rules or when its parts take effect. A registration check on a customer's number is processing of personal data, so ask local counsel how the Act applies. Until then, follow the baseline in our consent guide: your own customers, a stated purpose, minimal data and honoured objections.

What that means for OTP

A one-time passcode the user asked for isn't marketing, but it travels the same routes. Send it through an enlisted aggregator, keep it free of offers, and don't reuse numbers collected for verification for marketing unless the person opted in.

What changed recently?

The rows for BD and +880 in our numbering-plan changes dataset, built from libphonenumber's release notes:

<!-- country-data:BD:changes:start --> <!-- generated by apps/web/scripts/gen-country-guide-data.mjs (rows of content/datasets/numbering-plan-changes-2019-2026); edit the script, not this table -->
Change named in the release notes (2019-01-08 to 2026-09-23)Releases
Numbering-plan metadata (validation, lengths, types)13
Original-carrier prefix data3
Geocoding (area names)3
All19

Latest numbering-plan updates for BD: 2026-09-23 (v9.0.40), 2026-09-09 (v9.0.39), 2026-08-13 (v9.0.37), 2026-07-30 (v9.0.36), 2024-08-07 (v8.13.43).

<!-- country-data:BD:changes:end -->

Bangladesh's numbering-plan metadata changed in four libphonenumber releases between July and September 2026. A library that is a few months old will reject some valid new numbers, so update it at least monthly. Beyond numbering, the changes that matter are Meta's standalone WhatsApp rates from 1 October 2026, the August 2026 aggregator cancellations and the April 2026 data protection law.

What can MobileValidate check for Bangladeshi numbers?

Generated from our public catalog:

<!-- country-data:BD:coverage:start --> <!-- generated by apps/web/scripts/gen-country-guide-data.mjs (public catalog https://api.mobilevalidate.com/v1/services, fetched 2026-10-14); edit the script, not this table -->
CheckAccepts Bangladesh numbersNotes
Format and country (every lookup)YesEach number is parsed first; an invalid number returns invalid_number and is never billed.
Carrier lookup (beta)YesLine type and current network where data exists; no data means unknown, not billed. Real time and bulk.
US/CA carrier lookup (premium)No (US, CA only)Answers unsupported_country for other countries, not billed.
Live network status (HLR)YesLive reachability, porting, roaming (true or false) and current network; unknown is free. Real time and bulk.
Number portability (MNP)YesPorted or not ported, and the current network code; unknown is free. Real time and bulk.
Spam reputationLimited accessAll countries except sanctioned ones; report coverage is strongest in North America and Europe.
Messaging appsYes: WhatsApp, Telegram, Viber, Signal*, iMessage*, RCS*, LINE*, Zalo, Botim*, Facebook Messenger*Registered, not registered or unknown; unknown is free.
Social networksYes: Facebook, Instagram, Threads, X (Twitter), TikTok*, Snapchat*Not for Bangladesh numbers: LinkedIn (US, IN only).
Online accounts (Apple, Amazon, Microsoft, Netflix)Yes: Apple, Amazon, Microsoft, NetflixRegistered, not registered or unknown; unknown is free.

* bulk jobs only. Catalog as fetched on 2026-10-14; the live list is at GET /v1/services.

<!-- country-data:BD:coverage:end -->

A lookup returns network and registration facts. It never returns a subscriber's name, national ID or address, and we don't offer "number details" searches.

Here is a practical flow for a customer list: normalise with normalize_bd(), then one real-time lookup gives the current network and WhatsApp registration. It uses the public sandbox key mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym and our test values. The sandbox accepts only those UK drama numbers, so the example uses them. With a live key, pass the output of normalize_bd().

bd_channels.py
import os

import requests  # pip install requests

API = "https://api.mobilevalidate.com/v1/lookup"
KEY = os.environ["MOBILEVALIDATE_API_KEY"]


def channels(numbers: list[str]) -> dict[str, dict]:
    """Current network and WhatsApp registration per number. None means we don't know."""
    r = requests.post(API, headers={"Authorization": f"Bearer {KEY}"}, timeout=15,
                      json={"numbers": numbers, "checks": ["carrier", "whatsapp"], "wait": 5})
    r.raise_for_status()
    out = {}
    for row in r.json()["results"]:
        carrier, wa = row["checks"]["network.carrier"], row["checks"]["whatsapp.registered"]
        attrs = carrier["attributes"] or {}
        out[row["e164"]] = {
            "network": attrs.get("carrier"),
            "whatsapp": wa["registered"] if wa["status"] == "completed" else None,
        }
    return out


for number, info in channels(["+447700900001", "+447700900002", "+447700900005"]).items():
    print(number, info)

What the test values return:

Test valuenetworkwhatsapp
+447700900001Test CarrierTrue
+447700900002None (carrier unknown)False
+447700900005None (unsupported_country)None

Keep None apart from False: None means we don't know, and it's never billed. Requests with 20 or more consecutive numbers are refused (403 suspected_enumeration), and our acceptable use policy forbids finding recipients for unsolicited messages. People can object through our opt-out form. See WhatsApp number check, MNP lookup and carrier lookup for the fields.

What are the key takeaways?

  • Bangladeshi mobiles are +880 1 plus nine digits, 01XXX-XXXXXX at home; store the E.164 form.
  • Mobile codes are 011 and 013 to 019; 010 and 012 are reserved. Convert Bengali digits before parsing in JavaScript.
  • The second digit names the range holder (Grameenphone, Robi, Banglalink, Teletalk), not the current network: porting has run since 1 October 2018.
  • Send A2P SMS only through a BTRC-enlisted aggregator, and check the current list; enlistments are cancelled.
  • Check WhatsApp registration only for customers you hold lawfully, keep unknown apart from false, and never treat registration as consent.

Platform, regulator and company names are used descriptively. MobileValidate is not affiliated with any of them.

Sources

  1. Bangladesh National Numbering Plan 2017 (No. 14.32.0000.008.52.045.16-0.1139, 31 July 2017) — Bangladesh Telecommunication Regulatory Commission, 2017
  2. Regulatory and Licensing Guidelines for Mobile Number Portability Services in Bangladesh (July 2017) — Bangladesh Telecommunication Regulatory Commission, 2017
  3. SMS service providers: list of enlisted A2P SMS aggregators (last updated 17 September 2026) — Bangladesh Telecommunication Regulatory Commission, 2026
  4. Notice on cancelling existing A2P SMS aggregator enlistment certificates (5 August 2026) — Bangladesh Telecommunication Regulatory Commission, 2026
  5. Personal Data Protection Act, 2026 (Act No. 63 of 2026, Bangladesh Gazette, 10 April 2026) — Bangladesh Telecommunication Regulatory Commission (republished), 2026
  6. Now you can use any operator keeping same mobile number (1 October 2018) — The Daily Star, 2018
  7. GP gets new number series: 013 (21 August 2016) — The Daily Star, 2016
  8. Banglalink brings 014 number series (29 November 2018) — The Daily Star, 2018
  9. Robi, Airtel complete merger (16 November 2016) — The Daily Star, 2016
  10. Stop unwanted messages (4 September 2018) — The Daily Star, 2018
  11. WhatsApp Business Platform pricing (rate card updates effective 1 October 2026) — Meta for Developers, 2026
  12. libphonenumber PhoneNumberMetadata.xml (region BD) and release notes — libphonenumber project (Apache License 2.0), 2026

Frequently asked questions

How many digits is a Bangladeshi mobile number?

Ten digits after the country code +880, or eleven when written nationally with the leading 0. Every mobile number is 01X followed by eight digits at home, for example 01XXX-XXXXXX, and +880 1XXX XXXXXX in E.164.

What is the Bangladesh country code for WhatsApp and international use?

+880. Drop the leading 0 of the national number: 017XX-XXXXXX becomes +880 17XX XXXXXX. Store that E.164 form and use it for every platform and API.

Which operator does 013, 014, 015, 016, 017, 018 or 019 belong to?

The second digit is the operator code from BTRC's numbering plan: 013 and 017 Grameenphone, 014 and 019 Banglalink, 015 Teletalk, 016 and 018 Robi (016 came with the Airtel merger in 2016). Since mobile number portability started on 1 October 2018, the code shows only the range holder, not the current network.

Can a Bangladeshi number keep its digits after changing operator?

Yes. Under BTRC's 2017 portability guidelines a subscriber can move to another mobile operator and keep the number once 90 days have passed since activation or the last port, and the port must finish within three days. Only mobile-to-mobile porting is allowed.

Can I check whether Bangladeshi customers are on WhatsApp?

Yes, for numbers you hold with a lawful basis, such as your own customers or sign-ups. A MobileValidate check answers registered, not registered or unknown with a checked_at date; unknown answers are not billed. It never returns a name or profile, and requests that look like scans of number ranges are refused.

Do bulk SMS senders in Bangladesh need BTRC approval?

A2P SMS aggregators must be enlisted with BTRC. Its list, last updated on 17 September 2026, names 152 enlisted companies, and in August 2026 BTRC cancelled seven enlistments and called any further operation under them illegal. Check that your provider is on the current list.

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.