Guides

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

Pakistani numbers: the +92 format, which 03XX codes are mobile, tested validation code, porting, PTA's short-code and consent rules, and the 3627 register.

By Published 11 min read

On this page

Pakistani numbers use the country code +92. Mobile numbers have 10 digits after the code and start with 3 (03XX when dialled at home); in E.164 they look like +92 3XX XXXXXXX. Because subscribers can port their number to another operator, the 03XX code doesn't tell you the current network, and marketing texts must go through PTA-approved short codes to people who haven't opted out through the 3627 register.

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. The Pakistan Telecommunication Authority (PTA) site didn't respond to automated requests from our server, so on 2026-09-27 we read its gazette notifications and guidelines through Internet Archive copies captured between May 2025 and May 2026; the scanned gazettes were read page by page. This is a summary, not legal advice.

What does a Pakistani phone number look like?

A mobile number is 03XX XXXXXXX at home: the trunk prefix 0, a three-digit code starting with 3, and seven digits. From abroad it is +92 3XX XXXXXXX. Landlines start with an area code and have 9 or 10 digits after +92.

ItemValue
Country calling code+92
International call prefix (dialling out)00
Trunk prefix (dialling at home)0
Mobile: digits after +9210
Fixed line: digits after +929, 10
Toll-free: digits after +928, 11
Premium rate: digits after +928
Personal number: digits after +929
Universal access (UAN): digits after +9211, 12
Mobile, national format (masked)030X XXXXXXX
Mobile, international (masked)+92 30X XXXXXXX
Mobile, E.164 (masked)+9230XXXXXXXX
Fixed line, national format (masked)(021) XXXXXXXX
Fixed line, international (masked)+92 21 XXXXXXXX
Fixed line, E.164 (masked)+9221XXXXXXXX

Store only the E.164 form. Pakistani forms often collect numbers as 03XX-XXXXXXX or 923XX… without a plus; a numbering-plan library with the default region PK turns all of them into +923….

A +92 chip beside nested contour lines, a grid of 03 network-code blocks with two dimmed, an arc between two towers marked 4 days, and a shield with the number 3627.A +92 chip beside nested contour lines, a grid of 03 network-code blocks with two dimmed, an arc between two towers marked 4 days, and a shield with the number 3627.
03 codes show where a range started, not the network today, and 3627 is the do-not-call register.

Which prefixes are mobile numbers?

All mobile numbers start 03, but not every 03XX code is in use. For each 2-digit block, the generator counted every 10-digit number that libphonenumber's mobile pattern for PK accepts:

National prefixInternationalShare of the block that is mobile (10-digit numbers)3-digit sub-blocks that aren't fully mobile
030+92 30100%—
031+92 31100%—
032+92 32100%—
033+92 3390.0%not mobile: 0338
034+92 34100%—
035+92 3510.0%not mobile: 0350–0354, 0356–0359
036+92 3610.0%not mobile: 0360–0363, 0365–0369
037+92 37100%—

In short: 030 to 032, 034 and 037 are fully in use, 033 except 0338, and only 0355 and 0364 in the 035 and 036 blocks. A number such as 0350 XXXXXXX has the right shape but isn't a mobile number today.

03XX network codes and porting

Pakistanis often call the 03XX code the "network code", because each code was allocated to one operator. PTA's porting guidelines keep that allocation: the operator that was allocated a range stays its number range holder, and porting requests pass through a central number portability clearinghouse (PTA MNP guidelines, 2020). So the code still tells you who holds the range, and nothing more. We don't list operators by code here, because a table like that looks authoritative and is wrong for every ported number.

How do I validate a Pakistani number in code?

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

Python (pip install phonenumbers):

Python
import phonenumbers


