Technical guide for LLM agents writing code using the SDK.
LLM agents should use the AskUserQuestion tool to ask users about their messaging needs before writing code.
Ask the user the following questions using AskUserQuestion:
-
Message Type - Which type of message do you want to send?
- SMS/LMS (Text message)
- MMS (Image message)
- Kakao Alimtalk (Notification)
- Kakao Brand Message (Freeform/Template)
- RCS
- Voice
- FAX
-
Programming Language - Which language are you using?
- Kotlin
- Java
-
Send Mode - How do you want to send messages?
- Single message
- Batch send (multiple recipients)
- Scheduled send
After gathering requirements, proceed to the relevant sections in this guide.
| Item | Value |
|---|---|
| SDK | com.solapi:sdk:1.1.0 |
| Docs | https://developers.solapi.com/llms.txt |
| API Ref | https://solapi.github.io/solapi-kotlin/ |
| Java | 8+ |
| Kotlin | 1.8+ |
JDK 8 does not support Map.of(), List.of(). Use HashMap, ArrayList instead:
Map<String, String> variables = new HashMap<>();
variables.put("name", "홍길동");Gradle (Kotlin DSL):
implementation("com.solapi:sdk:1.1.0")Maven:
<dependency>
<groupId>com.solapi</groupId>
<artifactId>sdk</artifactId>
<version>1.1.0</version>
</dependency>Kotlin:
val service = SolapiClient.createInstance("API_KEY", "API_SECRET")
val message = Message(from = "발신번호", to = "수신번호", text = "내용")
val response = service.send(message)Java:
DefaultMessageService service = SolapiClient.INSTANCE.createInstance("API_KEY", "API_SECRET");
Message message = new Message();
message.setFrom("발신번호");
message.setTo("수신번호");
message.setText("내용");
service.send(message, null);| Type | Field | Notes |
|---|---|---|
| SMS | text | < 80 bytes |
| LMS | text | 80-2000 bytes |
| MMS | imageId | Use after uploadFile(), JPG/JPEG, max 200KB |
| ATA | kakaoOptions | Kakao Alimtalk, template required |
| BMS_* | kakaoOptions | Kakao Brand Message |
| RCS_* | rcsOptions | RCS message |
| NSA | naverOptions | Naver Smart Notification |
| FAX | fileId | Use after uploadFile() |
| VOICE | voiceOptions | Voice message |
KakaoOption(
pfId = "카카오채널ID",
templateId = "템플릿ID",
variables = mapOf("name" to "홍길동", "code" to "123456")
)KakaoOption kakaoOption = new KakaoOption();
kakaoOption.setPfId("카카오채널ID");
kakaoOption.setTemplateId("템플릿ID");
Map<String, String> variables = new HashMap<>();
variables.put("name", "홍길동");
variables.put("code", "123456");
kakaoOption.setVariables(variables);Kotlin:
val imageId = service.uploadFile(file, StorageType.MMS)
val message = Message(
type = MessageType.MMS,
from = "발신번호",
to = "수신번호",
text = "MMS 내용",
subject = "제목",
imageId = imageId
)
service.send(message)Java:
String imageId = service.uploadFile(file, StorageType.MMS, null);
Message message = new Message();
message.setType(MessageType.MMS);
message.setFrom("발신번호");
message.setTo("수신번호");
message.setText("MMS 내용");
message.setSubject("제목");
message.setImageId(imageId);
service.send(message, null);Kotlin:
val messages = recipients.map { recipient ->
Message(from = sender, to = recipient, text = "메시지")
}
service.send(messages) // max 10,000
// 중복 번호 허용
val config = SendRequestConfig().apply { allowDuplicates = true }
service.send(messages, config)Java:
List<Message> messages = new ArrayList<>();
for (String recipient : recipients) {
Message msg = new Message();
msg.setFrom(sender);
msg.setTo(recipient);
msg.setText("메시지");
messages.add(msg);
}
service.send(messages, null); // max 10,000
// 중복 번호 허용
SendRequestConfig config = new SendRequestConfig();
config.setAllowDuplicates(true);
service.send(messages, config);Kotlin:
val config = SendRequestConfig().apply {
setScheduledDateFromLocalDateTime(
LocalDateTime.now().plusMinutes(10),
ZoneId.of("Asia/Seoul")
)
}
service.send(message, config)Java:
SendRequestConfig config = new SendRequestConfig();
config.setScheduledDateFromLocalDateTime(
LocalDateTime.now().plusMinutes(10),
ZoneId.of("Asia/Seoul")
);
service.send(message, config);Constraints: Minimum 10 minutes, maximum 6 months in advance
Send:
| Method | Description |
|---|---|
send(message) |
Send single message |
send(messages) |
Send multiple messages (max 10,000) |
send(message, config) |
Send with configuration |
uploadFile(file, type) |
Upload file |
Query:
| Method | Description |
|---|---|
getBalance() |
Get balance |
getQuota() |
Get daily quota |
getMessageList(request) |
Get message history |
Kakao Templates:
| Method | Description |
|---|---|
getKakaoAlimtalkTemplates() |
Get Alimtalk template list |
getKakaoAlimtalkTemplate(id) |
Get template details |
getSendableKakaoAlimtalkTemplates() |
Get sendable templates |
| Exception | Cause |
|---|---|
SolapiBadRequestException |
Invalid parameters |
SolapiInvalidApiKeyException |
API key error |
SolapiApiKeyException |
API key related error |
SolapiFileUploadException |
File upload failed |
SolapiMessageNotReceivedException |
Send failed |
SolapiEmptyResponseException |
Empty response |
SolapiUnknownException |
Unknown error |
Kotlin:
try {
service.send(message)
} catch (e: SolapiBadRequestException) {
// 잘못된 요청
} catch (e: SolapiInvalidApiKeyException) {
// API 키 오류
} catch (e: SolapiMessageNotReceivedException) {
// 발송 실패
} catch (e: SolapiException) {
// 기타 오류
}Java:
try {
service.send(message, null);
} catch (SolapiBadRequestException e) {
// 잘못된 요청
} catch (SolapiInvalidApiKeyException e) {
// API 키 오류
} catch (SolapiMessageNotReceivedException e) {
// 발송 실패
} catch (SolapiException e) {
// 기타 오류
}| Variable | Description |
|---|---|
SOLAPI_API_KEY |
API key |
SOLAPI_API_SECRET |
API secret |
SOLAPI_SENDER |
Sender number |
SOLAPI_KAKAO_PF_ID |
Kakao channel ID |
SOLAPI_KAKAO_TEMPLATE_ID |
Alimtalk template ID |
Kotlin:
import com.solapi.sdk.SolapiClient
import com.solapi.sdk.message.model.Message
import com.solapi.sdk.message.model.MessageType
import com.solapi.sdk.message.model.StorageType
import com.solapi.sdk.message.model.SendRequestConfig
import com.solapi.sdk.message.model.kakao.KakaoOptionJava:
import com.solapi.sdk.SolapiClient;
import com.solapi.sdk.message.model.Message;
import com.solapi.sdk.message.model.MessageType;
import com.solapi.sdk.message.model.StorageType;
import com.solapi.sdk.message.model.SendRequestConfig;
import com.solapi.sdk.message.model.kakao.KakaoOption;
import com.solapi.sdk.message.service.DefaultMessageService;