phone number standards

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

Guam Phone Numbers: Format, Area Code & Validation Guide

Comprehensive developer guide for Guam phone numbers including validation, area code 671, NANP integration, and number portability

Guam Phone Numbers: Format, Area Code & Validation Guide

Introduction

Developing an application that handles Guam phone numbers? This comprehensive guide covers everything developers need to know about the Guam phone number system, including the 671 area code, NANP integration, validation techniques, and number portability. You'll learn how to validate Guam phone numbers programmatically, understand dialing procedures, implement number porting, and follow telecommunications best practices for the U.S. territory.

Background: Guam's Telecommunications Landscape and Area Code 671

NANP Integration and Regulatory Framework

Guam's telecommunications system is deeply integrated with the North American Numbering Plan (NANP), a testament to its status as a U.S. territory. This integration, finalized in 1997, simplified communication with North America and brought Guam into a standardized numbering system. The Federal Communications Commission (FCC) maintains regulatory oversight over Guam telecommunications under Title 47 of the U.S. Code, ensuring compliance with federal telecommunications regulations.

Practical Implications for Developers:

  • Domestic Routing: Calls between Guam and the U.S. mainland are treated as domestic within the NANP, avoiding international gateway routing
  • Rate Treatment: No international dialing prefixes required; standard NANP long-distance rates apply
  • Database Integration: Guam numbers participate in shared NANP databases including NPAC (Number Portability Administration Center) and LNP (Local Number Portability)
  • Compliance Requirements: Applications must adhere to FCC regulations including TCPA (Telephone Consumer Protection Act) for automated dialing and TRACED Act requirements for caller ID authentication

Regulatory Authority:

  • FCC: Primary federal regulator for interstate and international communications
  • Guam Public Utilities Commission (PUC): Local regulatory body for intra-territory services
  • NANPA: North American Numbering Plan Administrator manages number allocation and central office code assignments

Before 1997 integration, as detailed in historical accounts from the Guam Recorder, calling the U.S. mainland involved international dialing procedures and significantly higher costs, impacting communication with family and businesses.

Guam Phone Number Structure: Understanding the 671 Area Code Format

Guam phone numbers adhere to the NANP structure, making them easy to integrate into applications designed for North American numbers. Here's the breakdown:

Core Components

ComponentValueDescription
Country Code+1Shared with other NANP members
Area Code671Unique to Guam
Subscriber Number7 digitsLocal phone number (NXX-XXXX)
Total Length10 digits (national)12 digits (international with +1)

Format Variations and Examples

While the basic structure remains consistent, you'll encounter variations based on the service type:

TypeFormatExampleUsage
Landline+1 671 NXX XXXX+1 671 472 1234Fixed location services
Mobile+1 671 NXX XXXX+1 671 988 5678Cellular services
Toll-Free+1 800 XXX XXXX+1 800 234 5678No-cost calling
Premium Rate+1 900 XXX XXXX+1 900 345 6789Pay-per-call services

Note on Line Type Detection: Unlike some countries with dedicated mobile prefixes, NANP does not distinguish landline from mobile at the number level. Programmatic detection requires querying carrier databases or using specialized APIs like CNAM (Caller Name) lookup services or HLR (Home Location Register) lookups that return line type information.

NXX Exchange Code Rules and Restrictions

Key Point: N represents digits 2–9 (excluding 0 and 1), while X can be any digit 0–9. This distinction is crucial for accurate validation.

Reserved and Restricted NXX Codes:

  • N11 Codes: Reserved for special services (211-information, 311-non-emergency, 411-directory, 511-traffic, 611-repair, 711-relay, 811-utilities, 911-emergency)
  • 555-01XX: Reserved for fictional use in media and testing (555-0100 through 555-0199)
  • 555-XXXX: Mostly reserved except 555-0100 to 555-0199 for actual directory assistance in some areas
  • 958/959 Prefixes: Often used for carrier network testing and should be blocked from customer assignment
  • NPA-555-1212: Standard directory assistance format across NANP
  • Prohibited Formats: NXX cannot be N00 or N11 where N = 2–9

Valid NXX Pattern: [2-9][0-8][0-9] or [2-9][0-9][0-9] excluding the specific reserved patterns listed above.

