Guides

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

Malaysia phone number format: +60, 01X mobile prefixes, why 011 has an extra digit, tested validation code, porting, MCMC SMS rules and WhatsApp checks.

By Published 14 min read

On this page

The Malaysia phone number format uses the country code +60. Mobile numbers start with 1 after the code (01X at home) and have 9 or 10 digits after +60: +60 12 XXX XXXX for most ranges, +60 11 XXXX XXXX for 011, which has one extra digit. Store the E.164 form. Ported numbers keep their prefix, so 01X doesn't tell you today's network, and WhatsApp or SMS checks need a lawful basis under the PDPA.

This guide is part of our phone numbers by country series. The tables are generated from libphonenumber's metadata and our public catalog. Example numbers are masked with X. We read the Malaysian Communications and Multimedia Commission (MCMC) documents cited here on 2026-10-14. This is a summary, not legal advice.

What does a Malaysian phone number look like?

A mobile number is 01X-XXX XXXX at home: the trunk prefix 0, a two-digit code starting with 1, and seven digits. From abroad it is +60 1X XXX XXXX. The 011 range is the exception that breaks most validators: its subscriber numbers have eight digits, so the national form is 011-XXXX XXXX, 11 digits including the 0 (Wikipedia). Landlines have a one-digit area code in Peninsular Malaysia (03 for Kuala Lumpur, Selangor and Putrajaya) and a two-digit 08X code in Sabah and Sarawak.

<!-- country-data:MY: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+60
International call prefix (dialling out)00
Trunk prefix (dialling at home)0
Mobile: digits after +609, 10
Fixed line: digits after +608, 9
Toll-free: digits after +6010
Premium rate: digits after +6010
VoIP: digits after +6010
Mobile, national format (masked)012-XXX XXXX
Mobile, international (masked)+60 12 XXX XXXX
Mobile, E.164 (masked)+6012XXXXXXX
Fixed line, national format (masked)03-2XXX XXXX
Fixed line, international (masked)+60 3 2XXX XXXX
Fixed line, E.164 (masked)+6032XXXXXXX
<!-- country-data:MY:format:end -->

Malaysian forms often collect numbers as 012-XXX XXXX, 6012XXXXXXX without a plus, or with a leading +6 typed by hand. A numbering-plan library with the default region MY turns all of them into +601…. Never strip the leading 0 with a regex and prepend 60 yourself: the 011 length difference and the landline codes make that brittle.

A +60 card compares a 012 number with seven digit dots to an 011 number with eight, the extra digit highlighted; below, a number hops between two towers, beside a SIM linked to an ID card and a message with a crossed-out link.A +60 card compares a 012 number with seven digit dots to an 011 number with eight, the extra digit highlighted; below, a number hops between two towers, beside a SIM linked to an ID card and a message with a crossed-out link.
011 numbers are one digit longer, prefixes don't show today's network, and SMS links are blocked.

Which prefixes are mobile numbers?

All mobile numbers start 01, but not every 01X block is fully in use. For each two-digit block, the generator counted every 9- and 10-digit number that libphonenumber's mobile pattern for MY accepts:

<!-- country-data:MY: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 (9, 10-digit numbers)3-digit sub-blocks that aren't fully mobile
010+60 1072.0%not mobile: 0100, 0101; partly mobile: 0104 (70.0%), 0107 (60.0%), 0109 (90.0%)
011+60 1166.3%not mobile: 0110, 0119; partly mobile: 0116 (95.0%), 0117 (68.0%), 0118 (0.3%)
012+60 12100%—
013+60 1390.0%not mobile: 0130
014+60 1470.1%not mobile: 0140, 0141; partly mobile: 0144 (1.0%)
015+60 159.2%not mobile: 0150–0152, 0154–0158; partly mobile: 0153 (0.9%)
016+60 16100%—
017+60 1790.0%not mobile: 0170
018+60 185.1%not mobile: 0180; partly mobile: 0181 (1.8%), 0184 (2.3%), 0185 (3.6%), 0187 (5.5%), 0188 (2.7%), 0189 (8.2%)
019+60 19100%—
<!-- country-data:MY:prefixes:end -->

