phone number standards

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

Serbia Phone Numbers: Format, Area Code & Validation Guide

Complete guide to Serbian phone numbers including +381 country code, area codes, mobile formats (06X), number portability (MNP/FNP), and RATEL regulations for developers and telecom professionals.

Serbia Phone Numbers: Format, Area Code & Validation Guide

Introduction

Serbia phone numbers use the +381 country code and follow a structured numbering plan managed by RATEL. Learn Serbia's phone number formats, validation rules, and implementation best practices. Build telecommunications systems with proper area codes, mobile prefixes, number portability, and RATEL compliance.

The Serbian Numbering Plan

Serbia's telephone system follows international E.164 standards while accommodating regional variations. Serbian phone numbers are organized by service type and geography, with distinct formats for landlines, mobile numbers, and special services.

Historical Background and Regulatory Oversight

Serbia adopted the +381 country code after Yugoslavia's breakup in the early 1990s. Previously, it used +38 with area codes starting with 1, 2, or 3 for geographic regions.

The Regulatory Agency for Electronic Communications and Postal Services (RATEL) oversees Serbia's numbering plan and ensures compliance with international standards, simplifying integration with global communication systems.

General Number Structure

Serbian phone numbers use this structure:

  • Country Code: +381 (Serbia's international identifier)
  • Area/City Codes: 2–3 digit regional identifiers (e.g., 11 for Belgrade, 21 for Novi Sad)
  • Subscriber Number: 6–9 digits, varying by service type
  • Service-Specific Prefixes: Special codes for different services (e.g., 06X for mobile, 0800 for toll-free)

Serbian Phone Number Formats and Examples

Complete breakdown of Serbia phone number formats by service type:

Service TypeFormat PatternReal ExamplesNotes
Geographic (Landline)0AA X{6,7} or 0AAA X{5,6}011 2345678, 021 345678AA/AAA represents the area code
Mobile06X X{6,7}064 1234567, 069 12345678X represents the mobile operator code
Toll-Free0800 X{3,9}0800 123456Always starts with 0800
Premium Rate090X X{4,7}0901 2345678Higher billing rates apply
Emergency1XX192 (Police)Short codes for quick access

Major Serbian Area Codes

According to RATEL's official numbering plan, Serbia uses 2–3 digit area codes covering 34 regional networks:

Area CodeCities/Regions Covered
11Belgrade (Beograd), Barajevo, Grocka, Lazarevac, Mladenovac, Obrenovac, Sopot, Surčin
21Novi Sad, Bač, Bačka Palanka, Bački Petrovac, Bečej, Beočin, Temerin, Titel, Srbobran, Sremski Karlovci, Vrbas, Žabalj
18Niš, Aleksinac, Bela Palanka, Doljevac, Gadžin Han, Merošina, Sokobanja, Svrljig
34Kragujevac, Aranđelovac, Batočina, Knić, Lapovo, Rača, Topola
24Subotica, Ada, Bačka Topola, Kanjiža, Mali Iđoš, Senta
10Pirot, Babušnica, Dimitrovgrad
12Požarevac, Golubac, Kučevo, Petrovac, Veliko Gradište, Žabari, Žagubica, Malo Crniće
13Pančevo, Alibunar, Bela Crkva, Kovačica, Kovin, Opovo, Plandište, Vršac
14Valjevo, Lajkovac, Ljig, Mionica, Osečina, Ub
15Šabac, Bogatić, Koceljeva, Krupanj, Ljubovija, Loznica, Mali Zvornik, Vladimirci
16Leskovac, Bojnik, Crna Trava, Lebane, Medveđa, Vlasotince
17Vranje, Bosilegrad, Bujanovac, Preševo, Surdulica, Trgovište, Vladičin Han
19Zaječar, Kladovo, Knjaževac, Negotin
20Novi Pazar, Sjenica, Tutin
22Sremska Mitrovica, Inđija, Irig, Pećinci, Ruma, Stara Pazova, Šid
23Zrenjanin, Novi Bečej, Sečanj, Nova Crnja, Žitište
230Kikinda, Čoka, Novi Kneževac
25Sombor, Apatin, Kula, Odžaci
26Smederevo, Smederevska Palanka, Velika Plana
27Prokuplje, Blace, Kuršumlija, Žitorađa
30Bor, Boljevac, Majdanpek
31Užice, Arilje, Bajina Bašta, Čajetina, Kosjerić, Požega
32Čačak, Gornji Milanovac, Ivanjica, Lučani
33Prijepolje, Nova Varoš, Priboj
35Jagodina, Ćuprija, Despotovac, Paraćin, Rekovac, Svilajnac
36Kraljevo, Raška, Vrnjačka Banja
37Kruševac, Aleksandrovac, Brus, Ćićevac, Ražanj, Trstenik, Varvarin

Serbian Mobile Operator Prefixes

Per RATEL's allocation scheme, Serbia mobile numbers begin with 06 followed by operator-specific codes:

PrefixOperatorNotes
060, 061, 068A1 SerbiaAvailable for new customers
062, 063, 069Yettel Serbia (formerly Telenor)PPF Group subsidiary
064, 065, 066mts (Telekom Srbija)Largest mobile operator
677GlobaltelMVNO using A1 network
678Vectone MobileMVNO

Important: Since Mobile Number Portability (MNP) was introduced in 2011, prefixes no longer reliably indicate the current operator. Users retain their original prefix when switching providers.

Emergency and Special Service Numbers

RATEL standardized emergency numbers in 2012, transitioning from 2-digit to 3-digit codes:

CodeServiceNotes
112Pan-European emergency numberRedirects to 192 on mobile phones
192PolicePrimary emergency police line
193Fire serviceFire and rescue operations
194AmbulanceMedical emergencies
195Exact timeTime information service
1811Directory assistanceSubscriber number inquiries
1901International callsOperator-assisted international calls
1976Military ambulanceArmed forces medical emergency
1985Civil protectionMajor accidents and disasters
1987Road assistance (AMSS)Automotive roadside assistance
1981Wake-up serviceAutomated wake-up calls

Phone Number Validation Patterns for Developers

Use robust validation to ensure data integrity when working with Serbian phone numbers. Here are regex patterns for common number types:

regex
^(?:0|\+381)(?:[1-9][0-9]{1,2})\s?[0-9]{5,7}$  // Geographic (Landline)
^(?:0|\+381)6[0-9]\s?[0-9]{6,7}$            // Mobile
^(?:0|\+381)800\s?[0-9]{3,9}$              // Toll-Free
^(?:0|\+381)90[0-9]\s?[0-9]{4,7}$            // Premium Rate

These patterns accommodate both domestic and international formats. For production validation of international phone numbers including Serbia (RS), use libphonenumber. It provides comprehensive validation and handles edge cases better than regex. For regional phone number validation across other Balkan countries, check country-specific area code guides and international dialing formats.

Common Validation Errors and Edge Cases

Handle these common scenarios when validating Serbian phone numbers:

  • Missing leading zero: Domestic numbers require a leading 0; international format uses +381 without the 0
  • Whitespace variations: Users may insert spaces, hyphens, or parentheses in various positions
  • Ported numbers: Prefix no longer indicates carrier; query prenesibroj.rs for current operator
  • Number length variations: Geographic numbers can be 8–10 digits total; mobile numbers are 9–10 digits
  • Invalid prefixes: Reject numbers starting with 067 (unallocated) or obsolete 2-digit emergency codes
javascript
// Example validation with error handling
function validateSerbianPhone(number, type = 'mobile') {
  // Normalize input: remove whitespace and special characters
  const cleaned = number.replace(/[\s\-\(\)]/g, '');

  // Check format
  const patterns = {
    mobile: /^(?:0|\+381)6[0-9]{7,8}$/,
    geographic: /^(?:0|\+381)(?:[1-9][0-9]{1,2})[0-9]{5,7}$/
  };

  if (!patterns[type].test(cleaned)) {
    throw new Error(`Invalid ${type} number format`);
  }

  // Check for unallocated prefixes
  if (type === 'mobile' && cleaned.match(/^(?:0|\+381)67/)) {
    throw new Error('Prefix 067 is not allocated');
  }

  return true;
}

Serbian Number Portability and Implementation

Number portability (MNP and FNP) lets users keep their phone numbers when switching providers. Learn how Serbia's number porting system works and get technical implementation details for developers.

Understanding Number Portability in Serbia

RATEL manages number portability through two systems: Mobile Number Portability (MNP) and Fixed-Line Number Portability (FNP). Serbia continuously updates portability rules to streamline the process.

Mobile Number Portability (MNP)

Serbia implemented MNP in July 2011. By end of 2024, approximately 1,400,000 mobile numbers had been ported. The system features:

  • Central Database Integration: Real-time synchronization across operators, automated validation through RATEL's central system, and instant status updates via prenesibroj.rs.
  • Process Timeline: Request Submission → Technical Validation (1 business day) → Operator Approval → Port Execution (1 business day).
  • Technical Requirements: Active service status, no outstanding payments, device compatibility, SIM card checks, and user registration for prepaid customers.

Porting Costs and Policies: Per RATEL regulations, service providers must complete porting within one business day for mobile telephony. Users may be charged early termination fees by the donor operator. Common rejection reasons include:

  • Inaccurate or incomplete request submitted by unauthorized person
  • Unregistered prepaid user
  • Number already in porting procedure or ported less than 2 months ago
  • Outstanding debts with current provider
  • Number in use with current provider for less than 2 months

Fixed-Line Number Portability (FNP)

FNP became available in April 2014. By end of 2024, operators completed over 450,000 geographic number portings. FNP follows a structured approach to ensure service continuity:

  • Process Timeline: Request Submission → Technical Validation (2 business days) → Operator Approval → Port Execution (2 business days)
  • Documentation Requirements: User identity verification, statement of outstanding debts from donor operator (provided within 2 business days), commitment to pay all obligations until disconnection
  • Technical Differences from MNP: Longer validation period due to infrastructure requirements, fixed telephony systems that don't support portability are excluded, individual numbers from number blocks require withdrawal from the block first
javascript
// Check FNP eligibility before initiating porting request
function checkPortabilityEligibility(phoneNumber) {
  const requirements = {
    activeService: true,
    outstandingPayments: false,
    technicalCompatibility: true,
    documentationComplete: true,
    minimumServicePeriod: true  // At least 2 months with current provider
  };
  return Object.values(requirements).every(Boolean);
}

Cost Considerations: The contractual relationship between the donor operator and user terminates on the date of successful porting. Pay all obligations to the donor operator, including any early termination fees specified in your contract.

Technical Implementation Deep Dive

Implement number portability with these technical details.

Validation Framework

Build a robust validation framework with:

  1. Format Verification: Ensure the number adheres to the correct format.

    javascript
    const validateGeographicNumber = (number) => {
      const regex = /^0[1-9][0-9]{1,2}\s?[0-9]{5,7}$/;
      return regex.test(number);
    };
  2. Operator Verification: Identify the current operator, verify service status, and check porting history. Query operator databases or use APIs.

  3. Complete Validation Flow:

    javascript
    async function validateForPorting(phoneNumber) {
      // Step 1: Format check
      if (!validateFormat(phoneNumber)) {
        return { valid: false, error: 'INVALID_FORMAT' };
      }
    
      // Step 2: Check current operator via RATEL database
      const operatorInfo = await queryPrenesibroj(phoneNumber);
    
      // Step 3: Verify eligibility
      const eligible = await checkPortabilityEligibility(phoneNumber);
    
      // Step 4: Check for recent porting
      if (operatorInfo.lastPortDate &&
          daysSince(operatorInfo.lastPortDate) < 60) {
        return { valid: false, error: 'RECENT_PORT' };
      }
    
      return { valid: true, operator: operatorInfo.currentOperator };
    }

Golden Numbers and Premium Allocation

Golden numbers (easy-to-remember sequences) require special handling. RATEL allocates these through: Application → Technical Assessment → Market Impact Analysis → Allocation Decision.

Pricing and Acquisition: RATEL allocates golden numbers through competitive bidding or auction. Operators charge premium prices. Legal considerations include fair allocation and preventing number hoarding.

javascript
// Detect golden number patterns
function isGoldenNumber(number) {
  const cleaned = number.replace(/\D/g, '');

  // Check for repeating patterns
  const patterns = [
    /(\d)\1{5,}/,           // 6+ consecutive identical digits
    /^(\d{3})\1+$/,         // Repeating triplets
    /1234567|7654321/,      // Sequential patterns
    /^(\d)\1{2}(\d)\2{2}$/  // Paired triplets (e.g., 111222)
  ];

  return patterns.some(pattern => pattern.test(cleaned));
}

Security Implementation

Protect your system with these security measures:

  • Real-time Monitoring: Watch for fraudulent activity.

    javascript
    const securityChecks = {
      fraudDetection: true,
      numberValidation: true,
      operatorAuthentication: true,
      userVerification: true,
      rateLimiting: true,
      suspiciousPatternDetection: true
    };
  • Blocking Protocols: Deploy automated threat detection, manual override capabilities, and regulatory compliance checks.

Fraud Patterns and Mitigation:

  • SIM swap fraud: Verify identity through multiple channels before porting
  • Bulk porting requests: Implement rate limiting (e.g., max 5 requests per user per day)
  • Spoofed documentation: Require digital signatures or biometric verification
  • Compliance audits: RATEL requires operators to maintain logs of all porting requests for regulatory inspection
javascript
// Rate limiting implementation
class PortingRateLimiter {
  constructor() {
    this.requests = new Map();
  }

  checkLimit(userId, maxRequests = 5, windowHours = 24) {
    const now = Date.now();
    const windowMs = windowHours * 60 * 60 * 1000;

    if (!this.requests.has(userId)) {
      this.requests.set(userId, []);
    }

    const userRequests = this.requests.get(userId)
      .filter(timestamp => now - timestamp < windowMs);

    if (userRequests.length >= maxRequests) {
      return { allowed: false, retryAfter: windowMs };
    }

    userRequests.push(now);
    this.requests.set(userId, userRequests);
    return { allowed: true };
  }
}

Operator Integration Guide

Integrate with specific operators using these guidelines.

API Integration

RATEL regulations require operators to maintain interoperable systems with standardized APIs for number portability.

javascript
class PortabilityAPI {
  constructor(apiKey, environment = 'production') {
    this.apiKey = apiKey;
    this.baseUrl = environment === 'production'
      ? 'https://api.operator.rs/v1'
      : 'https://sandbox.operator.rs/v1';
    this.rateLimits = {
      requestsPerMinute: 60,
      burstLimit: 100
    };
  }

  async checkEligibility(phoneNumber) {
    try {
      const response = await fetch(`${this.baseUrl}/portability/check`, {
        method: 'POST',
        headers: {
          'Authorization': `Bearer ${this.apiKey}`,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({ phoneNumber })
      });

      if (!response.ok) {
        throw new Error(`API error: ${response.status}`);
      }

      return await response.json();
      // Returns: { eligible: boolean, reason?: string, currentOperator: string }
    } catch (error) {
      // Retry logic with exponential backoff
      return this.retryWithBackoff(() => this.checkEligibility(phoneNumber));
    }
  }

  async initiatePort(phoneNumber, targetOperator, userData) {
    // Validate request before submission
    if (!this.validatePortRequest(phoneNumber, userData)) {
      throw new Error('Invalid port request data');
    }

    const response = await fetch(`${this.baseUrl}/portability/initiate`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        phoneNumber,
        targetOperator,
        userIdentity: userData,
        timestamp: new Date().toISOString()
      })
    });

    const result = await response.json();
    // Returns: { requestId: string, estimatedCompletion: string, status: string }
    return result;
  }

  async validateNumber(phoneNumber) {
    const response = await fetch(`${this.baseUrl}/validation/number`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ phoneNumber })
    });

    return await response.json();
    // Returns: { valid: boolean, type: string, operator: string, ported: boolean }
  }

  async retryWithBackoff(fn, maxRetries = 3) {
    for (let i = 0; i < maxRetries; i++) {
      try {
        return await fn();
      } catch (error) {
        if (i === maxRetries - 1) throw error;
        await new Promise(resolve =>
          setTimeout(resolve, Math.pow(2, i) * 1000)
        );
      }
    }
  }
}

