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

```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

```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
<?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

```bash
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.

```typescript
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.

```text
(광고)[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

- [Send a Kakao Alimtalk](/en/cookbook/send-alimtalk)
- [Error codes and retry strategy](/en/cookbook/error-handling)