sms compliance

Sent logo
Sent TeamMay 3, 2025 / sms compliance / Article

South Korea SMS Guide: Compliance, A2P Regulations & Best Practices (2025)

Complete 2025 guide to South Korea SMS messaging: A2P regulations, PIPA compliance, KCC requirements, EUC-KR encoding, sender ID rules, and API integration for SK Telecom, KT, and LG U+ networks.

South Korea SMS Best Practices, Compliance, and Features

South Korea SMS Market Overview and Statistics

Locale name:South Korea
ISO code:KR
RegionAsia
Mobile country code (MCC)450
Dialing Code+82

Market Conditions: South Korea operates one of the world's most advanced mobile markets, with nearly 100% smartphone penetration. Three major mobile operators dominate: SK Telecom (48.4% market share), KT (Korea Telecom, 28.5%), and LG U+ (remaining share). While OTT messaging apps like KakaoTalk dominate personal communications, SMS remains essential for business authentication, notifications, and marketing. Android devices hold approximately 70% market share, with iOS comprising most of the remainder.

Market Statistics: South Korea's A2P messaging market generated USD 3.74 billion in revenue in 2024 and is projected to reach USD 5.82 billion by 2030. The SMS bulk service market was valued at USD 0.6 billion in 2022 and is projected to reach USD 1.5 billion by 2030, growing at a CAGR of 15.8%. SMS delivery rates typically exceed 95% due to mature infrastructure and strict carrier quality standards. Average costs range from $0.02 to $0.08 per message depending on volume, sender type, and carrier.

This comprehensive guide covers South Korea SMS regulations, A2P messaging requirements, PIPA compliance, technical specifications including EUC-KR encoding, and best practices for sending business SMS through SK Telecom, KT, and LG U+ carriers. Whether you're implementing SMS authentication, marketing campaigns, or transactional messaging, this guide provides essential compliance and technical requirements for the Korean market.


SMS Features and Capabilities in South Korea

South Korea maintains strict regulations on SMS capabilities with specific requirements for message formatting, sender IDs, and delivery mechanisms. Understanding these features is essential for successful SMS API integration and compliance.

Two-way SMS Support

Two-way SMS is not supported in South Korea for A2P (Application-to-Person) messaging. Use one-way messaging for business communications with alternative channels for customer responses.

Alternative Channels for Customer Responses:

  • Web forms: Direct users to a landing page for response submission
  • KakaoTalk Business: Integrate KakaoTalk for Business messaging for two-way communication
  • Dedicated customer service lines: Provide a phone number (toll-free 080 or customer service 1544/1566/1577)
  • Email responses: Include an email address for customer inquiries
  • Mobile app deep links: Direct users to your app for in-app messaging

Concatenated Messages (Segmented SMS)

Support: Most carriers no longer support concatenated messages (known as LMS in South Korea) by default. SK Telecom is the primary exception. Some providers offer full LMS support (up to 1,000 Unicode or 2,000 GSM characters) upon request.

Request LMS Support:

  1. Contact your SMS provider's account manager or technical support
  2. Submit a formal request with your business use case and expected monthly volume
  3. Provide business registration documents (Korean entity) or proof of international operations
  4. Complete carrier-specific application forms (SK Telecom, KT, and LG U+ have separate requirements)
  5. Wait 5–7 business days for carrier approval and account configuration
  6. Test messages across all three carriers to verify LMS functionality
  7. Monitor delivery reports during the first month to ensure proper segmentation

Message length: One SMS segment contains up to 140 bytes (140 ASCII characters or 70 Unicode characters).

Encoding considerations: Messages support both GSM-7 (ASCII) and UCS-2 (Unicode) encoding, but must use EUC-KR encoding for Korean characters. Delivery of Chinese characters is not guaranteed.

Byte Calculation Examples for Mixed Korean/English Content:

  • Korean characters in EUC-KR: 2 bytes per character
  • English/ASCII characters: 1 byte per character
  • Example 1: "안녕하세요" (5 Korean characters) = 10 bytes
  • Example 2: "Hello 고객님" (5 English + 1 space + 3 Korean) = 6 + 6 = 12 bytes
  • Example 3: "Order #12345 배송완료" (15 English/symbols + 1 space + 4 Korean) = 16 + 8 = 24 bytes
  • To calculate total bytes: (Korean characters × 2) + (ASCII characters × 1)
  • Maximum for single SMS: 140 bytes (e.g., 70 Korean characters, or 140 ASCII characters, or mix totaling ≤140 bytes)

Important: Without LMS support, concatenated messages may be trimmed, delivered as separate parts, or arrive out of sequence.

MMS Support

MMS messages are automatically converted to SMS with an embedded URL link, ensuring carrier compatibility while allowing rich media sharing through a web-based approach.