How to Validate Guam Phone Numbers: Ensuring Data Integrity

Robust validation is essential for any application handling phone numbers. While regular expressions provide basic validation, production applications should use comprehensive libraries.

Regex Patterns for Guam Numbers

Here are regex patterns with comprehensive edge case handling:

javascript
// Basic Guam number validation (international format)
const guamRegex = /^\+1\s671\s[2-9][0-9]{2}\s[0-9]{4}$/;

// Extended validation with optional formatting (handles spaces, hyphens, parentheses)
const extendedRegex = /^\+?1?\s*\(?671\)?[-.\s]?[2-9]\d{2}[-.\s]?\d{4}$/;

// Comprehensive validation excluding reserved ranges
const comprehensiveRegex = /^\+?1?\s*\(?671\)?[-.\s]?(?!555(?:01[0-9][0-9])|[2-9]11)([2-9]\d{2})[-.\s]?\d{4}$/;

// Usage example with error handling
function validateGuamNumber(phoneNumber) {
  if (!phoneNumber || typeof phoneNumber !== 'string') {
    return { valid: false, error: 'Invalid input type' };
  }

  const isValid = extendedRegex.test(phoneNumber);

  if (!isValid) {
    return { valid: false, error: 'Number does not match Guam format' };
  }

  // Check for reserved ranges
  const digits = phoneNumber.replace(/\D/g, '');
  const exchange = digits.substr(4, 3);

  if (exchange.match(/^[2-9]11$/)) {
    return { valid: false, error: 'Reserved N11 service code' };
  }

  return { valid: true, normalized: `+1671${digits.substr(-7)}` };
}

Production-Ready Validation Libraries

For production applications, use battle-tested validation libraries instead of custom regex:

Google libphonenumber

  • Language Support: Java (original), JavaScript, C++, Python, and 20+ community ports
  • Key Features: Parse, format, validate phone numbers for 250+ countries; detect number type (mobile, landline, toll-free); carrier and timezone detection
  • npm Package: libphonenumber-js (JavaScript/TypeScript)
  • Python Package: phonenumbers
javascript
// JavaScript example with libphonenumber-js
import { parsePhoneNumber, isValidPhoneNumber } from 'libphonenumber-js';

function validateGuamNumberProduction(input) {
  try {
    if (!isValidPhoneNumber(input, 'GU')) {
      return { valid: false, error: 'Invalid Guam phone number' };
    }

    const phoneNumber = parsePhoneNumber(input, 'GU');

    return {
      valid: true,
      e164: phoneNumber.format('E.164'),
      national: phoneNumber.formatNational(),
      international: phoneNumber.formatInternational(),
      type: phoneNumber.getType(), // Returns 'MOBILE', 'FIXED_LINE', etc.
      country: phoneNumber.country,
      areaCode: phoneNumber.nationalNumber.substr(0, 3)
    };
  } catch (error) {
    return { valid: false, error: error.message };
  }
}
python
# Python example with phonenumbers library
import phonenumbers
from phonenumbers import NumberParseException, carrier, geocoder

def validate_guam_number_production(input_number):
    try:
        parsed = phonenumbers.parse(input_number, "GU")

        if not phonenumbers.is_valid_number(parsed):
            return {"valid": False, "error": "Invalid Guam phone number"}

        return {
            "valid": True,
            "e164": phonenumbers.format_number(parsed, phonenumbers.PhoneNumberFormat.E164),
            "national": phonenumbers.format_number(parsed, phonenumbers.PhoneNumberFormat.NATIONAL),
            "international": phonenumbers.format_number(parsed, phonenumbers.PhoneNumberFormat.INTERNATIONAL),
            "type": phonenumbers.number_type(parsed),
            "carrier": carrier.name_for_number(parsed, "en"),
            "location": geocoder.description_for_number(parsed, "en")
        }
    except NumberParseException as e:
        return {"valid": False, "error": str(e)}

Comprehensive Test Cases

Test your validation against diverse inputs including edge cases:

