phone number standards

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

Poland Phone Numbers: Format, Area Code & Validation Guide

Validate Polish phone numbers: +48 country code, 9-digit format, mobile prefixes 4-8, area codes, UKE regulations, number portability. Includes regex examples.

Poland Phone Numbers: Format, Area Code & Validation Guide

Implement Polish phone number validation in your applications with the +48 country code. This comprehensive guide covers Poland's 9-digit number format, area codes for major cities like Warsaw (22) and Kraków (12), mobile prefixes (4-8), UKE regulations, and number portability rules for seamless integration with Poland's telecommunications system.

Poland Quick Reference

CategoryDetails
Country Code+48
Number Length9 digits (excluding country code)
International Format+48 XXX XXX XXX
ISO CodesPL (Alpha-2), POL (Alpha-3)
Regulatory AuthorityUKE (Urząd Komunikacji Elektronicznej / Office of Electronic Communications)
Number TypesGeographic (landlines), Mobile (4xx-8xx), Toll-Free (800), Premium (70x), Shared Cost (801), VoIP (39x)
Porting Time1 working day (max 3 hours disruption)
Porting Success Rate>98%
Emergency Number112 (EU standard)
Time ZoneCET (UTC+1), CEST (UTC+2 in summer)

Sources: UKE official numbering documentation, Wikipedia Telephone numbers in Poland, ECL 2024 (verified October 2025)

Regulatory Framework

Poland's telecommunications sector operates under the Telecommunications Act of 2004, covering telecommunications activities, operator and user rights, market regulation, universal service, consumer protection, and resource management (numbering, frequencies, orbital resources). UKE (Office of Electronic Communications) enforces these regulations and ensures compliance.

The Electronic Communications Law (ECL), effective November 10, 2024, replaced the 2004 Act and modernized the framework. The ECL extends regulation to online communication services and strengthens consumer protection.

Key 2024-2025 Regulatory Updates:

  • ECL Effective Date: November 10, 2024 (replaces 2004 Telecommunications Act)
  • UKE Register Update Deadline: May 10, 2025 (telecoms must update registration data)
  • Scope Expansion: ECL now covers online communication services (email, messaging apps, video conferencing)
  • Anti-Abuse Measures: September 25, 2024 – New Act on Counteracting Abuse in Electronic Communications (CAEC) introduces smishing protection, CLI spoofing prevention, and email authentication requirements

CAEC Compliance Requirements:

  • SMS Blocking Systems: Implement automated systems to block SMS matching smishing templates within 6 months of CAEC enactment (deadline: March 25, 2025)
  • CLI Spoofing Prevention: Deploy voice call blocking or caller ID masking systems within 12 months (deadline: September 25, 2025)
  • Email Authentication: Providers serving 500,000+ users must implement SPF (Sender Policy Framework), DMARC (Domain-based Message Authentication Reporting and Conformance), and DKIM (DomainKeys Identified Mail) protocols
  • Data Retention: Maintain logs of blocked communications for 12 months to support complaint handling
  • Smishing Detection: Integrate with CSIRT NASK's ICT system to receive and act on smishing message templates within required timeframes
  • Penalties: Administrative fines up to 3% of the previous calendar year's revenue for non-compliance; criminal sanctions for fraudulent electronic communications abuse

Sources: Poland Legal500, Mondaq ECL analysis, UKE official notices, Lexology regulatory updates, Chambers CAEC analysis (verified October 2025)

What Are the Phone Number Formats in Poland?

Polish phone numbers contain exactly 9 digits, excluding the +48 country code for international calls. Understanding these formats is essential for phone number validation and international calling. Implement validation for these six number types:

1. Geographic Numbers (Landlines)

  • Format: xx xxx xx xx (within Poland), +48 xx xxx xx xx (international)
  • Structure: First 2 digits = area code, followed by 7-digit subscriber number
  • Example: Warsaw landline 22 123 45 67. From the US, dial 011 48 22 123 45 67 (see our guide on E.164 phone format for international dialing).