MMS-to-SMS Conversion Process:

  • URL Generation: Provider generates a secure shortened URL hosted on their CDN
  • Hosting: Media files (images, videos, PDFs) are stored on provider servers
  • Expiration: URLs expire after 30–90 days (Twilio: 30 days, Sinch: 90 days)
  • Message Format: Recipients receive SMS like: "[Web 발신] View your image: https://short.url/abc123"
  • Technical Requirements: Media files must be under 5 MB; supported formats include JPEG, PNG, GIF, MP4, PDF
  • Best Practice: Host critical media on your own servers with permanent URLs

Recipient Phone Number Compatibility

Number Portability

Number portability is available in South Korea, allowing users to keep phone numbers when switching carriers. The number portability system is governed by Article 58 of the Telecommunications Business Act and processes requests within one business day. This does not significantly impact message delivery or routing.

Sending SMS to Landlines

Sending SMS to landline numbers is not possible in South Korea. Attempts result in a 400 response error (code 21614) – the message will not be delivered or charged.

How to Identify Landline vs Mobile Numbers: According to the Korean telephone numbering plan, mobile numbers in South Korea always start with 010 (unified prefix since January 1, 2004). Landline numbers use geographic area codes:

  • Seoul: 02
  • Gyeonggi-do: 031
  • Incheon/Bucheon: 032
  • Other cities: 033, 041–044, 051–055, 061–064

Validation Logic:

typescript
function isMobileNumber(phoneNumber: string): boolean {
  // Remove country code and format to domestic format
  const domestic = phoneNumber.replace(/^\+82/, '0').replace(/[^0-9]/g, '');

  // Mobile numbers start with 010 and are 11 digits total
  return /^010[0-9]{8}$/.test(domestic);
}

function isLandline(phoneNumber: string): boolean {
  // Landlines start with 02-06 (excluding 010)
  const domestic = phoneNumber.replace(/^\+82/, '0').replace(/[^0-9]/g, '');
  return /^0[2-6][0-9]{7,9}$/.test(domestic) && !domestic.startsWith('010');
}

South Korea SMS Compliance and Regulatory Guidelines

The Korea Communications Commission (KCC) and Korea Internet & Security Agency (KISA) regulate SMS communications in South Korea. All businesses must comply with the Personal Information Protection Act (PIPA) and the Act on Promotion of Information and Communications Network Utilization and Information Protection (Network Act). For international businesses, understanding 10DLC registration requirements is critical.

Key regulatory updates: PIPA was amended on September 15, 2023, with most provisions effective as of March 15, 2024. The amendments strengthened data subject rights and CPO (Chief Privacy Officer) independence requirements.

Penalties and Fines for Non-Compliance: According to DLA Piper and recent PIPC enforcement actions:

  • Administrative fines: Up to KRW 50 million (~USD $42,000) for violations
  • Criminal liability: Imprisonment of up to 5 years or criminal fine of up to KRW 50 million for severe breaches (e.g., transferring personal data to third parties without consent)
  • Punitive damages: Up to 5× the actual damages for breaches caused by intentional acts or negligence
  • Corrective orders: Non-compliance with PIPC corrective orders results in fines up to KRW 30 million

Recent Enforcement Examples:

  • March 2025: Modutour Network fined KRW 757.2 million (~USD $520,000) for data breach affecting 3.06 million individuals, failure to notify PIPC, and improper data retention
  • November 2024: Meta Platforms fined KRW 21.6 billion (~USD $15.67 million) for collecting sensitive personal data without legal basis
  • May 2025: Temu fined KRW 1.4 billion (~USD $978,000) for personal data violations

Explicit Consent Requirements:

  • Obtain written or electronic consent before sending marketing messages
  • Maintain consent records for at least 3 years
  • State the purpose, frequency, and type of messages in consent forms
  • Provide separate consents for different processing activities (collection, third-party provision) and information types

Best Practices for Consent:

  • Implement double opt-in verification
  • Maintain detailed consent logs with timestamps
  • Provide clear terms and conditions in Korean
  • Renew consent every 2 years for ongoing marketing communications

Example Compliant Consent Form Text:

Korean:

[마케팅 정보 수신 동의] 귀하의 개인정보를 다음과 같이 마케팅 목적으로 활용하고자 합니다. 1. 수집·이용 목적: SMS를 통한 상품 및 서비스 안내, 이벤트 정보 제공 2. 수집 항목: 휴대전화번호, 이름 3. 보유·이용 기간: 동의 철회 시 또는 회원 탈퇴 시까지 4. 발송 빈도: 주 1-2회 위 내용에 동의하지 않으실 수 있으며, 동의하지 않으시는 경우 마케팅 정보를 받으실 수 없습니다. 동의함 [ ] 동의하지 않음 [ ] 수신거부: "수신거부"를 회신하시거나 고객센터(1234-5678)로 연락하시면 즉시 처리됩니다.

English Translation:

[Marketing Information Consent] We would like to use your personal information for marketing purposes as follows: 1. Purpose of collection and use: Product and service information, event notifications via SMS 2. Information collected: Mobile phone number, name 3. Retention period: Until consent withdrawal or account termination 4. Message frequency: 1-2 times per week You may refuse to consent, in which case you will not receive marketing information. I agree [ ] I do not agree [ ] Opt-out: Reply "수신거부" (opt-out) or contact customer service at 1234-5678 for immediate processing.

Legal basis: Under the Network Act, receive explicit consent before transmitting advertisements via electronic media. If individuals withdraw or withhold consent, you cannot transmit profit-driven advertisements.

HELP/STOP and Other Commands

  • Include opt-out instructions in Korean in all marketing messages
  • Standard commands: "수신거부" (Opt-out) and "고객센터" (Help)
  • Commands must be free of charge
  • Process opt-out requests within 24 hours
  • Confirm opt-out status after processing

Example Marketing Message with Proper Opt-Out Format:

(광고) [CompanyName] 신규 회원 50% 할인 이벤트! 지금 바로 앱에서 확인하세요. bit.ly/event123 수신거부: 0808-123-4567 또는 "수신거부" 회신

Translation:

(Ad) [CompanyName] New member 50% discount event! Check now in the app. bit.ly/event123 Opt-out: 0808-123-4567 or reply "수신거부"

Required Elements:

  1. (광고) header marks message as advertisement
  2. Company name and clear offer
  3. 수신거부: footer with free opt-out number or reply instruction

Do Not Call / Do Not Disturb Registries

  • South Korea maintains a national Do-Not-Send Registry managed by KISA
  • Check numbers against the registry monthly
  • Maintain internal suppression lists
  • Honor opt-outs immediately
  • Document compliance procedures
  • KISA operates a spam reporting center (spam.kisa.or.kr) where individuals can report unsolicited messages

Accessing the Do-Not-Send Registry: Note: As of 2025, KISA does not provide a public API for automated Do-Not-Send Registry checks. Compliance requires manual processes or working with registered telecommunications providers who have direct access to KISA systems.

Compliance Process:

  1. For domestic Korean businesses: Register with KISA as a business sender by submitting business registration documents
  2. Work with approved aggregators: Partner with SMS providers (e.g., Twilio, Sinch, local Korean aggregators) who maintain direct connections to KISA systems and perform registry checks on your behalf
  3. Monthly verification: Request monthly registry updates from your SMS provider or aggregator
  4. Internal suppression: Maintain your own opt-out database and cross-reference before every campaign
  5. Documentation: Keep records of registry checks, dates, and suppression list updates for at least 3 years for compliance audits

Best Practice: Contact your SMS provider to confirm their KISA Do-Not-Send Registry integration and establish a monthly verification schedule.

Time Zone Sensitivity

  • Standard sending hours: 08:00 to 21:00 KST (Korea Standard Time, UTC+9)
  • Emergency notifications are exempt from time restrictions
  • Avoid sending during major holidays like Seollal (Lunar New Year) and Chuseok (Harvest Festival)
  • Consider business hours (09:00–18:00) for B2B communications

Emergency Notification Criteria: According to KCC and KISA guidelines, emergency notifications exempt from time restrictions include:

  • Natural disasters: Earthquakes, floods, typhoons, wildfires
  • Public safety alerts: Evacuation orders, hazardous material incidents, missing persons (Amber alerts)
  • Critical service disruptions: Banking system outages, utility failures affecting public safety
  • Health emergencies: Disease outbreak warnings, recall notices for dangerous products
  • Account security: Fraud alerts, unauthorized access notifications, password reset verifications

Non-emergency messages (marketing, promotions, general service updates) must comply with 08:00–21:00 KST restrictions.

SMS Sender ID Options and Phone Number Types in South Korea

Alphanumeric Sender ID

Operator network capability: Not supported

Registration requirements: N/A

Sender ID preservation: All sender IDs are converted to numeric format

Long Codes

Domestic vs. International:

  • Domestic: Supported but requires local business registration
  • International: Supported with automatic prefix (009 or 006)

Domestic Long Code Registration Process:

  1. Establish legal business entity in South Korea (register with National Tax Service)
  2. Obtain business registration certificate (사업자등록증)
  3. Apply for telecommunications business registration with KCC if sending over 10,000 messages/month
  4. Submit application to chosen carrier (SK Telecom, KT, or LG U+) with:
    • Business registration certificate
    • Company seal (inkan) and representative ID
    • Service usage plan and expected volume
    • Bank account verification for billing
  5. Wait 10–15 business days for carrier review and number assignment
  6. Pay setup fees (varies by carrier; typically KRW 50,000–200,000) and monthly service fees (KRW 10,000–50,000)
  7. Complete technical integration and testing with carrier's SMS gateway

