# Polish phone number format: +48, mobile prefixes, validation and messaging rules

> Polish phone number format: +48 plus 9 digits, no trunk 0, 13 mobile prefixes, tested validation code, 1-day porting, anti-spoofing law and SMS consent.

Canonical: https://mobilevalidate.com/blog/poland-phone-number-format · Last updated: 2026-11-07

![A round hub shows +48, nine digit dots in three groups and a crossed-out 0, linked to four cards: a grid of lit mobile blocks, a CLI shield, an 8080 SMS report and a 1 DAY porting swap.](https://mobilevalidate.com/images/blog/poland-phone-number-format.svg)

*Polish numbers are nine digits with no trunk 0; 13 mobile blocks, anti-spoofing rules, 8080 smishing reports and 1-day porting.*


By MobileValidate team (https://mobilevalidate.com/about) · Published: 2026-11-07 · Category: Guides · Tags: Poland, Phone validation, E.164, MNP, SMS, WhatsApp, Compliance

Polish phone numbers use the country code +48 and always have nine digits, with no trunk 0. A mobile number starts with one of 13 two-digit prefixes (45, 50, 51, 53, 57, 60, 66, 69, 72, 73, 78, 79 or 88), so `512 XXX XXX` in Poland is `+48 512 XXX XXX` from abroad (E.164: `+48512XXXXXX`). Landlines start with a two-digit area code such as `22` for Warsaw, written `22 XXX XX XX`. The prefix shows which operator received the block, but numbers are portable, so it doesn't prove the current network.

This guide is part of our [phone numbers by country](/blog/phone-numbers-by-country) series. The tables come from libphonenumber's metadata, the national numbering plan of December 2024, the allocation tables published by UKE (Urząd Komunikacji Elektronicznej, the Office of Electronic Communications), our [MNP atlas](/datasets/mnp-atlas-2026) and our public catalog. Example numbers are masked with X or are libphonenumber's own example numbers; the Polish plan reserves no range for fiction. We read the laws in the Sejm's legal database, UKE's tables and the guidance of CERT Polska and UODO on 2026-11-07; most are in Polish only. This is a summary, not legal advice.

## What does a Polish phone number look like?

Every ordinary Polish number has nine digits, and you dial all nine everywhere in the country. The plan sets the country code 48 and the international prefix 00, with `+` allowed from mobiles, and it defines no trunk prefix ([numbering plan, Dz.U. 2024 poz. 1862](https://api.sejm.gov.pl/eli/acts/DU/2024/1862/text.html), annex § 3). Mobiles are usually written in three groups of three (`512 345 678`), landlines as area code plus seven digits (`22 123 45 67`). The first two digits tell you the kind of number:

| First digits | International | Type |
|---|---|---|
| `12` … `95` (two-digit area codes) | `+48 12` … `+48 95` | Landline, for example `12` Kraków, `22` Warsaw, `32` Katowice, `42` Łódź, `58` Gdańsk, `61` Poznań, `71` Wrocław, `81` Lublin, `91` Szczecin |
| `45`, `50`, `51`, `53`, `57`, `60`, `66`, `69`, `72`, `73`, `78`, `79`, `88` | `+48 45` … `+48 88` | Mobile |
| `39` | `+48 39` | Services using Internet Protocol (VoIP) |
| `64` | `+48 64` | Radio paging |
| `21` | `+48 21` | Machine-to-machine (M2M) |
| `70`, `80` | `+48 70`, `+48 80` | Intelligent-network services: freephone, shared cost, premium rate |
| `26`, `47` | `+48 26`, `+48 47` | Networks of the defence and interior ministries |

From abroad, put `+48` or `0048` in front of the nine digits and change nothing else.

<!-- country-data:PL:format:start -->
<!-- generated by apps/web/scripts/gen-country-guide-data.mjs (libphonenumber metadata 9.0.41 via libphonenumber-js 1.13.15); edit the script, not this table -->

| Item | Value |
|---|---|
| Country calling code | `+48` |
| International call prefix (dialling out) | `00` |
| Trunk prefix (dialling at home) | none |
| Mobile: digits after +48 | 9 |
| Fixed line: digits after +48 | 7, 9 |
| Toll-free: digits after +48 | 9, 10 |
| Premium rate: digits after +48 | 9 |
| Shared cost: digits after +48 | 9 |
| VoIP: digits after +48 | 9 |
| Pager: digits after +48 | 6–9 |
| Universal access (UAN): digits after +48 | 9 |
| Mobile, national format (masked) | `51X XXX XXX` |
| Mobile, international (masked) | `+48 51X XXX XXX` |
| Mobile, E.164 (masked) | `+4851XXXXXXX` |
| Fixed line, national format (masked) | `12 XXX XX XX` |
| Fixed line, international (masked) | `+48 12 XXX XX XX` |
| Fixed line, E.164 (masked) | `+4812XXXXXXX` |
<!-- country-data:PL:format:end -->

"Trunk prefix: none" is the key fact. Many forms ask people to "drop the leading 0", and some users add one out of habit from other countries. In Poland a `0` in front makes the number ten digits long, and validation must fail. The other lengths in the table are special cases in libphonenumber: some short fixed-line and paging numbers and ten-digit freephone numbers. Every mobile has exactly nine digits.

## Which prefixes are mobile numbers?

The numbering plan lists 13 mobile ranges under "sieci ruchome" (mobile networks): `45`, `50`, `51`, `53`, `57`, `60`, `66`, `69`, `72`, `73`, `78`, `79` and `88`. UKE's mobile allocation table confirms that `45` and `57` are in use too, with blocks held by Orange, Play (P4), Canal+ and several virtual operators ([UKE numbering tables](https://numeracja.uke.gov.pl/pl)). For each two-digit block, the generator counted every nine-digit number that libphonenumber's mobile pattern for `PL` accepts:

<!-- country-data:PL:prefixes:start -->
<!-- generated by apps/web/scripts/gen-country-guide-data.mjs (exact count over the mobile pattern, libphonenumber metadata 9.0.41); 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 |
|---|---|---|---|
| `21` | `+48 21` | 24.0% | not mobile: 210, 214–219; partly mobile: 211 (50.0%), 213 (90.0%) |
| `45` | `+48 45` | 100% | — |
| `50` | `+48 50` | 100% | — |
| `51` | `+48 51` | 100% | — |
| `53` | `+48 53` | 100% | — |
| `57` | `+48 57` | 100% | — |
| `60` | `+48 60` | 100% | — |
| `66` | `+48 66` | 100% | — |
| `69` | `+48 69` | 100% | — |
| `72` | `+48 72` | 100% | — |
| `73` | `+48 73` | 100% | — |
| `78` | `+48 78` | 100% | — |
| `79` | `+48 79` | 100% | — |
| `88` | `+48 88` | 100% | — |
<!-- country-data:PL:prefixes:end -->

The `21` row is a library quirk, not a new mobile range. The plan defines `21` as the range for M2M communication (§ 10), and UKE's M2M table shows `210` to `219` allocated as M2M blocks to the mobile operators and, since March 2026, also to a gas distribution company and a power utility's IT arm (blocks in `211` and `216`). That is around the time libphonenumber typed parts of `21` as mobile (versions 9.0.24 and 9.0.26). Those are meters and devices, not people, so the code below drops them.

### Which operator holds a mobile block?

Poland has four mobile networks: Orange Polska, Play (P4), Plus (Polkomtel) and T-Mobile Polska, plus virtual operators on their networks. UKE allocates blocks of numbers to each one and publishes the allocation tables with a CSV export ([UKE numbering tables](https://numeracja.uke.gov.pl/pl)). The tables answer the question "who received this block", but they don't follow porting and there is no per-number lookup.

### What are 70x and 80x numbers?

They are intelligent-network numbers. UKE's table of these ranges gives the details:

| Range | Use |
|---|---|
| `800` | Freephone |
| `801` | Shared cost (split charge) |
| `804` | Universal number (UAN) |
| `806` | Virtual private networks |
| `808` | Virtual calling cards |
| `700`, `701`, `703`, `708` | Premium rate |
| `704` | Pay-per-call |
| `707` | Televoting |

Short numbers sit outside the nine-digit plan: `112` for emergencies, `997`, `998` and `999` for police, fire and ambulance, `116xxx` harmonised European services, `118xyz` directory enquiries and five-digit `19xyz` numbers such as `19115`. None of them should be accepted as a personal sign-up number.

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

Use a libphonenumber port with full metadata and the default region `PL`, keep only numbers typed as mobile, and drop the `21` M2M range.

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

```python
import phonenumbers
from phonenumbers import PhoneNumberType


def normalize_pl(raw: str) -> str | None:
    """E.164 for a Polish mobile number, or None. Poland has no trunk 0; M2M range 21 is dropped."""
    try:
        n = phonenumbers.parse(raw, "PL")
    except phonenumbers.NumberParseException:
        return None
    if (not phonenumbers.is_valid_number(n) or phonenumbers.region_code_for_number(n) != "PL"
            or phonenumbers.number_type(n) != PhoneNumberType.MOBILE
            or phonenumbers.national_significant_number(n).startswith("21")):
        return None
    return phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)


for raw in ["512 345 678", "512-345-678", "+48 512 345 678", "0048 512 345 678",
            "0512 345 678", "641 234 567", "12 345 67 89", "391 234 567"]:
    print(f"{raw!r:22} -> {normalize_pl(raw)}")
```

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

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

/** "512 …", "+48 …", "0048 …" → E.164 for a Polish mobile number, or null.
 *  Numbers in the M2M range 21 are dropped. */
export function normalizePl(raw) {
  const phone = parsePhoneNumberFromString(String(raw), "PL");
  return phone?.isValid() && phone.country === "PL" && phone.getType() === "MOBILE"
    && !phone.nationalNumber.startsWith("21") ? phone.number : null;
}

for (const raw of ["512 345 678", "512-345-678", "+48 512 345 678", "0048 512 345 678",
                   "0512 345 678", "641 234 567", "12 345 67 89", "391 234 567"]) {
  console.log(JSON.stringify(raw).padEnd(22), "->", normalizePl(raw));
}
```

We ran both on 2026-11-07 (Python 3.12 with phonenumbers 9.0.40, Node.js 24 with libphonenumber-js 1.13.13). Every input is one of libphonenumber's example numbers for `PL` (mobile, pager, fixed line and VoIP), written in different ways. Both printed the same results; Python prints single quotes and `None`, JavaScript double quotes and `null`:

```text
'512 345 678'          -> +48512345678
'512-345-678'          -> +48512345678
'+48 512 345 678'      -> +48512345678
'0048 512 345 678'     -> +48512345678
'0512 345 678'         -> None
'641 234 567'          -> None
'12 345 67 89'         -> None
'391 234 567'          -> None
```

The fifth input is the Polish trap: the same mobile with a habitual `0` in front is ten digits and rejected, which is correct, because Poland has no trunk prefix. If many of your users type it, strip a single leading `0` from ten-digit inputs before parsing, and log how often you do it. The pager (`64`), the Kraków landline and the VoIP number (`39`) are valid but not mobile, so they are dropped.

The generated test table runs the same idea over masked inputs. The shape regex column tests the pattern most tutorials give, after spaces, dots, dashes and brackets are removed:

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

| # | Case | Input (masked) | Shape regex `^(?:\+48\|0048)?[24-8]\d{8}$` | libphonenumber (`PL`) |
|---|---|---|---|---|
| 1 | National (no trunk prefix) | `51X XXX XXX` | passes | valid, `MOBILE` |
| 2 | International, with spaces | `+48 51X XXX XXX` | passes | valid, `MOBILE` |
| 3 | International dialling prefix 00 | `0048 51X XXX XXX` | passes | valid, `MOBILE` |
| 4 | E.164 | `+4851XXXXXXX` | passes | valid, `MOBILE` |
| 5 | Dashes and brackets | `(51X) XXX-XXX` | passes | valid, `MOBILE` |
| 6 | One digit short | `51XXXXXX` | fails | invalid |
| 7 | One digit too many | `51XXXXXXXX` | fails | invalid |
| 8 | Mobile shape, unused block 20 | `20XXXXXXX` | passes | invalid |
| 9 | Fixed line | `12 XXX XX XX` | fails | valid, `FIXED_LINE` |
| 10 | Pager range | `64X XXX XXX` | passes | valid, `PAGER` |
<!-- country-data:PL:tests:end -->

The regex accepts any nine digits starting 2 or 4 to 8, so it passes the unused `20` range (row 8) and the `64` paging range (row 10), and it also passes landlines such as `22` and `58` numbers. A list of the 13 mobile prefixes is better, `^(?:\+48|0048)?(?:45|5[0137]|6[069]|7[2389]|88)\d{7}$`, but it goes stale whenever UKE opens a range; parse with a maintained library instead. Our [E.164 developer guide](/blog/e164-phone-number-format-guide-for-developers) and the post on [why an E.164 regex is not enough](/blog/e164-regex-is-not-enough) cover the general problem.

### Which numbers can I use in tests and examples?

The Polish numbering plan has no block reserved for films or examples. Use libphonenumber's example numbers (`512 345 678` for a mobile, `12 345 67 89` for a landline) in parser unit tests, mask the rest with X, and never use a real customer's number. For lookups, a sandbox or test key is the safe way to test.

## Does number portability change the carrier?

Yes. Polish subscribers keep their number when they change operator. The rules are in the Electronic Communications Law (Prawo komunikacji elektronicznej, PKE) of 12 July 2024, in force since 10 November 2024 ([PKE, Dz.U. 2024 poz. 1221](https://api.sejm.gov.pl/eli/acts/DU/2024/1221/text.html)):

- **One working day.** The number must be ported no later than one working day after the start date agreed with the new provider (art. 325(6)).
- **Within the same kind of network.** A geographic number can be ported within its area, a non-geographic number anywhere in Poland, but not between fixed and mobile networks (art. 325(1) and (3)).
- **After the contract ends.** The subscriber keeps the right for one month after the contract ends (art. 325(2)).
- **Compensation.** For each day of delay, the subscriber is owed a quarter of the average monthly charges, or of the average prepaid top-ups (art. 326).
- **Central database.** The President of UKE runs the system used for porting and for locating emergency callers, PLI CBD (art. 337(3)). UKE announced a central database of ported numbers in January 2007 ([UKE archive](https://archiwum.uke.gov.pl/aktualnosci/biezace-informacje/komunikaty/baza-danych-przeniesionych-numerow,701.html)).

Porting is common. In the third quarter of 2026, 425,608 mobile numbers and 55,364 fixed numbers were ported. T-Mobile (+26,541) and Orange (+8,637) gained the most numbers on balance, while Plus (−50,935) and Play (−10,782) lost numbers ([UKE, 7 October 2026](https://www.uke.gov.pl/akt/statystyki-przenoszenia-numerow-w-iii-kwartale-2026-roku,695.html)). The Poland row of our MNP atlas:

<!-- country-data:PL: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 | 2006 |
| Maximum porting time | 1 working day (activation after agreed date) |
| Governing rule | Prawo komunikacji elektronicznej art. 325(6), Dz.U. 2024 poz. 1221 |
| Published porting volume | quarterly (Q3 2026): 425,608 mobile numbers ported (2026) |
| Source | [eur-lex.europa.eu](https://eur-lex.europa.eu/eli/dir/2018/1972/oj), [uke.gov.pl](https://www.uke.gov.pl/akt/statystyki-przenoszenia-numerow-w-iii-kwartale-2026-roku,695.html) |
| Checked | 2026-11-07 |
<!-- country-data:PL:mnp:end -->

The atlas cites the European Electronic Communications Code (Art. 106), which the PKE implements; the Polish rule is article 325 PKE. It gives 2006 as the launch year; we didn't find a primary source with the exact date. Our [MNP atlas](/blog/mobile-number-portability-atlas) compares Poland with other countries. With more than 1.5 million mobile ports a year at the current rate, a prefix-to-operator table is a poor guess for SMS routing, pricing or fraud rules: look up the current network per number.

## What are the rules for SMS, calls and caller ID?

These summarise the laws and guidance as we read them on 2026-11-07. Not legal advice; ask counsel how they apply to you.

### The Act on combating abuse in electronic communications (2023)

The Act of 28 July 2023 on combating abuse in electronic communications (ustawa o zwalczaniu nadużyć w komunikacji elektronicznej) came into force on 25 September 2023 ([Dz.U. 2023 poz. 1703](https://isap.sejm.gov.pl/isap.nsf/DocDetails.xsp?id=WDU20230001703); consolidated text [Dz.U. 2024 poz. 1803](https://api.sejm.gov.pl/eli/acts/DU/2024/1803/text.html)). It defines **smishing** (an SMS in which the sender pretends to be someone else to get the recipient to share data, pay, open a website, call or install software) and **CLI spoofing** (using another person's or organisation's number as caller ID without the right to do so) in article 3, and gives operators duties against both:

- **Report suspicious SMS to 8080.** CSIRT NASK, the national security incident team, receives reports at the short number `8080`, and operators must make it free (art. 5).
- **Pattern-based SMS blocking.** CSIRT NASK sends operators patterns of smishing messages, and operators must block matching SMS promptly (arts. 4 and 6). The information-exchange system started in January 2024, and operators had to block matching messages from 25 March 2024 ([Ministry of Digital Affairs, 16 January 2024](https://www.gov.pl/web/cyfryzacja/wystartowal-system-wymiany-informacji-o-smishingu)). A sender whose messages are blocked can object to the President of UKE (arts. 7 and 8).
- **Spoofed calls are blocked.** To prevent CLI spoofing, an operator blocks the voice call or hides the caller's number from the person called (art. 16).
- **Receive-only numbers.** The President of UKE keeps a public list of numbers used only to receive calls, on application by banks, credit unions, insurers, public bodies and others (art. 17). A call that shows one of those numbers as caller ID is a sign of spoofing.
- **Warning list of websites.** CSIRT NASK keeps a list of misleading domains used for fraud (arts. 20 to 22). CERT Polska has run this warning list with the mobile operators since March 2020 ([CERT Polska](https://cert.pl/lista-ostrzezen/)).

### Protected SMS sender names (public bodies)

An alphanumeric SMS sender name is a "nadpis" in the Act. CSIRT NASK keeps a **list of sender names reserved for public bodies** (wykaz nadpisów podmiotów publicznych), including variants that could mislead recipients (art. 10). Operators block an SMS that uses a listed name but wasn't sent by an SMS integrator on UKE's list of integrators for public bodies, and any SMS using a listed variant (arts. 13 and 14). Only public bodies may use sender names ending in `#RP` (art. 12). A business whose own name or trademark clashes with a listed name can ask the President of UKE to remove it (art. 11). Public bodies reserve their names through [CERT Polska's form](https://incydent.cert.pl/nadpis).

The list covers public bodies only. There is no general register of company sender names in the Act, so a bank or shop protects its sender name through its SMS provider. If your alphanumeric sender resembles an authority's name, expect it to be blocked.

### Marketing calls, SMS and messaging apps need consent (PKE art. 398)

Article 398(1) of the PKE bans the use of automated calling systems and telecom terminal equipment, "in particular" through interpersonal communication services such as messaging apps, to send commercial information, including direct marketing, to a subscriber or end user who has not consented beforehand ([PKE](https://api.sejm.gov.pl/eli/acts/DU/2024/1221/text.html)):

- **Calls, SMS and apps alike.** A sales call from a person on a phone uses terminal equipment, so it needs prior consent too, like an SMS or a WhatsApp message.
- **No business exception.** The rule protects every subscriber and end user, not only consumers, so B2B campaigns need consent as well.
- **Not at the recipient's cost** (art. 398(3)), and a breach is an act of unfair competition (art. 398(4)).
- **GDPR-style consent.** Consent follows the data-protection rules: freely given, specific, informed and unambiguous (art. 400; [GDPR](https://eur-lex.europa.eu/eli/reg/2016/679/oj) Art. 4(11)).

The PKE replaced the older rule for e-mail: the act that introduced it repealed article 10 of the Act on providing services by electronic means ([Dz.U. 2024 poz. 1222](https://api.sejm.gov.pl/eli/acts/DU/2024/1222/text.html), art. 26), so marketing e-mail now falls under article 398 as well. UODO, the Polish data protection authority, reminds businesses that telephone marketing, unlike direct marketing in general, needs prior consent under telecoms law, whatever GDPR basis they rely on for the data ([UODO, 6 July 2026](https://uodo.gov.pl/pl/701/4467)).

### Prepaid SIM cards are registered

Since the anti-terrorism act of 10 June 2016, prepaid users must give their identity data, and existing prepaid cards that were not registered by 1 February 2017 stopped working ([Dz.U. 2016 poz. 904](https://api.sejm.gov.pl/eli/acts/DU/2016/904/text.html)). The PKE keeps the rule (art. 296): a provider records the user's name and PESEL or ID document (company registration numbers for businesses) and may start the service only after verifying them, in person or electronically. Before it issues a duplicate SIM or eSIM, the provider must check the PESEL reservation register and refuse if the number is reserved (art. 297), a guard against SIM-swap fraud.

### Personal data (GDPR)

A phone number linked to a person is personal data under the GDPR. Checking a customer's number, for reachability or WhatsApp registration, needs a lawful basis under Art. 6, such as a contract or a legitimate interest you have weighed, and people can object to direct marketing at any time under Art. 21. Our posts on [whether a phone number is personal data](/blog/is-a-phone-number-personal-data-gdpr) and on [consent for WhatsApp checks](/blog/whatsapp-number-checks-consent-and-law) give the baseline: your own customers, a stated purpose, minimal data and honoured objections.

## Which messaging apps and channels reach people?

SMS reaches every active Polish mobile. We didn't find a primary source that measures messaging-app use in Poland in a way we can verify for this guide, so we don't quote shares. Measure your own opted-in customers instead: check which apps they are registered on, route each person to the channel they use, and keep SMS as the fallback.

### How do I check WhatsApp registration for a Polish customer list?

Normalise every row first, then run one check per number. 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 a WhatsApp account at `checked_at` | Offer WhatsApp to customers who opted in to it |
| `registered: false` | No account at `checked_at` | Use SMS or another channel |
| `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 |

For lists, use a [bulk job](/docs/bulk-jobs). Upload a CSV with numbers written the Polish way (`512 345 678`, `512-345-678` and `+48 …` all work) and `default_country=PL`:

```bash title="Bulk WhatsApp and line-type check for a customer CSV"
curl https://api.mobilevalidate.com/v1/jobs \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -F file=@customers.csv -F checks=whatsapp,carrier -F default_country=PL
```

Send the same body to `POST /v1/jobs/estimate` first: it is free and shows the maximum cost before anything runs. Rows with a leading `0` fail validation as `invalid_number` and are not billed; clean them at the source.

## What changed recently?

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

<!-- country-data:PL: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 |
|---|---:|
| Original-carrier prefix data | 13 |
| Numbering-plan metadata (validation, lengths, types) | 12 |
| Geocoding (area names) | 1 |
| All | 26 |

Latest numbering-plan updates for `PL`: 2026-03-12 (v9.0.26), 2026-02-12 (v9.0.24), 2025-01-29 (v8.13.54), 2024-11-13 (v8.13.50), 2024-02-07 (v8.13.30).
<!-- country-data:PL:changes:end -->

Poland's metadata changes often, mostly as UKE allocates new blocks; the February and March 2026 releases are the ones that typed parts of the `21` M2M range as mobile. The rule changes:

| Date | Change |
|---|---|
| 2 July 2016 | Anti-terrorism act: prepaid SIM registration (unregistered cards cut off after 1 February 2017) |
| 25 September 2023 | Act on combating abuse in electronic communications in force: smishing, CLI spoofing, 8080 |
| 25 March 2024 | Operators must block SMS that match CSIRT NASK's smishing patterns |
| 10 November 2024 | Electronic Communications Law (PKE) in force: porting (art. 325), marketing consent (art. 398), SIM identification (art. 296) |
| 1 January 2025 | New national numbering plan (Dz.U. 2024 poz. 1862); some M2M provisions apply from 2029 |
| March 2026 | New M2M blocks in `21` assigned; libphonenumber types parts of `21` as mobile |

## What can MobileValidate check for Polish numbers?

Generated from our public catalog:

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

Catalog data as of 2026-11-07.

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

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

How to start without paying:

- **Free test key.** [Get a test key](/get-test-key): it never touches a real network and returns fixed answers for reserved test numbers, so you can build every branch first ([test mode](/docs/test-mode)).
- **Free real checks.** Every account can run 20 phone numbers and 10 e-mail addresses through the real-time checks for free on the dashboard's Try it page.
- **Free carrier lookup.** The public [carrier lookup](/services/carrier-lookup) page answers three numbers a day without sign-up.
- **Free estimate.** `POST /v1/jobs/estimate` shows the maximum cost of a bulk file before anything runs.

To get a live account, [request access](/request-access). Viber and Zalo checks are bulk-only for now, as the asterisks in the table show. Prices are on the [pricing](/pricing) page, which also lists the bonus on larger top-ups.

A common use is choosing the channel for a one-time code: an SMS to a landline or an M2M SIM is wasted. A [carrier lookup](/services/carrier-lookup) gives the line type and current network; an [MNP lookup](/services/mnp-lookup) gives ported or not ported. Here is a small flow that picks SMS for mobiles and voice for other lines. It uses the public sandbox key `mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym` and our [test values](/docs/test-values). The sandbox accepts only those UK drama numbers, so the example uses them. With a live key, pass the output of `normalize_pl()`.

```python title="pl_otp.py"
import os

import requests  # pip install requests

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


def otp_channel(numbers: list[str]) -> dict[str, str]:
    """Pick an OTP channel per number: SMS to mobiles, voice otherwise, 'review' when we don't know."""
    r = requests.post(API, headers={"Authorization": f"Bearer {KEY}"}, timeout=15,
                      json={"numbers": numbers, "checks": ["carrier"], "wait": 5})
    r.raise_for_status()
    out = {}
    for row in r.json()["results"]:
        carrier = row["checks"]["network.carrier"]
        if carrier["status"] != "completed":
            out[row["e164"]] = f"review ({carrier['status']}, {carrier['reason']})"
            continue
        line = carrier["attributes"]["line_type"]
        out[row["e164"]] = "sms" if line == "mobile" else "voice"
    return out


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

What it printed with the sandbox key on 2026-11-07:

```text
+447700900001 sms
+447700900002 review (unknown, NO_DATA)
+447700900005 review (unsupported_country, UNSUPPORTED_COUNTRY)
```

The second and third test values have no conclusive answer, so the flow sends them for review instead of guessing; neither is billed. Keep "unknown" apart from "not mobile". 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 post on [checks before sending a code](/blog/otp-fraud-prevention-checks-before-sending-a-code) covers the wider OTP flow, and [WhatsApp number check](/services/whatsapp-number-check) the WhatsApp fields.

## What are the key takeaways?

- Polish numbers always have nine digits, at home and after `+48`, with no trunk `0`. Store `+48` plus the nine digits; a `0` in front makes the number invalid.
- The 13 mobile prefixes are `45`, `50`, `51`, `53`, `57`, `60`, `66`, `69`, `72`, `73`, `78`, `79` and `88`. Landlines start with a two-digit area code, `39` is VoIP, `64` paging, `70`/`80` special-rate.
- `21` is the M2M range. libphonenumber types parts of it as mobile since early 2026, so filter it yourself.
- The prefix names the block holder in UKE's tables, not the current network: porting takes at most one working day after the agreed date, and 425,608 mobile numbers moved in the third quarter of 2026.
- The 2023 anti-abuse act makes operators block spoofed calls and smishing SMS, runs the `8080` reporting number and protects public bodies' SMS sender names.
- Sales calls, marketing SMS and messaging-app marketing need prior consent under article 398 of the 2024 Electronic Communications Law, for consumers and businesses alike.
- Use libphonenumber's example numbers in tests; Poland has no fiction range.

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

## Sources

1. [Rozporządzenie Ministra Cyfryzacji z dnia 4 grudnia 2024 r. w sprawie planu numeracji krajowej dla publicznych sieci telekomunikacyjnych (Dz.U. 2024 poz. 1862)](https://api.sejm.gov.pl/eli/acts/DU/2024/1862/text.html) — Sejm of the Republic of Poland (ISAP / ELI), 2024
2. [Plan numeracji krajowej (Dz.U. 2024 poz. 1862), act details](https://isap.sejm.gov.pl/isap.nsf/DocDetails.xsp?id=WDU20240001862) — Internetowy System Aktów Prawnych (ISAP), 2024
3. [Numeracja: tabele zakresów numeracji (mobile, M2M, intelligent-network and VoIP allocation tables; read 2026-11-07)](https://numeracja.uke.gov.pl/pl) — UKE (Urząd Komunikacji Elektronicznej), 2026
4. [Ustawa z dnia 12 lipca 2024 r. Prawo komunikacji elektronicznej (Dz.U. 2024 poz. 1221): articles 296, 297, 325, 326, 337 and 398](https://api.sejm.gov.pl/eli/acts/DU/2024/1221/text.html) — Sejm of the Republic of Poland (ISAP / ELI), 2024
5. [Prawo komunikacji elektronicznej (Dz.U. 2024 poz. 1221), act details](https://isap.sejm.gov.pl/isap.nsf/DocDetails.xsp?id=WDU20240001221) — Internetowy System Aktów Prawnych (ISAP), 2024
6. [Ustawa z dnia 12 lipca 2024 r. Przepisy wprowadzające ustawę – Prawo komunikacji elektronicznej (Dz.U. 2024 poz. 1222)](https://api.sejm.gov.pl/eli/acts/DU/2024/1222/text.html) — Sejm of the Republic of Poland (ISAP / ELI), 2024
7. [Ustawa z dnia 28 lipca 2023 r. o zwalczaniu nadużyć w komunikacji elektronicznej (Dz.U. 2023 poz. 1703), act details](https://isap.sejm.gov.pl/isap.nsf/DocDetails.xsp?id=WDU20230001703) — Internetowy System Aktów Prawnych (ISAP), 2023
8. [Obwieszczenie w sprawie ogłoszenia jednolitego tekstu ustawy o zwalczaniu nadużyć w komunikacji elektronicznej (Dz.U. 2024 poz. 1803, consolidated text)](https://api.sejm.gov.pl/eli/acts/DU/2024/1803/text.html) — Sejm of the Republic of Poland (ISAP / ELI), 2024
9. [Wystartował system wymiany informacji o smishingu (16 January 2024)](https://www.gov.pl/web/cyfryzacja/wystartowal-system-wymiany-informacji-o-smishingu) — Ministry of Digital Affairs (gov.pl), 2024
10. [Lista ostrzeżeń przed niebezpiecznymi stronami](https://cert.pl/lista-ostrzezen/) — CERT Polska (NASK), 2026
11. [Zastrzeganie nadpisu SMS (public-body sender ID reservation form)](https://incydent.cert.pl/nadpis) — CERT Polska (NASK), 2026
12. [Statystyki przenoszenia numerów w III kwartale 2026 roku (7 October 2026)](https://www.uke.gov.pl/akt/statystyki-przenoszenia-numerow-w-iii-kwartale-2026-roku,695.html) — UKE (Urząd Komunikacji Elektronicznej), 2026
13. [Baza danych przeniesionych numerów (31 January 2007)](https://archiwum.uke.gov.pl/aktualnosci/biezace-informacje/komunikaty/baza-danych-przeniesionych-numerow,701.html) — UKE (archive), 2007
14. [UKE od 2006 roku (history)](https://uke.gov.pl/o-nas/historia/uke-od-2006/) — UKE (Urząd Komunikacji Elektronicznej), 2026
15. [Ustawa z dnia 10 czerwca 2016 r. o działaniach antyterrorystycznych (Dz.U. 2016 poz. 904)](https://api.sejm.gov.pl/eli/acts/DU/2016/904/text.html) — Sejm of the Republic of Poland (ISAP / ELI), 2016
16. [Zgoda nie zawsze jest podstawą przetwarzania danych (6 July 2026)](https://uodo.gov.pl/pl/701/4467) — UODO (Urząd Ochrony Danych Osobowych), 2026
17. [Directive 2002/58/EC on privacy and electronic communications (ePrivacy Directive)](https://eur-lex.europa.eu/eli/dir/2002/58/oj) — EUR-Lex, Publications Office of the European Union, 2002
18. [Directive (EU) 2018/1972 establishing the European Electronic Communications Code](https://eur-lex.europa.eu/eli/dir/2018/1972/oj) — EUR-Lex, Publications Office of the European Union, 2018
19. [Regulation (EU) 2016/679 (General Data Protection Regulation)](https://eur-lex.europa.eu/eli/reg/2016/679/oj) — EUR-Lex, Publications Office of the European Union, 2016
20. [libphonenumber PhoneNumberMetadata.xml (region PL)](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 Polish phone number?

Nine. Poland has a closed numbering plan, so every ordinary number has nine digits, at home and after the country code +48. A mobile is written 512 345 678 in Poland and +48 512 345 678 from abroad. There is no trunk 0: a number written with a leading 0 has ten digits and is invalid.

### What is the Poland country code for WhatsApp and international calls?

+48. Put +48 in front of the nine-digit number without removing anything: 512 345 678 becomes +48 512 345 678, and the E.164 form is +48512345678. Don't add a 0 after +48. From a Polish phone you dial the nine digits only; from abroad you dial 00 48 or +48 first.

### Which prefixes are mobile numbers in Poland?

The national numbering plan of December 2024 lists 13 two-digit mobile ranges: 45, 50, 51, 53, 57, 60, 66, 69, 72, 73, 78, 79 and 88. Landlines start with a two-digit area code such as 22 for Warsaw or 12 for Kraków, 39 is for IP-based (VoIP) services, 64 for paging and 21 for machine-to-machine services.

### Can I tell the operator from a Polish mobile prefix?

No. UKE, the Polish telecoms regulator, allocates number blocks to operators, but every block mixes holders and any number can be ported. A port takes effect no later than one working day after the agreed start date. In the third quarter of 2026 alone, 425,608 mobile numbers changed operator, so look up each number to know its current network.

### What is 8080 in Poland?

8080 is the free short number for reporting suspicious SMS. Under the 2023 Act on combating abuse in electronic communications, you forward a suspected smishing message to 8080, and CSIRT NASK, Poland's national computer security team, analyses it. Operators then block messages that match the patterns it publishes.

### Is caller ID spoofing illegal in Poland?

Yes. The Act on combating abuse in electronic communications, in force since 25 September 2023, defines CLI spoofing and requires operators to block a spoofed voice call or hide the caller's number. UKE also keeps a public list of numbers that only receive calls, such as bank helplines; calls showing those numbers can be stopped.

### Do I need consent to send marketing SMS or make sales calls in Poland?

Yes. Article 398 of the Electronic Communications Law of 2024 bans using automated calling systems or telecom terminal equipment, including messaging services, to send commercial information or direct marketing to a subscriber or end user who has not consented beforehand. It covers sales calls, SMS and messaging apps, for consumers and businesses alike, and a breach is also unfair competition.

### Do I need to register a prepaid SIM card in Poland?

Yes. Since 2016, prepaid users must give their identity data, and unregistered prepaid cards were cut off after 1 February 2017. Under the 2024 Electronic Communications Law, a provider may start service only after checking the user's name and PESEL or ID document, and before issuing a duplicate SIM it must check the PESEL reservation register.
