文档菜单
A PRACTICAL GUIDE
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이 가이드는 아직 번역되지 않아 English 문서를 표시합니다.
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.
이 문서에서 쓰는 패키지
관련 문서
이메일 · SMTP 연동 — 발신 인증, 뉴스레터와 자동화 수신함 →
일반 발송 승인이 완료된 이메일 서비스입니다. 발신 인증과 앱의 발송 가능 상태를 확인하고 SMTP, HTTP API와 자동화 수신함을 연동하세요.
Send a Kakao Alimtalk — PHP, Node.js, Python, Java, Go examples →
Send Kakao Alimtalk with an approved template code. Runnable code for Laravel, Node.js, Python, PHP, Java, Go, Ruby and .NET, plus every required field and why sends fail.
Send a Kakao Brand Message — the successor to Friendtalk →
Send Brand Messages to channel friends, non-friends, or every consenting friend at once. How targeting splits the request path, and when to keep using the Friendtalk endpoint.
SMS fallback when a Kakao Alimtalk fails →
Use replaceSms so a text message goes out when the Alimtalk cannot be delivered. Required fields, cost implications, and the mistake that silently sends nothing.
Bulk Alimtalk sending and per-recipient variables →
Send one template to many recipients with different values each, in batches. Batch sizing, partial failures, queue patterns and the data hygiene that prevents most incidents.
Scheduling an Alimtalk or SMS — scheduleType and at →
Send at a specific time with scheduleType SCHEDULED. Timestamp format, the KST timezone trap, and how scheduling interacts with the advertising night ban.