Costs: Setup fees KRW 100,000–300,000 (~USD $75–$225); monthly fees KRW 20,000–100,000 (~USD $15–$75) depending on volume and carrier.

Sender ID preservation: No – international numbers are automatically prefixed with 009 or 006 by mobile operators

Provisioning time: 3–5 business days

Use cases: Transactional messages, alerts, notifications

Short Codes

Support: Not supported for international businesses

Provisioning time: N/A

Use cases: N/A

Why Short Codes Are Unavailable for International Businesses: Short codes (3-6 digit numbers) in South Korea are heavily regulated and reserved exclusively for domestic entities with established business registration and direct carrier relationships. The KCC requires extensive documentation, local business presence, and compliance with strict content approval processes. International businesses can use long codes with international prefixes (009/006) or partner with local Korean aggregators who hold short code allocations. Domestic alternatives include virtual numbers (070 prefix for VoIP) or nationwide single numbers (1544, 1566, 1577 prefixes).

Prohibited SMS Content and Restricted Industries in South Korea

Prohibited Content:

  • Gambling and gaming
  • Adult content
  • Political campaigns (P2P traffic prohibited)
  • Cryptocurrency promotions
  • Unauthorized pharmaceutical products
  • Religious promotional content

Prohibited Keywords (Examples): Korean carriers automatically filter messages containing:

  • Gambling: 도박, 카지노, 바카라, 토토, 슬롯머신
  • Adult: 성인, 19금, 음란, 섹스
  • Cryptocurrency: 코인 투자, 비트코인 수익, 가상화폐 수익
  • Drugs: 불법 의약품, 마약, 대마초
  • Financial fraud: 대출 보장, 무심사, 즉시 현금

Note: Exact keyword lists are proprietary to each carrier and updated regularly. Always test messages before bulk sends and monitor blocking rates.

Penalties for Sending Prohibited Content:

  • Immediate message blocking with no refund
  • Account suspension (temporary: 7-30 days; permanent for repeat violations)
  • Fines up to KRW 30 million under the Telecommunications Business Act
  • Criminal prosecution for fraud-related or illegal product promotion (up to 5 years imprisonment)

Regulated Industries:

  • Financial services require additional verification
  • Healthcare messages must comply with medical privacy laws under PIPA

Financial Services Additional Verification Requirements: According to the Electronic Financial Transactions Act and FSC regulations:

  • Identity verification: Submit business license from Financial Services Commission (FSC) or Financial Supervisory Service (FSS)
  • OTP compliance: Implement one-time password (OTP) or multi-factor authentication for transaction-related SMS
  • Content approval: Pre-register message templates with carriers for financial transactions, loan offers, investment advice
  • Security standards: Comply with ISMS-P (Information Security Management System-Personal Information) certification
  • Audit requirements: Maintain detailed message logs for 5 years for regulatory audits
  • Customer authentication: Verify customer identity before sending account-specific information

Application Process: Contact your SMS provider with FSC/FSS license documentation to enable financial services messaging. Approval typically takes 10–15 business days and may require security audits.

Content Filtering

Carrier Filtering Rules:

  • Use approved character sets (EUC-KR for Korean text)
  • Use URLs from whitelisted domains only
  • Content screening detects prohibited keywords
  • Messages automatically include mandatory prefixes (see below)

Domain Whitelisting Process:

  1. Submit whitelist request to your SMS provider with:
    • Domain name(s) to be whitelisted
    • Domain ownership verification (DNS TXT record or SSL certificate)
    • Business registration documents
    • Sample message content showing how URLs will be used
  2. Provider forwards request to all three carriers (SK Telecom, KT, LG U+)
  3. Each carrier independently reviews and approves (typically 5–10 business days per carrier)
  4. Test URLs across all carriers before launching campaigns
  5. Renewal required annually or when domain ownership changes

Pre-Approved Domains: Major platforms typically have standing whitelist approval: naver.com, kakao.com, daum.net, google.com, apple.com. Custom business domains require explicit whitelisting.

Important: URL shorteners (bit.ly, tinyurl.com, ow.ly) are blocked by default. Use your whitelisted domain with server-side redirects instead.

Automatic Message Prefixes: All messages sent to South Korea are automatically prefixed with one of the following:

  • [Web 발신] – Message sent from web/A2P source
  • [국제발신] – Message sent from abroad

Tips to Avoid Blocking:

  • Use registered sender IDs
  • Avoid URL shorteners
  • Keep content clear and professional
  • Test message rendering before bulk campaigns
  • For marketing messages, include header advertisement "(광고)" and footer with opt-out information

Best Practices for Sending Business SMS in South Korea

SMS Messaging Strategy

  • Keep messages under 70 characters when possible to fit within a single segment
  • Include a clear call-to-action
  • Use formal Korean language style (존댓말, jondaetmal)
  • Avoid excessive punctuation or emojis in business communications

