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/sendText 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.