SMS Gateway Admin

Enter the API key from config/config.json (apiKey).

SMS Gateway Admin

Logs Users API
Active account
no session yet
Balance
press “Check live balance”
Total balance (all accounts)
sum of last-known balances
Accounts ready
Exhausted
below threshold / failed login
Sent this rotation
rotation disabled
Send queue
nothing waiting

Live status

Logs into the panel with the highest-priority funded account and reads its real balance. Takes 20–60 s the first time (headless browser + login).

seconds (after ~1 min of failures, retries slow to 30 s)

Send queue (paced delivery) RUNNING

The panel refuses bursts with “Too many SMS requests. Please wait one minute.” and it counts that limit per account, so every send goes through an internal queue and out over a pool of workers — each signed in as a different account, each paced separately. If the panel does refuse one, that message is not failed: the worker that was refused holds and slows down, the others keep sending, and the message is submitted again. Callers never see the rate-limit error.

Waiting 0
Sending now idle
Next send
Current pace
Last 60 s
Since start
WorkerAccountStatePaceLast 60 sPanel refused at

Answer inline up to decides the shape of the POST /api/send reply: a message that can go out within that window is answered with the finished send result (200), anything slower is accepted with 202 and its outcome appears in the message log. Send "async": true to always get the 202 form. Send workers is how many accounts send at the same time. The pace knobs are per worker, so 3 workers at 10/minute is 30 messages a minute in total — but only while there are 3 non-exhausted accounts to sign in as, since no two workers may share one. Start conservative — one send every 4 s with a 10/minute cap — and only speed up if the activity feed stays free of rate-limit warnings. Queued messages live in memory, so a gateway restart drops whatever is still waiting.

Live activity

Waiting for activity…

Everything the gateway does, as it happens: browser launches, page navigations, login attempts, balance checks, sends and rotations — successes and failures alike. The view holds the most recent 1000 events; with MongoDB connected every event is also stored permanently (activity_logs).

Accounts (priority order — top is used first)

#UsernamePasswordSender IDBalanceSentStatusActions

Saving stores the list in MongoDB, resets rotation to the top of the list, and drops the current login session (it re-logs-in on the next send). Newly added accounts get their balance checked automatically in a separate browser session. A balance check (auto or manual) also restarts that account's sent counter at 0 — the fresh reading is the new tracking baseline.

Thresholds & settings

Storage:

An account is switched out when its balance drops below min balance, or when logging in / reaching the send page fails login failures before switch times in a row (any reason — bad password, bot challenge, timeout). A successful login resets the failure count. Set min balance to at least the cost of one SMS (~1.2 credits) so a send never fails halfway. Rotate after N sent SMS additionally hands over to the next account once the active one has sent that many messages (each recipient counts as one SMS); its counter restarts at 0 and it comes back into rotation on its next turn. Settings, accounts, balances and sent counters are stored in MongoDB (local Docker — docker compose up -d), so they survive gateway restarts; the JSON files only seed the database on first run and serve as a fallback when Mongo is offline.

Browser egress (proxy) OFF

How long IPRoyal keeps the same IP for a session before rotating it.
Hosts Chromium should reach directly, as --proxy-bypass-list.
Session IDs are derived from each panel account's name, so every account keeps its own exit IP and gets the same one back after a restart. There is nothing to type.
Outbound proxy URL (preview)
Now:

Chromium is launched with --proxy-server, so every panel request — logins, sends, balance checks, user management — leaves through the proxy and the panel never sees this server's address. WebRTC is locked down at the same time, since it can otherwise reach around an HTTP proxy and reveal the real IP. Saving restarts the browser, because the flag is only read at launch; in-flight sends finish first. Sticky is the right choice here and is the default: the gateway holds logged-in panel sessions open, and an exit IP that changes underneath a live session gets it bounced back to the login form. There is no tunnel-pool tuning to set — Chromium manages its own connections, so IP turnover comes entirely from the gateway. Test connection opens a throwaway browser session and reports the address it arrives from, next to this server's own; they should differ.

Test send


      

This goes through the same paced queue as the API. If something is already in flight you get queued: true back (HTTP 202) instead of a send result — the message still goes out, and the outcome appears in the message log.

Maintenance

Clear exhausted flags after topping accounts up. Restart the browser if the panel gets stuck or after changing the headless setting.

Templates

{{message}} = your API content · {{company}} = the account's company. Every template needs {{message}}; one is chosen at random per send. No templates → content sent as-is.

Find & replace applies to selected templates, or all if none are selected.

Bulk import — paste one template per line
Copy 0 selected template(s) to:
0 selected