In short: 012, 016 and 019 are fully mobile, 013 and 017 except their 0 sub-block, and 010, 011 and 014 mostly. 015 and 018 are mostly not mobile. The 015 block holds VoIP ranges, so a 015 number can be valid without being a mobile. A number such as 0150 XXX XXXX has a mobile-looking shape but fails a mobile check.

Why do 011 numbers have an extra digit?

Each operator was originally given one mobile code. As those codes filled up and virtual operators arrived, the 011 and 015 ranges were opened with eight-digit subscriber numbers instead of seven (Wikipedia). libphonenumber's current pattern also accepts the longer length in a few ranges of 014, 018 and 019. The practical rule: never hard-code "10 digits" for Malaysian mobiles. Accept 9 or 10 digits after +60 and let the metadata decide which ranges allow which length.

Prefixes and operators

Malaysians often read the prefix as the network: 012 or 017 for one operator, 013 or 019 for another. That reflects the original allocation, and several blocks (010, 011, 014, 018) are split between operators and virtual operators. The merger of Celcom and Digi into CelcomDigi on 1 December 2022 changed the picture again (Wikipedia). We don't publish an operator-by-prefix table here, because it looks authoritative and is wrong for every ported number.

How do I validate a Malaysian number in code?

Use a libphonenumber port with full metadata and the default region MY.

Python (pip install phonenumbers):

Python
import phonenumbers


def normalize_my(raw: str) -> str | None:
    """E.164 for a Malaysian mobile (01X …), or None."""
    try:
        n = phonenumbers.parse(raw, "MY")
    except phonenumbers.NumberParseException:
        return None
    if (not phonenumbers.is_valid_number(n) or phonenumbers.region_code_for_number(n) != "MY"
            or phonenumbers.number_type(n) != phonenumbers.PhoneNumberType.MOBILE):
        return None
    return phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)

JavaScript (npm install libphonenumber-js):

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

/** "012-XXX XXXX", "011-XXXX XXXX", "+60 1X …", "601X…" → E.164 for a Malaysian mobile, or null. */
export function normalizeMy(raw) {
  const phone = parsePhoneNumberFromString(String(raw), "MY");
  return phone?.isValid() && phone.country === "MY" && phone.getType() === "MOBILE" ? phone.number : null;
}

We ran both on 2026-10-14 (Python phonenumbers 9.0.41, libphonenumber-js 1.13.13 with metadata 9.0.39). Both returned an E.164 number for rows 1 to 5 below and nothing for the rest; both also accepted an 11-digit 011-XXXX XXXX number and rejected the same number with one digit missing. The shape regex column tests ^(?:\+60|0060|0)?1\d{8,9}$, the pattern most tutorials give, after spaces, dashes and brackets are removed:

<!-- country-data:MY:tests:start --> <!-- generated by apps/web/scripts/gen-country-guide-data.mjs (libphonenumber-js 1.13.13, region MY); edit the script, not this table -->
#CaseInput (masked)Shape regex ^(?:\+60|0060|0)?1\d{8,9}$libphonenumber (MY)
1National, with trunk prefix012-XXX XXXXpassesvalid, MOBILE
2International, with spaces+60 12 XXX XXXXpassesvalid, MOBILE
3International dialling prefix 000060 12-XXX XXXXpassesvalid, MOBILE
4E.164+6012XXXXXXXpassesvalid, MOBILE
5Dashes and brackets(012) XXX-XXXXpassesvalid, MOBILE
6One digit short012XXXXXXfailsinvalid
7One digit too many012XXXXXXXXpassesinvalid
8Fixed line03-2XXX XXXXfailsvalid, FIXED_LINE
9VoIP range015X-XXX XXXXpassesvalid, VOIP
<!-- country-data:MY:tests:end -->

Rows 7 and 9 are the ones to remember. A 012 number with an extra digit has the length of an 011 number, so the regex passes it, but no 012 number is that long. And a 015 VoIP number passes the regex but isn't a mobile, so an OTP sent to it by SMS may never arrive. More languages are in our Python and JavaScript guides.

Does number portability change the carrier?

Yes. Mobile number portability was introduced in Malaysia on 1 October 2008, so a number's prefix shows only its original provider (Wikipedia). MCMC set the framework after a public inquiry; its December 2005 report discusses a central clearinghouse, porting times and a postponement of the launch to 2008 (MCMC, 2005).

