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.
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_SMSpermission (addRECEIVE_SMSif 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, passsimNumber (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
Links
- Docs: SMS Gate Documentation
- API Reference: Android SMS Gateway API Reference
- APK (always latest): Download Latest APK
- All Releases: View All Releases
All credit goes to https://github.com/capcom6/android-sms-gateway