phone number standards

Sent logo
Sent TeamMar 8, 2026 / phone number standards / Article

Netherlands Phone Number Format: Complete Validation & Integration Guide (2025)

Learn Dutch phone number formats, validation regex, and ACM compliance. Complete guide to 06 mobile numbers, area codes, number portability, and integration with KPN, Odido, VodafoneZiggo APIs.

Netherlands Phone Numbers: Format, Area Code & Validation Guide

Learn how to validate Netherlands phone numbers, integrate with Dutch telecom APIs, and handle number portability. This guide covers Dutch phone number formats (including 06 mobile numbers), validation regex, ACM compliance requirements, and production-ready integration patterns with working code examples.

Understanding Dutch Phone Number Formats

Dutch phone numbers follow a standardized 10-digit format governed by the Netherlands Authority for Consumers and Markets (ACM). Whether you're validating a Netherlands mobile number starting with 06 or a geographic landline with area codes like 020 (Amsterdam) or 010 (Rotterdam), understanding the correct format is essential for successful integration. The ACM intensified enforcement of telemarketing and numbering regulations beginning July 1, 2025. Violations trigger administrative fines and periodic penalty payments. The ACM withdraws phone numbers used for fraud – it has withdrawn over 100 numbers from fake helpdesks since 2020. Follow ACM standards to ensure successful communication and integration.

Netherlands Phone Number Types and Format Examples

The Netherlands uses several distinct phone number formats. All domestic numbers start with 0 (trunk code), followed by area codes or service prefixes:

Number TypeFormatDetails
Geographic (Landline)10 digits with leading "0"Link to specific geographic areas with 2-digit or 3-digit area codes followed by 7-digit or 6-digit subscriber numbers. Major cities use 2-digit codes (020 Amsterdam, 010 Rotterdam, 070 Den Haag, 030 Utrecht). Smaller areas use 3-digit codes (0111 Zierikzee, 0598 Hoogezand). See the complete list of Dutch area codes.
Mobile10 digits starting with 06Valid prefixes: 061, 062, 063, 064, 065, 068. Security note: The ACM does not allocate prefixes 066, 067, and 069 for standard mobile services. Prefix 066 serves pagers, 067 serves videotex/internet access, and 069 remains largely unallocated. Scammers exploit these unallocated and special-use prefixes because they register easily and resist tracing. Treat calls from 066, 067, 069, 084, and 087 prefixes with extreme caution.
Toll-Free (0800)8-11 digits starting with 0800Callers pay nothing – the business bears all costs. Use allocated numbers within 6 months or forfeit them. Apply through ACM's application process. International callers cannot dial 0800 numbers.
Premium Rate8-11 digits starting with 0900, 0906, or 09090900 serves business/information services, 0906 serves adult/erotic services, 0909 serves entertainment. Charge €0.25 to €2.00 per minute or per call, plus regular call charges.

Fraud Prevention Best Practices:

  • Implement prefix validation that rejects 066, 067, 069 unless specifically required for legacy systems
  • Log and flag calls from 084, 087 prefixes for additional verification
  • Use reverse lookup services to verify caller identity for high-risk prefixes
  • Educate users about these fraud-prone number ranges

Cost Structure and Regulations: Premium rate numbers charge callers €0.25 to €2.00 per minute or per call, plus regular call charges. Dutch consumer protection law requires:

  • Disclose rates clearly before the call connects
  • State information rate and traffic rate separately
  • Disclose call setup fees separately
  • Limit customer service numbers to normal call charges (no information charges)
  • Apply maximum rate restrictions in certain situations
  • Prohibit call forwarding to 0800 numbers

Special Numbers: Non-geographic numbers serve specific functions:

  • 084, 087: Location-independent premium rate (often used for fax-to-email, voicemail services)
  • 085: Location-independent basic rate for private VoIP telephony
  • 088: Location-independent basic rate for companies with multiple addresses (requires KVK business registration; issued in blocks of 100+ numbers)
  • 091: VoIP telephony
  • 097: Machine-to-machine (M2M) communication (8-11 digits; 0970 for standard M2M, 0979 reserved for internal network use)
  • 1233: Voicemail services
  • 112: Emergency services (EU standard)
  • 113: Suicide prevention hotline
  • 14xx: Public authorities (14 followed by 2-4 digit municipality area code)
  • 18xx: Directory assistance (commercial providers)