Use these common area codes for geographic validation:

CityArea CodeRegion/Voivodeship
Warsaw22Masovian
Kraków12Lesser Poland
Wrocław71Lower Silesian
Gdańsk58Pomeranian
Poznań61Greater Poland
Łódź42Łódź
Katowice32Silesian
Lublin81Lublin
Szczecin91West Pomeranian
Bydgoszcz52Kuyavian-Pomeranian

Geographic Area Code Mapping: Polish area codes correspond to major cities and surrounding regions, not to voivodeships (administrative regions). Multiple cities may share area codes with surrounding towns. For complete area code allocations, consult UKE's numbering database.

2. Mobile Numbers

  • Format: xxx xxx xxx (within Poland), +48 xxx xxx xxx (international)
  • Structure: 9 digits starting with 4, 5, 6, 7, or 8. Prefixes were originally associated with specific operators, but number portability now lets users switch operators while keeping their number.
  • Example: Mobile number 601 123 456. From the UK, dial 00 48 601 123 456.

Major Operator Prefix Ranges (Original Allocation):

OperatorExample PrefixesNotes
Orange50x, 51x, 60x, 69x, 78xLargest operator, ~14M subscribers
Play45x, 50x, 72x, 78x, 88xPart of Iliad group
Plus50x, 60x, 78x, 79xMerged with Aero2
T-Mobile50x, 60x, 72x, 78x, 88xStrong 5G coverage

Important: Due to number portability (operational since 2006), the prefix no longer guarantees the current operator. Treat any mobile number starting with 4, 5, 6, 7, or 8 as valid regardless of operator. For WhatsApp and messaging apps, Polish mobile numbers follow the same +48 XXX XXX XXX format.

Sources: Wikipedia Telephone numbers in Poland, CallingCardPlus Poland codes, Poland mobile operator market analysis (verified October 2025)

3. Toll-Free Numbers

  • Format: 800 xxx xxx (within Poland), +48 800 xxx xxx (international)
  • Structure: Starts with 800, followed by 6-digit subscriber number
  • Billing: Free for callers; the service provider pays all charges
  • Regulations: UKE mandates that organizations using 800 numbers maintain 99.9% uptime.
  • Example: 800 123 456

Registration Requirements:

  • Personal Use: Name, contact phone, passport or ID copy, worldwide address
  • Business Use: Company name, contact details, company incorporation certificate, worldwide address
  • Activation Time: Typically 1-3 business days after document verification
  • Typical Costs: Monthly fees range from €3-15 depending on provider; incoming call charges apply (€0.02/min fixed, €0.07/min mobile)

Use Cases: Customer support hotlines, sales inquiries, complaint departments, emergency services for businesses requiring maximum accessibility.

Sources: DIDWW Poland regulatory requirements, Zadarma Poland toll-free pricing, Poland Telecommunications Act (verified October 2025)

4. Premium Rate Numbers

  • Format: 70x xxx xx xx (within Poland), +48 70x xxx xx xx (international)
  • Structure: Starts with 70, followed by a digit indicating the rate tier, and then a 7-digit subscriber number.
  • Pricing Tiers:
    • 701-703: Standard rate (general premium services, typically per-minute charging)
    • 704-706: Enhanced rate (higher-value services)
    • 707-709: Premium rate (tele-voting, mass-calls, highest per-call or per-minute rates)
  • Regulations: The Telecommunications Act subjects premium rate services to specific regulations regarding pricing transparency, maximum call duration, and mandatory cost disclosures. The President of UKE maintains a public register of premium-rate numbers based on Article 345 of the Electronic Communications Law.
  • Consumer Protection: Providers must clearly disclose pricing before call connection and provide cost transparency throughout the call.
  • Example: 703 123 45 67 (standard premium), 707 123 45 67 (premium tele-voting)

Sources: UKE Consumer Information Center (cik.uke.gov.pl), Wikipedia premium-rate telephone numbers, ECL Article 345 (verified October 2025)

