API docs
Send SMS
Send an SMS to one number at once, or to many numbers as a batch.
POST
/v1/smsSends to one number. When the response arrives, the message has been handed to the operator.
Body
tostringrequired- An 8-digit number.
+976, spaces and dashes are accepted. Unitel, Mobicom, Skytel and G-Mobile are supported. textstringrequired- The message. At most 5 parts.
curl -X POST https://api.wesend.mn/v1/sms \
-H "Authorization: Bearer $WESEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "99112233",
"text": "Tanii zahialga batalgaajlaa. #1042"
}'Response200 OK
{
"id": "0b9c1a52-6f0e-4d8b-9a3c-2f1e5d7c8a90",
"status": "sent",
"channel": "sms",
"to": "99112233",
"parts": 1,
"rate_multiplier": 1,
"credits": 70,
"batch_id": null,
"error": null,
"created_at": "2026-10-06T08:15:30.000Z",
"sent_at": "2026-10-06T08:15:31.000Z",
"balance": 4930
}If the operator does not accept the message, the answer is 502 provider_failed and the credits are refunded. The error's id is the failed message.
Parts and price
A long message counts as several parts. Price = parts × credits per part × holiday multiplier.
A Cyrillic message costs 2.5 times a Latin one. A message longer than 5 parts answers 422 message_too_long. An emoji counts as 2 characters.
Send to many numbers
POST
/v1/sms/bulkSends one text to up to 1,000 numbers. The messages are queued and sent in the background.
Body
tostring[]required- 1 to 1,000 numbers. Duplicates are merged.
textstringrequired- The text every recipient receives.
curl -X POST https://api.wesend.mn/v1/sms/bulk \
-H "Authorization: Bearer $WESEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": [
"99112233",
"88112233",
"95112233"
],
"text": "Shine baraa irlee! shop.mn"
}'Response202 Accepted
{
"id": "5d2a7c1e-93b4-4f6a-8e0d-b1c2d3e4f5a6",
"status": "processing",
"channel": "sms",
"total": 3,
"sent": 0,
"failed": 0,
"credits": 210,
"created_at": "2026-10-06T08:15:30.000Z",
"completed_at": null,
"balance": 4720
}- The whole batch is charged up front. Credits for each message that is not sent are refunded.
- If any number is invalid or unsupported, the whole request answers
400 invalid_requestand lists the bad entries (up to 50) in the error'sinvalidfield. Nothing is sent or charged. - Follow progress with
GET /batches/{id}.