# Dutch phone number format: +31, 06 mobiles, validation and calling rules

> Dutch phone number format: +31 plus 9 digits, 06 mobiles, 0970 M2M numbers, tested validation code, 1-day porting, opt-in sales calls and SMS consent.

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

![A phone screen shows +31 and a large 06 capsule with eight digit dots, next to three linked rows: a 097 machine number marked no, an OPT-IN sales call marked yes and a call from abroad shown as a masked caller.](https://mobilevalidate.com/images/blog/netherlands-phone-number-format.svg)

*Dutch mobiles are 06 plus eight digits; 0970 is for machines, sales calls need opt-in and spoofed caller IDs are banned.*


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

Dutch phone numbers use the country code +31 and have 10 digits when written at home, always starting with 0. A mobile number starts with 06, so `06 XXXXXXXX` in the Netherlands becomes `+31 6 XXXXXXXX` from abroad (E.164: `+316XXXXXXXX`), with nine digits after +31. Landlines start with a two- or three-digit area code such as `010` or `0111`, company numbers with `088`, and machine-to-machine numbers with `0970`. The prefix shows which operator received the block, but numbers move between networks, so it doesn't prove the current one.

This guide is part of our [phone numbers by country](/blog/phone-numbers-by-country) series. The tables come from libphonenumber's metadata, the Dutch numbering plan on wetten.overheid.nl, reports by the ACM (the Netherlands Authority for Consumers and Markets, which issues numbers), 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 Dutch plan has no range reserved for fiction. We read the plan, the Telecommunications Act (Telecommunicatiewet) and the ACM and AP guidance on 2026-11-07; most are in Dutch only. This is a summary, not legal advice.

## What does a Dutch phone number look like?

A Dutch number is 10 digits including the leading `0`, the trunk prefix you dial inside the country. Article 2 of the numbering plan fixes geographic numbers at ten digits, and Annex 1 gives the same length to mobile, 084/087, 085/091 and 088 numbers. What follows the `0` tells you the kind of number:

| First digits (national) | International | Type |
|---|---|---|
| `01` to `05`, `07` (2- or 3-digit area codes) | `+31 10` … `+31 79` | Landline, for example `010` Rotterdam, `020` Amsterdam, `0111` Zierikzee |
| `061` to `065`, `068` | `+31 6` | Mobile |
| `066` | `+31 66` | Pagers (semafonie) |
| `085`, `091` | `+31 85`, `+31 91` | Public electronic communication services without an area code (mostly VoIP) |
| `084`, `087` | `+31 84`, `+31 87` | Personal assistant services (follow-me numbers) |
| `088` | `+31 88` | Company and institution numbers |
| `0800`, `0900`, `0906`, `0909` | `+31 800`, `+31 900` … | Freephone and information services (8 or 11 digits) |
| `0970` | `+31 970` | Machine-to-machine (12 digits) |

From abroad, drop the `0` and add `+31`. Dutch people often write a mobile as `06-12345678` or `06 1234 5678`, and on business cards `+31 (0)6 …`. Strip the bracket and the `0` before you store it.

<!-- country-data:NL: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 | `+31` |
| International call prefix (dialling out) | `00` |
| Trunk prefix (dialling at home) | `0` |
| Mobile: digits after +31 | 9, 11 |
| Fixed line: digits after +31 | 9 |
| Toll-free: digits after +31 | 7–10 |
| Premium rate: digits after +31 | 7–10 |
| VoIP: digits after +31 | 9 |
| Pager: digits after +31 | 9 |
| Universal access (UAN): digits after +31 | 5, 6, 9 |
| Mobile, national format (masked) | `06 1XXXXXXX` |
| Mobile, international (masked) | `+31 6 1XXXXXXX` |
| Mobile, E.164 (masked) | `+3161XXXXXXX` |
| Fixed line, national format (masked) | `010 XXX XXXX` |
| Fixed line, international (masked) | `+31 10 XXX XXXX` |
| Fixed line, E.164 (masked) | `+3110XXXXXXX` |
<!-- country-data:NL:format:end -->

The "9, 11" for mobiles is libphonenumber's view: it types the 11-digit `0970` M2M numbers as mobile too, because they sit on mobile networks. For a person's number, expect exactly nine digits after `+31`. Toll-free and premium numbers vary between 7 and 10 digits after `+31` because the plan allows `0800` and `090x` numbers of 8 or 11 digits nationally (Annex 3).

## Which prefixes are mobile numbers?

The numbering plan lists these `06` ranges ([Nummerplan, Annex 1](https://wetten.overheid.nl/BWBR0010198/2025-10-03/0)):

| Range | Use in the plan |
|---|---|
| `061`, `062`, `063`, `064` | Mobile telephony |
| `0650` to `0655` | Mobile telephony |
| `0656` to `0659` | Former pager range, mobile telephony since 1 January 2006 |
| `066` | Pagers (semafonie) |
| `0670` to `0675`, `0677` to `0679`, `06760` | Videotex, data and internet access |
| `068` | Mobile telephony |
| `060`, `069` | No entry; earmarked for mobile but not released for allocation |

The ACM's numbering report confirms it: numbers starting `06` are for mobile telephony, except the `066` and `067` ranges, and `060` and `069` are meant for mobile but not yet made available by the ministry ([ACM Monitor Nummeruitgifte 2025](https://www.acm.nl/system/files/documents/monitor-nummeruitgifte-2025.pdf)). For each two-digit block, the generator counted every number of a mobile length that libphonenumber's mobile pattern for `NL` accepts:

<!-- country-data:NL: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, 11-digit numbers) | 3-digit sub-blocks that aren't fully mobile |
|---|---|---|---|
| `061` | `+31 61` | 100% | — |
| `062` | `+31 62` | 100% | — |
| `063` | `+31 63` | 100% | — |
| `064` | `+31 64` | 100% | — |
| `065` | `+31 65` | 100% | — |
| `068` | `+31 68` | 100% | — |
| `097` | `+31 97` | 10.0% | not mobile: 0971–0979 |
<!-- country-data:NL:prefixes:end -->

The `097` row is the M2M range: only `0970` is in use, so libphonenumber accepts a tenth of the `097` block. All other rows are personal mobiles.

### How full is the 06 range?

The ACM issues `06` numbers to operators in blocks of 10,000. At the end of 2025, 88.7% of the issuable `06` numbers had been issued, the same as a year earlier. The ACM says it will look more closely at the situation if the share passes 90% (ACM Monitor Nummeruitgifte 2025). There were no changes to the mobile ranges in 2025.

### Which operator holds a 06 block?

The Dutch mobile market has three networks. In the ACM's Telecommonitor for the second quarter of 2026, KPN and Odido each had a 25 to 30% share of mobile connections, VodafoneZiggo 20 to 25%, and virtual operators on those networks 15 to 20% together. The country had 24.77 million mobile connections and 22.1 million M2M SIM cards ([ACM Telecommonitor Q2 2026](https://www.acm.nl/nl/publicaties/acm-telecommonitor-tweede-kwartaal-2026)). Odido is the brand that replaced T-Mobile and Tele2 in September 2023 ([RCR Wireless, 2023](https://www.rcrwireless.com/20230906/carriers/t-mo-netherlands-tele2-shake-off-dt-ties-rebrand-as-odido)), so older lookup tables may still show the old names.

## What are 0970 numbers?

They are numbers for **machine-to-machine (M2M)** services, such as smart meters, alarm panels, payment terminals and connected cars. The plan gives `0970` a length of **12 digits** nationally, so 11 digits follow `+31`. `0971` to `0978` have no use assigned yet, and `0979` is kept outside the plan for network-internal use ([Nummerplan, Annex 1](https://wetten.overheid.nl/BWBR0010198/2025-10-03/0)).

Since 1 March 2013, a new automated application must use a `0970` number. It may also use `067`, `0800`, `084`, `087`, `090` or `1` numbers if it meets their purpose rules (article 1c). M2M numbers are growing fast: the ACM reports 19.1 million more `0970` numbers issued in 2025 than in 2024 (+34.92%) and doesn't exclude that the issuable space could run out in the short term (ACM Monitor Nummeruitgifte 2025).

For your forms, the rule is simple: a `0970` number belongs to a device, not to a person. libphonenumber returns `MOBILE` for it, so filter it out yourself, as the code below does.

## What do 085, 088, 084/087 and 14 numbers mean?

- **`085` and `091`** are for public electronic communication services. The ACM explains that `085` serves providers that want a number that looks like a landline without a link to an area, mostly VoIP services, and `091` is for value-added services. libphonenumber types both as `VOIP`.
- **`088`** is for companies and institutions: a single national number for an organisation with several offices. 3,730,800 `088` numbers had been issued in 2025 (ACM).
- **`084` and `087`** are personal assistant services (follow-me numbers that forward to wherever the user is). The plan excludes erotic, call-prolonging and entertainment services from them.
- **`14` plus the area code** (5 or 6 digits, for example `14 020`) reaches a municipality's contact centre, `1400` the central government and `14088` the government contact centre for businesses.
- **`112`** is the emergency number, and **`116xxx`** numbers are harmonised European services of social value.

None of these should be accepted as a personal sign-up number. A landline area code still says where the line was issued: unlike France, the Netherlands kept its geographic numbering.

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

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

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

```python
import phonenumbers
from phonenumbers import PhoneNumberType


def normalize_nl(raw: str) -> str | None:
    """E.164 for a Dutch mobile number (06), or None. Pagers (066) and M2M (097) are dropped."""
    try:
        n = phonenumbers.parse(raw, "NL")
    except phonenumbers.NumberParseException:
        return None
    if (not phonenumbers.is_valid_number(n) or phonenumbers.region_code_for_number(n) != "NL"
            or phonenumbers.number_type(n) != PhoneNumberType.MOBILE
            or phonenumbers.national_significant_number(n).startswith("97")):
        return None
    return phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)


for raw in ["06 12345678", "06-1234 5678", "+31 (0)6 12345678", "0031 6 12 34 56 78",
            "+31 06 12345678", "066 2345678", "010 123 4567", "085 123 4567"]:
    print(f"{raw!r:24} -> {normalize_nl(raw)}")
```

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

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

/** "06 …", "+31 (0)6 …", "0031 …" → E.164 for a Dutch mobile number, or null.
 *  Pagers (066) and M2M numbers (097) are dropped. */
export function normalizeNl(raw) {
  const phone = parsePhoneNumberFromString(String(raw), "NL");
  return phone?.isValid() && phone.country === "NL" && phone.getType() === "MOBILE"
    && !phone.nationalNumber.startsWith("97") ? phone.number : null;
}

for (const raw of ["06 12345678", "06-1234 5678", "+31 (0)6 12345678", "0031 6 12 34 56 78",
                   "+31 06 12345678", "066 2345678", "010 123 4567", "085 123 4567"]) {
  console.log(JSON.stringify(raw).padEnd(24), "->", normalizeNl(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 `NL` (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
'06 12345678'            -> +31612345678
'06-1234 5678'           -> +31612345678
'+31 (0)6 12345678'      -> +31612345678
'0031 6 12 34 56 78'     -> +31612345678
'+31 06 12345678'        -> +31612345678
'066 2345678'            -> None
'010 123 4567'           -> None
'085 123 4567'           -> None
```

Two things are worth noting. `+31 06 …`, a common mistake that keeps the `0` after the country code, still parses to the right number in both libraries. The pager example `066 …` is valid but typed `PAGER`, so it is dropped, as are the Rotterdam landline and the `085` VoIP number.

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

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

Rows 7, 8 and 10 are the Dutch traps. The regex lets an 11-digit `06` number through because it allows the M2M length, passes `060`, which is not released, and passes the `066` pager range. A regex like `^0?6[1-58]\d{7}$` is closer, but it still can't keep up with plan changes; 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 Dutch numbering plan has no block reserved for films, books or examples, unlike the UK or France. Use libphonenumber's example numbers (`06 12345678` for a mobile, `010 123 4567` for a landline) in parser unit tests, mask the rest with X, and never use a real customer's number. A sandbox or test key is the safe way to test lookups.

## Does number portability change the carrier?

Yes. A Dutch mobile number can move to another operator and keep its digits. The rules are in article 4.10 of the Telecommunications Act ([Telecommunicatiewet](https://wetten.overheid.nl/BWBR0009950/2026-08-15/0)):

- **One working day.** The number must be moved as quickly as possible and activated on the date agreed with the subscriber, at the latest within one working day of that date. Service may not be interrupted for more than one working day.
- **No direct charge.** The subscriber can't be charged directly for porting.
- **After the contract ends.** A subscriber can still claim the right for up to one month after the contract ends.
- **ACM issues the numbers.** Numbers are allocated by the ACM on application (article 4.2); the minister sets the numbering plans after consulting the ACM (article 4.1).

The operators founded the association COIN in 1999 to agree the porting arrangements, and COIN runs the central platform on which operators exchange porting messages today ([COIN history](https://coin.nl/nl/over-coin/historie); [COIN number portability](https://coin.nl/nl/diensten/nummerportabiliteit)). The Netherlands row of our MNP atlas:

<!-- country-data:NL: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 | 1999 |
| Maximum porting time | 1 working day (activation after agreed date) |
| Governing rule | Telecommunicatiewet art. 4.10(5)(c) (implements EECC Art. 106) |
| Published porting volume | none published |
| Source | [wetten.overheid.nl](https://wetten.overheid.nl/BWBR0009950/2026-08-15/0), [btk.gov.tr](https://www.btk.gov.tr/uploads/pages/slug/mobil-numara-tasinabilirligi-rekabete-ve-tuketicilere-etkileri-ardil-duzenleyici-etki-analizi.pdf) |
| Checked | 2026-11-07 |
<!-- country-data:NL:mnp:end -->

The one-working-day rule in the atlas comes from the European Electronic Communications Code (Art. 106), which article 4.10 implements. The atlas gives 1999 as the launch year; we didn't find a primary Dutch source with the exact date. With three networks and many virtual operators, a block holder is a weak guess for SMS routing, pricing or fraud rules. Look up the current network per number; our [MNP atlas](/blog/mobile-number-portability-atlas) compares the Netherlands with other countries.

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

These summarise the law and the regulators' guidance as we read them on 2026-11-07. Not legal advice; ask counsel how they apply to you. Two regulators share the work: the ACM enforces article 11.7 (unsolicited communication) and the caller-ID rules of the Telecommunications Act, and the Autoriteit Persoonsgegevens (AP) supervises the GDPR (article 15.1 of the Act).

### The end of the Bel-me-niet register (2021)

The Netherlands used to have an opt-out list, the Bel-me-niet register: consumers registered their numbers, and callers had to skip them. A law of 10 February 2021 replaced it with opt-in for sales calls to natural persons and removed the register's article 11.8 from the Act with effect from 1 July 2021 ([Staatsblad 2021, 103](https://zoek.officielebekendmakingen.nl/stb-2021-103.html)). From then on, a business could call a consumer only with consent, or if the person was a current or former customer.

### Sales calls need explicit consent (since 1 July 2026)

The customer exception ended on 1 July 2026, when article 7.8 of the Energy Act (Energiewet), which amends article 11.7, came into force ([Staatsblad 2025, 89](https://zoek.officielebekendmakingen.nl/stb-2025-89.html); [Rijksoverheid, 15 May 2025](https://www.rijksoverheid.nl/actueel/nieuws/2025/05/15/ongevraagd-bellen-per-juli-2026-beperkt-wetsvoorstel-bedenktijd-deurverkoop)). The ACM summarises the rules ([ACM, 25 June 2026](https://www.acm.nl/nl/publicaties/vanaf-1-juli-strengere-regels-voor-telemarketing-alleen-nog-maar-als-klant-toestemming-heeft-gegeven)):

- **Who is protected:** consumers, sole traders (zzp'ers) and general partnerships (vof's).
- **Prior, explicit consent:** a business may call them with a sales offer only if they agreed in advance. Consent can't be collected by phone during a service call.
- **Exceptions:** charities, lotteries that give to charity, and publishers of newspapers and magazines may still call existing and former customers. The ACM's business page puts that at a customer relationship in the last three years ([ACM, telemarketing](https://www.acm.nl/nl/verkoop-aan-consumenten/reclame-en-verleiden/verkoop-telemarketing)).
- **Withdrawal:** saying "don't call me again" during a call is enough, and the business must remove the number from its list immediately. Every call must offer that choice.
- **Show your number:** a sales caller may not hide its caller ID (article 11.7(8)).

If your process still "cleans against Bel-me-niet", it is five years out of date: keep a consent record per number instead.

### Marketing SMS, WhatsApp and e-mail need consent (article 11.7)

Article 11.7(1) bans automated calling systems, fax and electronic messages for unsolicited commercial, ideological or charitable communication, unless the sender can show that the recipient consented beforehand ([Telecommunicatiewet](https://wetten.overheid.nl/BWBR0009950/2026-08-15/0)). The ePrivacy Directive's definition of electronic mail covers SMS ([Directive 2002/58/EC](https://eur-lex.europa.eu/eli/dir/2002/58/oj), Art. 2(h)), and the AP's guidance names newsletters, text messages and app messages ([AP, digital direct marketing](https://www.autoriteitpersoonsgegevens.nl/en/themes/internet-and-smart-devices/advertising/digital-direct-marketing)):

- **Individuals:** consent before the first message.
- **Existing customers (soft opt-in):** you may use contact details you got from a customer when selling a product or service to market your own similar products or services. The customer must have been able to object, free and easily, when you collected the details, and must be able to object in every message (article 11.7(4)). The July 2026 change removed the customer exception for sales calls only; this one remains.
- **Business recipients:** no prior consent is needed for legal persons or people acting in their profession if they published the contact details for receiving such messages (article 11.7(3)).
- **Every message** must state the sender's real identity and a valid address or number for unsubscribing (article 11.7(7)).

### SMS sender IDs

Dutch operators and SMS brokers run a self-regulatory **SMS Sender ID Register** through COIN, to fight smishing that uses alphanumeric sender names. It checks the sender name, not the message content. Only telecom providers and SMS brokers can join; a brand registers its sender ID through the provider that sends its messages ([COIN, SMS Sender ID Register](https://coin.nl/nl/diensten/sms-sender-id-register)). If you send A2P SMS to Dutch numbers with an alphanumeric sender, ask your provider whether your name is registered. COIN's page doesn't say how unregistered names are treated, so test delivery before a campaign.

### Caller ID spoofing

Article 11.10a of the Act forbids using caller ID to give the called person false information about the calling line or user, and the ACM supervises number use, including this ban ([Kamerstukken 29911, nr. 302](https://zoek.officielebekendmakingen.nl/kst-29911-302.html)). In 2020, operators, banks and the police formed a taskforce against spoofing, and the government announced rules on the use of Dutch numbers abroad. As of November 2026 that work is a bill: the **Wetsvoorstel nummerbeleid** was in public consultation from 10 July to 9 October 2026. Its three parts are suballocation of numbers, extraterritorial use of Dutch numbers and caller-number recognition, with new powers for the ACM, aimed at spoofing, phishing and bank-helpdesk fraud ([internetconsultatie.nl](https://www.internetconsultatie.nl/nummers/b1)). We found no rule in force yet that makes Dutch operators block calls from abroad showing a Dutch number. For a voice OTP, show a number your provider is allowed to use, and expect stricter checks once the bill passes; our guide to [STIR/SHAKEN attestation levels](/blog/stir-shaken-attestation-levels) explains how other countries authenticate caller IDs.

### Personal data (GDPR)

A phone number linked to a person is personal data under the GDPR ([Regulation (EU) 2016/679](https://eur-lex.europa.eu/eli/reg/2016/679/oj)). 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 Dutch mobile. We didn't find a primary source that measures messaging-app use in the Netherlands 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 Dutch 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 Dutch way (`06-12345678`, `+31 (0)6 …` and spaces also work) and `default_country=NL`:

```bash title="Bulk WhatsApp and porting 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,mnp -F default_country=NL
```

Send the same body to `POST /v1/jobs/estimate` first: it is free and shows the maximum cost before anything runs. Filter out `0970` and `066` rows before the upload; they are devices and pagers, not people.

## What changed recently?

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

<!-- country-data:NL: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 | 4 |
| Numbering-plan metadata (validation, lengths, types) | 2 |
| Alternate formatting | 1 |
| All | 7 |

Latest numbering-plan updates for `NL`: 2022-05-05 (v8.12.48), 2019-02-06 (v8.10.5).
<!-- country-data:NL:changes:end -->

The Dutch validation metadata has hardly changed since 2022; the plan's ranges were stable in 2025 too. The rule changes matter more:

| Date | Change |
|---|---|
| 1 January 2006 | `0656` to `0659` move from pagers to mobile telephony |
| 1 March 2013 | New automated (M2M) applications must use `0970` numbers |
| 1 July 2021 | Opt-in for sales calls to natural persons; Bel-me-niet register closed |
| 1 July 2026 | Customer exception for sales calls ends; explicit prior consent for consumers, sole traders and general partnerships |
| 10 July to 9 October 2026 | Public consultation on the number policy bill (suballocation, use of numbers abroad, caller-number recognition) |

## What can MobileValidate check for Dutch numbers?

Generated from our public catalog:

<!-- country-data:NL: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 Netherlands 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 Netherlands 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:NL:coverage:end -->

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

Because the `06` prefix shows only the block holder, the useful Dutch lookup is the current network. An [MNP lookup](/services/mnp-lookup) gives ported or not ported and the current network code; an [HLR lookup](/services/hlr-lookup) adds live reachability. Here is a small flow for a customer list that adds WhatsApp registration. 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_nl()`.

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

import requests  # pip install requests

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


def route(numbers: list[str]) -> dict[str, dict]:
    """Porting status, current network and WhatsApp registration. None means we don't know."""
    r = requests.post(API, headers={"Authorization": f"Bearer {KEY}"}, timeout=15,
                      json={"numbers": numbers, "checks": ["mnp", "whatsapp"], "wait": 5})
    r.raise_for_status()
    out = {}
    for row in r.json()["results"]:
        mnp, wa = row["checks"]["number.mnp"], row["checks"]["whatsapp.registered"]
        attrs = (mnp["attributes"] or {}) if mnp["status"] == "completed" else {}
        out[row["e164"]] = {
            "porting": attrs.get("porting"),
            "mcc_mnc": attrs.get("mcc_mnc"),
            "whatsapp": wa["registered"] if wa["status"] == "completed" else None,
        }
    return out


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

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

```text
+447700900001 {'porting': 'not_ported', 'mcc_mnc': '23415', 'whatsapp': True}
+447700900002 {'porting': 'not_ported', 'mcc_mnc': '23415', 'whatsapp': False}
+447700900003 {'porting': None, 'mcc_mnc': None, 'whatsapp': None}
```

The third test value answers `unknown` (a simulated timeout), so everything is `None`. Keep `None` apart from `False`: `None` means we don't know, and it's never billed. 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). See [WhatsApp number check](/services/whatsapp-number-check) for the fields.

## What are the key takeaways?

- Dutch numbers are 10 digits at home and `+31` plus 9 digits in E.164; mobiles start `06`. Store `+316XXXXXXXX`, without the `(0)`, spaces or dashes.
- Not every `06` is a person's mobile: `066` is pagers, `067` data access, and `060` and `069` are not released. Machine-to-machine numbers start `0970` and have 12 digits; libphonenumber calls them mobile, so filter them yourself.
- `085` and `091` are mostly VoIP, `088` company numbers, `084` and `087` follow-me numbers; landline area codes still show a place.
- The prefix names the block holder, not the current network: a port takes effect within one working day of the agreed date.
- The Dutch plan has no fiction range; use libphonenumber's example numbers in tests, never real numbers.
- The Bel-me-niet register closed in 2021. Since 1 July 2026, sales calls to consumers, sole traders and general partnerships need explicit prior consent, and marketing SMS and app messages need consent under article 11.7, with a soft opt-in for existing customers.
- Caller ID spoofing is illegal (article 11.10a); a number policy bill against spoofing finished consultation on 9 October 2026.

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

## Sources

1. [Nummerplan telefoon- en ISDN-diensten (BWBR0010198), version in force from 3 October 2025](https://wetten.overheid.nl/BWBR0010198/2025-10-03/0) — Ministry of Economic Affairs via wetten.overheid.nl, 2025
2. [Nummerplannen voor telecomaanbieders](https://www.acm.nl/nl/onderwerpen/telecommunicatie/telefoonnummers/telefoonnummers-aanvragen/nummerplannen-voor-telecomaanbieders) — ACM (Autoriteit Consument & Markt), 2026
3. [Monitor Nummeruitgifte 2025 (March 2026)](https://www.acm.nl/system/files/documents/monitor-nummeruitgifte-2025.pdf) — ACM (Autoriteit Consument & Markt), 2026
4. [Telecommunicatiewet (BWBR0009950), version in force from 15 August 2026: articles 4.2, 4.10, 11.7, 11.10a and 15.1](https://wetten.overheid.nl/BWBR0009950/2026-08-15/0) — wetten.overheid.nl, 2026
5. [Wet van 10 februari 2021 tot wijziging van de Telecommunicatiewet (opt-in for unsolicited calls; end of the Bel-me-niet register), Staatsblad 2021, 103](https://zoek.officielebekendmakingen.nl/stb-2021-103.html) — Officiële bekendmakingen, 2021
6. [Besluit van 31 maart 2025 (entry into force of article 7.8 of the Energiewet, amending article 11.7 Telecommunicatiewet, on 1 July 2026), Staatsblad 2025, 89](https://zoek.officielebekendmakingen.nl/stb-2025-89.html) — Officiële bekendmakingen, 2025
7. [Ongevraagd bellen per juli 2026 beperkt (news, 15 May 2025)](https://www.rijksoverheid.nl/actueel/nieuws/2025/05/15/ongevraagd-bellen-per-juli-2026-beperkt-wetsvoorstel-bedenktijd-deurverkoop) — Rijksoverheid (Government of the Netherlands), 2025
8. [Vanaf 1 juli strengere regels voor telemarketing: alleen nog maar als klant toestemming heeft gegeven (news, 25 June 2026)](https://www.acm.nl/nl/publicaties/vanaf-1-juli-strengere-regels-voor-telemarketing-alleen-nog-maar-als-klant-toestemming-heeft-gegeven) — ACM (Autoriteit Consument & Markt), 2026
9. [Verkoop via telemarketing (rules for businesses)](https://www.acm.nl/nl/verkoop-aan-consumenten/reclame-en-verleiden/verkoop-telemarketing) — ACM (Autoriteit Consument & Markt), 2026
10. [Digital direct marketing](https://www.autoriteitpersoonsgegevens.nl/en/themes/internet-and-smart-devices/advertising/digital-direct-marketing) — Autoriteit Persoonsgegevens (Dutch Data Protection Authority), 2026
11. [Kamerbrief over spoofing en nummerbeleid, Kamerstukken 29911, nr. 302 (16 December 2020)](https://zoek.officielebekendmakingen.nl/kst-29911-302.html) — Officiële bekendmakingen, 2020
12. [Wetsvoorstel nummerbeleid (public consultation, 10 July to 9 October 2026)](https://www.internetconsultatie.nl/nummers/b1) — Ministry of Economic Affairs via internetconsultatie.nl, 2026
13. [Historie (founding of COIN for number portability, 1999)](https://coin.nl/nl/over-coin/historie) — Vereniging COIN, 2026
14. [Nummerportabiliteit](https://coin.nl/nl/diensten/nummerportabiliteit) — Vereniging COIN, 2026
15. [SMS Sender ID Register](https://coin.nl/nl/diensten/sms-sender-id-register) — Vereniging COIN, 2026
16. [ACM Telecommonitor tweede kwartaal 2026 (20 October 2026)](https://www.acm.nl/nl/publicaties/acm-telecommonitor-tweede-kwartaal-2026) — ACM (Autoriteit Consument & Markt), 2026
17. [T-Mo Netherlands, Tele2 shake off DT ties, rebrand as Odido](https://www.rcrwireless.com/20230906/carriers/t-mo-netherlands-tele2-shake-off-dt-ties-rebrand-as-odido) — RCR Wireless News, 2023
18. [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
19. [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
20. [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
21. [libphonenumber PhoneNumberMetadata.xml (region NL)](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 Dutch phone number?

Ten digits when written in the Netherlands, starting with 0, for example 06 XXXXXXXX for a mobile. In international form you drop the 0 and add the country code +31, so nine digits follow: +31 6 XXXXXXXX. Landlines, 085 and 088 numbers have the same length. The exceptions are machine-to-machine numbers starting 0970, which have 12 digits, and some 0800 and 0900 numbers with 8 or 11 digits.

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

+31. Drop the leading 0 of the Dutch number: 06 12345678 becomes +31 6 12345678. People often write +31 (0)6 …; the (0) is only a reminder for callers inside the country. Save the E.164 form +316XXXXXXXX, without the 0, spaces or dashes.

### Are all 06 numbers mobile in the Netherlands?

Almost. The national numbering plan reserves 061 to 065 and 068 for mobile telephony. 066 is still the old pager (semafonie) range and 067 is used for data and internet access. 060 and 069 are earmarked for mobile but have not been released for allocation yet, so no valid number starts with them today.

### What are 097 numbers in the Netherlands?

Numbers starting 0970 are for machine-to-machine services, such as smart meters, alarms and connected cars. They have 12 digits nationally (11 after +31). Since 1 March 2013, new automated applications must use them instead of 06 numbers. They are not personal mobiles, so don't accept them as a customer's contact number.

### Can I tell the operator from a 06 number?

No. The ACM issues 06 numbers to operators in blocks of 10,000, but any number can be moved to another operator and keep its digits. The law requires the port to take effect within one working day of the agreed date. To know today's network, look up each number.

### Does the Bel-me-niet register still exist?

No. The Bel-me-niet register closed on 1 July 2021, when the Netherlands switched to opt-in for sales calls. From 1 July 2026, the exception for existing and former customers ended too: businesses may only call consumers, sole traders and general partnerships who gave explicit prior consent. Charities, charity lotteries and publishers keep a narrow customer exception.

### Do I need consent to send marketing SMS or WhatsApp messages in the Netherlands?

Yes. Article 11.7 of the Telecommunications Act bans unsolicited commercial electronic messages, including SMS and app messages, unless the recipient consented beforehand. The exception is an existing customer offered your own similar products, who could object when you collected the number and can object in every message. Each message must name the sender and give a valid way to unsubscribe.

### Is caller ID spoofing illegal in the Netherlands?

Yes. Article 11.10a of the Telecommunications Act forbids using caller ID to give the called person false information about the calling line or user, and the ACM supervises this. As of November 2026, a bill on number policy that targets spoofing, phishing and bank-helpdesk fraud has finished public consultation but is not yet law.