Security Warning: Scammers frequently use 066, 084, and 087 numbers – these prefixes register easily and resist identification. Exercise caution with calls from these prefixes.

How to Validate Netherlands Phone Numbers with Regex

Validating Dutch phone number formats requires regular expressions that check for valid prefixes and digit counts. Here are production-ready regex patterns for each Netherlands phone number type:

javascript
const dutchPhoneValidators = {
  geographic: /^0[1-9]\d{7}$/, // Validates 9-digit geographic numbers (additional area code validation recommended)
  mobile: /^06[1-5,8]\d{7}$/, // Valid prefixes: 061-065 and 068
  tollFree: /^0800\d{4,7}$/,
  premiumRate: /^090[069]\d{4,7}$/,
  specialVoIP: /^08[458]\d{6,9}$/, // 084, 085, 088 numbers
  m2m: /^097[09]\d{5,8}$/ // Machine-to-machine
};

function validateDutchPhoneNumber(number, type) {
  const cleanNumber = number.replace(/\s+/g, ''); // Remove whitespace
  return dutchPhoneValidators[type].test(cleanNumber);
}

// Example usage:
console.log(validateDutchPhoneNumber('020 123 4567', 'geographic')); // Returns true after whitespace removal
console.log(validateDutchPhoneNumber('0612345678', 'mobile')); // Returns true
console.log(validateDutchPhoneNumber('0661234567', 'mobile')); // Returns false (066 not valid for mobile)

When NOT to use regex: Avoid regex-only validation for verifying active, ported, or reachable numbers. Use APIs or number lookup services for real-time verification.

Comprehensive Validation Example

This function demonstrates complete validation with error handling and formatting:

javascript
function formatDutchPhoneNumber(cleaned) {
  // Format based on prefix for better readability
  if (cleaned.startsWith('06')) {
    // Mobile: 06 1234 5678
    return `${cleaned.slice(0, 2)} ${cleaned.slice(2, 6)} ${cleaned.slice(6)}`;
  } else if (cleaned.length === 10 && cleaned.startsWith('0')) {
    // Geographic with 2-digit area code: 020 123 4567
    if (['020', '010', '070', '030', '040', '050'].includes(cleaned.slice(0, 3))) {
      return `${cleaned.slice(0, 3)} ${cleaned.slice(3, 6)} ${cleaned.slice(6)}`;
    }
    // Geographic with 3-digit area code: 0111 123 456
    return `${cleaned.slice(0, 4)} ${cleaned.slice(4, 7)} ${cleaned.slice(7)}`;
  }
  // Default formatting for special numbers
  return cleaned;
}

function handlePhoneValidation(phoneNumber) {
  try {
    const cleaned = phoneNumber.replace(/[\s\-\(\)]/g, ''); // Remove formatting characters
    if (!/^0\d{9,}$/.test(cleaned)) { // Initial length check (minimum 9 digits)
      throw new Error('Invalid number length or format. Numbers must start with 0 and have at least 9 digits.');
    }

    // Validate based on prefix
    if (cleaned.startsWith('06')) {
      if (!validateDutchPhoneNumber(cleaned, 'mobile')) {
        throw new Error('Invalid mobile number format. Valid prefixes are 061-065 and 068.');
      }
    } else if (cleaned.startsWith('0800')) {
      if (!validateDutchPhoneNumber(cleaned, 'tollFree')) {
        throw new Error('Invalid toll-free number format.');
      }
    } else if (cleaned.startsWith('090')) {
      if (!validateDutchPhoneNumber(cleaned, 'premiumRate')) {
        throw new Error('Invalid premium rate number format.');
      }
    } else if (cleaned.startsWith('0')) { // Geographic numbers
        if (!validateDutchPhoneNumber(cleaned, 'geographic')) {
            throw new Error('Invalid geographic number format. Check the area code and subscriber number.');
        }
    } else {
        throw new Error('Invalid number format. Numbers must start with 0.');
    }

    return { isValid: true, formattedNumber: formatDutchPhoneNumber(cleaned) };
  } catch (error) {
    return { isValid: false, error: error.message };
  }
}