Authentication Methods: Operators use OAuth 2.0 or API key authentication. Rate limits range from 60–100 requests per minute. Error response codes follow HTTP standards:

  • 400 Bad Request – Invalid phone number format or missing parameters
  • 401 Unauthorized – Invalid or expired API credentials
  • 429 Too Many Requests – Rate limit exceeded; includes Retry-After header
  • 500 Internal Server Error – Operator system error; implement retry logic

Service Provider Implementation

Each operator has specific requirements:

MVNO Operators: Three MVNOs operate in Serbia:

  • SBB: Licensed in 2013, provides services over host network infrastructure
  • Globaltel: Registered 2016, uses A1 network (2G/3G/4G/LTE), prefix 677
  • Vectone Mobile: International MVNO, prefix 678
OperatorAPI EndpointAuthenticationRate LimitSLA
Telekom Srbijaapi.telekom.rs/v2OAuth 2.0100/min99.5% uptime
Yettelapi.yettel.rs/v1API Key60/min99.0% uptime
A1 Serbiaapi.a1.rs/integrationOAuth 2.080/min99.5% uptime

Visit the RATEL website for detailed API documentation. RATEL transitions from Serbian Certificates of Conformity (CoCs) to EU CE Marking for radio equipment on January 1, 2027, aligning Serbia with EU standards and simplifying compliance.

