Send SMS, LMS and MMS in South Korea — code examples

Send SMS, LMS and MMS in South Korea — code examples

Send Korean SMS (90 bytes), LMS (long text) and MMS (with images) through Sendgo. Type selection, byte counting, verification-code patterns and advertising rules.

POST /api/v2/messages/send

Text messages need no template approval, so you can compose the body in code. That makes them the right tool for one-off notices and verification codes that no Alimtalk template covers.

Prerequisites

  • A pre-registered SMS sending number (senderKey)
  • An access key and secret key

No Kakao sender profile is needed.

SMS, LMS or MMS

Type Body limit Subject Attachment Use for
SMS 90 bytes (~45 Korean chars) Verification codes, short alerts
LMS 2,000 bytes Notices, long announcements
MMS 2,000 bytes Images Event banners, coupon images

Byte counting: Korean characters are 2 bytes, Latin/digits/symbols 1, line breaks 1–2. If the body length varies at runtime, either use LMS from the start or branch on the measured length — going over 90 bytes means it cannot be sent as SMS.

Examples by language

Node.js / TypeScript

// SMS
await sendgo.sms.sendSms({
  content: '[Acme] Verification code: 123456 (valid 5 minutes)',
  contacts: [{ contact: '01012345678' }],
});

// LMS — long text with a subject
await sendgo.sms.sendLms({
  subject: '[Notice] Scheduled maintenance',
  content: `Hello,

Maintenance is scheduled.

- When: 2026-09-01 02:00 - 06:00 KST
- Scope: all services

Sorry for the inconvenience.`,
  contacts: [{ contact: '01012345678' }],
});

// MMS — with an image
await sendgo.sms.sendMms({
  subject: '[Event] September deals',
  content: 'Check out this month\'s offers!',
  contacts: [{ contact: '01012345678' }],
});

Python

client.sms.send_sms(
    content="[Acme] Verification code: 123456 (valid 5 minutes)",
    contacts=[{"contact": "01012345678"}],
)

client.sms.send_lms(
    subject="[Notice] Scheduled maintenance",
    content="Maintenance is scheduled for 2026-09-01 02:00-06:00 KST.",
    contacts=[{"contact": "01012345678"}],
)

client.sms.send_mms(
    subject="[Event] September deals",
    content="Check out this month's offers!",
    contacts=[{"contact": "01012345678"}],
)

PHP · Laravel

<?php

$sendgo->sms->sendSms([
    'content'  => '[Acme] Verification code: 123456 (valid 5 minutes)',
    'contacts' => [['contact' => '01012345678']],
]);

$sendgo->sms->sendLms([
    'subject'  => '[Notice] Scheduled maintenance',
    'content'  => "Maintenance is scheduled.\n\nWhen: 2026-09-01 02:00-06:00 KST",
    'contacts' => [['contact' => '01012345678']],
]);

In Laravel, either inject Sendgo or use app(Sendgo::class)->sms->sendSms([...]).

REST

curl -X POST https://sendgo.io/api/v2/messages/send \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignType": "MESSAGE",
    "messageType": "SMS",
    "scheduleType": "DIRECTLY",
    "content": "Verification code: 123456",
    "contacts": [{ "contact": "01012345678" }],
    "senderKey": "your_sms_sender_key"
  }'

Switch messageType to LMS or MMS; both also take a subject.

Verification codes

The most common use, and the one with the sharpest failure mode.

const code = String(Math.floor(100000 + Math.random() * 900000));

await redis.setex(`verify:${phone}`, 300, code);   // 5 minute expiry

try {
  await sendgo.sms.sendSms({
    content: `[Acme] Verification code: ${code} (valid 5 minutes)`,
    contacts: [{ contact: phone }],
  });
} catch (error) {
  // Do not swallow this — the user is waiting for a message that will never arrive.
  throw new Error('Could not send the verification code. Please try again.');
}
  • Do not swallow the failure. Unlike an order notification, a missing verification code blocks the user entirely.
  • Rate limit resends. Without a per-number limit this becomes an SMS-bombing vector and drains your credit.
  • Name your service in the body. People do not type codes from an unidentified sender.

Advertising rules

Promotional messages are regulated under the Network Act.

(광고)[Brand] Autumn sale, up to 50% off
...
Free opt-out 080-000-0000
  • (광고) at the very start of the body
  • A free opt-out number or method
  • No sending between 21:00 and 08:00 KST
  • Prior consent from every recipient

Verification codes and order notifications are informational and exempt.

Next

자주 묻는 질문

What is the difference between SMS and LMS?
Length. SMS is up to 90 bytes, which is roughly 45 Korean characters. Anything longer must go as LMS, which allows 2,000 bytes and a subject line. They are priced differently.
How many bytes is a Korean character?
Two, under the EUC-KR counting used for Korean SMS; Latin letters and digits are one. So 90 bytes is about 45 Korean characters. Line breaks count too.
Should I use SMS instead of Alimtalk?
SMS needs no template approval, so the body is free-form — good for one-off notices. It costs more per message than Alimtalk. For repeated, structured notifications Alimtalk is the better fit.
What rules apply to advertising SMS?
Korean law requires the body to start with (광고), include a free opt-out number, and never send between 21:00 and 08:00 KST. Prior consent is required. Informational messages such as verification codes are exempt.

이 문서에서 쓰는 패키지

관련 문서