API docs

Send SMS

Send an SMS to one number at once, or to many numbers as a batch.

POST/v1/sms

Sends 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. The supported numbers are listed below.
textstringrequired
The message. At most 5 parts.
curl -X POST https://dev-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": 80,
  "batch_id": null,
  "error": null,
  "created_at": "2026-10-06T08:15:30.000Z",
  "sent_at": "2026-10-06T08:15:31.000Z",
  "balance": 4920
}

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.

Messages to ONDO and Lime numbers, and messages another operator did not accept, go over a different route. That route carries no links, so any link in the text (https://…, www.…, example.mn/…) is removed before delivery. A message that is nothing but a link is not sent and fails with 502 provider_failed.

Supported numbers

The operator is read from the start of the number. An 8-digit number starting with one of these is accepted.

OperatorNumber starts with
Mobicom85, 94, 95, 99, and 5050-5099, 5550-5599
Skytel69, 90, 91, 92, 96
Unitel80, 86, 88, 89, and 5000-5049
G-Mobile78, 83, 87, 93, 97, 98
ONDO60, 66, and 8181
Lime72
Toki5500-5549 (on the Unitel network)
KAOS505 (on the Mobicom network)

A number with any other start (a landline or a foreign number, for instance) answers 422 unsupported_number. No credits are taken.

Parts and price

A long message counts as several parts. Price = parts × credits per part × holiday multiplier.

ContentOne part
Only Latin letters, digits and common punctuation150 characters
Any Cyrillic letter, emoji, or one of [ \ ] ^ { | } ~ and the backtick (`)60 characters

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/bulk

Sends 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://dev-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": 240,
  "created_at": "2026-10-06T08:15:30.000Z",
  "completed_at": null,
  "balance": 4680
}
  • 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_request and lists the bad entries (up to 50) in the error's invalid field. Nothing is sent or charged.
  • Follow progress with GET /batches/{id}.