Kotlin Integation Guide
Welcome to the ReSMS Kotlin integration guide.
This guide explains how you can quickly and securely send SMS messages using the ReSMS API in your Kotlin applications.
Features
- Send SMS: Send text messages to phone numbers.
- Send OTP: Generate and send one-time passwords (OTP) for user verification.
- Verify OTP: Validate OTP codes entered by users.
Installation
First, install our official ReSMS Kotlin SDK:
Maven:
<dependency>
<groupId>dev.resms</groupId>
<artifactId>resms-java-sdk</artifactId>
<version>1.1.0</version>
</dependency>Gradle (Kotlin DSL):
implementation("dev.resms:resms-java-sdk:1.1.0")Setup
You need to get an API key on ReSMS Dashboard .
Then import the package and create a new instance of the ReSMS class with your API key.
import dev.resms.ReSMS
val resms = ReSMS("re_12345") // Replace with your actual API keySend SMS
Here’s a minimal example to send an SMS:
import dev.resms.ReSMS
import dev.resms.core.exception.ReSMSException
import dev.resms.services.sms.model.SendSmsOptions
val resms = ReSMS("re_12345")
val smsOptions = SendSmsOptions.builder()
.to("+33612345678")
.message("Welcome to ReSMS!")
.build()
try {
resms.sms().send(smsOptions)
} catch (e: ReSMSException) {
println("Error: ${e.message}")
}Parameters
Possible parameters for sending an SMS:
| Field | Type | Required | Description |
|---|---|---|---|
to | String | ✅ | The phone number of the recipient, in international format (E.164) |
message | String | ✅ | The SMS content (160 characters max) |
senderId | String | ❌ | The alphanumeric sender name displayed |
Response
Success Response
The sms.send() method returns a response when the SMS has been successfully sent.
The response type is:
data class SendSmsResponse(
val data: SendSmsResponseData
) : Response() {
data class SendSmsResponseData(
val messageId: String
)
}Error Response
In case of an error, a ReSMSException is thrown:
class ReSMSException(message: String) : Exception(message)The sms.send() method may return the following errors:
| Name | Message |
|---|---|
| COUNTRY_DETECTION_FAILED | Unable to detect country code from phone number |
| PHONE_NUMBER_PARSING_FAILED | Invalid phone number |
| INSUFFICIENT_SMS_QUOTA | Failed to update message status |
| MESSAGE_STATUS_UPDATE_FAILED | Failed to update message status |
Send OTP
Here is a minimal example to send an OTP verification code to a phone number:
import dev.resms.ReSMS
import dev.resms.services.otp.model.SendOtpOptions
val resms = ReSMS("re_12345")
val otpOptions = SendOtpOptions.builder()
.to("+33612345678")
.message("Your OTP code is {CODE}")
.build()
try {
resms.otp().send(otpOptions)
} catch (e: ReSMSException) {
println("Error: ${e.message}")
}Parameters
Possible parameters for sending an OTP:
| Field | Type | Required | Description | Default Value |
|---|---|---|---|---|
to | String | ✅ | The phone number of the recipient, in international format (E.164) | |
message | String | ✅ | The SMS content (160 characters max). It must contain {CODE}. | |
senderId | String | ❌ | The alphanumeric sender name displayed | |
codeType | String ("NUMERIC"| "ALPHA") | ❌ | The type of OTP code to generate | "NUMERIC" |
codeLength | Int | ❌ | The length of the OTP code | 6 |
validityMinutes | Int | ❌ | The validity period of the OTP in minutes. | 5 |
Response
Success Response
The otp.send() method returns a response when the OTP has been successfully sent.
The response type is:
data class SendOtpResponse(
val data: SendOtpResponseData
) : Response() {
data class SendOtpResponseData(
val phoneNumber: String,
val expiresAt: String
)
}Error Response
In case of an error, a ReSMSException is thrown with the error details.
The otp.send() method may return the following errors:
| Code | HTTP Status | Message |
|---|---|---|
INVALID_MESSAGE_TEMPLATE | 400 | Message template must contain {CODE} placeholder |
INVALID_CODE_LENGTH | 400 | Code length must be between 4 and 16 |
INVALID_VALIDITY_DURATION | 400 | Validity duration must be between 1 minute and 1440 minutes (24 hours) |
TOO_MANY_OTP_REQUESTS | 429 | Too many OTP requests for this phone number |
Verify OTP
To verify an OTP code entered by the user:
import dev.resms.ReSMS
import dev.resms.services.otp.model.VerifyOtpOptions
val resms = ReSMS("re_12345")
val verifyOptions = VerifyOtpOptions.builder()
.to("+33612345678")
.code("123456")
.build()
try {
val response = resms.otp().verify(verifyOptions)
println("OTP verified: ${response.data.otpId}")
} catch (e: ReSMSException) {
println("Error: ${e.message}")
}Parameters
Possible parameters for verifying an OTP:
| Field | Type | Required | Description |
|---|---|---|---|
to | String | ✅ | The phone number the OTP was sent to, in international format (E.164) |
code | String | ✅ | The verification code entered by the user |
Response
Success Response
The otp.verify() method returns a response indicating whether the OTP is valid or not.
The response type is:
data class VerifyOtpResponse(
val data: VerifyOtpResponseData
) : Response() {
data class VerifyOtpResponseData(
val otpId: String,
val phoneNumber: String,
val verifiedAt: String
)
}Error Response
In case of an error, a ReSMSException is thrown with the error details.
The otp.verify() method may return the following errors:
| Code | HTTP Status | Message |
|---|---|---|
OTP_NOT_FOUND | 404 | OTP not found |
OTP_INVALID | 400 | OTP is invalid |
OTP_EXPIRED | 400 | OTP has expired |
OTP_ALREADY_VERIFIED | 400 | OTP already verified |
INVALID_OTP_CODE | 400 | Invalid OTP code |
Have feedback, found a bug, or want to suggest a feature?
- Open an issue on GitHub
- Or chat with us directly on Discord — we’re happy to help!