def normalize_pk(raw: str) -> str | None:
    """E.164 for a Pakistani mobile (03XX …), or None."""
    try:
        n = phonenumbers.parse(raw, "PK")
    except phonenumbers.NumberParseException:
        return None
    if (not phonenumbers.is_valid_number(n) or phonenumbers.region_code_for_number(n) != "PK"
            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";

/** "03XX XXXXXXX", "+92 3XX …", "923XX…" → E.164 for a Pakistani mobile, or null. */
export function normalizePk(raw) {
  const phone = parsePhoneNumberFromString(String(raw), "PK");
  return phone?.isValid() && phone.country === "PK" && phone.getType() === "MOBILE" ? phone.number : null;
}

We ran both on 2026-09-27 (Python phonenumbers 9.0.40, 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. The shape regex column tests ^(?:\+92|0092|0)?3\d{9}$, the pattern most tutorials give, after spaces, dashes and brackets are removed:

#CaseInput (masked)Shape regex ^(?:\+92|0092|0)?3\d{9}$libphonenumber (PK)
1National, with trunk prefix030X XXXXXXXpassesvalid, MOBILE
2International, with spaces+92 30X XXXXXXXpassesvalid, MOBILE
3International dialling prefix 000092 30X XXXXXXXpassesvalid, MOBILE
4E.164+9230XXXXXXXXpassesvalid, MOBILE
5Dashes and brackets(030X) XXXXXXXpassesvalid, MOBILE
6One digit short030XXXXXXXfailsinvalid
7One digit too many030XXXXXXXXXfailsinvalid
8Mobile shape, unused block 038038XXXXXXXXpassesinvalid
9Fixed line(021) XXXXXXXXfailsvalid, FIXED_LINE
10Toll-free range0800 XXX XXXXXfailsvalid, TOLL_FREE

Row 8 is the one to remember. 038 is shaped like a mobile number and passes the regex, but nothing is allocated there, so an OTP sent to it is wasted. More languages are in our Python and JavaScript guides.

Does number portability change the carrier?

Yes. Pakistan's porting framework rests on PTA's Mobile Number Portability Regulations 2005 and its porting process guidelines. Our atlas records a normal porting time of four days. Under the 2020 guidelines, an inactive ported number stays in quarantine for 180 days and, if it is still unused, goes back to the range holder within 30 days. The guidelines also refer to PTA's procedure of 20 November 2013 for selling and activating SIMs through biometric verification (PTA MNP guidelines). The Pakistan row of our MNP atlas:

ItemValue
Mobile number portabilityYes
Mobile porting sincenot verified
Maximum porting time4 days (normal porting time)
Governing rulePTA MNP Regulations 2005; MNP Porting Process Guidelines (13 Feb 2020)
Published porting volumenone published
Sourcepta.gov.pk
Checked2026-09-25

For routing, pricing or fraud rules, look up the current network per number instead of reading the code. Our MNP atlas compares Pakistan with 67 other countries.

Which messaging apps and channels reach people?

SMS reaches every active mobile. For WhatsApp, Meta prices Pakistan as its own market, and its pricing page lists rate changes specific to Pakistan: lower authentication rates from 1 February 2025, lower authentication-international rates from 1 April 2025, and higher utility and authentication rates, with no change to the authentication-international rate, from 1 April 2026 (Meta pricing, read on 2026-09-27). Per Meta's rules, the authentication-international rate applies when an eligible business based in another country sends authentication messages to users with that country's calling code; eligibility depends on volume. For OTPs sent from abroad at scale, it can matter more than the local rate. Our WhatsApp OTP vs SMS OTP post shows how to compare cost per verified user.

We didn't find a published source that measures app use in Pakistan in a way we can verify, so we don't quote shares. Check which apps your own opted-in customers are registered on, route from that, and keep SMS as the fallback. Our channel-by-country guide shows the method.

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

These summarise PTA's gazette notifications as we read them on 2026-09-27. Not legal advice; ask counsel how they apply to you.

PTA's anti-spam regulations (2009, amended 2022)

The Protection from Spam, Unsolicited, Fraudulent and Obnoxious Communication Regulations, 2009 (S.R.O. 713(I)/2009) apply to all licensed operators. They required operators to run anti-spam filtering, keep lists of subscribers disconnected for fraudulent messages, and set up a do-not-call register (PTA, 2009).

The 2nd Amendment Regulations, 2022 (S.R.O. 2402(I)/2022, gazetted 31 December 2022) rewrote the rules for marketing (PTA, 2022):

  • Central register. Operators run a central Do Not Call / SMS Register (C-DNCR). Subscribers join or leave it through the short code 3627, and it covers promotional and telemarketing SMS (A2P) as well as calls.
  • Authorised telemarketers. A telemarketer is a person or company authorised by PTA to send marketing messages or calls, directly or through a third party. Operators must ensure telemarketers are registered.
  • Consent first. Telemarketers, through their SMS aggregator (the short-code holder), must ask each subscriber for consent by message in English and Urdu before sending marketing, and keep the record of that consent.
  • Approved senders only. All marketing messages go out through approved short codes, or alphanumeric IDs set against short codes, under an agreement with the aggregator or operator.
  • Unsubscribe and timing. Anyone who opted in must be able to unsubscribe, and operators must ensure such messages arrive within normal business hours.
  • Robocalls are allowed only for public-awareness messages required by PTA or the Government of Pakistan.

The amendment also defines "spamming" by reference to section 25 of the Prevention of Electronic Crimes Act, 2016. And PTA's numbering FAQ says an SMS short code for content-based services requires a CVAS registration certificate first (PTA numbering FAQ).

What that means for OTP

A one-time passcode the user asked for isn't marketing, but it travels on the same routes. Send it from a sender your provider has registered for transactional traffic, keep it free of offers, and don't reuse numbers collected for verification for marketing unless the person opted in.

What changed recently?

The rows for PK and +92 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)5
Original-carrier prefix data3
Geocoding (area names)1
Short numbers1
All10

Latest numbering-plan updates for PK: 2023-11-21 (v8.13.26), 2023-07-19 (v8.13.17), 2022-01-27 (v8.12.42), 2020-10-29 (v8.12.12), 2020-03-02 (v8.11.5).

The last metadata update for PK was in November 2023, so a library updated since then knows today's 03XX ranges. The rules that changed most recently are the 2022 anti-spam amendment above and the WhatsApp rate changes listed on Meta's pricing page.

What can MobileValidate check for Pakistani numbers?

Generated from our public catalog:

CheckAccepts Pakistan 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 Pakistan 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-09-27; the live list is at GET /v1/services.

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

Here is a practical flow for routing and fraud rules: normalise with normalize_pk(), then one lookup gives the current network, a porting hint and WhatsApp registration. 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_pk(). We ran it on 2026-09-27 with Python 3.12 and requests 2.31.

pk_network.py
import os

import requests  # pip install requests

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


def current_network(numbers: list[str]) -> dict[str, dict]:
    """Current network per number. The 03XX code only shows where the range was first allocated."""
    r = requests.post(API, headers={"Authorization": f"Bearer {KEY}"}, timeout=15,
                      json={"numbers": numbers, "checks": ["carrier", "whatsapp"], "wait": 5})
    r.raise_for_status()
    out = {}
    for row in r.json()["results"]:
        carrier, wa = row["checks"]["network.carrier"], row["checks"]["whatsapp.registered"]
        attrs = carrier["attributes"] or {}
        out[row["e164"]] = {
            "status": carrier["status"],  # completed, unknown or unsupported_country
            "network": attrs.get("carrier"),
            "ported": ("original_carrier" in attrs) if attrs else None,  # None = we don't know
            "whatsapp": wa["registered"] if wa["status"] == "completed" else None,
            "billed": carrier["billed"] or wa["billed"],
        }
    return out


for number, info in current_network(["+447700900001", "+447700900002", "+447700900005"]).items():
    print(number, info)
Test valuestatusnetworkportedwhatsappbilled
+447700900001completedTest CarrierFalseTrueFalse
+447700900002unknownNoneNoneFalseFalse
+447700900005unsupported_countryNoneNoneNoneFalse

original_carrier is only present when the range holder and the current network differ, which is why its presence is a porting hint. Test mode never bills; in live mode, unknown and unsupported answers aren't billed either. The same call with curl:

Shell
curl https://api.mobilevalidate.com/v1/lookup \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"numbers": ["+447700900001"], "checks": ["carrier", "whatsapp"], "wait": 5}'

See carrier lookup and WhatsApp number check for the fields, and pricing for prices.

What are the key takeaways?

  • Pakistani mobiles are +92 3 plus nine digits, 03XX XXXXXXX at home; store the E.164 form.
  • Not every 03XX code is live: 0338, most of 035 and 036, and 038 aren't mobile ranges today.
  • The 03XX code shows the range holder, not the current network. Look it up when the operator matters.
  • Marketing SMS must go through PTA-approved short codes, with consent in English and Urdu and an unsubscribe option; subscribers opt out through 3627.
  • 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. Protection from Spam, Unsolicited, Fraudulent and Obnoxious Communication Regulations, 2009 (S.R.O. 713(I)/2009, Gazette of Pakistan, 5 August 2009) — Pakistan Telecommunication Authority, 2009
  2. Protection from Spam, Unsolicited, Fraudulent and Obnoxious Communication (2nd Amendment) Regulations, 2022 (S.R.O. 2402(I)/2022, Gazette of Pakistan, 31 December 2022) — Pakistan Telecommunication Authority, 2022
  3. MNP Porting Process Guidelines v7.9.15 (13 February 2020) — Pakistan Telecommunication Authority, 2020
  4. Numbering FAQs: allocation of UAN, toll-free, UIN and SMS short codes (29 April 2025) — Pakistan Telecommunication Authority, 2025
  5. WhatsApp Business Platform pricing (market list and rate updates) — Meta for Developers, 2026
  6. libphonenumber PhoneNumberMetadata.xml (region PK) and release notes — libphonenumber project (Apache License 2.0), 2026

Frequently asked questions

How many digits is a Pakistani mobile number?

Ten digits after the country code +92, or eleven when written nationally with the leading 0. Every mobile number is 03XX followed by seven digits at home, and +92 3XX followed by seven digits in E.164.

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

+92. Drop the leading 0: 03XX XXXXXXX becomes +92 3XX XXXXXXX. Store that E.164 form and use it for every platform.

Does the 03XX code tell me the mobile network?

It tells you which operator the number range was first allocated to. PTA's porting rules let subscribers move to another operator and keep the number, so the code can be wrong about the network that serves the number today.

Can I find out who owns a Pakistani mobile number online?

Not from us, and not from any lawful lookup service. Subscriber details are held by the operators. A MobileValidate lookup returns network and registration facts, never a name, an ID number or an address.

How do people in Pakistan stop marketing texts?

By registering on the operators' central do-not-call register through the short code 3627, set by PTA's 2022 amendment to its anti-spam regulations. Marketers must send through approved short codes and offer an unsubscribe option.

All articles

Know before you send.

Get a free test key in a minute. Live access is approved automatically, usually within 10–15 minutes.