# 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.

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

![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.](https://mobilevalidate.com/images/blog/pakistan-phone-number-format.svg)

*03 codes show where a range started, not the network today, and 3627 is the do-not-call register.*


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

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](/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. 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`.

<!-- country-data:PK: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 | `+92` |
| International call prefix (dialling out) | `00` |
| Trunk prefix (dialling at home) | `0` |
| Mobile: digits after +92 | 10 |
| Fixed line: digits after +92 | 9, 10 |
| Toll-free: digits after +92 | 8, 11 |
| Premium rate: digits after +92 | 8 |
| Personal number: digits after +92 | 9 |
| Universal access (UAN): digits after +92 | 11, 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` |
<!-- country-data:PK:format:end -->

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…`.

## 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:

<!-- country-data:PK: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 (10-digit numbers) | 3-digit sub-blocks that aren't fully mobile |
|---|---|---|---|
| `030` | `+92 30` | 100% | — |
| `031` | `+92 31` | 100% | — |
| `032` | `+92 32` | 100% | — |
| `033` | `+92 33` | 90.0% | not mobile: 0338 |
| `034` | `+92 34` | 100% | — |
| `035` | `+92 35` | 10.0% | not mobile: 0350–0354, 0356–0359 |
| `036` | `+92 36` | 10.0% | not mobile: 0360–0363, 0365–0369 |
| `037` | `+92 37` | 100% | — |
<!-- country-data:PK:prefixes:end -->

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](https://www.pta.gov.pk/assets/media/mnp_porting_process_guidelines_13022020.pdf)). 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`):

```js
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:

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

| # | Case | Input (masked) | Shape regex `^(?:\+92\|0092\|0)?3\d{9}$` | libphonenumber (`PK`) |
|---|---|---|---|---|
| 1 | National, with trunk prefix | `030X XXXXXXX` | passes | valid, `MOBILE` |
| 2 | International, with spaces | `+92 30X XXXXXXX` | passes | valid, `MOBILE` |
| 3 | International dialling prefix 00 | `0092 30X XXXXXXX` | passes | valid, `MOBILE` |
| 4 | E.164 | `+9230XXXXXXXX` | passes | valid, `MOBILE` |
| 5 | Dashes and brackets | `(030X) XXXXXXX` | passes | valid, `MOBILE` |
| 6 | One digit short | `030XXXXXXX` | fails | invalid |
| 7 | One digit too many | `030XXXXXXXXX` | fails | invalid |
| 8 | Mobile shape, unused block 038 | `038XXXXXXXX` | passes | invalid |
| 9 | Fixed line | `(021) XXXXXXXX` | fails | valid, `FIXED_LINE` |
| 10 | Toll-free range | `0800 XXX XXXXX` | fails | valid, `TOLL_FREE` |
<!-- country-data:PK:tests:end -->

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](/blog/phone-number-validation-python) and [JavaScript](/blog/phone-number-validation-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](https://www.pta.gov.pk/assets/media/mnp_porting_process_guidelines_13022020.pdf)). The Pakistan row of our MNP atlas:

<!-- country-data:PK: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 | not verified |
| Maximum porting time | 4 days (normal porting time) |
| Governing rule | PTA MNP Regulations 2005; MNP Porting Process Guidelines (13 Feb 2020) |
| Published porting volume | none published |
| Source | [pta.gov.pk](https://www.pta.gov.pk/assets/media/mnp_porting_process_guidelines_13022020.pdf) |
| Checked | 2026-09-25 |
<!-- country-data:PK:mnp:end -->

For routing, pricing or fraud rules, look up the current network per number instead of reading the code. Our [MNP atlas](/blog/mobile-number-portability-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](https://developers.facebook.com/docs/whatsapp/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](/blog/whatsapp-otp-vs-sms-otp-cost) 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](/blog/choosing-a-messaging-channel-by-country) 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](https://pta.gov.pk/assets/media/pro-spam-reg-09.pdf)).

The 2nd Amendment Regulations, 2022 (S.R.O. 2402(I)/2022, gazetted 31 December 2022) rewrote the rules for marketing ([PTA, 2022](https://www.pta.gov.pk/assets/media/31-12-22_gazette_notification_protection_spam_regs_2022_2nd_amendment_31_03_2023.pdf)):

- **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](https://www.pta.gov.pk/assets/media/2025-04-29-faqs_numbering.pdf)).

### 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](/datasets/numbering-plan-changes-2019-2026), built from libphonenumber's release notes:

<!-- country-data:PK: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) | 5 |
| Original-carrier prefix data | 3 |
| Geocoding (area names) | 1 |
| Short numbers | 1 |
| All | 10 |

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).
<!-- country-data:PK:changes:end -->

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:

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

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

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](/docs/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.

```python title="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 value | `status` | `network` | `ported` | `whatsapp` | `billed` |
|---|---|---|---|---|---|
| `+447700900001` | `completed` | `Test Carrier` | `False` | `True` | `False` |
| `+447700900002` | `unknown` | `None` | `None` | `False` | `False` |
| `+447700900005` | `unsupported_country` | `None` | `None` | `None` | `False` |

`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:

```bash
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](/services/carrier-lookup) and [WhatsApp number check](/services/whatsapp-number-check) for the fields, and [pricing](/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)](https://pta.gov.pk/assets/media/pro-spam-reg-09.pdf) — 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)](https://www.pta.gov.pk/assets/media/31-12-22_gazette_notification_protection_spam_regs_2022_2nd_amendment_31_03_2023.pdf) — Pakistan Telecommunication Authority, 2022
3. [MNP Porting Process Guidelines v7.9.15 (13 February 2020)](https://www.pta.gov.pk/assets/media/mnp_porting_process_guidelines_13022020.pdf) — Pakistan Telecommunication Authority, 2020
4. [Numbering FAQs: allocation of UAN, toll-free, UIN and SMS short codes (29 April 2025)](https://www.pta.gov.pk/assets/media/2025-04-29-faqs_numbering.pdf) — Pakistan Telecommunication Authority, 2025
5. [WhatsApp Business Platform pricing (market list and rate updates)](https://developers.facebook.com/docs/whatsapp/pricing) — Meta for Developers, 2026
6. [libphonenumber PhoneNumberMetadata.xml (region PK) and release notes](https://github.com/google/libphonenumber/blob/master/resources/PhoneNumberMetadata.xml) — 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.