5. Shared Cost Numbers

  • Format: 801 xxx xxx (within Poland), +48 801 xxx xxx (international)
  • Structure: Starts with 801, followed by 6-digit subscriber number
  • Billing: Caller pays local rate, service provider covers long-distance component
  • Example: 801 123 456

When to Use Shared Cost vs. Toll-Free:

  • Use 801 (Shared Cost) when: Providing support services where caller contribution is reasonable; operating help desks for existing customers; maintaining product support lines
  • Use 800 (Toll-Free) when: Maximizing customer accessibility; handling sales inquiries; managing complaint hotlines; providing emergency or critical services

Registration: Similar requirements to toll-free numbers (identity verification, company documentation for businesses, address verification).

Sources: Poland Telecommunications Act, DIDWW regulatory requirements (verified October 2025)

6. VoIP Numbers

  • Format: 39x xxx xxx (within Poland), +48 39x xxx xxx (international)
  • Structure: Starts with 39, followed by a 7-digit subscriber number.
  • Regulations: UKE technical standards require SIP protocol support, QoS monitoring, failover mechanisms, and emergency service routing (112).
  • Example: 391 123 456

VoIP Setup Requirements:

  • Technical: SIP-compliant infrastructure, Quality of Service (QoS) monitoring, redundancy/failover systems
  • Compliance: Emergency calling (112) routing capability, telecommunications secrecy adherence, ECL 2024 compliance
  • Registration: Identity verification (personal or business), address worldwide, contact information

Sources: UKE technical standards, DIDWW Poland requirements, ECL 2024 (verified October 2025)

How to Validate Polish Phone Numbers

Validate Polish phone numbers to ensure data integrity and prevent communication errors. Whether you're implementing phone number validation in JavaScript, Python, or other languages, use these regex patterns and code examples for accurate validation of Poland's +48 country code format:

typescript
// Comprehensive validation with error types
enum PolishNumberType {
  Mobile = 'MOBILE',
  Geographic = 'GEOGRAPHIC',
  TollFree = 'TOLL_FREE',
  PremiumRate = 'PREMIUM_RATE',
  SharedCost = 'SHARED_COST',
  VoIP = 'VOIP',
  Invalid = 'INVALID'
}

interface ValidationResult {
  isValid: boolean;
  type: PolishNumberType;
  formatted: string;
  error?: string;
}

const validatePolishNumber = (input: string): ValidationResult => {
  // Normalize input: remove spaces, parentheses, hyphens, leading zeros
  let normalized = input.replace(/[\s()\-]/g, '');

  // Handle international prefix variations
  if (normalized.startsWith('+48')) {
    normalized = normalized.substring(3);
  } else if (normalized.startsWith('0048')) {
    normalized = normalized.substring(4);
  } else if (normalized.startsWith('48') && normalized.length === 11) {
    normalized = normalized.substring(2);
  }

  // Must be exactly 9 digits after normalization
  if (!/^\d{9}$/.test(normalized)) {
    return {
      isValid: false,
      type: PolishNumberType.Invalid,
      formatted: input,
      error: 'Polish numbers must be exactly 9 digits (excluding country code)'
    };
  }

  // Validate by number type
  if (/^[4-8]\d{8}$/.test(normalized)) {
    return {
      isValid: true,
      type: PolishNumberType.Mobile,
      formatted: `+48 ${normalized.substring(0,3)} ${normalized.substring(3,6)} ${normalized.substring(6)}`
    };
  } else if (/^800\d{6}$/.test(normalized)) {
    return {
      isValid: true,
      type: PolishNumberType.TollFree,
      formatted: `+48 ${normalized.substring(0,3)} ${normalized.substring(3,6)} ${normalized.substring(6)}`
    };
  } else if (/^801\d{6}$/.test(normalized)) {
    return {
      isValid: true,
      type: PolishNumberType.SharedCost,
      formatted: `+48 ${normalized.substring(0,3)} ${normalized.substring(3,6)} ${normalized.substring(6)}`
    };
  } else if (/^70\d{7}$/.test(normalized)) {
    return {
      isValid: true,
      type: PolishNumberType.PremiumRate,
      formatted: `+48 ${normalized.substring(0,3)} ${normalized.substring(3,6)} ${normalized.substring(6,8)} ${normalized.substring(8)}`
    };
  } else if (/^39\d{7}$/.test(normalized)) {
    return {
      isValid: true,
      type: PolishNumberType.VoIP,
      formatted: `+48 ${normalized.substring(0,3)} ${normalized.substring(3,6)} ${normalized.substring(6)}`
    };
  } else if (/^\d{9}$/.test(normalized)) {
    // Geographic number (landline) - starts with 2-digit area code
    return {
      isValid: true,
      type: PolishNumberType.Geographic,
      formatted: `+48 ${normalized.substring(0,2)} ${normalized.substring(2,5)} ${normalized.substring(5,7)} ${normalized.substring(7)}`
    };
  }

  return {
    isValid: false,
    type: PolishNumberType.Invalid,
    formatted: input,
    error: 'Number does not match any valid Polish format'
  };
};