// Example usage
console.log(handlePhoneValidation('020-1234567')); // Valid landline: { isValid: true, formattedNumber: '020 123 4567' }
console.log(handlePhoneValidation('0612345678')); // Valid mobile: { isValid: true, formattedNumber: '06 1234 5678' }
console.log(handlePhoneValidation('+31612345678')); // Invalid (missing leading 0 for domestic validation)
console.log(handlePhoneValidation('0800-1234')); // Valid toll-free
console.log(handlePhoneValidation('090012345')); // Valid premium rate
console.log(handlePhoneValidation('12345')); // Invalid format

Netherlands Number Portability: How to Port Dutch Mobile and Landline Numbers

Number portability in the Netherlands allows you to switch telecom providers while keeping your existing phone number—whether it's a 06 mobile number or a geographic landline. The Dutch number porting system uses a recipient-led process (EU standard) where you initiate port requests through your new provider. This system ensures competition and consumer choice.

How to Port a Dutch Mobile Number (MNP)

Mobile Number Portability (MNP) in the Netherlands lets you transfer your 06 mobile number between providers. All Dutch carriers—including KPN, Odido, and VodafoneZiggo—support MNP for both prepaid and postpaid plans. Port completion times depend on when you submit your request:

  • Before 17:00: 2 business days
  • After 17:00: Up to 3 business days

Initiate porting requests through your new provider – the Netherlands follows the recipient-led approach standard across Europe. Some providers offer expedited emergency options.

Required Documents for Number Porting:

  • Letter of Authorization (LOA) dated within the last 30 days
  • Copy of most recent phone bill/invoice from current provider (preferably within last 30 days)
  • For business numbers: Company registration certificate (KVK extract)
  • For personal numbers: Copy of government-issued ID or passport
  • Proof of address (utility bill dated within last 90 days)

Porting Process:

  1. Contact your new provider and request a number port
  2. Submit LOA and required documents
  3. Your new provider submits the port request to the Central Reference Database (CRDB)
  4. Your current provider accepts or rejects within 1 business day
  5. If accepted, the port completes within the specified timeframe (1-3 business days)
  6. Service transfers at the scheduled time with minimal interruption

Common Rejection Reasons:

  • Mismatched account information between LOA and provider records
  • Outstanding balance with current provider
  • Contract still under minimum term without early termination
  • Incorrect or incomplete documentation

Costs and Contract Implications: Number porting is typically free or low-cost (approximately €10/number for some international providers). Terminating your contract early may trigger early termination fees depending on your contract terms. Review your contract and clear all outstanding dues before porting. Business contracts may require 1-3 months' notice.

Fixed-Line Number Portability (FNP)

FNP covers both analog and digital lines nationwide, following the same 1-3 business day timeframe as mobile numbers. Geographic numbers must remain within their assigned area code – you cannot port a Rotterdam (010) number to Amsterdam (020). FNP delivers comparable service levels to MNP for in-area transfers.

Geographic Restrictions: Fixed-line numbers link to their geographic area codes. FNP fails when:

  • Moving to a different area code region
  • Converting between geographic and non-geographic numbers
  • Changing from consumer to business number types (requires new number allocation)

VoIP services using 085, 088, or 091 prefixes have no geographic restrictions – standard FNP rules apply.

Technical Implementation of Number Portability

The Netherlands uses a Central Reference Database (CRDB) managed by Vereniging COIN to track ported numbers and routing information. The CRDB contains:

  • Active number ranges by operator
  • All ported numbers and their current operators
  • Service number rates (premium, toll-free)
  • Real-time portability status

Accessing the CRDB: Access the CRDB through COIN's Number Portability service. The system provides:

  • Daily updated files with routing and tariff information
  • Secured environment with automated file retrieval
  • Detailed specifications for automated processing
  • Real-time query capabilities via web portal

Integration Requirements:

  • Query CRDB before routing calls to determine the correct terminating network
  • Implement fallback mechanisms for database unavailability
  • Cache routing information with 24-hour TTL (recommended)
  • Monitor porting windows (typically overnight) for number changes
  • Synchronize with CRDB daily updates to maintain accuracy

Contact Vereniging COIN at +31 (0)182 690 074 for CRDB access.

Major Netherlands Telecom Providers: API Integration Guide

