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

> Thailand phone number format: +66 and 10-digit mobiles (06, 08, 09), the 0066 parsing trap, tested code, porting, SIM identity rules and LINE checks.

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

![A card shows +66 and a ten-digit Thai mobile as circles, with prefixes 06, 08 and 09 feeding the highlighted prefix; a crossed-out 0066 turns into a ticked +66. Small cards show porting, a SIM with ID card, and yes/no/unknown.](https://mobilevalidate.com/images/blog/thailand-phone-number-format.svg)

*A Thai mobile is +66 plus nine digits starting 6, 8 or 9; write it with a plus, never as 0066.*


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

Thai numbers use the country code +66. Mobile numbers have 9 digits after the code and start with 6, 8 or 9, so they are ten digits at home (08X XXX XXXX) and +66 8X XXX XXXX in E.164. Write the international form with a plus, not as 0066: Thailand uses several exit codes (001, 006, 009 and others), so a parser set to Thailand reads "006" as one and rejects the number. Porting has run since December 2010, and SIM cards are tied to a verified identity.

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](/datasets/mnp-atlas-2026) and our public catalog. Example numbers are masked with X. We read the regulator notices, legal texts and press reports cited below between 2026-10-16 and 2026-10-18. Several Thai rules are published only in Thai; for those we relied on official translations, law-firm summaries or press reports and say so. This is a summary, not legal advice.

## What does a Thai phone number look like?

A mobile number is `08X XXX XXXX` at home: the trunk prefix `0`, a two-digit prefix starting `6`, `8` or `9`, and seven subscriber digits. From abroad it is `+66 8X XXX XXXX`. Landlines are one digit shorter: 8 digits after `+66`, where the first one or two digits are the area code.

<!-- country-data:TH: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 | `+66` |
| International call prefix (dialling out) | `00[1-9]` (pattern: more than one prefix is used) |
| Trunk prefix (dialling at home) | `0` |
| Mobile: digits after +66 | 9 |
| Fixed line: digits after +66 | 8 |
| Toll-free: digits after +66 | 10, 13 |
| Premium rate: digits after +66 | 10 |
| VoIP: digits after +66 | 9 |
| Mobile, national format (masked) | `081 XXX XXXX` |
| Mobile, international (masked) | `+66 81 XXX XXXX` |
| Mobile, E.164 (masked) | `+6681XXXXXXX` |
| Fixed line, national format (masked) | `010 XXX XXX` |
| Fixed line, international (masked) | `+66 10 XXX XXX` |
| Fixed line, E.164 (masked) | `+6610XXXXXX` |
<!-- country-data:TH:format:end -->

The fixed-line example in the table is the first number libphonenumber's pattern accepts, not a typical landline. Real landlines look like this:

| Area | National format (masked) | E.164 (masked) |
|---|---|---|
| Bangkok, Nonthaburi, Pathum Thani, Samut Prakan | `02 XXX XXXX` | `+662XXXXXXX` |
| Chiang Mai and the upper north (`053`) | `053 XXX XXX` | `+6653XXXXXX` |
| Chon Buri, Rayong, Chachoengsao (`038`) | `038 XXX XXX` | `+6638XXXXXX` |
| Phuket and Phang Nga (`076`) | `076 XXX XXX` | `+6676XXXXXX` |
| Khon Kaen and neighbouring provinces (`043`) | `043 XXX XXX` | `+6643XXXXXX` |

Area names come from libphonenumber's geocoding data. The area code is part of the number and is always dialled, even for a call within the same province.

### Why do Thai numbers written as 0066… fail validation?