// Example usage with error handling
console.log(validatePolishNumber("+48 601 123 456"));
// { isValid: true, type: 'MOBILE', formatted: '+48 601 123 456' }

console.log(validatePolishNumber("800 123 456"));
// { isValid: true, type: 'TOLL_FREE', formatted: '+48 800 123 456' }

console.log(validatePolishNumber("123 456"));
// { isValid: false, type: 'INVALID', error: 'Polish numbers must be exactly 9 digits...' }
python
import re
from enum import Enum
from typing import Dict, Optional

class PolishNumberType(Enum):
    MOBILE = "mobile"
    GEOGRAPHIC = "geographic"
    TOLL_FREE = "toll_free"
    PREMIUM_RATE = "premium_rate"
    SHARED_COST = "shared_cost"
    VOIP = "voip"
    INVALID = "invalid"

def validate_polish_number(input_number: str) -> Dict[str, any]:
    """
    Validates Polish phone numbers with comprehensive error handling.

    Returns:
        dict: {
            'is_valid': bool,
            'type': PolishNumberType,
            'formatted': str,
            'error': Optional[str]
        }
    """
    # Normalize: remove whitespace, parentheses, hyphens, plus signs
    normalized = re.sub(r"[\s()\-+]", "", input_number)

    # Handle international prefix variations
    if normalized.startswith('48') and len(normalized) == 11:
        normalized = normalized[2:]
    elif normalized.startswith('0048'):
        normalized = normalized[4:]

    # Must be exactly 9 digits
    if not re.match(r'^\d{9}$', normalized):
        return {
            'is_valid': False,
            'type': PolishNumberType.INVALID,
            'formatted': input_number,
            'error': 'Polish numbers must be exactly 9 digits (excluding country code)'
        }

    # Validate by type
    if re.match(r'^[4-8]\d{8}$', normalized):  # Mobile
        return {
            'is_valid': True,
            'type': PolishNumberType.MOBILE,
            'formatted': f'+48 {normalized[:3]} {normalized[3:6]} {normalized[6:]}'
        }
    elif re.match(r'^800\d{6}$', normalized):  # Toll-free
        return {
            'is_valid': True,
            'type': PolishNumberType.TOLL_FREE,
            'formatted': f'+48 {normalized[:3]} {normalized[3:6]} {normalized[6:]}'
        }
    elif re.match(r'^801\d{6}$', normalized):  # Shared cost
        return {
            'is_valid': True,
            'type': PolishNumberType.SHARED_COST,
            'formatted': f'+48 {normalized[:3]} {normalized[3:6]} {normalized[6:]}'
        }
    elif re.match(r'^70\d{7}$', normalized):  # Premium rate
        return {
            'is_valid': True,
            'type': PolishNumberType.PREMIUM_RATE,
            'formatted': f'+48 {normalized[:3]} {normalized[3:6]} {normalized[6:8]} {normalized[8:]}'
        }
    elif re.match(r'^39\d{7}$', normalized):  # VoIP
        return {
            'is_valid': True,
            'type': PolishNumberType.VOIP,
            'formatted': f'+48 {normalized[:3]} {normalized[3:6]} {normalized[6:]}'
        }
    elif re.match(r'^\d{9}$', normalized):  # Geographic (landline)
        return {
            'is_valid': True,
            'type': PolishNumberType.GEOGRAPHIC,
            'formatted': f'+48 {normalized[:2]} {normalized[2:5]} {normalized[5:7]} {normalized[7:]}'
        }

    return {
        'is_valid': False,
        'type': PolishNumberType.INVALID,
        'formatted': input_number,
        'error': 'Number does not match any valid Polish format'
    }

