Now in production — Sierra Leone's first voice AI gateway

Build voice apps that understand Krio

Send a voice note in Krio. Get back the intent and the values — an amount, a phone number, a medicine and its dose. When it is not sure, it asks in Krio rather than guessing, and hands you the question already spoken.

Set up without writing code| Free tier available| Failed calls refunded automatically

Live Demo

See voice intent detection in action

Type a Krio phrase and see what the model detects

Input (Krio or English)

Result will appear here →

This demo uses a simulated response. Sign up to call the real API →

What you get

Built for how people actually speak

Not a transcription API with intent bolted on. The parts that decide whether a voice product works — confidence, recovery, and speaking back — are the product.

Voice AI

Intent and values from speech

Declare what your callers can ask for and which values each request needs. A voice note comes back as an intent plus a flat set of values you can prefill a form from.

Confidence

It knows when it is unsure

A confidence floor per value type. Below it, the turn becomes a question instead of a guess — which matters when the value is a phone number about to receive money.

Recovery

Recovery in words you chose

Write the Krio for a value that was missed, one that was unclear, and one your own systems refuse. Hear each in the dashboard, then get it back on the response already spoken.

Repeating groups

Several things in one breath

“Amoxicillin three times a day, and Paracetamol twice” returns one entry per thing, each judged on its own. Nobody re-dictates a whole prescription over one bad word.

ASR

Krio, and the English inside it

Our own Krio model for everyday speech. Switch to multilingual or hybrid transcription when callers say product or drug names that have to be spelled correctly.

TTS

Speaks back properly

Bind a Krio template to each outcome. Amounts read as words, phone numbers digit by digit, and phrasing rotates so the assistant does not read like a machine.

Also from kay_x

Your messages, in the language they actually read

Built for money moving across borders. One API call: send English and a destination, get back the message your customer can read — French, Portuguese, Hausa, Krio, and every language across 40+ African markets.

What your code sends

Flot: You received 50.00 SLE
From: Diallo
Ref: TXN_FCPTSWNNR3

What your customer gets

FRENCH

Flot : Vous avez reçu 50.00 SLE
De : Diallo
Réf : TXN_FCPTSWNNR3

KRIO

Flot: Yu don gɛt 50.00 SLE
Frɔm: Diallo
Ref: TXN_FCPTSWNNR3

The amount, the name and the reference are never sent to a translation engine — they are lifted out and put back afterwards.

No templates to write

Send the string your code already builds — the one with the amount and the reference already in it. We work out which parts change and which parts are the message, so no call site has to move.

Repeated messages stop costing

A payment notification is the same sentence with different numbers. It is translated once, reviewed once, and every send after that is served from your own approved copy.

You read it before your customers do

Every language is shown to you before it goes live, and you can correct any of it. Machine translation is strong in French and Portuguese and weak in smaller languages — we tell you which is which rather than pretending they are equal.

The whole integration

POST /api/v1/translate/message

{
  "message": "Flot: You received 50.00 SLE
From: Diallo",
  "country": "SN"                    // or "locales": ["fr", "wo"]
}

Name a country and we pick the language read there. Name languages and we use exactly those.

Integration

Set it up here. Then write very little code.

Getting a Krio voice assistant right is mostly wording and thresholds, not code. That work happens in the dashboard, where you can hear it — so your integration stays small.

01

Describe your business

Name what callers can ask for and the values each request needs. Write the Krio they hear when something is missing, unclear, or refused — and press play to check it sounds right.

02

Tune it in the Playground

Type or speak what a real caller would say and watch the transcript, the confidence on every field, and where it went wrong. Iterate until detection is boring.

03

Bind what it says back

Attach a Krio response template to each outcome, then rehearse a whole conversation — answering in pieces, refusing a value — without writing any code.

04

Then integrate

Only now do you need a key. Your app sends voice and branches on one field: next.action is done, ask, or confirm. Everything above is already configured server-side.

The entire integration
const fd = new FormData();
fd.append('file', voiceNote);
fd.append('business_id', 'flot');
fd.append('session_id', 'whatsapp-23276123456');  // same across turns
fd.append('message_id', waMessageId);             // idempotency

const res = await fetch('https://kay.geneline-x.net/api/v1/voice/intent', {
  method: 'POST',
  headers: { 'X-API-Key': process.env.KAYX_KEY },  // server-side only
  body: fd,
});

const { next, final_values } = await res.json();

switch (next.action) {
  case 'done':    return fillForm(final_values);   // safe to act
  case 'ask':                                      // a value is missing
  case 'confirm': await play(next.audio);          // Krio, already spoken
                  return waitForReply(next.action);
}

The voice layer for Sierra Leone's digital economy

Join builders creating the next generation of Krio-first apps.