Because Thailand has several international exit codes, not one. The metadata defines the exit code as `00` followed by any digit from 1 to 9, and operators really do use several of them: the carrier selection codes include `001`, `003`, `004`, `005`, `006` and `009`, each tied to an international carrier ([Telephone numbers in Thailand](https://en.wikipedia.org/wiki/Telephone_numbers_in_Thailand), citing the NBTC numbering database). `006` is one of them. A parser that is told the number comes from Thailand therefore reads `0066 81 XXX XXXX` as exit code `006`, then country code `68…`, and the result is not a Thai number at all. We confirmed this with both libphonenumber ports we test (row 3 of the test table below).

The fix is one line: rewrite a leading `0066` to `+66` before parsing. Inputs that use a real Thai exit code, such as `001 66 81 XXX XXXX`, already parse correctly. And as everywhere, store only the E.164 form, `+6681XXXXXXX`, with no spaces and no `0` after the country code.

## Which prefixes are mobile numbers?

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

<!-- country-data:TH: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 |
|---|---|---|---|
| `0AA`, for 27 blocks AA = 14, 61–66, 80–89, 90–99 | `+66 AA` | 100% | — |
| `067` | `+66 67` | 19.0% | not mobile: 0670, 0674–0679; partly mobile: 0671 (90.0%), 0672 (40.0%), 0673 (60.0%) |
<!-- country-data:TH:prefixes:end -->

Three details matter:

- **`080`–`089` and `090`–`099` are fully mobile.** The `09` range was opened after `08` filled up.
- **`06` is mixed.** `061`–`066` are mobile, `067` is only partly allocated, and `060` and `068` are VoIP ranges, typed `VOIP` in the metadata (row 10 of the test table). A VoIP number has the same shape as a mobile, so a regex can't tell them apart.
- **`014` is an oddity.** The metadata treats it as a mobile block, but we found no allocation notice from the regulator that explains it, so the code below accepts only `06`, `08` and `09`, like our other guides do for unexplained blocks.

### Which operator holds each prefix?

In Thailand the two-digit prefix doesn't identify the operator. Each block is split between operators at the third or fourth digit, so `081`, `089` or `095` can each belong to several. A few examples from libphonenumber's carrier prefix file ([66.txt](https://github.com/google/libphonenumber/blob/master/resources/carrier/en/66.txt)), which still uses the brand names of the time the ranges were assigned:

| Example sub-blocks (national) | Name in the carrier file | Range holder today |
|---|---|---|
| `0811`, `0818`, `0901`, `0981` | AIS | AIS (Advanced Info Service) |
| `0825`, `0835`, `0918`, `0961` | True Move | True Corporation (TrueMove H brand) |
| `0805`, `0831`, `0911`, `0991` | DTAC | True Corporation (dtac brand) |
| `0905`, `0975` | TOT Mobile | National Telecom (NT) |
| `0641` | Penguin SIM | Mobile virtual network operator |

Two mergers explain the right-hand column. dtac and True completed their amalgamation on 1 March 2023 into True Corporation Public Company Limited ([True Corporation, 2023](https://www.true.th/blog/en/dtac-true-amalgamation-complete-2/)). The two state-owned operators, TOT and CAT Telecom, were merged into National Telecom (NT) in January 2021 ([The Nation via Open Development Thailand, 2020](https://thailand.opendevelopmentmekong.net/news/cat-tot-merger-to-be-completed-by-january-7/)). So "DTAC" in the carrier file today means a True Corporation range, and a lookup that returns "TOT" is describing the original holder.

Porting changes the picture further: 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.

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

Remove spaces and punctuation, rewrite `0066` to `+66`, parse with full metadata and the default region `TH`, and keep only mobiles.

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

```python
import re

import phonenumbers


def normalize_th(raw: str) -> str | None:
    """E.164 for a Thai mobile number, or None."""
    s = re.sub(r"[\s().-]", "", raw)
    # "0066..." means +66, but Thailand has several exit codes (001, 006, 009 ...),
    # so a parser with region TH reads "006" as an exit code. Rewrite it first.
    s = re.sub(r"^0066", "+66", s)
    try:
        n = phonenumbers.parse(s, "TH")
    except phonenumbers.NumberParseException:
        return None
    if (not phonenumbers.is_valid_number(n) or phonenumbers.region_code_for_number(n) != "TH"
            or phonenumbers.number_type(n) != phonenumbers.PhoneNumberType.MOBILE):
        return None
    e164 = phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)
    return e164 if e164[3] in "689" else None  # 06, 08, 09 only, see the prefix table
```

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

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

/** "081 234 5678", "+66 81 …", "0066 81 …" or "+66 081 …" → E.164 for a Thai mobile number, or null. */
export function normalizeTh(raw) {
  // "0066…" means +66, but Thailand has several exit codes (001, 006, 009 …), so region TH reads "006" as one.
  const input = String(raw).replace(/[\s().-]/g, "").replace(/^0066/, "+66");
  const phone = parsePhoneNumberFromString(input, "TH");
  return phone?.isValid() && phone.country === "TH" && phone.getType() === "MOBILE" && /^\+66[689]/.test(phone.number)
    ? phone.number : null;
}
```

We ran both on 2026-10-18 (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, including row 3, and nothing for rows 6 to 10. They also agreed on inputs outside the table: `+66 08…` with the stray `0`, `66 8…` without a plus and `001 66 8…` with a Thai exit code all became the right E.164 number, while `014…` and `068…` numbers were rejected. The libphonenumber column shows what the library makes of each input on its own, without our two extra rules. The shape regex column tests the pattern most tutorials give, after spaces, dashes and brackets are removed:

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

| # | Case | Input (masked) | Shape regex `^(?:\+66\|0066\|0)?[1689]\d{8}$` | libphonenumber (`TH`) |
|---|---|---|---|---|
| 1 | National, with trunk prefix | `081 XXX XXXX` | passes | valid, `MOBILE` |
| 2 | International, with spaces | `+66 81 XXX XXXX` | passes | valid, `MOBILE` |
| 3 | International dialling prefix 00 | `0066 81 XXX XXXX` | passes | invalid |
| 4 | E.164 | `+6681XXXXXXX` | passes | valid, `MOBILE` |
| 5 | Dashes and brackets | `(081) XXX-XXXX` | passes | valid, `MOBILE` |
| 6 | One digit short | `081XXXXXX` | fails | invalid |
| 7 | One digit too many | `081XXXXXXXX` | fails | invalid |
| 8 | Mobile shape, unused block 010 | `010XXXXXXX` | passes | invalid |
| 9 | Fixed line | `010 XXX XXX` | fails | valid, `FIXED_LINE` |
| 10 | VoIP range | `060 XXX XXXX` | passes | valid, `VOIP` |
<!-- country-data:TH:tests:end -->

Rows 3, 8 and 10 are the ones to remember:

1. **Row 3:** `0066` passes the regex, but libphonenumber on its own rejects it for the exit-code reason above. Without the rewrite you lose real customers.
2. **Row 8:** `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.
3. **Row 10:** `060` passes the regex and libphonenumber says it is valid, but as `VOIP`, not `MOBILE`. If your sign-up flow only wants mobiles, check the type, not just validity.

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. For VoIP numbers at sign-up, see [VoIP number detection](/blog/voip-number-detection-for-signups).

## Does number portability change the carrier?

Yes. Mobile number portability (MNP) took effect on 5 December 2010. At first it was limited to Bangkok and to 100 numbers a day per operator, with a fee of THB 99, and full nationwide availability followed in January 2011 ([Kasikorn Research Center, 2010](https://www.kasikornresearch.com/en/analysis/k-econ/business/Pages/26168.aspx)). New rules from the National Broadcasting and Telecommunications Commission (NBTC), which The Nation reported on 17 January 2017 as taking effect that week, require operators to complete a transfer in two days instead of three and put the fee at THB 29 ([The Nation, 2017](https://www.nationthailand.com/business/30304311)). The current NBTC notification on mobile number portability, dated 6 September 2021 and published in the Royal Gazette on 23 September 2021, keeps the limit at two working days, counted from a complete and verified request ([Royal Gazette, 2021](https://web.archive.org/web/20211202151643/http://www.ratchakitcha.soc.go.th/DATA/PDF/2564/E/229/T_0026.PDF)).

The Thailand row of our MNP atlas:

<!-- country-data:TH: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 | 2010-12-05 |
| Maximum porting time | 2 working days |
| Governing rule | NBTC Notification on Criteria for Mobile Number Portability (6 Sep 2021), clause 10 |
| Published porting volume | none published |
| Source | [web.archive.org](https://web.archive.org/web/20211202151643/http://www.ratchakitcha.soc.go.th/DATA/PDF/2564/E/229/T_0026.PDF), [kasikornresearch.com](https://www.kasikornresearch.com/en/analysis/k-econ/business/Pages/26168.aspx) |
| Checked | 2026-10-19 |
<!-- country-data:TH:mnp:end -->

The 2021 notification replaced the 2009 and 2010 rules, which allowed three working days. Our [MNP atlas](/blog/mobile-number-portability-atlas) compares Thailand 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 SIM card is registered to a person, and since 2023 the rules have been tightened again and again to fight phone scams.

| Date | Rule | What it means for you |
|---|---|---|
| 17 March 2023 | Emergency Decree on technological crimes in force | Lending your mobile number to someone else, knowing it will be used for crime, can bring up to 3 years in prison or a THB 300,000 fine (section 9). Trading SIMs registered to someone who can't be identified: 2 to 5 years or up to THB 500,000 (section 11) |
| January 2024 | People with more than five SIMs per operator must confirm their identity | Those with more than 100 had until 14 February 2024, those with 6 to 100 until 13 July 2024. After the deadline outgoing calls and SMS were suspended, then the SIM was terminated |
| 13 April 2025 | Amendment to the Emergency Decree | Telecom providers must screen for content linked to technology crime and suspend SIM cards when the NBTC orders it |
| 16 May 2026 | NBTC notification No. 2 on technology crime | People without Thai nationality: at most three SIMs per person per operator, in-person registration, mainly with a passport. Every user must activate a registered SIM within 60 days |

Sources: the decree's official English translation ([MDES, 2023](https://mdes.go.th/law/detail/7455-Emergency-Decree-on-Measures-for-the-Prevention-and-Suppression-of-Technological-Crimes--B-E--2566--2023-)), Pattaya Mail's report of the NBTC's statements ([2024](https://www.pattayamail.com/thailandnews/final-warning-for-holders-of-six-to-100-sim-cards-to-confirm-identities-at-mobile-phone-service-centers-by-july-13-465247)) and Tilleke & Gibbins' summaries of the 2025 amendment ([2025](https://www.tilleke.com/insights/thailand-amends-emergency-decree-on-technology-crime/)) and the 2026 notification ([2026](https://www.tilleke.com/insights/thailand-tightens-telecom-registration-data-and-ip-address-rules-to-combat-tech-crime/)). By the end of June 2024, according to the NBTC, only 1,635,407 of the 3,981,251 SIMs affected by the five-SIM rule had been verified, and more than a million SIMs in the over-100 group had already been suspended in February.

Two consequences for businesses:

- **Shared liability.** Under the decree as amended, banks, payment providers, mobile network operators and other service providers are jointly responsible for losses from technological crimes unless they show they met their regulators' standards ([Baker McKenzie, 2025](https://www.bakermckenzie.com/en/insight/publications/alerts/2025/08/thailand-sec-sets-new-standards-against-mule-accounts)). Expect Thai banks and fintechs to ask more of the phone numbers they rely on for OTPs.
- **Suspended outgoing service.** A number whose owner missed a verification deadline can lose outgoing calls and SMS first. It may still receive your OTP and look normal to you, while the customer can't reply or call back. Our [SIM swap signals](/blog/sim-swap-fraud-signals) post covers the checks that do point to fraud.

### What is the +697 prefix on calls in Thailand?

It marks an incoming call that arrived over internet telephony. In July 2022 the Ministry of Digital Economy and Society said call-centre scammers favour these numbers because they don't have to be registered, and that the NBTC had ordered operators to add `+697` to incoming IP calls so people can spot them ([The Nation, 2022](https://www.nationthailand.com/in-focus/40017318)). Police advice repeated in September 2024 is to reject calls from abroad starting `+697` or `+698` and to treat `+66` calls made over VoIP with suspicion ([PRD, 2024](https://web.archive.org/web/20260202011450/https://thailand.prd.go.th/en/content/category/detail/id/2078/iid/327803)). `+697` is not a country code and never belongs in a phone field: if one reaches your database, it came from a caller ID, not from a customer.

## Which messaging apps and channels reach people?

SMS reaches every active mobile. Among messaging apps, LINE is the one most Thai businesses build on: in August 2026 LINE Thailand disclosed 56 million users in the country and more than 12 billion conversations with LINE Official Accounts during 2025 ([Relevant Audience, reporting LINE's disclosure, 2026](https://www.relevantaudience.com/digital-marketing-en/line-thailand-business-solutions-2026/)). Those are the company's own figures, not an independent measurement, so we don't quote market shares for LINE, WhatsApp, Facebook Messenger or Telegram.

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 how much weight a "not registered" answer carries on LINE, where people also connect by ID and QR code, and our [channel-by-country guide](/blog/choosing-a-messaging-channel-by-country) shows the method.

### How do I check LINE, WhatsApp or Telegram registration for Thai customers?

Normalise every row first, then run the checks you need per number. The [LINE check](/services/line-number-check) runs in bulk jobs only; the [WhatsApp check](/services/whatsapp-number-check) and the [Telegram check](/services/telegram-number-check) 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; for LINE, also offer your Official Account's QR code |
| `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 `0066` and VoIP 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_th()`:

```python title="th_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]:
    """WhatsApp and Telegram registration per number. None means we don't know."""
    r = requests.post(API, headers={"Authorization": f"Bearer {KEY}"}, timeout=15,
                      json={"numbers": numbers, "checks": ["whatsapp", "telegram"], "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 (("whatsapp", row["checks"]["whatsapp.registered"]), ("telegram", row["checks"]["telegram.registered"]))
        }
    return out


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

What the [test values](/docs/test-values) return (we ran it against the sandbox on 2026-10-18):

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

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

```bash title="Bulk LINE 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=line,whatsapp -F default_country=TH
```

Two pricing rules apply to Thai lists. LINE is a bulk-only check, so each country in a job is charged at least the price of 500 LINE checks. WhatsApp checks get the bulk price only for groups of at least 132 numbers from the same country in one job. Collect a day's Thai numbers into one job, and 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). Rewrite `0066` numbers before uploading, because a CSV written that way can 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 and commentary as we read them between 2026-10-16 and 2026-10-18. Thailand has no single anti-spam law; the rules for marketing messages come from the data protection law, the direct marketing law and the NBTC. Not legal advice; ask local counsel how they apply to you.

| Rule | Requirement | Source |
|---|---|---|
| Consent to marketing (PDPA) | A phone number is personal data. Get consent before marketing to consumers by SMS or phone, in writing or electronically, separate from other terms; withdrawal must be as easy as giving it | Personal Data Protection Act B.E. 2562, in full force since 1 June 2022 ([Linklaters](https://www.linklaters.com/insights/data-protected/data-protected---thailand)) |
| Objection | People can object to direct marketing at any time | PDPA |
| Registration | Direct marketing operators must register with the Office of the Consumer Protection Board (OCPB) | Direct Sales and Direct Marketing Act, section 27 ([Formichella & Sritawat](https://www.mondaq.com/advertising-marketing-branding/1372024/e-commerce-law-direct-sales-and-marketing-act-consumer-protection-act-and-personal-data-act-thailand-part-3-of-a-3-part-series)) |
| No disturbance | Marketing calls must not disturb consumers; adverts must not be false or misleading | Consumer Protection Act, section 23 |
| Opt-out from SMS | Subscribers of every network can stop unwanted SMS free of charge by dialling `*137` | NBTC and operators, since March 2014 ([Siamphone](https://www.siamphone.com/contents/news-16229.html)) |

Penalties are significant: under the PDPA, administrative fines of up to THB 5 million, plus criminal penalties and punitive damages; operating direct marketing without registration can bring up to one year in prison or a THB 100,000 fine.

### What that means for OTP

A one-time passcode the user asked for isn't marketing, but it travels on the same routes and is filtered by the same operators. Keep OTP messages free of offers, send them under a stable sender name, and don't reuse numbers collected for verification for marketing without separate consent. A customer who dialled `*137` to stop promotional SMS may also filter more than you expect, so monitor delivery per operator.

### Personal data checks

A registration check on a customer's number is processing of personal data under the PDPA. 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, and [is a phone number personal data?](/blog/is-a-phone-number-personal-data-gdpr) explains why the answer is almost always yes.

## What changed recently?

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

<!-- country-data:TH: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) | 6 |
| Short numbers | 3 |
| Original-carrier prefix data | 2 |
| Alternate formatting | 1 |
| Geocoding (area names) | 1 |
| All | 13 |

Latest numbering-plan updates for `TH`: 2026-04-22 (v9.0.29), 2024-01-24 (v8.13.29), 2021-11-25 (v8.12.38), 2021-09-22 (v8.12.33), 2021-01-12 (v8.12.16).
<!-- country-data:TH:changes:end -->

Thailand's numbering metadata changes less often than Vietnam's or Malaysia's, but the April 2026 update shows it still moves, so keep your library current. Beyond numbering, the changes that matter are the SIM identity rules: the five-SIM verification of 2024, the 2025 amendment of the Emergency Decree and the NBTC notification of May 2026.

## What can MobileValidate check for Thai numbers?

Generated from our public catalog:

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

| Check | Accepts Thailand 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 Thailand 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-19; the live list is at [`GET /v1/services`](https://api.mobilevalidate.com/v1/services).
<!-- country-data:TH:coverage:end -->

A lookup returns network and registration facts. It never returns a subscriber's name, ID card number 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?

- Thai mobiles are `+66` plus nine digits starting 6, 8 or 9, `0XX XXX XXXX` at home; store the E.164 form and strip a stray `0` after `+66`.
- Rewrite `0066` to `+66` before parsing: Thailand has several exit codes (`001`, `006`, `009` …), so a parser set to Thailand misreads `0066`.
- `060` and `068` are VoIP, not mobile; check the number type, not just validity.
- The prefix names the range holder (AIS, True Corporation, NT or an MVNO), not the current network: porting has run since December 2010, with a two-day transfer since 2017.
- SIMs are tied to verified identities, with caps and deadlines added in 2024 and 2026; marketing SMS needs PDPA consent, and subscribers can stop unwanted SMS with `*137`.
- Check LINE, WhatsApp or Telegram 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. [libphonenumber PhoneNumberMetadata.xml (region TH) and carrier prefix data (66.txt)](https://github.com/google/libphonenumber/blob/master/resources/carrier/en/66.txt) — libphonenumber project (Apache License 2.0), 2026
2. [Telephone numbers in Thailand (carrier selection codes, citing the NBTC numbering database)](https://en.wikipedia.org/wiki/Telephone_numbers_in_Thailand) — Wikipedia, 2026
3. [Mobile Number Portability: New Marketing Strategies for Service Differentiation Needed (Business Brief No. 3002, 3 December 2010)](https://www.kasikornresearch.com/en/analysis/k-econ/business/Pages/26168.aspx) — Kasikorn Research Center, 2010
4. [Number portability service approved (17 January 2017)](https://www.nationthailand.com/business/30304311) — The Nation, 2017
5. [NBTC Notification on Criteria for Mobile Number Portability (6 September 2021), Royal Gazette vol. 138, special part 229 Ng (archived copy)](https://web.archive.org/web/20211202151643/http://www.ratchakitcha.soc.go.th/DATA/PDF/2564/E/229/T_0026.PDF) — National Broadcasting and Telecommunications Commission (NBTC) / Royal Gazette, 2021
6. [dtac and True have completed their amalgamation process (1 March 2023)](https://www.true.th/blog/en/dtac-true-amalgamation-complete-2/) — True Corporation, 2023
7. [CAT, TOT merger to be completed by January 7 (14 December 2020, from The Nation)](https://thailand.opendevelopmentmekong.net/news/cat-tot-merger-to-be-completed-by-january-7/) — Open Development Thailand, 2020
8. [Final warning for holders of six to 100 SIM cards to confirm identities by July 13 (11 July 2024)](https://www.pattayamail.com/thailandnews/final-warning-for-holders-of-six-to-100-sim-cards-to-confirm-identities-at-mobile-phone-service-centers-by-july-13-465247) — Pattaya Mail, 2024
9. [Thailand Tightens Telecom Registration, Data, and IP Address Rules to Combat Tech Crime (19 May 2026)](https://www.tilleke.com/insights/thailand-tightens-telecom-registration-data-and-ip-address-rules-to-combat-tech-crime/) — Tilleke & Gibbins, 2026
10. [Emergency Decree on Measures for the Prevention and Suppression of Technological Crimes, B.E. 2566 (2023), unofficial translation](https://mdes.go.th/law/detail/7455-Emergency-Decree-on-Measures-for-the-Prevention-and-Suppression-of-Technological-Crimes--B-E--2566--2023-) — Ministry of Digital Economy and Society of Thailand (translation for the Office of the Council of State), 2023
11. [Thailand Amends Emergency Decree on Technology Crime (18 April 2025)](https://www.tilleke.com/insights/thailand-amends-emergency-decree-on-technology-crime/) — Tilleke & Gibbins, 2025
12. [Thailand: SEC sets new standards against mule accounts (22 August 2025)](https://www.bakermckenzie.com/en/insight/publications/alerts/2025/08/thailand-sec-sets-new-standards-against-mule-accounts) — Baker McKenzie, 2025
13. [Phone lines with '+697' prefix too dangerous to be answered: DES (3 July 2022)](https://www.nationthailand.com/in-focus/40017318) — The Nation, 2022
14. [Scam alert! Do not answer calls that begin with +697, +698, or +66 (27 September 2024)](https://web.archive.org/web/20260202011450/https://thailand.prd.go.th/en/content/category/detail/id/2078/iid/327803) — Government Public Relations Department of Thailand, 2024
15. [กสทช. เปิดช่องทาง *137 ยกเลิก SMS รบกวน (6 March 2014)](https://www.siamphone.com/contents/news-16229.html) — Siamphone, 2014
16. [Data Protected – Thailand (last updated June 2026)](https://www.linklaters.com/insights/data-protected/data-protected---thailand) — Linklaters, 2026
17. [E-Commerce Law (Direct Sales and Marketing Act, Consumer Protection Act and Personal Data Act): Thailand, Part 3](https://www.mondaq.com/advertising-marketing-branding/1372024/e-commerce-law-direct-sales-and-marketing-act-consumer-protection-act-and-personal-data-act-thailand-part-3-of-a-3-part-series) — Formichella & Sritawat (via Mondaq), 2023
18. [LINE Thailand puts 56 million users and 12 billion Official Account conversations behind its 2026 business stack (12 August 2026)](https://www.relevantaudience.com/digital-marketing-en/line-thailand-business-solutions-2026/) — Relevant Audience (reporting LINE Thailand's disclosure via Marketing Oops), 2026

## Frequently asked questions

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

Nine digits after the country code +66, or ten when written nationally with the leading 0: 08X XXX XXXX at home and +66 8X XXX XXXX in E.164. Mobile numbers start 06, 08 or 09. Bangkok landlines are shorter: 02 XXX XXXX nationally, 8 digits after +66.

### What is the Thailand country code for WhatsApp, LINE and international calls?

+66. Drop the leading 0 of the national number: 081 XXX XXXX becomes +66 81 XXX XXXX. Don't keep the 0 after the code (+66 081…), and don't store the number as 0066…: Thailand uses several exit codes (001, 006, 009 and others), so a parser set to Thailand reads 006 as an exit code and rejects the number.

### Why does my validator reject a Thai number written as 0066…?

Because 00 followed by a digit is a Thai international exit code (for example 001 or 009), not a plain 00. libphonenumber with the default region TH reads '0066 81…' as exit code 006 followed by country code 68, so the number fails. Rewrite a leading 0066 to +66 before parsing, as the code in this guide does.

### Can a Thai mobile number keep its digits after changing operator?

Yes. Mobile number portability started on 5 December 2010, at first limited to Bangkok and 100 numbers a day per operator, and became available nationwide in January 2011. Rules that took effect in January 2017 require operators to complete a transfer in two days. Because of porting, the prefix only shows which operator holds the range, not the current network.

### How many SIM cards can one person have in Thailand?

Since January 2024, anyone holding more than five SIM cards with one operator had to confirm their identity or lose outgoing calls and SMS. Under an NBTC notification in force since 16 May 2026, people without Thai nationality may hold at most three SIM cards per operator, must register in person, mainly with a passport, and every user must activate a registered SIM within 60 days.

### Can I check whether Thai customers are on LINE or 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; LINE runs in bulk jobs only, WhatsApp in real time and in bulk, and unknown answers are not billed. It never returns a name or profile, and requests that look like scans of number ranges are refused.