Three major operators dominate the Dutch telecommunications market in 2025, each offering developer APIs for SMS, voice, and number management:

  • KPN: Leads with 30-35% mobile market share by connections and 40% fixed broadband share (alongside VodafoneZiggo). Developer resources at developer.kpn.com include SMS API, Mobile Service Management API, and Internet Speed Check API.

  • Odido Netherlands: (Rebranded from T-Mobile Netherlands in September 2023) Holds 30-35% mobile share by connections and 40-45% by consumed minutes – the largest by usage. API catalogue at agile.api-dashboard.odido.nl covers logistics, mobile connect services, and OTT provisioning.

  • VodafoneZiggo: Third-largest mobile operator with 20-25% market share. Joint fixed broadband leader (40% share) with KPN. Developer information at vodafoneziggo.nl.

  • MVNOs: Mobile Virtual Network Operators collectively hold 10-15% market share and offer competitive alternatives.

Developer Portal Access:

  • KPN Developer Portal: developer.kpn.com – Comprehensive API documentation, GitHub repositories with OpenAPI specifications, and Postman collections
  • Odido API Dashboard: agile.api-dashboard.odido.nl – Requires API key registration; powered by Tyk platform
  • VodafoneZiggo: Business solutions through sales channels; limited public API documentation

API Capabilities Comparison:

FeatureKPNOdidoVodafoneZiggo
SMS APIContact Sales
Number LookupContact Sales
Mobile ManagementLimited
Public DocumentationExtensiveModerateLimited
Self-Service Portal

Netherlands Phone Number API Integration Checklist

When integrating Dutch phone number validation and telecom APIs into your application, follow these best practices:

  • Input Validation: Validate Netherlands phone number formats using regex, handle both national (0x) and international (+31) formats, and sanitize all input. Reject suspicious prefixes (066, 067, 069) unless specifically required.
  • Error Handling: Provide clear error messages for invalid formats, network errors, and rate limits. Log all validation failures for security monitoring.
  • Format Conversion: Convert between national (0x format) and international (+31 format) formats for display and storage. Store in E.164 format for consistency.
  • Security Considerations: Implement rate limiting on validation endpoints, log suspicious patterns (repeated 066/084/087 attempts), and sanitize inputs to prevent injection attacks.
  • GDPR Compliance: Handle phone numbers as personal data. Implement data minimization, obtain proper consent, enable user data deletion, and maintain audit logs with retention policies.
  • Authentication & Authorization: Secure API endpoints with OAuth 2.0 or API keys, implement role-based access control, and rotate credentials regularly.
  • Monitoring & Alerting: Track validation success/failure rates, monitor API latency, set up alerts for unusual traffic patterns, and log all CRDB queries for troubleshooting.

Best Practices for Netherlands Phone Number Handling

  • Validate all formats: Build a validation function that checks all valid Dutch number types and rejects known fraud-prone prefixes.
  • Store in international format: Use E.164 format (+31xxxxxxxx) for consistency and international compatibility.
  • Format for display: Display numbers with appropriate formatting (020 1234 567 for landlines, 06 1234 5678 for mobile).
  • Implement CRDB lookups: Query the Central Reference Database daily to maintain accurate routing for ported numbers.
  • Handle portability windows: Account for the 1-3 business day porting window and implement retry logic for failed deliveries during transitions.
  • Privacy by design: Minimize phone number storage duration, encrypt sensitive data at rest and in transit, and implement proper access controls.
  • Testing strategy: Maintain test numbers for each prefix type, use staging environments that mirror production, and implement automated validation test suites.

Keeping Up-to-Date with Dutch Telecom Regulations

Telecommunications regulations and technical requirements change regularly. Monitor these official sources:

  • ACM (Netherlands Authority for Consumers and Markets): acm.nl/en – Primary regulatory authority for numbering, consumer protection, and competition
  • RDI (Rijksinspectie Digitale Infrastructuur): Dutch Authority for Digital Infrastructure (rebranded from Agentschap Telecom in January 2023) – Oversees telecommunications infrastructure, digital security, and frequency management
  • Business.gov.nl: Official guidance on corporate and information phone numbers
  • Vereniging COIN: coin.nl/en – Manages CRDB and number portability infrastructure

2025 Enforcement Updates: As of July 1, 2025, the ACM intensified enforcement of telemarketing rules with mandatory compliance audits. Violations trigger administrative fines and periodic penalty payments. Ensure compliance with consent verification, transparent pricing disclosure, and call recording requirements.