Sending Frequency and Timing

  • Limit to 1–2 messages per day per recipient
  • Respect quiet hours (21:00–08:00 KST)
  • Plan campaigns around Korean holidays (Seollal, Chuseok)
  • Space out bulk campaigns to avoid overwhelming recipients

Bulk Campaign Interval Guidance:

  • High-priority transactional: Send immediately (OTP, order confirmations)
  • Marketing to engaged users: 2-hour intervals between campaigns
  • Marketing to general audience: 24-hour minimum intervals between campaigns
  • Large broadcasts (>100,000 recipients): Spread over 4-6 hours using queue systems to avoid carrier throttling

Localization

  • Primary language: Korean (Hangul)
  • Use formal business Korean (존댓말, jondaetmal)
  • Include English only when necessary for technical terms or brand names
  • Test character rendering across all three major carriers (SK Telecom, KT, LG U+)
  • Verify EUC-KR encoding compatibility before sending

Common Localization Mistakes:

  1. Using informal speech: Avoid casual Korean (반말) in business contexts; always use formal endings (습니다, 세요)
  2. Direct English translation: Korean requires contextual particles and honorifics that don't exist in English
  3. Wrong character encoding: Sending Unicode UTF-8 instead of EUC-KR causes garbled text (e.g., "한글" appears as "한글")
  4. Mixing scripts incorrectly: Don't alternate Korean/English mid-sentence; keep brand names in English, descriptive text in Korean
  5. Ignoring spacing rules: Korean doesn't use spaces between some grammatical elements; follow proper Korean spacing conventions

Opt-Out Management

  • Process opt-outs within 24 hours (required by law)
  • Maintain a centralized opt-out database
  • Confirm opt-out status after processing
  • Perform regular database cleaning to remove invalid numbers
  • Check the national Do-Not-Send Registry monthly

Testing and Monitoring

  • Test across all three major carriers before launching campaigns
  • Monitor delivery rates by carrier to identify issues
  • Track opt-out rates as a quality indicator
  • Conduct regular content compliance checks against KCC/KISA guidelines
  • Verify that automatic prefixes ([Web 발신] or [국제발신]) are displaying correctly

Acceptable Metrics and Thresholds:

  • Delivery rate: Target ≥95%; investigate if <90%
  • Opt-out rate: Normal ≤0.5%; concerning >2%
  • Bounce rate: Target ≤3%; audit list quality if >5%
  • Spam complaints: Target <0.1%; critical issue if >0.5%

Carrier-Specific Troubleshooting:

  • SK Telecom: High blocking rate often due to domain not whitelisted; verify URL whitelist status
  • KT: Delayed delivery typically indicates rate limiting; reduce send speed or implement queue backoff
  • LG U+: Garbled Korean text usually means encoding issue; confirm EUC-KR encoding implementation

SMS API Integration Guide for South Korea

Twilio SMS API for South Korea

Twilio provides a robust SMS API with specific support for South Korean messaging requirements.

typescript
import twilio from 'twilio';
import iconv from 'iconv-lite';

// Initialize the client with your credentials
const client = twilio(
  process.env.TWILIO_ACCOUNT_SID,
  process.env.TWILIO_AUTH_TOKEN
);

// Send SMS to South Korea with proper E.164 formatting
async function sendSmsToKorea(
  to: string,
  message: string
): Promise<void> {
  try {
    // Format the phone number to E.164 format (+82XXXXXXXXX)
    // Remove leading 0 from local numbers (e.g., 010-1234-5678 becomes +821012345678)
    const formattedNumber = to.startsWith('+82')
      ? to
      : `+82${to.replace(/^0/, '').replace(/[^0-9]/g, '')}`;

    // Verify EUC-KR encoding for Korean characters
    const eucKrEncoded = iconv.encode(message, 'euc-kr');

    const response = await client.messages.create({
      body: message,
      to: formattedNumber,
      // Twilio automatically adds [Web 발신] or [국제발신] prefix
      from: process.env.TWILIO_PHONE_NUMBER,
      // Optional: Set validity period (time before message expires)
      validityPeriod: 3600, // 1 hour in seconds
      // Optional: Request delivery receipt
      statusCallback: 'https://your-domain.com/sms/status'
    });

    console.log(`Message sent successfully: ${response.sid}`);
  } catch (error) {
    console.error('Error sending message:', error);
    throw error;
  }
}

// Handle delivery receipts
async function handleDeliveryReceipt(webhookData: any): Promise<void> {
  const { MessageSid, MessageStatus, To, ErrorCode } = webhookData;

  console.log(`Message ${MessageSid} to ${To}: ${MessageStatus}`);

  if (MessageStatus === 'failed' || MessageStatus === 'undelivered') {
    console.error(`Delivery failed with error code: ${ErrorCode}`);
    // Handle failed delivery (e.g., remove from list, retry with different provider)
  }
}

Sinch SMS API for South Korea

