Integrate SMS into your application
A simple REST API for sending transactional, marketing, and OTP messages. Direct connections to Moldovan operators — no intermediaries.
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" }'
{
"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
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
Subscribe to a webhook and we will notify your server as soon as the SMS is delivered or rejected by the operator.
// 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" }
// 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.
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