Send OTP
Generate and send a 6-digit verification code to a phone number via SMS.
Send verification code to phone number
Request Body
| Field | Type | Required | Description |
| phone_number |
string |
required |
Phone with country code (e.g., +85512345678) |
| purpose |
string |
optional |
register, reset_password, or login (default: register) |
| site_name |
string |
optional |
Your website/app name (included in SMS) |
POST /api/otp/send
{
"phone_number": "+85512345678",
"purpose": "register",
"site_name": "MyShop"
}
{
"success": true,
"message": "OTP sent",
"expires_in": 300
}
{
"error": "Rate limit exceeded"
}
Verify OTP
Verify the 6-digit code sent to the phone number.
Verify the OTP code
Request Body
| Field | Type | Required | Description |
| phone_number |
string |
required |
Phone number used in send request |
| otp_code |
string |
required |
6-digit verification code |
| purpose |
string |
optional |
Must match the purpose used in send (default: register) |
POST /api/otp/verify
{
"phone_number": "+85512345678",
"otp_code": "123456",
"purpose": "register"
}
{
"success": true,
"message": "Phone verified",
"purpose": "register",
"site_name": "MyShop"
}
Rate Limits
To prevent abuse, the following rate limits apply:
Global: 3 requests per 15 minutes
Login: 5 attempts per 15 minutes
OTP Send: 3 requests per minute
Per Phone: 5 OTP requests per hour
Need more requests? Contact admin to increase your limits.
Code Examples
Integrate with your favorite language.
const axios = require('axios');
const API = 'https://backend-lime-three-82.vercel.app';
async function sendOtp(phone) {
const { data } = await axios.post(API + '/api/otp/send', {
phone_number: phone,
purpose: 'register',
site_name: 'MyApp'
});
return data;
}
async function verifyOtp(phone, code) {
const { data } = await axios.post(API + '/api/otp/verify', {
phone_number: phone,
otp_code: code,
purpose: 'register'
});
return data;
}
sendOtp('+85512345678').then(console.log);
verifyOtp('+85512345678', '123456').then(console.log);
import requests
API = 'https://backend-lime-three-82.vercel.app'
def send_otp(phone):
response = requests.post(f'{API}/api/otp/send', json={
'phone_number': phone,
'purpose': 'register',
'site_name': 'MyApp'
})
return response.json()
def verify_otp(phone, code):
response = requests.post(f'{API}/api/otp/verify', json={
'phone_number': phone,
'otp_code': code,
'purpose': 'register'
})
return response.json()
print(send_otp('+85512345678'))
print(verify_otp('+85512345678', '123456'))
$API = 'https://backend-lime-three-82.vercel.app';
function sendOtp($phone) {
global $API;
$ch = curl_init($API . '/api/otp/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'phone_number' => $phone,
'purpose' => 'register',
'site_name' => 'MyApp'
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return json_decode(curl_exec($ch), true);
}
function verifyOtp($phone, $code) {
global $API;
$ch = curl_init($API . '/api/otp/verify');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'phone_number' => $phone,
'otp_code' => $code,
'purpose' => 'register'
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return json_decode(curl_exec($ch), true);
}
print_r(sendOtp('+85512345678'));
print_r(verifyOtp('+85512345678', '123456'));
import java.net.http.*;
import java.net.URI;
public class OtpClient {
static String API = "https://backend-lime-three-82.vercel.app";
public static String sendOtp(String phone) throws Exception {
HttpClient client = HttpClient.newHttpClient();
String json = "{\"phone_number\":\"" + phone +
"\",\"purpose\":\"register\",\"site_name\":\"MyApp\"}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(API + "/api/otp/send"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
return client.send(request, HttpResponse.BodyHandlers.ofString()).body();
}
public static String verifyOtp(String phone, String code) throws Exception {
HttpClient client = HttpClient.newHttpClient();
String json = "{\"phone_number\":\"" + phone +
"\",\"otp_code\":\"" + code + "\",\"purpose\":\"register\"}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(API + "/api/otp/verify"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
return client.send(request, HttpResponse.BodyHandlers.ofString()).body();
}
}
curl -X POST https://backend-lime-three-82.vercel.app/api/otp/send \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+85512345678",
"purpose": "register",
"site_name": "MyApp"
}'
curl -X POST https://backend-lime-three-82.vercel.app/api/otp/verify \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+85512345678",
"otp_code": "123456",
"purpose": "register"
}'