Frequently Asked Questions About Serbia Phone Numbers

What is Serbia's country code for international calls?

Serbia's country code is +381. When calling Serbia from abroad, dial your international access code (011 from the US, 00 from Europe, or + from mobile devices), then 381, followed by the phone number without the leading 0.

How do I format a Serbian phone number in international format?

Remove the leading 0 and add +381. For example, a Belgrade landline 011 2345678 becomes +381 11 2345678. A mobile number 064 1234567 becomes +381 64 1234567. Always use this format for international compatibility.

What are the main area codes in Serbia?

Belgrade uses area code 11, Novi Sad uses 21, Niš uses 18, and Kragujevac uses 34. Additional major codes include 24 (Subotica), 10 (Pirot), 12 (Požarevac), 13 (Pančevo), and 23 (Zrenjanin). Area codes are 2–3 digits long. When calling domestically, dial 0 followed by the area code and subscriber number. See the complete list of 34 area codes in the Major Serbian Area Codes section above.

How do I identify Serbian mobile numbers?

Serbian mobile numbers always start with 06 followed by an operator-specific digit (06X). Per RATEL's allocation scheme: 060/061/068 (A1 Serbia), 062/063/069 (Yettel), 064/065/066 (mts), 677 (Globaltel MVNO), and 678 (Vectone MVNO). Mobile numbers are 9–10 digits total including the 06 prefix. Note that due to number portability, the prefix may no longer indicate the current operator.