Sinch offers dedicated APIs for the South Korean market with built-in compliance handling.

typescript
import axios from 'axios';
import iconv from 'iconv-lite';

class SinchSmsService {
  private readonly apiToken: string;
  private readonly servicePlanId: string;
  private readonly baseUrl: string;

  constructor(apiToken: string, servicePlanId: string) {
    this.apiToken = apiToken;
    this.servicePlanId = servicePlanId;
    this.baseUrl = 'https://sms.api.sinch.com/xms/v1';
  }

  async sendSms(to: string, message: string): Promise<void> {
    try {
      // Validate EUC-KR encoding
      const eucKrBuffer = iconv.encode(message, 'euc-kr');
      if (eucKrBuffer.length > 140) {
        console.warn(`Message exceeds 140 bytes: ${eucKrBuffer.length} bytes`);
      }

      const response = await axios.post(
        `${this.baseUrl}/${this.servicePlanId}/batches`,
        {
          from: '009xxx', // Automatically prefixed by Korean carriers
          to: [to],
          body: message,
          // EUC-KR encoding required for Korean characters
          encoding: 'EUC-KR'
        },
        {
          headers: {
            'Authorization': `Bearer ${this.apiToken}`,
            'Content-Type': 'application/json'
          }
        }
      );

      console.log('Message sent:', response.data.id);
    } catch (error) {
      console.error('Sinch SMS error:', error);
      throw error;
    }
  }
}

Bird SMS API for South Korea

Bird's API provides streamlined integration for South Korean messaging compliance.

typescript
import { BirdClient } from '@bird/sdk';
import iconv from 'iconv-lite';

class BirdSmsService {
  private readonly client: BirdClient;
  private readonly channelId: string;

  constructor(accessKey: string, channelId: string) {
    this.client = new BirdClient(accessKey);
    this.channelId = channelId;
  }

  async sendMessage(
    phoneNumber: string,
    messageText: string
  ): Promise<void> {
    try {
      // Validate EUC-KR compatibility
      const eucKrEncoded = iconv.encode(messageText, 'euc-kr');
      console.log(`Message byte length: ${eucKrEncoded.length}`);

      const response = await this.client.messages.create({
        channel: this.channelId,
        recipient: {
          type: 'individual',
          phoneNumber: phoneNumber
        },
        content: {
          type: 'text',
          text: messageText
        },
        // Korea-specific configuration
        options: {
          region: 'kr',
          encoding: 'EUC-KR'
        }
      });

      console.log('Message sent:', response.messageId);
    } catch (error) {
      console.error('Bird SMS error:', error);
      throw error;
    }
  }
}

EUC-KR Encoding Implementation Library:

typescript
// Install: npm install iconv-lite
import iconv from 'iconv-lite';

// Encode Korean text to EUC-KR
function encodeToEucKr(text: string): Buffer {
  return iconv.encode(text, 'euc-kr');
}

// Decode EUC-KR to JavaScript string
function decodeFromEucKr(buffer: Buffer): string {
  return iconv.decode(buffer, 'euc-kr');
}

// Validate message fits within 140-byte limit
function validateSmsLength(message: string): { valid: boolean; bytes: number } {
  const eucKrBuffer = encodeToEucKr(message);
  return {
    valid: eucKrBuffer.length <= 140,
    bytes: eucKrBuffer.length
  };
}

// Example usage
const message = "안녕하세요 고객님, 주문이 완료되었습니다.";
const validation = validateSmsLength(message);
console.log(`Message length: ${validation.bytes} bytes, Valid: ${validation.valid}`);

API Rate Limits and Throughput

Default rate limits vary by provider:

  • Twilio: 100 messages/second
  • Sinch: 50 messages/second
  • Bird: 30 messages/second

Throughput Management Strategies:

  • Implement exponential backoff for rate limit errors
  • Use queue systems (Redis, RabbitMQ, or cloud-based queues)
  • Batch messages when possible
  • Monitor delivery receipts to track success rates

Queue System Implementation Example:

typescript
import { Queue, Worker } from 'bullmq';
import IORedis from 'ioredis';

// Initialize Redis connection
const connection = new IORedis({
  host: 'localhost',
  port: 6379,
  maxRetriesPerRequest: null
});

// Create SMS queue
const smsQueue = new Queue('korea-sms', { connection });

// Add message to queue
async function queueSms(to: string, message: string) {
  await smsQueue.add('send-sms', {
    to,
    message,
    timestamp: Date.now()
  }, {
    attempts: 3,
    backoff: {
      type: 'exponential',
      delay: 2000
    }
  });
}

// Process queue with rate limiting
const worker = new Worker('korea-sms', async (job) => {
  const { to, message } = job.data;
  await sendSmsToKorea(to, message);
}, {
  connection,
  limiter: {
    max: 50, // 50 messages
    duration: 1000 // per second
  }
});

