REST API

Integrate SMS into your application

A simple REST API for sending transactional, marketing, and OTP messages. Direct connections to Moldovan operators — no intermediaries.

99.8% Delivery rate
< 5 sec Average delivery time
24/7 Available
POST /v3/messages
curl -X POST https://api.sms.md/v3/messages \
  -H "X-Api-Token: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "CompanyName",
    "to":   "+37369000000",
    "text": "Ваш код: 4821"
  }'
200 OK
{
  "status":   "success",
  "httpCode": 200,
  "data": {
    "id":       "787ab0aa-09cd-44f2-aa98-6ebc3cdb2ec6",
    "to":       "+37369000000",
    "cost":     "0.30",
    "currency": "MDL"
  }
}

API features

Everything you need to integrate SMS into any application or service

Send SMS

Single and bulk sending via a single endpoint. JSON response format.

OTP and 2FA

One-time codes for verification, login, and financial operations with server-side validation.

Delivery Reports

Delivery statuses via webhook (push) or polling (pull). Everything accepted by the carrier is charged — regardless of the delivery outcome.

Scheduled sending

Schedule SMS for a specific time — Unix timestamp or ISO 8601. Cancel or modify before sending.

Alphanumeric Sender ID

Register a sender name with Moldovan operators (up to 11 characters). Recipients see your brand name.

UTF-8 and Unicode

Native support for Cyrillic, Romanian diacritics (ș, ț, ă, î, â), and any Unicode language.

Bulk send

Send to a list of numbers in a single request. Batch queue support with no database size limits.

Security

API key in the X-Api-Token header. HTTPS only. Optional IP whitelist and key rotation from the dashboard.

Code examples

Select a language and copy the ready-made example

# Sending a single SMS
curl -X POST https://api.sms.md/v3/messages \
  -H "X-Api-Token: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "CompanyName",
    "to":   "+37369000000",
    "text": "Your order #1042 has been accepted. Expect a call from our manager."
  }'

# Response:
{
  "status":   "success",
  "httpCode": 200,
  "data": {
    "id":      "787ab0aa-09cd-44f2-aa98-6ebc3cdb2ec6",
    "cost":    "0.30",
    "currency": "MDL"
  }
}
# Bulk send to a list of numbers (up to 500 per request)
curl -X POST https://api.sms.md/v3/messages/bulk \
  -H "X-Api-Token: YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "CompanyName",
    "recipients": ["+37369000001", "+37369000002", "+37369000003"],
    "text": "20% off today only! Promo code: SALE20"
  }'

# Response:
{
  "status":   "success",
  "httpCode": 200,
  "data": {
    "bulkId": "019fd720-1a7d-715c-a4ef-bfe26b903293"
  }
}
# Checking delivery status by ID
curl https://api.sms.md/v3/messages/787ab0aa-09cd-44f2-aa98-6ebc3cdb2ec6 \
  -H "X-Api-Token: YOUR_API_TOKEN"

# Response:
{
  "status":   "success",
  "httpCode": 200,
  "data": {
    "id":     "787ab0aa-09cd-44f2-aa98-6ebc3cdb2ec6",
    "status": { "id": 3, "name": "Delivered" },
    "dateUpdated": "2026-03-24T14:32:11+03:00"
  }
}
// Use Guzzle or any HTTP client
use GuzzleHttp\Client;

$client = new Client();
$response = $client->post('https://api.sms.md/v3/messages', [
    'headers' => [
        'X-Api-Token' => $apiToken,
    ],
    'json' => [
        'from' => 'CompanyName',
        'to'   => '+37369000000',
        'text' => 'Your order #1042 has been accepted.',
    ],
]);
$body = json_decode($response->getBody(), true);
echo $body['data']['id']; // 787ab0aa-09cd-44f2-aa98-6ebc3cdb2ec6
$response = $client->post('https://api.sms.md/v3/messages/bulk', [
    'headers' => ['X-Api-Token' => $apiToken],
    'json' => [
        'from' => 'CompanyName',
        'recipients' => [
            '+37369000001',
            '+37369000002',
            '+37369000003',
        ],
        'text' => '20% off today only!',
    ],
]);
$body = json_decode($response->getBody(), true);
echo $body['data']['bulkId'];
$response = $client->get(
    'https://api.sms.md/v3/messages/' . $messageId,
    ['headers' => ['X-Api-Token' => $apiToken]]
);
$msg = json_decode($response->getBody(), true)['data'];

if ($msg['status']['name'] === 'Delivered') {
    // Message delivered
}
import requests

