TRICK #003 · 3 MIN READ

Free SMS/OTP API for MVPs — Turn Any Android Phone into a Gateway

FILED 31 AUG 2026·505 words·3 min read
androidsmsapiself-hostedautomation
All tricks →

Free SMS/OTP API for MVPs — Turn Any Android Phone into a Gateway

Building an MVP and need SMS or OTP without paying Twilio-level prices before you even have users? SMS Gateway for Android turns any Android phone with a SIM into a working SMS API in a few minutes. Good enough for early-stage testing, internal tools, and low-volume production.

Why it's useful for MVPs

  • Free — no per-SMS cost, no paid account needed.
  • Send + receive SMS via a simple REST API or CLI — plug it straight into your OTP/verification flow.
  • Delivery status tracking so you know if the OTP actually landed.
  • Webhooks on incoming SMS — useful for auto-testing OTP flows end-to-end.
  • 5-minute setup, no backend infra needed to start.
⚠️ Not for bulk/marketing SMS — carriers will throttle that. This is for testing and low-volume real usage, not scale.
Note: We tested Local Server mode and hit connectivity issues on our test device, so we'd recommend going straight to Cloud Server mode — it's more reliable and works from anywhere, not just your local network.

Setup (Cloud Server)

  • Download the APK — this link always grabs the latest release automatically, no need to update the version number:
👉 app-realse.apk (latest)
  • Grant SEND_SMS permission (add RECEIVE_SMS if you need incoming OTP/replies).
  • In the app, toggle Cloud Server to "on" and tap Online. Note the basic-auth credentials shown — you'll use these in every API call.

Send an OTP/SMS (Cloud Server)

curl -X POST -u <username>:<password> \
  -H "Content-Type: application/json" \
  -d '{ "textMessage": { "text": "Your OTP is 482913" }, "phoneNumbers": ["+19162255887"] }' \
  https://api.sms-gate.app/3rdparty/v1/message

Send from a specific SIM (dual-SIM devices)

If the device has two SIM cards, pass simNumber (1 or 2) in the request body to pick which one sends the message. Leave it out and the app falls back to its default/round-robin behavior.
# Send via SIM 1
curl -X POST -u <username>:<password> \
  -H "Content-Type: application/json" \
  -d '{ "textMessage": { "text": "Your OTP is 482913" }, "phoneNumbers": ["+19162255887"], "simNumber": 1 }' \
  https://api.sms-gate.app/3rdparty/v1/message
# Send via SIM 2
curl -X POST -u <username>:<password> \
  -H "Content-Type: application/json" \
  -d '{ "textMessage": { "text": "Your OTP is 482913" }, "phoneNumbers": ["+19162255887"], "simNumber": 2 }' \
  https://api.sms-gate.app/3rdparty/v1/message
Handy if you want to split traffic (e.g. SIM 1 for OTP, SIM 2 for general notifications) to spread volume across two numbers. Incoming webhook payloads also include a simNumber field so you know which SIM received a message.

Get notified on incoming SMS (e.g. reply-based verification)

curl -X POST -u <username>:<password> \
  -H "Content-Type: application/json" \
  -d '{ "id": "otp-hook", "url": "https://webhook.site/<your-uuid>", "event": "sms:received" }' \
  https://api.sms-gate.app/3rdparty/v1/webhooks

Screenshots

App screenshot Cloud server settings

Links

All credit goes to https://github.com/capcom6/android-sms-gateway

Trick #003 · Lab Notebook №01 ← Back to all tricks

Stay posted,
one file a day.

New tricks and daily logs delivered by email — free via Buttondown. Or keep it classic with the RSS feed.

Live on buttondown.com/hariomlohar RSS: /feed.xml Unsubscribe anytime