javascript
const testCases = [
  // Valid formats
  { input: '+16714721234', expected: true, description: 'E.164 format' },
  { input: '+1 671 472 1234', expected: true, description: 'E.164 with spaces' },
  { input: '(671) 472-1234', expected: true, description: 'National with parentheses' },
  { input: '671-472-1234', expected: true, description: 'National with hyphens' },
  { input: '1-671-472-1234', expected: true, description: 'NANP format with country code' },

  // Invalid formats
  { input: '+16710721234', expected: false, description: 'Invalid NXX (starts with 0)' },
  { input: '+16711721234', expected: false, description: 'Invalid NXX (starts with 1)' },
  { input: '+16719111234', expected: false, description: 'Reserved 911 emergency code' },
  { input: '+16714111234', expected: false, description: 'Reserved 411 directory code' },
  { input: '+1671555011', expected: false, description: 'Reserved 555 test range' },
  { input: '+166712341234', expected: false, description: 'Wrong area code' },
  { input: '671472123', expected: false, description: 'Too short (missing digit)' },
  { input: '67147212345', expected: false, description: 'Too long (extra digit)' },
  { input: '+1671ABCDEFG', expected: false, description: 'Contains letters' },
  { input: '', expected: false, description: 'Empty string' },
  { input: null, expected: false, description: 'Null input' },

  // Edge cases
  { input: '+1 (671) 472-1234 ext. 100', expected: false, description: 'Number with extension (requires special handling)' },
  { input: '  +1 671 472 1234  ', expected: true, description: 'Extra whitespace (should trim)' },
  { input: '+1.671.472.1234', expected: true, description: 'Dots as separators' }
];

// Run test suite
function runValidationTests() {
  testCases.forEach(test => {
    const result = validateGuamNumber(test.input);
    const passed = result.valid === test.expected;
    console.log(`${passed ? '✓' : '✗'} ${test.description}: ${test.input}`);
    if (!passed) {
      console.log(`  Expected: ${test.expected}, Got: ${result.valid}`);
      if (result.error) console.log(`  Error: ${result.error}`);
    }
  });
}

Dialing Procedures: How to Call Guam Phone Numbers

Understanding dialing procedures is crucial for applications that initiate or process calls. Here are the variations for domestic and international calls.

Domestic Calls within Guam

  • Local Calls: Dial the 7-digit subscriber number (XXX-XXXX).
  • Mobile-to-Mobile/Landline-to-Mobile: Dial 1 + 671 + the 7-digit number. The "1" signifies a domestic long-distance call within the NANP.

International Calls and Rate Information

  • Outbound from Guam: Dial 011 (international prefix) + Country Code + Number.
  • Inbound to Guam: Dial +1 671 + Local Number. The "+1" clearly identifies Guam within the NANP.

Cost Implications:

  • Calls to/from U.S. Mainland: Treated as domestic long-distance; rates typically $0.05–$0.15 per minute depending on carrier and plan
  • International Calls from Guam: Standard international rates apply; vary by destination country ($0.10–$3.00+ per minute)
  • Rate Zone Classification: Guam is classified as NANP Zone 1, same as U.S., Canada, and Caribbean territories
  • VoIP Considerations: Internet-based calling (WhatsApp, Skype, etc.) may bypass traditional telecom rates entirely

Important for Developers: Applications that bill for call services must clearly disclose rate information and obtain user consent per FCC TCPA requirements.

Guam Number Portability: How to Port Phone Numbers Between Carriers

Number portability allows users to retain their numbers when switching carriers. This adds complexity for developers, but it's a crucial aspect of modern telecommunications. As documented by the FCC in DA 05-2714, Guam's implementation of wireless number portability has faced challenges due to infrastructure dependencies and coordination between carriers.

Porting Process and Implementation

The porting process involves several steps, including customer requests, carrier verification, and database updates. You'll need to integrate with number portability databases and handle potential delays or errors.

Key Considerations:

  • Real-time NPAC Integration: Connect to the Number Portability Administration Center (NPAC) database for accurate porting information.
  • Automated Validation: Implement automated communication between carriers for efficient verification.
  • Standardized Request Handling: Use Local Service Request (LSR) forms for consistent processing.
  • Emergency Services Routing: Ensure emergency services are correctly routed during and after the porting process.

Porting Timeline Standards and Implementation Example

Porting timelines vary based on the complexity of the request:

Port TypeMaximum DurationValidation Fields
Simple1 business day4 fields max
Complex4 business daysAdditional verification
Emergency4 hoursExpedited process
javascript
// Example Number Portability Validation with comprehensive error handling
function validatePortingRequest(request) {
  const requiredFields = ["accountNumber", "pin", "zipCode", "lastFourSSN"];
  const errors = [];

  // Check required fields
  requiredFields.forEach(field => {
    if (!request.hasOwnProperty(field) || !request[field]) {
      errors.push(`Missing required field: ${field}`);
    }
  });

  // Validate phone number format
  if (!request.phoneNumber || !validateGuamNumber(request.phoneNumber).valid) {
    errors.push("Invalid phone number format");
  }

  // Validate account number (typically alphanumeric, 6-20 characters)
  if (request.accountNumber && !/^[A-Z0-9]{6,20}$/i.test(request.accountNumber)) {
    errors.push("Invalid account number format");
  }

  // Validate PIN (typically 4-6 digits)
  if (request.pin && !/^\d{4,6}$/.test(request.pin)) {
    errors.push("Invalid PIN format (must be 4-6 digits)");
  }

  // Validate ZIP code (5 or 9 digits)
  if (request.zipCode && !/^\d{5}(-\d{4})?$/.test(request.zipCode)) {
    errors.push("Invalid ZIP code format");
  }

  return {
    valid: errors.length === 0,
    errors: errors
  };
}

Common Porting Error Codes and Failure Scenarios

Understanding error codes helps implement robust retry and user notification logic:

Error CodeDescriptionResolution
E1001Invalid account numberVerify account details with old carrier; user must provide correct account number
E1002PIN/Password mismatchUser must confirm PIN/password; may need to reset with current carrier
E1003Address mismatchBilling address must match carrier records; update with current carrier first
E1004Number not portableNumber may be landline-only or in contract; contact current carrier
E1005Port already in progressWait for current port to complete (typically 1–4 days)
E1006CSR (Customer Service Record) mismatchCustomer info doesn't match carrier database; verify all details
E2001NPAC database timeoutTemporary issue; retry after 15–30 minutes
E2002Carrier system unavailableWait for carrier system maintenance to complete; retry in 1–4 hours
E3001Duplicate port requestPort already completed or request submitted twice
E3002FOC (Firm Order Commitment) date conflictRequested activation date unavailable; select alternate date
javascript
// Webhook implementation for async porting status updates
class PortingWebhookHandler {
  constructor(webhookUrl) {
    this.webhookUrl = webhookUrl;
    this.maxRetries = 3;
    this.retryDelay = 5000; // 5 seconds
  }

  async handlePortingUpdate(portRequest) {
    const payload = {
      requestId: portRequest.id,
      phoneNumber: portRequest.phoneNumber,
      status: portRequest.status, // 'pending', 'in_progress', 'completed', 'failed'
      timestamp: new Date().toISOString(),
      details: {
        oldCarrier: portRequest.currentProvider,
        newCarrier: portRequest.newProvider,
        focDate: portRequest.focDate, // Firm Order Commitment date
        errorCode: portRequest.errorCode,
        errorMessage: portRequest.errorMessage
      }
    };

    for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
      try {
        const response = await fetch(this.webhookUrl, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'X-Webhook-Signature': this.generateSignature(payload)
          },
          body: JSON.stringify(payload)
        });

        if (response.ok) {
          console.log(`Webhook delivered successfully on attempt ${attempt}`);
          return true;
        }

        console.log(`Webhook attempt ${attempt} failed with status ${response.status}`);
      } catch (error) {
        console.error(`Webhook attempt ${attempt} error:`, error.message);
      }

      if (attempt < this.maxRetries) {
        await this.sleep(this.retryDelay * attempt); // Exponential backoff
      }
    }

    // Log failed webhook for manual retry
    console.error('Webhook delivery failed after all retries', payload);
    return false;
  }

  generateSignature(payload) {
    // Implement HMAC-SHA256 signature for webhook security
    const crypto = require('crypto');
    const secret = process.env.WEBHOOK_SECRET;
    return crypto
      .createHmac('sha256', secret)
      .update(JSON.stringify(payload))
      .digest('hex');
  }

  sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
  }
}

