On this page
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 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 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.
| 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 |
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, 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:
| 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%) |
Three details matter:
080–089and090–099are fully mobile. The09range was opened after08filled up.06is mixed.061–066are mobile,067is only partly allocated, and060and068are VoIP ranges, typedVOIPin 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.014is 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 only06,08and09, 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), 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). 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). 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):
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 tableJavaScript (npm install libphonenumber-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:
| # | 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 |
Rows 3, 8 and 10 are the ones to remember:
- Row 3:
0066passes the regex, but libphonenumber on its own rejects it for the exit-code reason above. Without the rewrite you lose real customers. - Row 8:
010is shaped like a mobile number and passes the regex, but no mobile range starts there, so an OTP sent to it is wasted. - Row 10:
060passes the regex and libphonenumber says it is valid, but asVOIP, notMOBILE. 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 shows the same problem in other countries, and our Python and JavaScript guides cover more languages. For VoIP numbers at sign-up, see VoIP number detection.
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). 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). 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).
The Thailand row of our MNP atlas:
| 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, kasikornresearch.com |
| Checked | 2026-10-19 |
The 2021 notification replaced the 2009 and 2010 rules, which allowed three working days. Our MNP 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 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), Pattaya Mail's report of the NBTC's statements (2024) and Tilleke & Gibbins' summaries of the 2025 amendment (2025) and the 2026 notification (2026). 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). 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 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). 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). +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). 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 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 runs in bulk jobs only; the WhatsApp check and the Telegram 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; the sandbox accepts only those UK drama numbers. With a live key, pass the output of normalize_th():
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 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 with a CSV whose numbers are written nationally and default_country=TH:
curl https://api.mobilevalidate.com/v1/jobs \
-H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
-F file=@customers.csv -F checks=line,whatsapp -F default_country=THTwo 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. 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 forbids finding recipients for unsolicited messages. People can object through our opt-out form. Our consent guide 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) |
| 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) |
| 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) |
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 lists the steps, and is a phone number personal data? explains why the answer is almost always yes.
What changed recently?
The rows for TH and +66 in our numbering-plan changes dataset, built from libphonenumber's release notes:
| 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).
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:
| 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.
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, HLR lookup and carrier lookup for the network fields.
What are the key takeaways?
- Thai mobiles are
+66plus nine digits starting 6, 8 or 9,0XX XXX XXXXat home; store the E.164 form and strip a stray0after+66. - Rewrite
0066to+66before parsing: Thailand has several exit codes (001,006,009…), so a parser set to Thailand misreads0066. 060and068are 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
unknownapart fromfalse, and never treat registration as consent.
Platform, operator, regulator and company names are used descriptively. MobileValidate is not affiliated with any of them.
Sources
- libphonenumber PhoneNumberMetadata.xml (region TH) and carrier prefix data (66.txt) — libphonenumber project (Apache License 2.0), 2026
- Telephone numbers in Thailand (carrier selection codes, citing the NBTC numbering database) — Wikipedia, 2026
- Mobile Number Portability: New Marketing Strategies for Service Differentiation Needed (Business Brief No. 3002, 3 December 2010) — Kasikorn Research Center, 2010
- Number portability service approved (17 January 2017) — The Nation, 2017
- NBTC Notification on Criteria for Mobile Number Portability (6 September 2021), Royal Gazette vol. 138, special part 229 Ng (archived copy) — National Broadcasting and Telecommunications Commission (NBTC) / Royal Gazette, 2021
- dtac and True have completed their amalgamation process (1 March 2023) — True Corporation, 2023
- CAT, TOT merger to be completed by January 7 (14 December 2020, from The Nation) — Open Development Thailand, 2020
- Final warning for holders of six to 100 SIM cards to confirm identities by July 13 (11 July 2024) — Pattaya Mail, 2024
- Thailand Tightens Telecom Registration, Data, and IP Address Rules to Combat Tech Crime (19 May 2026) — Tilleke & Gibbins, 2026
- Emergency Decree on Measures for the Prevention and Suppression of Technological Crimes, B.E. 2566 (2023), unofficial translation — Ministry of Digital Economy and Society of Thailand (translation for the Office of the Council of State), 2023
- Thailand Amends Emergency Decree on Technology Crime (18 April 2025) — Tilleke & Gibbins, 2025
- Thailand: SEC sets new standards against mule accounts (22 August 2025) — Baker McKenzie, 2025
- Phone lines with '+697' prefix too dangerous to be answered: DES (3 July 2022) — The Nation, 2022
- Scam alert! Do not answer calls that begin with +697, +698, or +66 (27 September 2024) — Government Public Relations Department of Thailand, 2024
- กสทช. เปิดช่องทาง *137 ยกเลิก SMS รบกวน (6 March 2014) — Siamphone, 2014
- Data Protected – Thailand (last updated June 2026) — Linklaters, 2026
- E-Commerce Law (Direct Sales and Marketing Act, Consumer Protection Act and Personal Data Act): Thailand, Part 3 — Formichella & Sritawat (via Mondaq), 2023
- LINE Thailand puts 56 million users and 12 billion Official Account conversations behind its 2026 business stack (12 August 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.
Related services and guides
More from the blog
All articlesGuides
Phone numbers by country: formats, portability, channels and rules
How phone numbers differ by country: formats and E.164, numbering changes, portability, line types, messaging channels, and a dated tracker of calling and texting rules.
10 min read
Developers
E.164 phone number format: a practical guide for developers
How to normalize phone numbers to E.164 in JavaScript and Python, the pitfalls that break deduplication, and how the MobileValidate API normalizes input.
8 min read
Research
Mobile number portability by country: a 2026 atlas
Mobile number portability in 68 countries: launch dates, porting times and published volumes, with a source per row, plus why prefix carrier lookups fail.
9 min read