One recent change matters for anyone who checked numbers by hand: MCMC's public MNP Check website was discontinued with effect from 8 May 2026 (MCMC notice). For automated routing, you need a lookup through a provider instead.

<!-- country-data:MY:mnp:start --> <!-- generated by apps/web/scripts/gen-country-guide-data.mjs (MNP atlas 2026); edit the script, not this table -->

Our MNP atlas has no verified row for Malaysia yet.

<!-- country-data:MY:mnp:end -->

For routing, SMS cost or fraud rules, look up the current network per number instead of reading the prefix. Our MNP lookup returns ported or not_ported and the current MCC/MNC, and our MNP atlas compares porting rules across countries.

What do prepaid SIM registration rules mean for validation?

Every prepaid line in Malaysia must be registered to an identity document, and the rules tightened in 2026. On 26 February 2026 MCMC registered the Commission Determination on the Mandatory Standard for the Registration of End Users of Public Cellular Prepaid Services. As Bernama reported, it caps prepaid SIMs at five per person per operator for citizens and permanent residents and two for non-citizens, uses biometric checks and MyDigital ID for self-registration, bars registration of children under 12, and ends tourist SIMs after at most three months (Bernama, 2026).

Two consequences for number data:

  • Tourist numbers expire. A Malaysian number collected from a visitor can stop working within three months. Recheck it before an important message instead of trusting an old "valid" flag; our guide on how long check results stay valid covers refresh intervals.
  • Registration isn't identity for you. The identity behind a line stays with the operator. No lawful lookup, ours included, returns the registered name or ID number.

What are the rules for SMS and marketing messages?

These summarise MCMC and statutory sources as we read them on 2026-10-14. Not legal advice; ask counsel how they apply to you.

On MCMC's direction, operators began blocking SMS containing links sent from mobile numbers on 2 May 2023, with business short codes to follow after notice (MCMC press clipping, 2023). CelcomDigi's customer notice says SMS containing URL links, personal details or phone numbers are blocked, that the rule covers person-to-person and application-to-person traffic, and that MCMC's short-code exemption was revoked from 1 September 2024. Blocked messages can't be unblocked (CelcomDigi).

For OTP and service SMS, that means plain text: the code, your brand and an instruction, no link and no callback number. A delivery report may still show "sent" for a blocked message, so measure conversion as well; see why SMS is not delivered.

Section 233A and the proposed anti-spam framework

The Communications and Multimedia (Amendment) Act, gazetted in February 2025, inserted section 233A into the Communications and Multimedia Act 1998, which prohibits sending unsolicited commercial electronic messages. MCMC's consultation paper of 13 August 2025 proposed the regulations that would apply it (MCMC, 2025):

ProposalWhat it would require
ScopeCommercial messages by e-mail, SMS, internet messaging services or similar modes, with a "Malaysian link" by sender, recipient or infrastructure
ConsentExpress consent, or implied consent from an existing relationship: up to 24 months after the last transaction, 6 months after an enquiry
WithdrawalFree opt-out in every message, working for at least 30 days, processed within 5 business days
IdentificationSender's name or registered business identity and working contact details in the message
Labelling<ADV> at the start of the subject line, or of the first line where there is no subject
HarvestingNo address-harvesting tools, no "dictionary attacks" that generate addresses by guessing, no sending to such lists

When we checked on 2026-10-14, we couldn't confirm from official sources that these regulations or section 233A are in force. Treat the table as the direction of travel. Its consent and opt-out rules are already good practice, and the ban on generated addresses is one reason we refuse requests that look like number-range scans.

The PDPA 2010 and its 2024 amendments

A Malaysian mobile number linked to a customer is personal data under the Personal Data Protection Act 2010 (Act 709). Section 43 lets a person require you, by written notice, to stop processing their data for direct marketing, defined as advertising or marketing material "directed to particular individuals" by any means (JPDP, Act 709). The Personal Data Protection (Amendment) Act 2024 came into force in stages: 1 January, 1 April and 1 June 2025. It renamed data users "data controllers", raised the maximum fine for breaching the data protection principles to RM1,000,000, extended the security principle to data processors and, from 1 June 2025, added mandatory breach notification, a data protection officer and a right to data portability (Norton Rose Fulbright, 2025).