// Usage example
const webhookHandler = new PortingWebhookHandler('https://your-app.com/webhooks/porting');

// Simulate porting status update
await webhookHandler.handlePortingUpdate({
  id: 'PORT-12345',
  phoneNumber: '+16714721234',
  status: 'completed',
  currentProvider: 'GTA',
  newProvider: 'DocomoPacific',
  focDate: '2024-10-10T12:00:00Z'
});

Major Guam Telecom Carriers and Service Providers

Understanding the major operators in Guam can be beneficial for your development efforts. Here's a detailed overview with technical specifications:

GTA (Guam Telephone Authority)

  • Coverage: Island-wide coverage with extensive rural reach
  • Services: Mobile, broadband, landlines, government priority lines
  • Network Technology: 4G LTE (Band 2, 4, 12, 66), expanding 5G deployment
  • API Availability: Wholesale carrier APIs available for enterprise integrations
  • Technical Contact: developers@gta.net (Note: Verify current contact)

Docomo Pacific

  • Coverage: Focused on urban centers (Tumon, Hagåtña, Tamuning) and tourist areas
  • Services: 5G mobile, international roaming, enterprise solutions
  • Network Technology: 5G NR (n77, n78 bands), 4G LTE (Band 2, 4, 5, 12, 29, 30, 66)
  • International Roaming: "Data To Go" packages available in U.S., Japan, and select Asia-Pacific countries (per Docomo Pacific Terms)
  • API Availability: REST APIs for account management and usage queries (requires business account)
  • Developer Portal: developer.docomopacific.com (Note: Verify URL)

IT&E Guam

  • Coverage: Island-wide with focus on business and IoT connectivity
  • Services: Mobile broadband, business solutions, IoT/M2M connectivity
  • Network Technology: 4G LTE (Band 2, 4, 5, 12, 66), LTE-Advanced
  • IoT/M2M Platform: Specialized APIs for device connectivity and fleet management
  • Technical Documentation: Available through business partnerships

Coverage Maps and Network Capabilities:

  • 4G LTE Coverage: All three carriers provide 95%+ population coverage; rural areas may have limited service
  • 5G Deployment: Primarily Docomo Pacific in urban areas; GTA and IT&E expanding gradually
  • Network Speed Benchmarks (Typical):
    • 4G LTE: 20–50 Mbps download, 5–15 Mbps upload
    • 5G: 100–300 Mbps download, 30–80 Mbps upload (where available)
  • API Integration Considerations: Contact carrier business departments for sandbox access, rate limits typically 100–1000 requests/hour depending on service tier

Technical Implementation: Best Practices for Guam Phone Number Integration

Following best practices ensures your application is robust, reliable, and compliant with industry standards.

E.164 Compliance: The Global Standard

The E.164 format is the international standard for phone numbers. Always store numbers in this format (+1671XXXXXXX) for consistency and interoperability.

Normalization Examples:

python
import re

def normalize_to_e164(phone_number):
    """Convert various Guam number formats to E.164 standard."""
    # Remove all non-digit characters
    digits = re.sub(r'\D', '', phone_number)

    # Handle different input lengths
    if len(digits) == 7:
        # Local format: add country code and area code
        return f'+1671{digits}'
    elif len(digits) == 10 and digits.startswith('671'):
        # National format: add country code
        return f'+1{digits}'
    elif len(digits) == 11 and digits.startswith('1671'):
        # NANP format: add + prefix
        return f'+{digits}'
    elif len(digits) == 11 and digits.startswith('1'):
        # Check if it's a Guam number
        if digits[1:4] == '671':
            return f'+{digits}'

    # Already in potential E.164 format or invalid
    return None

def validate_e164(phone_number):
    """Validate E.164 format for Guam numbers."""
    pattern = r'^\+1671[2-9]\d{6}$'
    return bool(re.match(pattern, phone_number))

# Example usage
examples = [
    '4721234',              # Local format
    '671-472-1234',         # National format with hyphens
    '(671) 472-1234',       # National format with parentheses
    '1-671-472-1234',       # NANP format
    '+1 671 472 1234'       # E.164 with spaces
]

