# Vietnam phone numbers: format, mobile prefixes, validation and messaging rules

> Vietnam phone number format: +84 and 10-digit mobile prefixes, the 2018 switch from 11 digits, tested code, porting, anti-spam rules and Zalo checks.

Canonical: https://mobilevalidate.com/blog/vietnam-phone-number-format · Last updated: 2026-10-17

![A wide strip where an 11-digit number's three-digit code is replaced by a two-digit code while the last seven digits stay linked, above cards for porting between towers, face re-verification with a clock, and check answers](https://mobilevalidate.com/images/blog/vietnam-phone-number-format.svg)

*Old 11-digit mobiles became 10 digits in 2018; porting and identity rules shape the rest.*


By MobileValidate team (https://mobilevalidate.com/about) · Published: 2026-10-17 · Category: Guides · Tags: Vietnam, Phone validation, E.164, MNP, SMS, Zalo, Compliance

Vietnamese numbers use the country code +84. Mobile numbers have 9 digits after the code and start with 3, 5, 7, 8 or 9, so they are ten digits at home (09XX XXX XXX) and +84 9XX XXX XXX in E.164. Old 11-digit mobile numbers starting 01 were converted in 2018 and no longer work. Porting has run since November 2018, and advertising SMS needs prior consent under Decree 91/2020.

This guide is part of our [phone numbers by country](/blog/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 legal texts and press reports cited below between 2026-10-14 and 2026-10-16. Several are in Vietnamese only, and for some decrees we relied on published full texts or law-firm summaries rather than the official gazette; where that is the case, we say so. This is a summary, not legal advice.

## What does a Vietnamese phone number look like?

A mobile number is `09XX XXX XXX` at home: the trunk prefix `0`, a two-digit network code, and seven subscriber digits. From abroad it is `+84 9XX XXX XXX`. Landlines are longer: 10 digits after `+84`, starting with `2`, where the first digits are the area code.

<!-- country-data:VN: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 -->

| Item | Value |
|---|---|
| Country calling code | `+84` |
| International call prefix (dialling out) | `00` |
| Trunk prefix (dialling at home) | `0` |
| Mobile: digits after +84 | 9 |
| Fixed line: digits after +84 | 10 |
| Toll-free: digits after +84 | 8–10 |
| Premium rate: digits after +84 | 8–10 |
| VoIP: digits after +84 | 9 |
| Universal access (UAN): digits after +84 | 7, 8 |
| Mobile, national format (masked) | `091X XXX XXX` |
| Mobile, international (masked) | `+84 91X XXX XXX` |
| Mobile, E.164 (masked) | `+8491XXXXXXX` |
| Fixed line, national format (masked) | `020X XXXX XXX` |
| Fixed line, international (masked) | `+84 20X XXXX XXX` |
| Fixed line, E.164 (masked) | `+8420XXXXXXXX` |
<!-- country-data:VN:format:end -->

Store only the E.164 form. Vietnamese forms collect numbers in many shapes: `0912345678`, `84912345678` without a plus, and very often `+84 09…`, with the trunk `0` kept after the country code. Both libphonenumber ports we tested drop that stray `0` correctly. What they can't fix on their own are old 11-digit numbers, which still sit in CRMs and contact lists from before 2018; the code below converts them first.

## Which prefixes are mobile numbers?

Mobile numbers start `03`, `05`, `07`, `08` or `09`. For each 2-digit block, the generator counted every 9-digit number that libphonenumber's mobile pattern for `VN` accepts:

<!-- country-data:VN: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 prefix | International | Share of the block that is mobile (9-digit numbers) | 3-digit sub-blocks that aren't fully mobile |
|---|---|---|---|
| `012` | `+84 12` | 4.0% | not mobile: 0120, 0122–0129; partly mobile: 0121 (40.0%) |
| `016` | `+84 16` | 10.0% | not mobile: 0161–0169 |
| `0AA`, for 36 blocks AA = 30–39, 51, 56, 58, 59, 70, 76–79, 81–88, 90–98 | `+84 AA` | 100% | — |
| `052` | `+84 52` | 30.0% | not mobile: 0520, 0521, 0524–0527, 0529 |
| `055` | `+84 55` | 10.0% | not mobile: 0550–0558 |
| `089` | `+84 89` | 40.0% | not mobile: 0890–0895 |
| `099` | `+84 99` | 90.0% | not mobile: 0992 |
<!-- country-data:VN:prefixes:end -->

The main row is the one that matters: 36 blocks are fully mobile. `052`, `055`, `089` and `099` are only partly mobile, so a number in an unallocated sub-block (for example `0550`) is rejected. Two rows are oddities: libphonenumber also treats `0160` and `01210`–`01213` as 10-digit mobile ranges. They have nothing to do with the old 11-digit `016x` and `012x` numbers, and we found no allocation notice that explains them, so our code below accepts only `03`, `05`, `07`, `08` and `09`.

### Which operator holds each prefix?

The network code shows who holds the range. Range holders below come from libphonenumber's carrier prefix file ([84.txt](https://github.com/google/libphonenumber/blob/master/resources/carrier/en/84.txt)); the "from" column comes from the conversion plan described in the next section:

| Prefixes (national) | Range holder | Converted from (2018) |
|---|---|---|
| `031`–`039`, `086`, `096`–`098` | Viettel | `032`–`039` from `0162`–`0169` |
| `030`, `051`, `070`, `076`–`079`, `089`, `090`, `093` | MobiFone | `070` from `0120`, `079` from `0121`, `077` from `0122`, `076` from `0126`, `078` from `0128` |
| `081`–`085`, `088`, `091`, `094` | VinaPhone | `083` from `0123`, `084` from `0124`, `085` from `0125`, `081` from `0127`, `082` from `0129` |
| `052`, `056`, `058`, `092` | Vietnamobile | `056` from `0186`, `058` from `0188` |
| `059`, `0993`–`0997` | Gmobile | `059` from `0199` |
| `0998`, `0999` | Indochina Telecom | — |
| `055` | Mobile virtual network operator launched as Reddi, renamed Wintel in November 2022 ([24HMoney, 2023](https://24hmoney.vn/news/masan-fpt-retail-vnpay-dat-muc-tieu-gi-khi-lan-san-sang-mang-di-dong-ao-c2a1978575.html)) | — |

The file names no holder for `095`, which the metadata still treats as mobile. Two caveats. First, virtual operators also use numbers inside a host's blocks: the same 2023 report says the VNPay-backed MVNO VNSky started with numbers beginning `0777`, inside a MobiFone range. Second, porting means none of this tells you today's network. Read the table as "who holds the range" and look the number up when the network matters.

## What happened to 11-digit mobile numbers?

They were converted to 10 digits in 2018. The Ministry of Information and Communications' Decision 798/QD-BTTTT of 25 May 2018 replaced 21 three-digit network codes of five operators with two-digit codes, keeping the seven subscriber digits ([Decision 798, full text](https://luatvietnam.vn/thong-tin/quyet-dinh-798-qd-btttt-2018-ke-hoach-chuyen-thue-bao-11-so-sang-10-so-163661-d1.html)). The plan's own example: `0123 456 7890` became `083 456 7890`. Its timetable:

| Phase | Dates (Decision 798) | What happened |
|---|---|---|
| Notice | at least 60 days before the start | Operators had to announce the change publicly |
| Parallel dialling | 00:00 15 September 2018 to 23:59 14 November 2018 | Both the old and the new number connected |
| Announcement tone | 00:00 15 November 2018 to 23:59 30 June 2019 | Calls to the old number heard a message giving the new code |
| End | from 1 July 2019 | Only the new number works |

Press coverage at the time put the number of affected subscribers at about 60 million ([VietNamNet, 2018](https://vietnamnet.vn/bang-tong-hop-doi-11-so-thanh-10-so-cac-nha-mang-i375066.html)). Note that a few contemporary articles printed the Vietnamobile pair the wrong way round; the decision itself maps `0186` to `056` and `0188` to `058`.

What this means for your data: an `01XX XXX XXXX` number in an old list is not a typo. Convert it with the table above, then treat the result as unverified. Eight years on, many of those people have changed numbers, and some converted numbers will have been recycled to someone else. Our number recycling post explains why an old list needs a live check before you send anything to it.

The ministry itself has since changed: in February 2025 the Ministry of Information and Communications was merged into the Ministry of Science and Technology, which took over its telecom functions ([MST, 2025](https://english.mst.gov.vn/nguyen-manh-hung-appointed-minister-of-science-and-technology-197250219103302235.htm)). Newer rules below are issued by that ministry.

## How do I validate a Vietnamese number in code?

Convert old 11-digit numbers first, then parse with full metadata and the default region `VN`, and keep only mobiles.

**Python** (`pip install phonenumbers`):

```python
import re

import phonenumbers

# Decision 798/QD-BTTTT (2018): old 3-digit mobile code -> new 2-digit code; the last 7 digits stay the same.
LEGACY = {
    "120": "70", "121": "79", "122": "77", "126": "76", "128": "78",  # MobiFone
    "123": "83", "124": "84", "125": "85", "127": "81", "129": "82",  # VinaPhone
    "162": "32", "163": "33", "164": "34", "165": "35",
    "166": "36", "167": "37", "168": "38", "169": "39",               # Viettel
    "186": "56", "188": "58",                                          # Vietnamobile
    "199": "59",                                                       # Gmobile
}


def upgrade_legacy(raw: str) -> str:
    """Rewrite an old 11-digit mobile number (01XX XXX XXXX, +84 1XX ...) to its 10-digit form."""
    digits = re.sub(r"^00", "", re.sub(r"\D", "", raw))
    national = digits[2:] if digits.startswith("84") and len(digits) == 12 else digits[1:] if digits.startswith("0") else digits
    if len(national) == 10 and national[:3] in LEGACY:
        return "0" + LEGACY[national[:3]] + national[3:]
    return raw


def normalize_vn(raw: str) -> str | None:
    """E.164 for a Vietnamese mobile number, or None."""
    try:
        n = phonenumbers.parse(upgrade_legacy(raw), "VN")
    except phonenumbers.NumberParseException:
        return None
    if (not phonenumbers.is_valid_number(n) or phonenumbers.region_code_for_number(n) != "VN"
            or phonenumbers.number_type(n) != phonenumbers.PhoneNumberType.MOBILE):
        return None
    e164 = phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)
    return e164 if e164[3] in "35789" else None  # 03, 05, 07, 08, 09 only, see the prefix table
```

**JavaScript** (`npm install libphonenumber-js`):

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

// Decision 798/QD-BTTTT (2018): old 3-digit mobile code -> new 2-digit code; the last 7 digits stay the same.
const LEGACY = {
  120: "70", 121: "79", 122: "77", 126: "76", 128: "78", // MobiFone
  123: "83", 124: "84", 125: "85", 127: "81", 129: "82", // VinaPhone
  162: "32", 163: "33", 164: "34", 165: "35", 166: "36", 167: "37", 168: "38", 169: "39", // Viettel
  186: "56", 188: "58", // Vietnamobile
  199: "59", // Gmobile
};

/** "0912 345 678", "+84 912 …", "0084…" or an old 11-digit "01XX…" → E.164 for a mobile number, or null. */
export function normalizeVn(raw) {
  const digits = String(raw).replace(/\D/g, "").replace(/^00/, "");
  const national = digits.startsWith("84") && digits.length === 12 ? digits.slice(2) : digits.startsWith("0") ? digits.slice(1) : digits;
  const input = national.length === 10 && LEGACY[national.slice(0, 3)] ? `0${LEGACY[national.slice(0, 3)]}${national.slice(3)}` : String(raw);
  const phone = parsePhoneNumberFromString(input, "VN");
  return phone?.isValid() && phone.country === "VN" && phone.getType() === "MOBILE" && /^\+84[35789]/.test(phone.number)
    ? phone.number : null;
}
```

We ran both on 2026-10-16 (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 rows 6 to 10. They also gave the same answers on inputs outside the table: `+84 09…` with the stray `0` became the right E.164 number, and old numbers starting `0168`, `0186`, `0199` and `0120`, with or without `+84` or `0084`, came out as `+8438…`, `+8456…`, `+8459…` and `+8470…`. Without `upgrade_legacy`, both libraries reject those old numbers. The shape regex column tests the pattern most tutorials give, after spaces, dashes and brackets are removed:

<!-- country-data:VN:tests:start -->
<!-- generated by apps/web/scripts/gen-country-guide-data.mjs (libphonenumber-js 1.13.13, region VN); edit the script, not this table -->

| # | Case | Input (masked) | Shape regex `^(?:\+84\|0084\|0)?[1357-9]\d{8}$` | libphonenumber (`VN`) |
|---|---|---|---|---|
| 1 | National, with trunk prefix | `091X XXX XXX` | passes | valid, `MOBILE` |
| 2 | International, with spaces | `+84 91X XXX XXX` | passes | valid, `MOBILE` |
| 3 | International dialling prefix 00 | `0084 91X XXX XXX` | passes | valid, `MOBILE` |
| 4 | E.164 | `+8491XXXXXXX` | passes | valid, `MOBILE` |
| 5 | Dashes and brackets | `(091X) XXX-XXX` | passes | valid, `MOBILE` |
| 6 | One digit short | `091XXXXXX` | fails | invalid |
| 7 | One digit too many | `091XXXXXXXX` | fails | invalid |
| 8 | Mobile shape, unused block 010 | `010XXXXXXX` | passes | invalid |
| 9 | Fixed line | `020X XXXX XXX` | fails | valid, `FIXED_LINE` |
| 10 | Toll-free range | `180X XXXXXX` | fails | valid, `TOLL_FREE` |
<!-- country-data:VN:tests:end -->

Row 8 is the one to remember: `010` is shaped like a mobile number and passes the regex, but no mobile range starts there, so an OTP sent to it is wasted. The regex also lets through old 11-digit numbers if you widen it "to be safe", and those never connect. Our post on [why an E.164 regex is not enough](/blog/e164-regex-is-not-enough) shows the same problem in other countries, and our [Python](/blog/phone-number-validation-python) and [JavaScript](/blog/phone-number-validation-javascript) guides cover more languages.

## Does number portability change the carrier?

Yes. Mobile number portability (MNP) started on 16 November 2018. According to the ministry's announcement as reported at the time, the first three months were open to postpaid subscribers of Viettel, VinaPhone and MobiFone, with Vietnamobile joining on 1 January 2019 and prepaid subscribers after the first phase. The draft rules required a number to have been used for at least 90 days with the current provider and no unpaid bills ([Tuoi Tre News, 2018](https://news.tuoitre.vn/vietnam-to-roll-out-mobile-number-portability-from-november-16-10347411.htm)).

The Vietnam row of our MNP atlas:

<!-- country-data:VN: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 -->

| Item | Value |
|---|---|
| Mobile number portability | Yes |
| Mobile porting since | 2018-11-16 |
| Maximum porting time | not verified |
| Governing rule | MIC guidance on mobile number portability (MNP) |
| Published porting volume | none published |
| Source | [mic.gov.vn](https://mic.gov.vn/Pages/TinTuc/138171/Bo-TT-TT-huong-dan-cach-chuyen-mang-giu-nguyen-so-thue-bao.html) |
| Checked | 2026-09-25 |
<!-- country-data:VN:mnp:end -->

The atlas source link points to the former ministry's website, which no longer resolves since the merger. Our MNP atlas compares Vietnam with other countries. For routing, pricing or fraud rules, look up the current network per number instead of reading the prefix. Our [SMS routing with MNP and HLR](/use-cases/sms-routing-mnp-hlr) use case shows where that pays off.

## How are SIM subscribers identified?

Every mobile subscription is tied to a verified identity. Decree 163/2024/ND-CP, issued on 24 December 2024 to implement the 2023 Telecommunications Law, requires operators to check identity documents against the National Population Database, lets subscribers register through operator apps, and uses a one-time code sent to an already registered SIM when someone activates additional SIMs ([Tilleke & Gibbins, 2025](https://www.tilleke.com/insights/new-decree-provides-guidance-on-vietnams-telecom-law/)).

In 2026 the Ministry of Science and Technology tightened this with Circular 08/2026/TT-BKHCN, as reported in the press ([Tiền Phong, 2026](https://tienphong.vn/thue-bao-di-dong-phai-thuc-hien-sinh-trac-hoc-tu-15-4-post1832808.html); [LuatVietnam, 2026](https://luatvietnam.vn/tin-van-ban-moi/tu-hom-nay-15-6-2026-doi-dien-thoai-khong-xac-thuc-lai-thue-bao-co-the-bi-cham-dut-dich-vu-186-109566-article.html)):

- **From 15 April 2026**, subscribers verify their ID number, name, date of birth and a face image against the chip of their citizen ID card. Subscribers who registered the number with a level 2 VNeID account don't need to do this, except after a device change.
- **From 15 June 2026**, when a subscriber moves the SIM to another device, the operator has at most two hours to suspend outgoing calls and SMS until the person verifies their face again.
- **If they don't**, the subscription moves to two-way suspension and, after further deadlines, termination.

For anyone sending OTPs to Vietnam, the device-change rule matters. Only outgoing service is suspended, so the number can still receive your SMS and may look normal to you while its owner is in the middle of re-verification. If a customer reports that they can't reply or call, a recent phone change is a likely cause, not necessarily fraud. Our [SIM swap signals](/blog/sim-swap-fraud-signals) post covers the checks that do point to fraud.

## Which messaging apps and channels reach people?

SMS reaches every active mobile. Among messaging apps, Zalo, built by the Vietnamese technology group VNG, calls itself "the No. 1 communication app in Vietnam" and claims more than 81.3 million users and over 2.2 billion messages a day ([Zalo](https://zalo.me/), read on 2026-10-16). Those are the company's own figures, and we found no independent measurement we could verify, so we don't quote market shares for Zalo, WhatsApp, Viber or others.

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 LINE, Zalo and Botim guide explains why a `false` on Zalo carries more weight for a Vietnamese number than on a minor app, and our [channel-by-country guide](/blog/choosing-a-messaging-channel-by-country) shows the method.

### How do I check Zalo, WhatsApp or Viber registration for Vietnamese customers?

Normalise every row first, then run the checks you need per number. The [Zalo check](/services/zalo-number-check), the [WhatsApp check](/services/whatsapp-number-check) and the [Viber check](/services/viber-number-check) all run in real time and in bulk. A check tells you whether a number is registered at the time of the check. It can't tell you whether the person wants your messages:

| Answer | What it means | What to do |
|---|---|---|
| `registered: true` | The number has an account at `checked_at` | Offer that app to customers who opted in to it |
| `registered: false` | No account found at `checked_at` | Use SMS or another channel. Zalo users can limit who finds them by number, so ask before assuming |
| `unknown` | No conclusive answer (not billed) | Keep the current channel; retry later |
| `invalid_number` | Failed format validation (not billed) | Fix the data at the source, starting with old 11-digit numbers |

For a few numbers at a time, use a real-time lookup. This one uses the public sandbox key `mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym` and our [test values](/docs/test-values); the sandbox accepts only those UK drama numbers. With a live key, pass the output of `normalize_vn()`:

```python title="vn_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]:
    """Zalo 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": ["zalo", "whatsapp"], "wait": 5})
    r.raise_for_status()
    out = {}
    for row in r.json()["results"]:
        out[row["e164"]] = {
            name: (c["registered"] if c["status"] == "completed" else None)
            for name, c in (("zalo", row["checks"]["zalo.registered"]), ("whatsapp", row["checks"]["whatsapp.registered"]))
        }
    return out


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

What the [test values](/docs/test-values) return:

| Test value | `zalo` | `whatsapp` |
|---|---|---|
| `+447700900001` | `True` | `True` |
| `+447700900002` | `False` | `False` |
| `+447700900005` | `None` (`unsupported_country`) | `None` (`unsupported_country`) |

For lists, use a [bulk job](/docs/bulk-jobs) with a CSV whose numbers are written nationally and `default_country=VN`:

```bash title="Bulk Zalo and 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=zalo,whatsapp -F default_country=VN
```

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 Vietnamese numbers into one job. 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](/pricing). Run old lists through `normalize_vn()` before uploading, because the API doesn't convert 11-digit numbers for you: they come back as `invalid_number`.

Use these checks only for numbers you hold lawfully, such as customers and sign-ups. Requests with 20 or more consecutive numbers are refused (`403 suspected_enumeration`), and our [acceptable use policy](/legal/acceptable-use) forbids finding recipients for unsolicited messages. People can object through our [opt-out form](/opt-out). Our [consent guide](/blog/whatsapp-number-checks-consent-and-law) covers the legal basis in more detail.

## What are the rules for SMS, calls and personal data?

These summarise the texts as we read them between 2026-10-14 and 2026-10-16. Not legal advice; ask local counsel how they apply to you.

### Advertising messages and calls (Decree 91/2020)

Decree 91/2020/ND-CP took effect on 1 October 2020 and replaced the earlier anti-spam decrees. It extended the rules from SMS and e-mail to calls ([Tilleke & Gibbins, 2020](https://www.tilleke.com/insights/vietnams-new-decree-91-sets-out-stricter-anti-spam-regulations/)). The main obligations for advertisers, from the published English text ([Decree 91/2020](https://english.luatvietnam.vn/decree-no-91-2020-nd-cp-dated-august-14-2020-of-the-government-on-fighting-against-spam-text-messages-spam-emails-and-spam-calls-189003-doc1.html)):

| Rule | Requirement | Article |
|---|---|---|
| Consent | No advertising without the recipient's prior consent; no further messages after a refused or unanswered registration message | 13(1), 13(3) |
| Do Not Call list | No advertising messages or calls to numbers on the national DNC list; check it first | 7(3), 11, 13(1) |
| Frequency | At most 3 advertising messages and 1 advertising call per number in 24 hours, unless agreed otherwise | 13(5) |
| Hours | Messages 7:00 to 22:00, calls 8:00 to 17:00, unless agreed otherwise | 13(6) |
| Label | Advertising SMS starts with a mark such as `[QC]` or `[AD]` | 15 |
| Opt-out | Instructions at the end of every message; stop immediately and confirm once | 13(4), 16 |
| Sender | Only under a granted brand name of up to 11 characters, not all digits; phone numbers can't be used as senders | 13(8), 23 |

Tilleke & Gibbins reported fines of VND 80 to 100 million for messaging or calling numbers on the DNC list. We found no replacement of Decree 91, but the database page we read doesn't show its current status, so confirm it with counsel.

### What that means for OTP

A one-time passcode the user asked for isn't advertising, but it uses the same routes and sender names. Keep OTP messages free of offers, send them under a registered brand name, and don't reuse numbers collected for verification for marketing without separate consent.

### Personal data (Law 91/2025 and Decree 356/2025)

Vietnam's Personal Data Protection Law (Law 91/2025/QH15) was passed on 26 June 2025 and took effect on 1 January 2026, together with its guiding Decree 356/2025/ND-CP, which replaced Decree 13/2023/ND-CP, the earlier data protection decree. The law gives data subjects the right to agree, refuse and withdraw consent, and states that silence or no response is not consent ([LuatVietnam, 2026](https://english.luatvietnam.vn/legal-updates/the-latest-law-on-personal-data-protection-and-the-guiding-documents-892-106778-article.html)). A registration check on a customer's number is processing of personal data, so record why you run it, keep only the answer you need, and honour objections. Our [privacy checklist](/blog/privacy-checklist-for-phone-and-email-checks) lists the steps.

## What changed recently?

The rows for `VN` and `+84` in our [numbering-plan changes dataset](/datasets/numbering-plan-changes-2019-2026), built from libphonenumber's release notes:

<!-- country-data:VN: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) | 18 |
| Original-carrier prefix data | 9 |
| Alternate formatting | 3 |
| All | 30 |

Latest numbering-plan updates for `VN`: 2026-09-23 (v9.0.40), 2026-06-17 (v9.0.33), 2026-05-20 (v9.0.31), 2023-11-08 (v8.13.25), 2023-08-02 (v8.13.18).
<!-- country-data:VN:changes:end -->

Vietnam's numbering metadata changed three times between May and September 2026, so a library that is a few months old will reject some valid new numbers; update it at least monthly. Beyond numbering, the changes that matter are the face-verification rules of April and June 2026 and the data protection law in force since January 2026.

## What can MobileValidate check for Vietnamese numbers?

Generated from our public catalog:

<!-- country-data:VN:coverage:start -->
<!-- generated by apps/web/scripts/gen-country-guide-data.mjs (public catalog https://api.mobilevalidate.com/v1/services, fetched 2026-10-16); edit the script, not this table -->

| Check | Accepts Vietnam numbers | Notes |
|---|---|---|
| Format and country (every lookup) | Yes | Each number is parsed first; an invalid number returns `invalid_number` and is never billed. |
| Carrier lookup (beta) | Yes | Line 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) | Yes | Live reachability, porting, roaming (true or false) and current network; `unknown` is free. Real time and bulk. |
| Number portability (MNP) | Yes | Ported or not ported, and the current network code; `unknown` is free. Real time and bulk. |
| Spam reputation | Limited access | All countries except sanctioned ones; report coverage is strongest in North America and Europe. |
| Messaging apps | Yes: WhatsApp, Telegram, Viber, Signal*, iMessage*, RCS*, LINE*, Zalo, Botim*, Facebook Messenger* | Registered, not registered or unknown; unknown is free. |
| Social networks | Yes: Facebook, Instagram, Threads, X (Twitter), TikTok*, Snapchat* | Not for Vietnam numbers: LinkedIn (US, IN only). |
| Online accounts (Apple, Amazon, Microsoft, Netflix) | Yes: Apple, Amazon, Microsoft, Netflix | Registered, not registered or unknown; unknown is free. |

\* bulk jobs only. Catalog as fetched on 2026-10-16; the live list is at [`GET /v1/services`](https://api.mobilevalidate.com/v1/services).
<!-- country-data:VN: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. See [MNP lookup](/services/mnp-lookup), [HLR lookup](/services/hlr-lookup) and [carrier lookup](/services/carrier-lookup) for the network fields.

## What are the key takeaways?

- Vietnamese mobiles are `+84` plus nine digits starting 3, 5, 7, 8 or 9, `0XX XXX XXXX` at home; store the E.164 form and strip a stray `0` after `+84`.
- Old 11-digit numbers (`012x`, `016x`, `0186`, `0188`, `0199`) were converted in 2018 under Decision 798; convert them in your data, then treat them as unverified.
- The prefix names the range holder (Viettel, VinaPhone, MobiFone, Vietnamobile, Gmobile or an MVNO), not the current network: porting has run since 16 November 2018.
- Advertising SMS needs prior consent, a `[QC]` label, a brand name, DNC screening and sending hours; OTPs stay free of offers.
- Check Zalo, WhatsApp or Viber registration only for customers you hold lawfully, keep `unknown` apart from `false`, and never treat registration as consent.

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

## Sources

1. [Decision 798/QD-BTTTT of 25 May 2018 promulgating the mobile network code conversion plan (full text)](https://luatvietnam.vn/thong-tin/quyet-dinh-798-qd-btttt-2018-ke-hoach-chuyen-thue-bao-11-so-sang-10-so-163661-d1.html) — Ministry of Information and Communications of Vietnam (text published by LuatVietnam), 2018
2. [Bảng tổng hợp đổi 11 số thành 10 số các nhà mạng (31 May 2018)](https://vietnamnet.vn/bang-tong-hop-doi-11-so-thanh-10-so-cac-nha-mang-i375066.html) — VietNamNet, 2018
3. [Vietnam to roll out mobile number portability from November 16 (27 October 2018)](https://news.tuoitre.vn/vietnam-to-roll-out-mobile-number-portability-from-november-16-10347411.htm) — Tuoi Tre News, 2018
4. [Nguyen Manh Hung appointed Minister of Science and Technology (19 February 2025)](https://english.mst.gov.vn/nguyen-manh-hung-appointed-minister-of-science-and-technology-197250219103302235.htm) — Ministry of Science and Technology of Vietnam, 2025
5. [New Decree Provides Guidance on Vietnam's Telecom Law (Decree 163/2024/ND-CP, 6 January 2025)](https://www.tilleke.com/insights/new-decree-provides-guidance-on-vietnams-telecom-law/) — Tilleke & Gibbins, 2025
6. [Thuê bao di động phải thực hiện sinh trắc học từ 15/4 (3 April 2026)](https://tienphong.vn/thue-bao-di-dong-phai-thuc-hien-sinh-trac-hoc-tu-15-4-post1832808.html) — Tiền Phong, 2026
7. [Từ hôm nay (15/6/2026), đổi điện thoại không xác thực lại thuê bao có thể bị chấm dứt dịch vụ (Circular 08/2026/TT-BKHCN)](https://luatvietnam.vn/tin-van-ban-moi/tu-hom-nay-15-6-2026-doi-dien-thoai-khong-xac-thuc-lai-thue-bao-co-the-bi-cham-dut-dich-vu-186-109566-article.html) — LuatVietnam, 2026
8. [Decree No. 91/2020/ND-CP on fighting spam text messages, spam emails and spam calls (English text)](https://english.luatvietnam.vn/decree-no-91-2020-nd-cp-dated-august-14-2020-of-the-government-on-fighting-against-spam-text-messages-spam-emails-and-spam-calls-189003-doc1.html) — Government of Vietnam (translation published by LuatVietnam), 2020
9. [Vietnam's New Decree 91 Sets Out Stricter Anti-Spam Regulations (29 September 2020)](https://www.tilleke.com/insights/vietnams-new-decree-91-sets-out-stricter-anti-spam-regulations/) — Tilleke & Gibbins, 2020
10. [The latest Law on Personal Data Protection and the guiding documents (Law 91/2025/QH15, Decree 356/2025/ND-CP)](https://english.luatvietnam.vn/legal-updates/the-latest-law-on-personal-data-protection-and-the-guiding-documents-892-106778-article.html) — LuatVietnam, 2026
11. [Masan, FPT Retail, VNPay đặt mục tiêu gì khi lấn sân sang mạng di động ảo? (17 July 2023)](https://24hmoney.vn/news/masan-fpt-retail-vnpay-dat-muc-tieu-gi-khi-lan-san-sang-mang-di-dong-ao-c2a1978575.html) — 24HMoney, 2023
12. [Zalo](https://zalo.me/) — Zalo / VNG, 2026
13. [libphonenumber PhoneNumberMetadata.xml (region VN) and carrier prefix data (84.txt)](https://github.com/google/libphonenumber/blob/master/resources/carrier/en/84.txt) — libphonenumber project (Apache License 2.0), 2026

## Frequently asked questions

### How many digits is a Vietnamese mobile number?

Nine digits after the country code +84, or ten when written nationally with the leading 0, for example 09XX XXX XXX at home and +84 9XX XXX XXX in E.164. Every mobile number has been ten digits nationally since the 2018 conversion; an 11-digit number starting 01 is an old number that has to be converted.

### What did the old 11-digit 012x and 016x numbers become?

Under the Ministry of Information and Communications' Decision 798/QD-BTTTT of 25 May 2018, the old three-digit code was replaced by a two-digit one and the last seven digits stayed the same: Viettel 0162–0169 became 032–039, MobiFone 0120/0121/0122/0126/0128 became 070/079/077/076/078, VinaPhone 0123/0124/0125/0127/0129 became 083/084/085/081/082, Vietnamobile 0186/0188 became 056/058 and Gmobile 0199 became 059.

### What is the Vietnam country code for WhatsApp, Zalo and international use?

+84. Drop the leading 0 of the national number: 09XX XXX XXX becomes +84 9XX XXX XXX. A common mistake is keeping the 0 after the code (+84 09…); store the E.164 form without it.

### Can a Vietnamese number keep its digits after changing operator?

Yes. Mobile number portability started on 16 November 2018 with Viettel, VinaPhone and MobiFone postpaid subscribers, Vietnamobile joined on 1 January 2019 and prepaid subscribers followed. Because of porting, a prefix such as 09X or 03X shows only the operator that holds the range, not the current network.

### What are Vietnam's rules for advertising SMS and calls?

Decree 91/2020/ND-CP requires prior consent, an opt-out in every message, a [QC] or [AD] label, a registered sender name, no messages to numbers on the Do Not Call list, at most three advertising messages and one advertising call per number in 24 hours, and sending only between 7:00 and 22:00 (calls 8:00 to 17:00), unless the recipient agreed otherwise.

### Can I check whether Vietnamese customers are on Zalo?

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, in real time or in bulk; unknown answers are not billed. It never returns a name or profile, and requests that look like scans of number ranges are refused.
