Endpoints
| POST /provider/v1/heartbeat | Marks SIMs as online. |
| GET /provider/v1/orders | Numbers assigned to you that are open, plus those closed in the last 10 minutes. |
| POST /provider/v1/sms | Forwards an SMS that reached a SIM. |
| GET /provider/v1/rentals | Your SIMs rented out right now. |
| GET /provider/v1/sims | Your connected SIMs, whether they are online and how many codes they delivered. |
| POST /provider/v1/sims | Adds SIMs (up to 500 at once). |
| PATCH /provider/v1/sims/:id | Turns a SIM on or off for sale, or changes its services. |
| PUT /provider/v1/prices | Your price per number (USD, between 0.02 and 10). |
| PUT /provider/v1/rent-prices | Your daily rental price (USD, between 0.10 and 50). |
| GET /provider/v1 | Summary: status, score, tier, commission, balances and SIM counts. |
| GET /provider/v1/stats?days=30 | Daily earnings and codes, by service and country, and success rate and uptime per SIM (1-90 days). |
| GET /provider/v1/ledger | Earnings, releases, fines and payouts. |
| POST /provider/v1/payouts | Requests a USDT payout from the available balance (at least $10). |
POST /provider/v1/heartbeat
Marks SIMs as online. Send it at least every 30 seconds; a SIM silent for 90 seconds stops being sold. Without phones, every SIM counts as online.
Request
{ "phones": ["447700900001", "447700900002"] }Response
{ "online": 2 }GET /provider/v1/orders
Numbers assigned to you that are open, plus those closed in the last 10 minutes. Poll every 2-5 seconds; status waiting means an SMS is expected.
Response
[
{
"id": 9182,
"phone": "447700900001",
"service": "wa",
"status": "waiting",
"code": null,
"createdAt": "2026-11-10T09:00:00.000Z",
"expiresAt": "2026-11-10T09:20:00.000Z"
}
]POST /provider/v1/sms
Forwards an SMS that reached a SIM. One of orderId, rentalId or phone is enough. The code is extracted from the text and shown to the buyer at once.
Request
{ "orderId": 9182, "sender": "WhatsApp", "text": "Your WhatsApp code 123-456" }Response
{ "accepted": true, "code": "123456" }GET /provider/v1/rentals
Your SIMs rented out right now. Forward every SMS they receive with /sms.
Response
[{ "id": 311, "phone": "447700900002", "service": "full", "status": "active", "price": "3.0000", "earning": "2.5500", "sms": 4, "endsAt": "2026-11-11T09:00:00.000Z" }]GET /provider/v1/sims
Your connected SIMs, whether they are online and how many codes they delivered.
Response
[{ "id": 7, "phone": "447700900001", "country": "16", "operator": "EE", "services": [], "enabled": true, "online": true, "busy": false, "delivered": 128 }]POST /provider/v1/sims
Adds SIMs (up to 500 at once). country is the SMS-Activate country code (16 = United Kingdom, 62 = Turkey). Empty services means every service.
Request
{ "sims": [{ "phone": "447700900001", "country": "16", "operator": "EE", "services": ["wa", "tg"] }] }Response
{ "ids": [7] }PATCH /provider/v1/sims/:id
Turns a SIM on or off for sale, or changes its services.
Request
{ "enabled": false }Response
{ "ok": true }PUT /provider/v1/prices
Your price per number (USD, between 0.02 and 10). service "*" is the country default; price: null removes the row.
Request
{ "prices": [{ "service": "*", "country": "16", "price": 0.12 }, { "service": "wa", "country": "16", "price": 0.18 }] }Response
{ "ok": true }PUT /provider/v1/rent-prices
Your daily rental price (USD, between 0.10 and 50).
Request
{ "prices": [{ "country": "16", "dayPrice": 1.5 }] }Response
{ "ok": true }GET /provider/v1
Summary: status, score, tier, commission, balances and SIM counts.
Response
{
"status": "active",
"score": 88.5,
"tier": "A",
"commission": 0.15,
"balances": { "pending": "12.4800", "available": "41.2000", "deposit": "50.0000", "depositRequired": "62.0000" },
"sims": { "total": 12, "online": 11, "busy": 3 },
"hasKey": true
}GET /provider/v1/stats?days=30
Daily earnings and codes, by service and country, and success rate and uptime per SIM (1-90 days).
Response
{
"days": [{ "day": "2026-11-10", "orders": 42, "delivered": 37, "earned": "4.4400", "rentals": 1 }],
"services": [{ "service": "wa", "orders": 30, "delivered": 28, "earned": "3.3600", "successRate": 93.3 }],
"countries": [{ "country": "16", "orders": 42, "delivered": 37, "earned": "4.4400", "successRate": 88.1 }],
"sims": [{ "id": 7, "phone": "447700900001", "orders": 9, "delivered": 9, "earned": "1.0800", "successRate": 100, "uptime": 99.2 }]
}GET /provider/v1/ledger
Earnings, releases, fines and payouts.
Response
[{ "id": 55, "kind": "earning", "amount": "0.1020", "bucket": "pending", "createdAt": "…" }]POST /provider/v1/payouts
Requests a USDT payout from the available balance (at least $10).
Request
{ "amount": 40, "address": "TQ…" }Response
{ "id": 18 }Example code
Ready-made heartbeat, order polling and SMS forwarding. Replace pk_... with your key.
cURL
# Heartbeat
curl -X POST https://smsrota.com/provider/v1/heartbeat \
-H "Authorization: Bearer pk_..." -H "Content-Type: application/json" -d '{}'
# Open orders
curl https://smsrota.com/provider/v1/orders -H "Authorization: Bearer pk_..."
# Forward an SMS
curl -X POST https://smsrota.com/provider/v1/sms \
-H "Authorization: Bearer pk_..." -H "Content-Type: application/json" \
-d '{"phone":"447700900001","sender":"WhatsApp","text":"Your WhatsApp code 123-456"}'Python
import threading, time, requests
API = "https://smsrota.com/provider/v1"
H = {"Authorization": "Bearer pk_..."}
def heartbeat():
while True:
requests.post(f"{API}/heartbeat", json={}, headers=H, timeout=10)
time.sleep(25)
threading.Thread(target=heartbeat, daemon=True).start()
def on_sms(phone, sender, text):
# Call this from your modem / SIM bank software for every incoming SMS.
r = requests.post(f"{API}/sms", json={"phone": phone, "sender": sender, "text": text}, headers=H, timeout=10)
print(r.json())
while True:
for o in requests.get(f"{API}/orders", headers=H, timeout=10).json():
if o["status"] == "waiting":
print("waiting for SMS on", o["phone"], "for", o["service"])
time.sleep(3)Node.js
const API = "https://smsrota.com/provider/v1";
const headers = { Authorization: "Bearer pk_...", "Content-Type": "application/json" };
setInterval(() => fetch(`${API}/heartbeat`, { method: "POST", headers, body: "{}" }), 25_000);
export async function onSms(phone, sender, text) {
const res = await fetch(`${API}/sms`, { method: "POST", headers, body: JSON.stringify({ phone, sender, text }) });
return res.json(); // { accepted: true, code: "123456" }
}