# Example usage
print(validate_polish_number("+48 601 123 456"))
# {'is_valid': True, 'type': PolishNumberType.MOBILE, 'formatted': '+48 601 123 456'}

print(validate_polish_number("12345"))
# {'is_valid': False, 'type': PolishNumberType.INVALID, 'error': '...'}

Common Validation Errors:

  • Leading zeros: Polish domestic format doesn't use trunk prefix; remove any leading "0" before validation
  • Mixed formats: Users may input numbers with spaces, dashes, or parentheses; normalize before validation
  • Incorrect length: Numbers with fewer than 9 or more than 9 digits (excluding country code) are invalid
  • Invalid prefixes: Numbers starting with 0, 1, 2, 3, or 9 (except 39x for VoIP) are not valid mobile numbers
  • Country code variations: Accept +48, 0048, (48), and bare 48 prefix formats

Best Practices:

  • Update validation rules regularly to reflect changes in UKE numbering plans and ECL 2024 regulations
  • Consult UKE's official numbering database (numeracja.uke.gov.pl) for current number range allocations
  • Test validation against all number types: geographic, mobile, toll-free (800), premium (70x), shared cost (801), and VoIP (39x)
  • Handle international format variations: +48, 0048, (48), and domestic format without country code (see E.164 format guide)
  • Implement proper error messages indicating which number type failed validation
  • For high-volume validation: compile regex patterns once, use memoization for repeated validations, consider database caching for frequently validated numbers

Sources: UKE numbering database, ECL 2024 technical standards (verified October 2025)

How Does Number Portability Work in Poland?

UKE manages number portability, allowing consumers to keep their phone numbers when switching providers. Porting completes within 1 working day with maximum 3-hour service disruption. Poland achieves >98% porting success rate through a centralized database with real-time synchronization and standardized APIs.

Porting Process Requirements (UKE Regulations):

  1. Initiation: Customer signs agreement with new provider for service with number portability
  2. Notification Requirement: Existing provider must inform the subscriber within 24 hours via SMS or phone call that porting has been initiated
  3. Resignation Window: Subscriber can cancel porting up to 2 days before the planned porting date
  4. Completion Timeline: Porting occurs within 1 working day from the date specified in the new provider agreement
  5. Service Disruption: Maximum 3 hours of service interruption during the transfer

Porting Fees and Costs:

  • Consumer Charges: According to Poland's Telecommunications Act (Article 71), subscribers pay no fees for porting an assigned number. The porting process is free for end users.
  • Inter-Operator Fees: Operators may charge each other wholesale porting fees (historically capped at PLN 50 by UKE, though this may vary), but cannot pass these costs to consumers.
  • Contract Terms: New provider may require minimum contract term or prepaid credit, but cannot charge specifically for the porting service.

Troubleshoot Failed Porting:

  • Outstanding debt: Existing provider may block porting if customer has unpaid bills; resolve billing disputes before initiating port
  • Contract obligations: Active contract with penalties may need to be settled; check termination terms
  • Incorrect details: Verify name, address, and account number match existing provider's records exactly
  • Technical issues: Contact UKE consumer helpline if porting exceeds 1 working day without valid reason
  • Appeals: File complaint with UKE if provider wrongfully blocks or delays porting