for example in examples:
    normalized = normalize_to_e164(example)
    if normalized and validate_e164(normalized):
        print(f'✓ {example:20}{normalized}')
    else:
        print(f'✗ {example:20} → Invalid')
javascript
// JavaScript normalization example
function normalizeToE164(phoneNumber) {
  // Remove all non-digit characters
  const digits = phoneNumber.replace(/\D/g, '');

  // Handle different input lengths
  if (digits.length === 7) {
    // Local format: add country code and area code
    return `+1671${digits}`;
  } else if (digits.length === 10 && digits.startsWith('671')) {
    // National format: add country code
    return `+1${digits}`;
  } else if (digits.length === 11 && digits.startsWith('1671')) {
    // NANP format: add + prefix
    return `+${digits}`;
  }

  // Already in potential E.164 format or invalid
  return null;
}

function formatForDisplay(e164Number, locale = 'en-US') {
  // Format E.164 number for user-friendly display
  const match = e164Number.match(/^\+1(\d{3})(\d{3})(\d{4})$/);
  if (!match) return e164Number;

  const [, area, prefix, line] = match;

  // Return formatted based on locale preference
  return `(${area}) ${prefix}-${line}`;
}

// Example usage
const input = '671-472-1234';
const e164 = normalizeToE164(input);
const display = formatForDisplay(e164);
console.log(`Input: ${input}`);
console.log(`E.164: ${e164}`);
console.log(`Display: ${display}`);

Integration Best Practices

  • Consistent Formatting: Store numbers in E.164 format, but format them appropriately for display based on user locale.
  • Thorough Porting Validation: Validate all porting requests against the NPAC database and implement retry logic for failed queries.
  • Comprehensive Error Handling: Log all porting transactions and maintain audit trails for compliance.

Database Schema and Performance Optimization

Recommended Database Schema:

sql
CREATE TABLE phone_numbers (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  e164_number VARCHAR(15) NOT NULL UNIQUE,
  country_code VARCHAR(3) NOT NULL DEFAULT 'GU',
  area_code VARCHAR(3) NOT NULL,
  subscriber_number VARCHAR(7) NOT NULL,
  line_type VARCHAR(20), -- 'mobile', 'landline', 'voip', 'toll_free', 'premium'
  carrier VARCHAR(100),
  is_portable BOOLEAN DEFAULT true,
  ported_date TIMESTAMP,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

  -- Create indexes for common queries
  INDEX idx_e164 (e164_number),
  INDEX idx_area_code (area_code),
  INDEX idx_carrier (carrier),
  INDEX idx_line_type (line_type)
);

-- Partial index for active portable numbers
CREATE INDEX idx_portable_active ON phone_numbers (e164_number)
WHERE is_portable = true;

-- Composite index for lookups by area code and carrier
CREATE INDEX idx_area_carrier ON phone_numbers (area_code, carrier);

Performance Optimization Tips:

  1. Caching Strategy:
    • Cache validated phone numbers for 24–48 hours (TTL depends on porting frequency)
    • Use Redis or Memcached with keys like phone:validated:{e164_number}
    • Cache NPAC lookups for 1–4 hours to reduce API calls
    • Implement cache warming for frequently accessed numbers
javascript
// Redis caching example
const redis = require('redis');
const client = redis.createClient();

async function getCachedValidation(phoneNumber) {
  const cacheKey = `phone:validated:${phoneNumber}`;
  const cached = await client.get(cacheKey);

  if (cached) {
    return JSON.parse(cached);
  }

  // Perform validation
  const result = await validateGuamNumberProduction(phoneNumber);

  // Cache for 24 hours
  await client.setex(cacheKey, 86400, JSON.stringify(result));

  return result;
}
  1. Rate Limiting:
    • Implement rate limiting for validation API calls (recommended: 100 requests/minute per IP)
    • Use token bucket or sliding window algorithms
    • Return HTTP 429 (Too Many Requests) with Retry-After header
javascript
// Express.js rate limiting example
const rateLimit = require('express-rate-limit');

const validationLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 100, // 100 requests per minute
  message: 'Too many validation requests, please try again later',
  standardHeaders: true,
  legacyHeaders: false,
  handler: (req, res) => {
    res.status(429).json({
      error: 'Rate limit exceeded',
      retryAfter: req.rateLimit.resetTime
    });
  }
});

