API documentation
Use SMSReactor from your own backend: authenticate with an API key, queue SMS with JSON, and let the Android app on your SIM deliver them — anywhere that phone can send. The same key also pairs the phone. Free accounts get 30 SMS credits per day.
Quick start for developers
Your software talks to SMSReactor. A phone running the SMSReactor app is the radio that actually sends. Keep that app online.
- Create a free account and sign in to the dashboard.
- Open API keys, create a key, scan the QR with the Android app, tap Start gateway.
- From your server,
POST /smsapi/create-taskwith headerX-API-Key. - Your connected phone sends the SMS (wherever that SIM can reach). Replies show up in the dashboard inbox.
X-Worker-Token from your product — that header is for the phone app / operator path.
Authentication
Client endpoints require an API key in the request header (or, for quick tests, as a query parameter).
X-API-Key: skr_your_key_here
Alternative (less preferred):
?api_key=skr_your_key_here
Send SMS
Queues one SMS. Costs 1 credit. Your connected Android app phone delivers it — local or international, whatever that SIM / carrier allows. The gateway app must stay running.
400
with No app phone registered…
Request body
| Field | Type | Required | Description |
|---|---|---|---|
recipient |
string | yes |
Destination number. Prefer E.164 with a country code
(e.g. +381611234567, +491761234567, +15551234567).
Local 06x… is accepted and stored as +381….
Reach is whatever your connected SIM can send — we do not restrict country.
|
message |
string | yes | SMS body text. |
phone_id |
integer | no | Specific connected app phone. Invalid IDs are ignored. Omit (or pass an unusable ID) to use your first active own-app phone. |
scheduled_at |
string | no | Local datetime YYYY-MM-DD HH:MM:SS (or YYYY-MM-DDTHH:MM). Omit for ASAP. |
{
"recipient": "+381611234567",
"message": "Hello from SMSReactor!",
"scheduled_at": "2026-07-26 18:30:00"
}
Success response
HTTP 201 Created
{
"ok": true,
"id": 42,
"status": "pending",
"phone_id": 1,
"client_id": 3,
"charged": true,
"scheduled_at": "2026-07-26 18:30:00",
"credits_remaining": 99
}
Credits & plans
- Each SMS from your connected phone debits 1 credit.
- Daily credits refill every 24 hours. Unused daily credits do not stack. Admin bonus credits persist.
- The success body includes
chargedandcredits_remaining. There is no separate balance endpoint. - Insufficient balance returns HTTP
402. Failed sends are refunded once.
| Plan | SMS / day | Own phones | EUR / mo |
|---|---|---|---|
| Free | 30 | 2 | 0 |
| Starter | 1,000 | 2 | 4 |
| Basic | 2,500 | 3 | 6 |
| Standard | 5,000 | 5 | 9 |
| Pro | 10,000 | 10 | 19 |
| Business | 30,000 | 20 | 39 |
| Enterprise | 50,000+ | 50 | 79+ |
Errors
Errors are JSON objects with an error string (and sometimes detail).
| HTTP | When |
|---|---|
400 | Missing/invalid fields, unusable recipient, or no active own-app phone registered. |
401 | Missing, invalid, or revoked API key / worker token. |
403 | Phone disabled, or over the plan’s phone limit on register. |
402 | Daily credit limit reached (or no credits left). |
405 | Wrong HTTP method. |
500 | Unexpected server error. |
503 | Worker path: no active gateway configured. |
{
"error": "Daily send limit reached. Credits refill every 24 hours, or add bonus credits on the account."
}
Examples
cURL
curl -X POST https://smsreactor.com/smsapi/create-task \
-H "Content-Type: application/json" \
-H "X-API-Key: skr_your_key_here" \
-d '{
"recipient": "+381611234567",
"message": "Hello from SMSReactor!"
}'
JavaScript (fetch)
const res = await fetch("https://smsreactor.com/smsapi/create-task", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": "skr_your_key_here",
},
body: JSON.stringify({
recipient: "+381611234567",
message: "Hello from SMSReactor!",
}),
});
const data = await res.json();
console.log(res.status, data);
Python
import json, urllib.request
req = urllib.request.Request(
"https://smsreactor.com/smsapi/create-task",
data=json.dumps({
"recipient": "+491761234567",
"message": "Hello from SMSReactor!",
}).encode(),
headers={
"Content-Type": "application/json",
"X-API-Key": "skr_your_key_here",
},
method="POST",
)
with urllib.request.urlopen(req) as res:
print(res.status, res.read().decode())
PHP
$ch = curl_init("https://smsreactor.com/smsapi/create-task");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: skr_your_key_here",
],
CURLOPT_POSTFIELDS => json_encode([
"recipient" => "+381611234567",
"message" => "Hello from SMSReactor!",
]),
]);
$body = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $code, "\n", $body;