Can I check if a Malaysian number is on WhatsApp?

Yes, for numbers your customers gave you, with a stated purpose. Our WhatsApp number check answers registered, not registered or unknown, with a checked_at time. It doesn't read profiles, names or photos, and a registered result is not permission to message anyone.

Businesses check Malaysian numbers mainly to choose a support or OTP channel. Meta prices Malaysia as its own WhatsApp market, lists Malaysia among the markets with an authentication-international rate for eligible businesses sending codes from abroad, and added the ringgit (MYR) as a billing currency from 1 April 2026 (Meta pricing, read on 2026-10-14). If you send OTPs to Malaysia from another country at volume, compare both rates with SMS; our WhatsApp OTP vs SMS OTP post shows how.

What a lawful check looks like under the PDPA, in our reading:

DoDon't
Check numbers from your own sign-ups, orders and support contactsCheck bought lists, scraped numbers or generated ranges
Name channel checks in your privacy notice (PDPA section 7)Treat "registered" as consent to send marketing
Store only the answer and its dateKeep or build profiles of people who aren't customers
Honour section 43 notices and opt-outs at onceRe-check opted-out numbers to market to them elsewhere

Our consent and law guide compares Malaysia's PDPA with the GDPR, India and Brazil in detail. Requests with 20 or more consecutive numbers are refused with 403 suspected_enumeration, and our acceptable use policy forbids finding recipients for unsolicited messages. People can object through our opt-out form.

Here is the check from code, after normalize_my(). It uses the public sandbox key mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym and our test values, which are UK drama numbers because the sandbox accepts only those. With a live key, pass the output of normalize_my(). We ran it on 2026-10-14 with Python 3.12 and requests 2.34.

my_channels.py
import os

import requests  # pip install requests

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


def channel_facts(numbers: list[str]) -> dict[str, dict]:
    """Porting status and WhatsApp registration for numbers your customers gave you."""
    r = requests.post(API, headers={"Authorization": f"Bearer {KEY}"}, timeout=15,
                      json={"numbers": numbers, "checks": ["mnp", "whatsapp"], "wait": 5})
    r.raise_for_status()
    out = {}
    for row in r.json()["results"]:
        mnp, wa = row["checks"]["number.mnp"], row["checks"]["whatsapp.registered"]
        out[row["e164"]] = {
            "porting": (mnp["attributes"] or {}).get("porting"),  # ported, not_ported or None
            "whatsapp": wa["registered"] if wa["status"] == "completed" else None,  # None = unknown
            "checked_at": wa["checked_at"],
            "billed": mnp["billed"] or wa["billed"],
        }
    return out


for number, info in channel_facts(["+447700900001", "+447700900002", "+447700900005", "+447700900006"]).items():
    print(number, info)
Test valueportingwhatsappchecked_atbilled
+447700900001not_portedTruesetFalse
+447700900002not_portedFalsesetFalse
+447700900005NoneNoneNoneFalse
+447700900006portedTruesetFalse

+447700900005 stands for a country a check doesn't cover: it answers unsupported_country, which the script maps to None, never to False. Test mode never bills; in live mode, unknown and unsupported answers aren't billed either. For a whole customer file, a bulk job takes up to 50,000 numbers, and the free estimate (POST /v1/jobs/estimate) shows the maximum cost before you start; see our bulk WhatsApp check guide.

What changed recently?

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

<!-- country-data:MY: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)16
Original-carrier prefix data13
Geocoding (area names)1
All30

Latest numbering-plan updates for MY: 2026-04-22 (v9.0.29), 2026-03-26 (v9.0.27), 2026-02-25 (v9.0.25), 2025-05-23 (v9.0.6), 2024-07-24 (v8.13.42).

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

Malaysia's metadata changes often: three updates in the first four months of 2026 alone. Update your validation library at least monthly, or numbers from newly opened sub-blocks will fail. On the rules side, the recent changes are the 2026 prepaid registration standard, the end of MCMC's MNP Check website, and the PDPA amendments that took full effect in June 2025.

What can MobileValidate check for Malaysian numbers?

Generated from our public catalog:

<!-- country-data:MY: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 Malaysia 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 Malaysia 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:MY:coverage:end -->

A lookup returns network and registration facts. It never returns a subscriber's name, MyKad number or address, and we don't offer "number details" searches. See MNP lookup, HLR lookup and WhatsApp number check for the fields, our channel selection use case for routing, and pricing for current prices.

What are the key takeaways?

  • Malaysian mobiles are +60 1 plus eight or nine digits: 01X-XXX XXXX at home, 011-XXXX XXXX for the longer 011 range. Store the E.164 form.
  • Don't validate with a fixed length or a shape regex: 015 holds VoIP ranges, and several blocks are only partly mobile.
  • The prefix shows the original operator. Porting has existed since October 2008, and MCMC's public MNP Check site closed in May 2026, so look up the current network when it matters.
  • SMS with links or phone numbers are blocked; keep OTPs plain. Section 233A's anti-spam rules are proposed, and the PDPA already applies.
  • A WhatsApp check is for your own customers' numbers, with a stated purpose. Registration isn't consent, and no lawful lookup returns who owns a number.

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

Sources

  1. Telephone numbers in Malaysia — Wikipedia, 2026
  2. A report on a public inquiry on implementation of mobile number portability (MNP) in Malaysia (28 December 2005) — Malaysian Communications and Multimedia Commission (MCMC), 2005
  3. Notice: Discontinuation of MNP Check website (with effect from 8 May 2026) — Malaysian Communications and Multimedia Commission (MCMC), 2026
  4. MCMC introduces mandatory standard to tighten prepaid SIM card registration (26 February 2026) — Bernama, 2026
  5. Malaysian users are blocked from sending and receiving SMS containing links from mobile numbers (2 May 2023, MCMC press clipping) — Malaysian Communications and Multimedia Commission (MCMC) / SoyaCincau, 2023
  6. Blocking of SMS containing URL link, personal details, phone numbers and/or others — CelcomDigi, 2024
  7. Public consultation paper on unsolicited commercial electronic messages (13 August 2025) — Malaysian Communications and Multimedia Commission (MCMC), 2025
  8. Personal Data Protection Act 2010 (Act 709), amendment and commencement notices — Personal Data Protection Department (JPDP), Malaysia, 2024
  9. New horizons in data protection: Malaysia's Personal Data Protection (Amendment) Act 2024 — Norton Rose Fulbright, Data Protection Report, 2025
  10. WhatsApp Business Platform pricing and authentication-international rates — Meta for Developers, 2026
  11. libphonenumber PhoneNumberMetadata.xml (region MY) and release notes — libphonenumber project (Apache License 2.0), 2026

Frequently asked questions

How many digits is a Malaysian mobile number?

Nine or ten digits after the country code +60. Most mobiles are 01X followed by seven digits at home (10 digits with the leading 0), while 011 numbers have eight digits after the prefix (11 digits with the 0). In E.164 that is +60 1X XXX XXXX or +60 11 XXXX XXXX.

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

+60. Drop the leading 0: 012-XXX XXXX becomes +60 12 XXX XXXX. Store that E.164 form and use it for every channel, including WhatsApp, SMS and voice.

Why does my 011 number have one more digit than other Malaysian mobiles?

Because the 011 range was opened when the older mobile codes were running out, and its subscriber numbers have eight digits instead of seven. A validator that expects exactly ten national digits for every Malaysian mobile will reject valid 011 numbers.

Does the 01X prefix tell me the mobile network in Malaysia?

Only the operator that the range was first allocated to. Mobile number portability has been available in Malaysia since 1 October 2008, so a number can move to another operator and keep its prefix. Look up the current network when it matters for routing or cost.

Is it legal to check whether a Malaysian number is on WhatsApp?

It can be, for numbers your customers gave you, for a stated purpose such as choosing a support channel. Malaysia's PDPA 2010 treats a phone number as personal data, so you need consent or another basis, a notice of purpose and minimal data. A check never replaces consent to send messages.

Can I find out who owns a Malaysian mobile number?

Not from us, and not from any lawful lookup service. Registration details for prepaid and postpaid lines stay with the operators. A MobileValidate lookup returns network and registration facts, never a name, an ID number or an address.

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.