Skip to content
Kisoasms

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

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.

  1. 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.

  2. 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.

  3. 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 overview
curl -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.