Integrate SMS into your application
A simple REST API for sending transactional, marketing, and OTP messages. Direct connections to Moldovan operators — no intermediaries.
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" }'
{
"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
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.
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.
Send your first SMS
Use the code examples above. One POST request — and your app can send SMS.
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.
// 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" }
// 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.
Transactional notifications
Order status, payment confirmation, delivery notification, appointment reminders — automatically via API.
Marketing campaigns
Promotions, base reactivation, personalized offers. Bulk sending with real-time delivery analytics.
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