Technical Implementation:

  • Centralized porting database (PLI CBD – Localization and Information Platform with Central Database) managed by UKE
  • Real-time synchronization across all operators
  • Standardized APIs for inter-operator communication
  • Automated validation and conflict resolution
  • Developer Note: Direct API access to PLI CBD is restricted to licensed telecommunications operators. Third-party developers must work through operator partnerships or use carrier-provided APIs that interface with the central database.

Sources: UKE number portability regulations, Poland Telecommunications Act (Article 71), ECL 2024, academic studies on Polish number portability (verified October 2025)

Consumer Protection

The ECL and related regulations enforce consumer protection through these key measures:

  • Cost Transparency: Providers must clearly communicate all pricing and charges before service activation
  • Contract Summaries: All agreements require simplified summaries of key contract terms
  • Termination Rights: Terminate contracts when services don't match agreed specifications
  • Complaint Resolution: Established procedures for handling and resolving consumer complaints
  • Data Protection: Strict data confidentiality and processing rules, aligned with GDPR requirements

UKE enforces these regulations and can impose penalties up to 3% of annual revenue for non-compliance, plus service suspension.

File Complaints with UKE:

  1. Contact Provider First: Attempt to resolve the issue directly with your telecommunications provider using their complaint process
  2. Document Everything: Keep records of communications, service issues, billing statements, and provider responses
  3. Consumer Information Center (CIK): Contact UKE's Consumer Information Center at cik.uke.gov.pl
    • Phone: +48 22 330 40 00 (main UKE line)
    • Address: Office of Electronic Communications, 7/9 Giełdowa Street, 01-211 Warsaw, Poland
    • Online: Use contact form on UKE website
  4. Out-of-Court Dispute Resolution: UKE provides mediation services for consumer-provider disputes
  5. Formal Complaint: Submit written complaint with:
    • Your contact details and account information
    • Description of the issue and timeline
    • Copies of supporting documentation (bills, contracts, correspondence)
    • Desired resolution
  6. Timeline: UKE aims to respond within 14-30 days depending on complexity
  7. Alternative: Contact UOKiK (Consumer Protection Office) for broader consumer rights issues

Sources: UKE Consumer Information Center, ECL 2024, UOKiK consumer protection guidelines (verified October 2025)

Frequently Asked Questions

What is the country code for Poland?

The country code for Poland is +48. Dial all international calls to Poland with +48 followed by the 9-digit Polish phone number. For example, from the US, dial 011-48-XXX-XXX-XXX. The +48 prefix identifies all Polish numbers internationally, whether mobile or landline.

How many digits are in a Polish phone number?

Polish phone numbers are exactly 9 digits long, excluding the country code (+48). This standardized length applies to all number types: geographic (landlines), mobile, toll-free, premium-rate, shared cost, and VoIP numbers. No trunk code or leading zero is needed when dialing within Poland.

What prefixes do Polish mobile numbers start with?

Polish mobile numbers start with 4, 5, 6, 7, or 8. The full mobile number format is 9 digits: 4XX XXX XXX, 5XX XXX XXX, 6XX XXX XXX, 7XX XXX XXX, or 8XX XXX XXX. Within Poland, no trunk code prefix is needed. These mobile prefixes apply to all Polish carriers including Orange, Play, Plus, and T-Mobile.

How long does number portability take in Poland?

Number portability in Poland takes 1 working day with a maximum service disruption of 3 hours. Poland has a >98% porting success rate. The existing provider must notify the customer within 24 hours when porting is initiated, and customers can cancel up to 2 days before the scheduled porting date. Porting is free for consumers under Polish law.

What is the UKE and what does it regulate?

UKE (Urząd Komunikacji Elektronicznej / Office of Electronic Communications) is Poland's telecommunications regulator. UKE enforces the Electronic Communications Law (effective November 10, 2024), manages number portability, maintains the numbering plan, regulates pricing transparency, and can impose fines up to 3% of annual revenue for non-compliance.

Are VoIP numbers in Poland different from regular phone numbers?

