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. 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.

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://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_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}.