Error Handling and Reporting

Common Error Scenarios:

  • Invalid phone numbers (incorrect format or landline numbers)
  • Network timeouts
  • Character encoding issues (non-EUC-KR characters in Korean text)
  • Rate limit exceeded
  • Blocked content (prohibited keywords or restricted industries)

Best Practices:

typescript
// Robust error handling implementation for South Korea SMS
async function handleSmsError(error: any): Promise<void> {
  // Handle invalid number errors
  if (error.code === 'INVALID_NUMBER' || error.code === '21614') {
    // Remove invalid number from database
    await cleanInvalidNumber(error.number);
    console.log(`Removed invalid number: ${error.number}`);
  }
  // Handle rate limit errors with exponential backoff
  else if (error.code === 'RATE_LIMIT_EXCEEDED' || error.status === 429) {
    await exponentialBackoff();
    console.log('Rate limit reached – implementing backoff strategy');
  }
  // Handle encoding errors
  else if (error.message?.includes('encoding') || error.message?.includes('character')) {
    console.error('Character encoding issue – verify EUC-KR compatibility');
  }
  // Handle content filtering/blocking
  else if (error.code === 'CONTENT_BLOCKED') {
    console.error('Message blocked by carrier – review content against filtering rules');
  }

  // Log all errors for monitoring and compliance
  await logger.error({
    error: error.message,
    code: error.code,
    timestamp: new Date().toISOString(),
    service: 'sms',
    destination: 'KR'
  });
}

// Exponential backoff implementation
async function exponentialBackoff(retryCount: number = 0): Promise<void> {
  const maxRetries = 5;
  const baseDelay = 1000; // 1 second

  if (retryCount >= maxRetries) {
    throw new Error('Max retry attempts reached');
  }

  const delay = baseDelay * Math.pow(2, retryCount);
  await new Promise(resolve => setTimeout(resolve, delay));
}

Provider-Specific Error Codes:

  • Twilio: 21614 (landline number), 21211 (invalid format), 30007 (message blocked), 30008 (unknown destination)
  • Sinch: 400 (bad request), 402 (insufficient balance), 403 (forbidden content), 429 (rate limit)
  • Bird: INVALID_RECIPIENT (bad number), QUOTA_EXCEEDED (rate limit), BLOCKED_CONTENT (carrier filtering)

South Korea SMS Frequently Asked Questions (FAQ)

What character encoding is required for sending SMS to South Korea?

Use EUC-KR encoding for Korean characters. While GSM-7 (ASCII) and UCS-2 (Unicode) are supported for non-Korean text, EUC-KR is mandatory for proper delivery of Korean (Hangul) characters. Delivery of Chinese characters is not guaranteed.

EUC-KR Encoding Implementation:

typescript
import iconv from 'iconv-lite';

// Encode Korean text
const koreanText = "안녕하세요";
const eucKrEncoded = iconv.encode(koreanText, 'euc-kr');

// Check byte length
console.log(`Byte length: ${eucKrEncoded.length}`); // 10 bytes (5 characters × 2 bytes)

// Decode back to string
const decoded = iconv.decode(eucKrEncoded, 'euc-kr');
console.log(decoded); // "안녕하세요"

Can I send two-way SMS in South Korea?

No. Two-way SMS is not supported in South Korea for A2P (Application-to-Person) messaging. Use one-way messaging for business communications. If you need customer responses, implement alternative channels such as web forms, phone lookup services, or dedicated customer service lines.

What are the automatic prefixes added to SMS messages in South Korea?

All SMS messages sent to South Korea are automatically prefixed by carriers with either:

  • [Web 발신] – for messages sent from web/A2P sources
  • [국제발신] – for messages sent from abroad

These prefixes are mandatory and cannot be removed.

Under PIPA (Personal Information Protection Act) and the Network Act:

  • Obtain explicit written or electronic consent before sending marketing messages
  • Maintain consent records for at least 3 years
  • State the purpose, frequency, and type of messages in consent forms
  • Process opt-out requests within 24 hours
  • Check the national Do-Not-Send Registry monthly

What are the permitted sending hours for SMS in South Korea?

Standard sending hours are 08:00 to 21:00 KST (Korea Standard Time, UTC+9). Emergency notifications are exempt from these restrictions. For B2B communications, consider limiting to business hours (09:00–18:00 KST).

Are alphanumeric sender IDs supported in South Korea?

No. Alphanumeric sender IDs are not supported by South Korean mobile operators. All sender IDs are automatically converted to numeric format. International numbers are automatically prefixed with 009 or 006.

What is the maximum SMS message length in South Korea?

One SMS segment can contain up to 140 bytes, equivalent to 140 ASCII characters or 70 Unicode characters. Concatenated messages (LMS) are no longer supported by most carriers by default, though some providers offer full LMS support (up to 1,000 Unicode or 2,000 GSM characters) upon request.