Yes. Polish VoIP numbers start with 39 (format: 39X XXX XXX) and are 9 digits long. VoIP implementations must comply with UKE technical standards including SIP protocol support, QoS monitoring, failover mechanisms, and emergency service routing (112 compatibility). The international format is +48 39X XXX XXX.

What are premium-rate numbers in Poland and how are they priced?

Premium-rate numbers in Poland start with 70 followed by a digit indicating the pricing tier: 701-703 (standard), 704-706 (enhanced), 707-709 (premium). These numbers charge higher per-minute or per-call rates and are used for tele-voting, information services, and mass-call services. Providers must maintain transparency and register with UKE's public premium-rate register.

Best Practices for Polish Phone Number Integration

Implement systems that interact with Polish phone numbers with proper infrastructure, reliability, security, and regulatory compliance:

Infrastructure:

  • Sufficient network capacity with redundant connections
  • Geographic distribution across multiple data centers
  • SIP trunking integration with Polish carriers
  • Support for both local (geographic) and international termination

Reliability:

  • Target 99.99% uptime for critical telecommunications services
  • Automatic failover systems with health monitoring
  • Real-time monitoring and alerting for service disruptions
  • Compliance with UKE 99.9% uptime requirement for toll-free numbers

Security & CAEC Compliance:

  • DDoS Protection: Implement rate limiting and traffic filtering
  • Fraud Detection: Monitor for unusual call patterns, CLI spoofing attempts, and smishing
  • CLI Spoofing Prevention: Validate caller ID authenticity, block or mask spoofed calls per CAEC requirements (deadline: September 25, 2025)
  • SMS Filtering: Deploy automated smishing detection systems integrated with CSIRT NASK templates (deadline: March 25, 2025)
  • Email Authentication: Implement SPF, DMARC, and DKIM if serving 500,000+ users
  • Call Encryption: Use TLS/SRTP for VoIP communications
  • Audit Logging: Maintain 12-month logs of blocked communications for CAEC compliance

Number Formatting for Display:

typescript
// Format Polish number for display in different contexts
function formatPolishNumber(number: string, context: 'local' | 'international' | 'e164'): string {
  const validated = validatePolishNumber(number);

  if (!validated.isValid) {
    return number; // Return original if invalid
  }

  const normalized = number.replace(/\D/g, '').replace(/^(48|0048|\+48)/, '');

  switch (context) {
    case 'local':
      // Format for display within Poland (no country code)
      if (validated.type === PolishNumberType.Mobile) {
        return `${normalized.substring(0,3)} ${normalized.substring(3,6)} ${normalized.substring(6)}`;
      } else {
        return `${normalized.substring(0,2)} ${normalized.substring(2,5)} ${normalized.substring(5,7)} ${normalized.substring(7)}`;
      }

    case 'international':
      // Format with country code for international display
      return validated.formatted;

    case 'e164':
      // E.164 format for APIs and databases
      return `+48${normalized}`;

    default:
      return validated.formatted;
  }
}

// Examples
console.log(formatPolishNumber("601123456", "local"));         // "601 123 456"
console.log(formatPolishNumber("601123456", "international")); // "+48 601 123 456"
console.log(formatPolishNumber("601123456", "e164"));          // "+48601123456"

Performance Optimization:

  • Cache validated numbers with TTL to reduce repeated regex operations
  • Pre-compile regex patterns as constants
  • Use database indexes on phone number fields
  • Implement batch validation for bulk operations
  • Consider UKE numbering database local caching (update monthly)

Testing Strategy:

  • Unit tests covering all 6 number types (mobile, geographic, toll-free, premium, shared cost, VoIP)
  • Edge case tests (leading zeros, international prefixes, invalid lengths, special characters)
  • Integration tests with actual carrier APIs in staging environment
  • Load testing for high-volume validation scenarios
  • Compliance validation against UKE numbering plan updates

Sources: UKE technical standards, CAEC compliance requirements, ECL 2024, telecommunications security best practices (verified October 2025)

This guide provides a solid foundation for understanding and working with Polish phone numbers. Always refer to the official UKE website and the latest regulations for the most up-to-date information.