Key Takeaways
- Node.js bulk send on an Android SMS gateway is fetch/undici to POST /messages (or POST /campaigns) — not an npm “Complete SMS SDK.”
- Several numbers in to[], or campaigns for lists. Confirm live JSON in Developer Center.
- A tight loop outruns the SIM. Cap concurrency, persist ids, same Idempotency-Key on retry.
- HTTP 200 is accepted. Watch DLR. Unknown ≠ resend the file. CPaaS throughput is a different last mile.
- You bring the phone and operator credit. Platform pricing is devices plus send volume.
fetch is not a radio
Hub: Android SMS gateway API. Java sibling: Java bulk loops. Checklist: bulk campaign checklist. Node runtime: fetch. Live JSON: Developer Center.
We meter devices and volume. Faster libuv does not include pulsa. Twilio-style aggregator throughput is a different product: Twilio vs Android.
HTTPS/JSON, not a Node SDK
POST https://app.sms-gateway.app/api/v1/messages with Authorization: Bearer. PHP/C# samples on this site are REST too: PHP.
“If p-limit is sized for your VPS, not the tray, you will discover OEM rate ceilings as a pager event.”
Loop failure modes
| Symptom | Likely cause | First check |
|---|---|---|
| Pending pile | Loop faster than claim | Last-seen; cap concurrency |
| Duplicate rows | Retry without Idempotency-Key | Stable key per recipient+job |
| Event-loop stall | Sync JSON parse of a huge CSV | Stream the file |
| OTP delayed | Same deviceId | Named campaign pool |
| Mapped 200 to delivered | No DLR | DLR |
Queue beats a tight for-await
Multi-device multiplies radios: multi-device. Bulk CSV: bulk CSV. Pairing: setup.
Keep OTP off this worker
Next steps
Canary 10 rows. Watch Pending age. Then the list. Operator credit stays yours.
Related product pages
Jump to the live product docs for this topic—not another long-form article.
- bulk SMS from Excel and CSVSpreadsheet campaigns
- bulk SMS with consent best practicesHigh-volume outreach
- SMS API documentationLive endpoint reference
- device and SMS volume pricingPlans and allowances