response = requests.post(
    'https://api.sms.md/v3/messages',
    headers={'X-Api-Token': api_token},
    json={
        'from': 'CompanyName',
        'to':   '+37369000000',
        'text': 'Your order #1042 has been accepted.',
    }
)
body = response.json()
print(body['data']['id'])  # 787ab0aa-09cd-44f2-aa98-6ebc3cdb2ec6
response = requests.post(
    'https://api.sms.md/v3/messages/bulk',
    headers={'X-Api-Token': api_token},
    json={
        'from': 'CompanyName',
        'recipients': [
            '+37369000001',
            '+37369000002',
            '+37369000003',
        ],
        'text': '20% off today only!',
    }
)
print(response.json()['data']['bulkId'])
response = requests.get(
    f'https://api.sms.md/v3/messages/{message_id}',
    headers={'X-Api-Token': api_token}
)
msg = response.json()['data']

if msg['status']['name'] == 'Delivered':
    print('Delivered', msg['dateUpdated'])
const response = await fetch('https://api.sms.md/v3/messages', {
  method: 'POST',
  headers: {
    'X-Api-Token':   apiToken,
    'Content-Type':  'application/json',
  },
  body: JSON.stringify({
    from: 'CompanyName',
    to:   '+37369000000',
    text: 'Your order #1042 has been accepted.',
  }),
});

const { data } = await response.json();
console.log(data.id); // 787ab0aa-09cd-44f2-aa98-6ebc3cdb2ec6
const response = await fetch('https://api.sms.md/v3/messages/bulk', {
  method: 'POST',
  headers: {
    'X-Api-Token':   apiToken,
    'Content-Type':  'application/json',
  },
  body: JSON.stringify({
    from: 'CompanyName',
    recipients: ['+37369000001', '+37369000002'],
    text: '20% off today only!',
  }),
});
const { data } = await response.json();
console.log(`Bulk ID: ${data.bulkId}`);
const response = await fetch(
  `https://api.sms.md/v3/messages/${messageId}`,
  { headers: { 'X-Api-Token': apiToken } }
);
const { data } = await response.json();

if (data.status.name === 'Delivered') {
  console.log('Delivered', data.dateUpdated);
}

Get started in 3 steps

From registration to your first SMS

01

Sign up

Create an account at partner.sms.md. Fill in your company details and sign the contract. Processing takes a few hours. Top up your balance from 500 MDL.

02

Get your API key

Go to the section in your dashboard Settings → API. Copy the key and submit a sender name registration request to Moldovan operators in 1–2 business days.

03

Send your first SMS

Use the code examples above. One POST request — and your app can send SMS.

Delivery Reports

Real-time delivery statuses

Set a DLR URL in Settings → API and we will send a POST request to your server on every status change.

Queued Accepted by the system, awaiting sending. Not yet billed.
Sent Handed off to the carrier for delivery. Billed.
Delivered Carrier confirmed delivery to the recipient. Billed.
Undelivered Handed off to the carrier, but delivery failed — content filtering, unreachable phone. Billed.
Failed Rejected by the platform or carrier before sending — invalid parameters, number, or sender name. Not billed.
Unknown The system did not receive a reliable delivery result. Billed if the message was handed off to the carrier.
POST your_server.com/dlr
// Incoming POST request to your DLR URL
{
  "id":           "787ab0aa-09cd-44f2-aa98-6ebc3cdb2ec6",
  "phone":        "37369000000",
  "text":         "Ваш код: 4821",
  "status_id":    3,
  "status_name":  "Delivered",
  "date_created": "2026-03-24 14:32:11"
}
Your server responds
// HTTP 200 OK

Main parameters

All requests in JSON, responses available in JSON

Parameter Type Required Description
to string да Recipient number — local without a prefix (69123456) or with a country code (+37369123456)
from string да Sender name up to 15 characters, approved by operators
text string да Message text, up to 800 characters. 160 GSM-7 / 70 Unicode characters per billable segment
sendAt string нет Scheduled send time, Y-m-d H:i:s in Moldova time. Without a value — immediately

Popular use cases

What developers build with SMS.MD API

OTP / 2FA

Two-factor authentication, operation confirmation, registration verification. The code arrives in seconds.

Banking E-commerce SaaS
Transactional notifications

Order status, payment confirmation, delivery notification, appointment reminders — automatically via API.

Logistics Healthcare Finance
Marketing campaigns

Promotions, base reactivation, personalized offers. Bulk sending with real-time delivery analytics.

Retail HoReCa Beauty

Start Sending SMS Today

Sign up, top up your balance, and launch your first campaign within one business day.

For legal entities in Moldova only  ·  Minimum deposit 500 MDL  ·  No hidden fees