← Provider programme

Provider API reference

Connect your SIMs from a modem, a SIM bank or your own software and earn from every verification code. Every endpoint speaks JSON and works with one API key.

Getting started

  1. Create an account and join the seller programme in the seller hub.
  2. Create your API key (starts with pk_) under Seller hub > API. It is shown only once.
  3. Add your servers' IP addresses to the allowlist on the same page; when it is set, requests from other IPs are refused.
  4. Add your SIMs, set your price and start sending heartbeats. Online SIMs go on sale at once.

Basics

Base URL
https://smsrota.com/provider/v1
Authentication
Authorization: Bearer pk_… header
Format
JSON bodies and responses; amounts in USD as strings ("0.1200")
Rate limit
600 requests per minute per key
Country codes
SMS-Activate country codes (e.g. 16 United Kingdom, 62 Turkey, 187 USA)
Service codes
SMS-Activate service codes (e.g. wa WhatsApp, tg Telegram, go Google)

How it works

  1. POST /heartbeat every 25-30 seconds. A SIM silent for 90 seconds stops being sold and lowers your uptime score.
  2. Poll GET /orders every 2-5 seconds. A number in waiting status has been given to a buyer.
  3. When an SMS reaches the number, forward the text as is with POST /sms. The code is extracted, the buyer sees it at once and your earning is recorded.
  4. Earnings become available after a 72-hour hold; withdraw USDT in the panel or with POST /payouts.
  5. Forward every SMS that reaches a rented SIM (GET /rentals) with /sms too; the earning is recorded when the rental ends.

Endpoints

POST /provider/v1/heartbeatMarks SIMs as online.
GET /provider/v1/ordersNumbers assigned to you that are open, plus those closed in the last 10 minutes.
POST /provider/v1/smsForwards an SMS that reached a SIM.
GET /provider/v1/rentalsYour SIMs rented out right now.
GET /provider/v1/simsYour connected SIMs, whether they are online and how many codes they delivered.
POST /provider/v1/simsAdds SIMs (up to 500 at once).
PATCH /provider/v1/sims/:idTurns a SIM on or off for sale, or changes its services.
PUT /provider/v1/pricesYour price per number (USD, between 0.02 and 10).
PUT /provider/v1/rent-pricesYour daily rental price (USD, between 0.10 and 50).
GET /provider/v1Summary: status, score, tier, commission, balances and SIM counts.
GET /provider/v1/stats?days=30Daily earnings and codes, by service and country, and success rate and uptime per SIM (1-90 days).
GET /provider/v1/ledgerEarnings, releases, fines and payouts.
POST /provider/v1/payoutsRequests 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" }
}

Rules and payouts

Price range
$0.02 to $10 per number; $0.10 to $50 per day for rentals.
Commission
By tier: A 15%, B 20%, C 25%. New sellers start at tier B.
Hold
Every earning waits 72 hours; upheld complaints in that time take it back.
Deposit
$50 plus $1 per SIM, filled from 20% of earnings until covered.
Trial
First 14 days: at most 50 open numbers at once and $50 of payouts per day.
Score
Delivery rate (40%), first-SMS time (20%), uptime (20%) and complaint rate (20%). Sales pause below 50.
Payouts
USDT, at least $10. Tiers A and B daily, tier C weekly.

Error codes

401 bad_key
The key is wrong or revoked, or the request came from an IP outside the allowlist.
400 bad_request
The body is missing or invalid; issues names the field.
403 not_seller
The account is not in the seller programme or was shut out.
409 phone_taken
This number belongs to another seller.
400 price_out_of_range
The price is outside the allowed range.
409 payout_limit
Below the minimum payout or over the daily trial limit.
409 payout_too_soon
Your tier's next payout day has not come yet.
403 payout_frozen
Payouts are paused because of your score or account status.
429
Rate limit reached; wait a moment and retry.