Which mobile carriers operate in South Korea?

South Korea has three major mobile operators:

  • SK Telecom (largest carrier, 48.4% market share)
  • KT (Korea Telecom) (28.5% market share)
  • LG U+ (remaining market share)

Test your SMS campaigns across all three carriers before launching to ensure proper delivery and formatting.

Summary: Key Takeaways for South Korea SMS

Essential Requirements:

  1. Always use EUC-KR encoding for Korean characters – delivery of Chinese characters is not guaranteed
  2. Implement proper error handling and retry logic with exponential backoff
  3. Respect rate limits and implement queuing systems for bulk campaigns
  4. Obtain explicit consent before sending marketing messages and maintain records for 3 years minimum
  5. Process opt-out requests within 24 hours (legally required)
  6. Check the national Do-Not-Send Registry monthly
  7. Messages are automatically prefixed with [Web 발신] or [국제발신] by carriers
  8. Respect sending hours (08:00–21:00 KST) except for emergency notifications

Next Steps:

  1. Review regulations: Read the KCC and KISA guidelines
  2. Implement consent management: Build a PIPA-compliant consent system with timestamp logging, 3-year record retention, and opt-out processing
  3. Set up monitoring: Configure delivery rate tracking by carrier, opt-out rate alerts (>2% threshold), and automated compliance reporting
  4. Test comprehensively: Send test messages to all three carriers (SK Telecom, KT, LG U+) and verify EUC-KR encoding, prefix display, and URL rendering
  5. Register with authorities: If establishing local presence, register business entity with National Tax Service and apply for telecommunications registration with KCC

Additional Resources:

PIPA Compliance Note: The Personal Information Protection Act was amended on September 15, 2023, with most provisions taking effect on March 15, 2024. Ensure your compliance procedures reflect these updates, particularly regarding CPO independence and data subject rights.

Frequently Asked Questions

How to send SMS messages in South Korea?

Use a reputable SMS API provider like Twilio, Sinch, or Bird, ensuring your messages are encoded in EUC-KR for Korean characters and comply with local regulations. Due to the lack of two-way SMS support for A2P messaging, businesses must use one-way messaging and alternative channels for customer responses.

What is the role of SMS in South Korea's mobile market?

Despite the popularity of OTT apps like KakaoTalk, SMS remains essential for business communication in South Korea. It's primarily used for authentication, notifications, and marketing, particularly given the country's near 100% smartphone penetration.

Why does South Korea not support two-way SMS for businesses?

South Korea's regulations prohibit two-way A2P SMS to prevent spam and ensure security. Businesses must use one-way SMS and other channels for customer interactions.

What are the character limits for SMS in South Korea?

One SMS segment can hold up to 140 bytes, which translates to 140 ASCII characters or 70 Unicode characters. Messages must also be encoded using EUC-KR for Korean text.

When should I send marketing SMS messages in South Korea?

Adhere to the standard sending window of 8:00 AM to 9:00 PM KST, avoid major holidays, and limit frequency to 1-2 messages per recipient daily. B2B communications should ideally occur during business hours (9:00 AM - 6:00 PM).

How to get consent for SMS marketing in South Korea?

Obtain explicit written or electronic consent before sending marketing SMS, stating the purpose, frequency, and type of messages. Maintain these records for at least 3 years and consider double opt-in verification.

Can I use an alphanumeric sender ID for SMS in South Korea?

No, alphanumeric sender IDs are not supported in South Korea. All sender IDs are converted to numeric format by carriers, regardless of the original format.

How to handle opt-out requests for SMS in South Korea?

All marketing messages must include opt-out instructions in Korean. Process requests within 24 hours, maintain a centralized opt-out database, and confirm the opt-out status to users.

What is the process for sending SMS to landlines in South Korea?

Sending SMS messages to landline numbers in South Korea is not possible. Attempts will result in a 400 response error (code 21614), and no charge will occur.

What content is restricted for SMS in South Korea?

Prohibited content includes gambling, adult material, political campaigns, cryptocurrency promotions, and unauthorized pharmaceutical products. Financial and healthcare industries face additional regulations.

How can I avoid SMS filtering in South Korea?

Use registered sender IDs, avoid URL shorteners, include mandatory prefixes (like [Web ??????] for A2P), and keep content clear, professional, and compliant with character set (EUC-KR) requirements.

How to comply with SMS regulations in South Korea?

Comply with KCC and KISA regulations, including the Personal Information Protection Act (PIPA), obtain consent for marketing messages, provide clear opt-out instructions, and respect sending time restrictions.

How do MMS messages work in South Korea?

MMS messages are automatically converted to SMS with an embedded URL link. This ensures compatibility across all carriers while still allowing for the sharing of rich media content via a web link.

How do short codes work for SMS in South Korea?

Short codes are not supported for international businesses in South Korea. Businesses need to use long codes with specific prefixes.