app.post('/api/validate-phone', validationLimiter, async (req, res) => {
  // Validation logic here
});
  1. Batch Processing:
    • Process multiple numbers in single database transaction
    • Use bulk insert/update operations for efficiency
    • Implement queue systems (Redis Queue, RabbitMQ) for asynchronous validation

Example JSON for Porting Requests:

json
{
  "portingRequest": {
    "subscriberNumber": "+16714721234",
    "currentProvider": "GTA",
    "newProvider": "DocomoPacific",
    "validationFields": {
      "accountNumber": "12345",
      "pin": "9999",
      "zipCode": "96913",
      "lastFourSSN": "1234"
    }
  }
}

Troubleshooting Common Guam Phone Number Issues

Validation Failures

Issue: Number rejected despite correct format

  • Check: Verify number is not in reserved range (N11, 555-01XX)
  • Check: Ensure area code is exactly 671
  • Check: Confirm first digit of exchange (NXX) is 2–9
  • Solution: Use libphonenumber library for comprehensive validation

Issue: Library reports "invalid region code"

  • Cause: Using 'US' instead of 'GU' as region parameter
  • Solution: Always specify 'GU' for Guam numbers, even though country code is +1

Porting Issues

Issue: Porting request stuck in "pending" status

  • Check: Verify NPAC database connectivity
  • Check: Confirm all validation fields match carrier records exactly (case-sensitive)
  • Solution: Implement webhook monitoring and set timeout alerts (4 business days max)

Issue: Emergency services routing after port

  • Cause: ALI (Automatic Location Identification) database not updated
  • Solution: Verify port includes 911 database update; test emergency routing post-port

International Calling

Issue: Call to Guam fails from certain countries

  • Cause: Some carriers may not recognize +1 671 as distinct from U.S. mainland
  • Solution: Educate users to use full international format (+1 671 XXX XXXX)
  • Alternative: Some countries require 00 instead of + for international prefix

Issue: Unexpected international rates for U.S. mainland calls

  • Cause: Some non-U.S. carriers treat Guam as international despite NANP membership
  • Solution: Verify carrier rate tables; consider VoIP alternatives for cost-sensitive users

Frequently Asked Questions About Guam Phone Numbers

Q: Can I port a Guam number to a U.S. mainland carrier?

A: Generally no. Guam numbers must remain with Guam-based carriers due to geographic restrictions, though some VoIP providers may offer exceptions.

Q: How do I determine if a Guam number is mobile or landline?

A: NANP does not encode line type in the number. Use carrier lookup APIs (HLR/CNAM) or libphonenumber's getNumberType() function with carrier database.

Q: Are 5G features available for all Guam numbers?

A: 5G availability depends on carrier and location. Docomo Pacific has most extensive 5G coverage in urban areas; GTA and IT&E expanding. Verify with coverage maps.

Q: What happens to my number during a port?

A: Service continues with old carrier until port completes (typically 1–4 business days). Brief outage (5–15 minutes) may occur during cutover.

Q: Can I validate Guam numbers offline?

A: Basic format validation yes (using regex). Carrier verification, line type detection, and porting status require online API access.

Conclusion

You now have a comprehensive foundation for working with Guam phone numbers in your applications. This guide has covered:

  • NANP integration and FCC regulatory compliance requirements
  • Detailed number structure including NXX restrictions and reserved ranges
  • Production-ready validation using libphonenumber library with comprehensive test cases
  • Number portability implementation with error handling and webhook patterns
  • Carrier-specific technical details and API integration options
  • Database schema design and performance optimization strategies
  • Troubleshooting guidance for common issues

Next Steps and Resources

Implementation Checklist:

  • Integrate libphonenumber library for validation
  • Implement E.164 storage format in database
  • Set up NPAC database connection for porting
  • Configure webhook handlers for async porting updates
  • Implement rate limiting and caching strategies
  • Test against comprehensive test suite
  • Verify FCC TCPA compliance for automated dialing

Essential Resources:

By following the guidelines and best practices outlined in this guide, you can ensure your application handles Guam phone numbers accurately, efficiently, and in compliance with telecommunications standards.