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
GET /v1/send
curl https://api.sms.md/v1/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to":   "+37369000000",
    "from": "CompanyName",
    "message": "Ваш код: 4821"
  }'
200 OK
{
  "id":       "fec42b1b-eb52-4ea7-9629-b62342c62d64",
  "receiver":  "+37369000000",
  "status":   "queued",
  "message":  "Message sent successfully"
  "dateCreate": "2026-03-12 08:20:05"
}

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). Funds for undelivered SMS are automatically refunded.

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 Authorization 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/v1/messages \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to":   "+37369000000",
    "from": "CompanyName",
    "text": "Your order #1042 has been accepted. Expect a call from our manager."
  }'
# Bulk send to a list of numbers
curl -X POST https://api.sms.md/v1/messages/bulk \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "recipients": ["+37369000001", "+37369000002", "+37369000003"],
    "from": "CompanyName",
    "text": "20% off today only! Promo code: SALE20"
  }'
# Checking delivery status by ID
curl -X GET https://api.sms.md/v1/messages/msg_8f3a91bc \
  -H "Authorization: Bearer YOUR_API_KEY"

# Response:
{
  "id":           "msg_8f3a91bc",
  "status":       "delivered",
  "delivered_at": "2026-03-24T14:32:11Z",
}
// Use Guzzle or any HTTP client
use GuzzleHttp\Client;

$client = new Client();
$response = $client->post('https://api.sms.md/v1/messages', [
    'headers' => [
        'Authorization' => 'Bearer ' . $apiKey,
    ],
    'json' => [
        'to'   => '+37369000000',
        'from' => 'CompanyName',
        'text' => 'Your order #1042 has been accepted.',
    ],
]);
$data = json_decode($response->getBody(), true);
echo $data['id']; // msg_8f3a91bc
$response = $client->post('https://api.sms.md/v1/messages/bulk', [
    'headers' => ['Authorization' => 'Bearer ' . $apiKey],
    'json' => [
        'recipients' => [
            '+37369000001',
            '+37369000002',
            '+37369000003',
        ],
        'from' => 'CompanyName',
        'text' => '20% off today only!',
    ],
]);
$result = json_decode($response->getBody(), true);
echo $result['sent']; // 3
$response = $client->get(
    'https://api.sms.md/v1/messages/msg_8f3a91bc',
    ['headers' => ['Authorization' => 'Bearer ' . $apiKey]]
);
$msg = json_decode($response->getBody(), true);

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

response = requests.post(
    'https://api.sms.md/v1/messages',
    headers={'Authorization': f'Bearer {api_key}'},
    json={
        'to':   '+37369000000',
        'from': 'CompanyName',
        'text': 'Your order #1042 has been accepted.',
    }
)
data = response.json()
print(data['id'])  # msg_8f3a91bc
response = requests.post(
    'https://api.sms.md/v1/messages/bulk',
    headers={'Authorization': f'Bearer {api_key}'},
    json={
        'recipients': [
            '+37369000001',
            '+37369000002',
            '+37369000003',
        ],
        'from': 'CompanyName',
        'text': '20% off today only!',
    }
)
print(response.json()['sent'])  # 3
response = requests.get(
    'https://api.sms.md/v1/messages/msg_8f3a91bc',
    headers={'Authorization': f'Bearer {api_key}'}
)
msg = response.json()

if msg['status'] == 'delivered':
    print('Delivered at', msg['delivered_at'])
const response = await fetch('https://api.sms.md/v1/messages', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`,
    'Content-Type':  'application/json',
  },
  body: JSON.stringify({
    to:   '+37369000000',
    from: 'CompanyName',
    text: 'Your order #1042 has been accepted.',
  }),
});

const data = await response.json();
console.log(data.id); // msg_8f3a91bc
const response = await fetch('https://api.sms.md/v1/messages/bulk', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`,
    'Content-Type':  'application/json',
  },
  body: JSON.stringify({
    recipients: ['+37369000001', '+37369000002'],
    from: 'CompanyName',
    text: '20% off today only!',
  }),
});
const { sent } = await response.json();
console.log(`Sent: ${sent}`);
const response = await fetch(
  'https://api.sms.md/v1/messages/msg_8f3a91bc',
  { headers: { 'Authorization': `Bearer ${apiKey}` } }
);
const msg = await response.json();

if (msg.status === 'delivered') {
  console.log('Delivered at', msg.delivered_at);
}

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

Subscribe to a webhook and we will notify your server as soon as the SMS is delivered or rejected by the operator.

delivered SMS delivered to phone by operator
queued Queued for sending
failed Send error — funds returned
rejected Rejected by operator
POST your_server.com/webhook
// Incoming POST request to your callback URL
{
  "event":        "message.delivered",
  "id":           "msg_8f3a91bc",
  "to":           "+37369000000",
  "from":         "CompanyName",
  "status":       "delivered",
  "delivered_at": "2026-03-24T14:32:11Z"
}
Your server responds
// HTTP 200 OK
{ "received": true }

Main parameters

All requests in JSON, responses available in JSON

Parameter Type Required Description
to string да Recipient number in E.164 format (+37369000000)
from string да Sender name up to 11 characters, approved by operators
message string да Message text. 160 GSM-7 characters, 70 Unicode characters
callback_url string нет URL for delivery report (webhook). Must respond with HTTP 200
scheduled_at string нет Send time in ISO 8601 format. 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