Android phones · one REST API
Your phone is the gateway.
Kisoasms puts your Android phones behind one API. Pair a phone, take a key, send — from your code or the dashboard. The SIMs stay yours, so the carrier bill is the only bill.
POST /v1/messages · up to 500 recipients · idempotency keys
Your code
POST /v1/messages · to 034 12 345 6709:41 · Telma
queued
sent
delivered
One request · one message · its own status
- recipients in one request
- 500
- characters per message, at most
- 1,600
- hours a message waits for a phone
- 24 h
- messages a day per organization
- 1,000
From box to first SMS in an afternoon
Unbox a phone, end the day sending.
Pair a phone
Install the Kisoasms app on an Android phone and scan the code the dashboard shows. The phone keeps its own SIM and plan — nothing to top up except what the carrier already charges you.
Take a key
Mint a scoped API key per integration. It appears once, lives hashed, and can carry an expiry — revoke it the moment a laptop goes missing.
Send
POST one number or 500. Each becomes its own message with its own status line, from queued to delivered, and you can resend or cancel along the way.
App first? Get the Android app.
Send in minutes
Copy, paste, watch the status move.
One endpoint, your language of choice. The response hands back an id on the spot; the status follows by poll or webhook.
Full developer overviewcurl -X POST https://kisoasms.marindrano.com/v1/messages \
-H "Authorization: Bearer [REDACTED]" \
-H "Content-Type: application/json" \
-d '{"to": ["+261 34 12 345 67"], "text": "Votre code est le 482 913"}'const res = await fetch('https://kisoasms.marindrano.com/v1/messages', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.KISOASMS_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
to: ['+261 34 12 345 67'],
text: 'Votre code est le 482 913',
}),
})
const message = await res.json()
console.log(message.id, message.status)import os
import requests
res = requests.post(
'https://kisoasms.marindrano.com/v1/messages',
headers={'Authorization': 'Bearer ' + os.environ['KISOASMS_API_KEY']},
json={'to': ['+261 34 12 345 67'], 'text': 'Votre code est le 482 913'},
timeout=30,
)
message = res.json()
print(message['id'], message['status'])What comes back
{ "id": "msg_01h9k4b2c7d3e5f6", "status": "queued" }The local reason to switch
MVola, Orange Money, Airtel Money — as data, not inbox clutter.
Confirmation texts land on your phones all day. Kisoasms reads them into records your system can reconcile against: amount in Ariary, counterpart, reference — fired to your webhook the moment they arrive.
Templates first, no model involved
Known confirmation formats match exactly. Deterministic, explainable, free.
AI only where you allow it
Off by default, per organization. Codes and numbers are masked before anything reaches a provider.
Marked unverified, always
An SMS says the operator wrote something down. It is not proof money moved — every record says so on its face.
mobile_money.detected
{
"provider": "mvola",
"amount_ariary": 150000,
"counterpart": "034 12 345 67",
"reference": "AB12CD34",
"verified": false
}Proof, pushed to you
Eleven events. Zero polling.
Signed HTTPS callbacks, retried with backoff, every attempt kept in a delivery log you can replay from. When your endpoint hiccups, the 410 above is not the end of the story.
Recent deliveries
- message.deliveredhttps://shop.example.mg/hooks20012 s ago
- mobile_money.detectedhttps://shop.example.mg/hooks2001 min ago
- message.failedhttps://shop.example.mg/hooks410 · retrying4 min ago
- incoming.receivedhttps://shop.example.mg/hooks2009 min ago
- message.queued
- message.claimed
- message.sending
- message.sent
- message.delivered
- message.failed
- message.expired
- message.cancelled
- message.unknown
- incoming.received
- mobile_money.detected
More than one of you
Nobody shares a login.
Invite people with the access they actually need. The audit trail records who did what — and never the text they sent.
Roles that match the org chart
Owner, admin, developer and the rest. A teammate sees exactly what their role allows, nothing borrowed.
Keys with boundaries
Scope each key, set an expiry, rotate and revoke. A leaked key stops where its scope stops.
An audit log with nothing to leak
Who paired a phone, who rotated a key, who changed retention — on record, without message text or secrets.
Read before you plan
Four constraints, stated up front.
- Android only
- Phones pair through the Android app. Apple keeps third-party apps away from SMS, so there is no iOS gateway — the dashboard itself runs in any browser.
- Your SIM pays the carrier
- No per-message fee from Kisoasms. Every ariary of carrier charges lands on the SIM plan that sent the message.
- A daily quota
- 1,000 messages a day per organization to start, raisable to 100,000. A message no phone can send expires after 24 hours — visibly, as expired.
- Kept on a schedule
- Inbound text lives 90 days by default; set 1 to 3,650. Sender and time outlive the text itself.
Free during beta
The phone in your pocket is already a gateway.
Pair it this afternoon. Send your first message before dinner, and wake up to mobile-money confirmations arriving as webhooks.