What is RATEL and what does it do?

RATEL (Regulatory Agency for Electronic Communications and Postal Services) is Serbia's telecommunications regulator. RATEL manages the national numbering plan, oversees number portability, enforces compliance standards, and maintains the prenesibroj.rs portal for porting requests.

How does number portability work in Serbia?

Number portability lets you keep your phone number when switching providers. Submit a request through your new operator, which enters RATEL's central database. Technical validation takes 1 business day for mobile or 2 days for fixed-line, then the port executes within 1–2 additional business days. Check status at prenesibroj.rs.

Can I port my landline number to a different provider in Serbia?

Yes. Fixed-Line Number Portability (FNP) has been available since April 2014. You must have active service, no outstanding payments, and technical compatibility. The process takes 2 business days for validation plus 2 days for execution, longer than mobile porting due to infrastructure coordination.

What is prenesibroj.rs?

Prenesibroj.rs is RATEL's official portal for number portability in Serbia. Use it to check porting eligibility, track request status, verify operator assignments, and access documentation. The portal provides real-time updates on all porting requests.

How do I validate Serbian phone numbers programmatically?

For programmatic Serbia phone number validation, use the libphonenumber library for comprehensive validation. This Google library supports parsing, formatting, and validating international phone numbers in Java, C++, JavaScript, and third-party ports for Python, PHP, C#, Go, and other languages. For basic regex validation, match geographic numbers with ^(?:0|\+381)(?:[1-9][0-9]{1,2})\s?[0-9]{5,7}$ and mobile numbers with ^(?:0|\+381)6[0-9]\s?[0-9]{6,7}$. Always validate both format and operator assignment.

Example using libphonenumber-js:

javascript
import { parsePhoneNumber } from 'libphonenumber-js';

try {
  const phoneNumber = parsePhoneNumber('+381 64 1234567');
  console.log(phoneNumber.isValid());  // true
  console.log(phoneNumber.country);    // 'RS'
  console.log(phoneNumber.nationalNumber); // '641234567'
} catch (error) {
  console.error('Invalid phone number');
}

What are golden numbers in Serbia?

Golden numbers are easy-to-remember sequences (like 064 1234567 or 011 1111111) that hold premium value. RATEL allocates these through a formal process: application, technical assessment, market impact analysis, and allocation decision. They require special handling in telecommunications systems and are often allocated through competitive bidding.

Which mobile operators serve Serbia?

Serbia has three mobile network operators (MNOs): Telekom Srbija (mts) with prefixes 060, 061, 063, 064, 065, 066 and ~37% market share; Yettel Serbia (formerly Telenor, now PPF Group) with prefixes 061, 063, 065; and A1 Serbia with prefixes 062, 064, 065, 069. Three MVNOs also operate: SBB, Globaltel (prefix 677), and Vectone Mobile (prefix 678). Each operator offers APIs for number validation and portability integration.

How long does it take to port a number in Serbia?

Number porting in Serbia takes 2–3 business days total for mobile: 1 day for technical validation plus 1 day for execution. Fixed-line porting takes 4 business days: 2 days for validation plus 2 days for execution. The exact timeline may vary based on technical requirements and operator coordination. Service providers are required by law to complete porting within these timeframes.

Conclusion and Next Steps

You now understand Serbian phone number formats, validation patterns, and number portability. Apply these principles to build robust telecommunications solutions that comply with RATEL regulations.

Next Steps:

  • Test Your Implementation: Use prenesibroj.rs to verify porting functionality
  • Review RATEL Documentation: Check www.ratel.rs/en for current regulations and technical specifications
  • Implement libphonenumber: Download from GitHub for production-ready validation
  • Contact Operators: Reach out to Telekom Srbija, Yettel, or A1 Serbia for API access and integration support

Troubleshooting Resources:

  • RATEL Support: 0800-800-999 (toll-free), ratel@ratel.rs
  • Developer Community: Join telecommunications forums for Serbia-specific implementation discussions
  • API Status Pages: Monitor operator API availability and scheduled maintenance

Check the RATEL website and operator documentation for current information and technical specifications.

Related Resources: