I want an AI bot to answer customers inside my own application
The AI Operator that answers conversations inside the WACO inbox is also available as a pure API: your application sends the customer's message, we return an answer drawn from the knowledge you taught it — or say honestly that it does not know. The channel (your own WhatsApp, website live chat, Telegram, anything) stays entirely yours.
waco_ API key from Settings. Knowledge can be filled in from the portal (cards, interview, PDF upload) or through this API.Ask for an answer
POST https://waco.id/api/v1/asisten/balas
Authorization: Bearer waco_xxxx
{ "sesi": "cust-8812", "teks": "are you open on Sundays?" }
→ 200 { "jawab": true, "teks": "We are open Monday to Saturday 08:00–17:00, closed Sunday." }
→ 200 { "jawab": false, "alasan": "di_luar_pengetahuan" }
sesi is your own conversation id — use anything consistent per customer. For
continuing context, include riwayat: an array of
{"peran":"pelanggan"|"bot","teks":"..."} (the last 10 are used).
jawab:false MUST be handled as a handover to a human. The reason may be di_luar_pengetahuan (outside its knowledge), anggaran_habis (quota spent), sibuk (concurrency limit), bot_nonaktif or galat_sementara — whichever it is, the customer must still be answered by your team. A bot that hesitates and then goes silent is worse than no bot at all.Manage knowledge
GET /api/v1/asisten/pengetahuan → { "kartu": [...] }
POST /api/v1/asisten/pengetahuan
{ "judul": "Opening hours", "isi": "Mon–Sat 08:00–17:00." } → new card (active)
{ "id": 12, "isi": "...", "aktif": true } → edit a card
{ "url": "https://your-site.com/faq" } → distil into draft cards
DELETE /api/v1/asisten/pengetahuan/:id
Cards created from a url arrive as inactive drafts — review,
then activate (from the portal or POST {"id":…,"aktif":true}). The bot never uses
knowledge you have not approved.
Check the remaining quota
GET /api/v1/asisten/pemakaian
→ { "aktif": true, "terpakaiIdr": 12500, "kuotaBulananIdr": 50000,
"topupIdr": 0, "sisaIdr": 37500, "percakapanAktif": 1, "batasBersamaan": 5 }
The monthly quota is included in the subscription and resets each month; a top-up is valid for
30 days from purchase. When the quota runs out the bot stops answering
(jawab:false) — conversations flow to your team and the service never breaks.
Integration example (Node.js) — the correct handover pattern
async function replyToCustomer(conversationId, customerMessage) {
const r = await fetch('https://waco.id/api/v1/asisten/balas', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + process.env.WACO_API_KEY,
},
body: JSON.stringify({ sesi: conversationId, teks: customerMessage }),
});
const j = await r.json();
if (j.jawab) {
await sendToCustomer(conversationId, j.teks); // your own channel
} else {
// REQUIRED: whatever the reason, a human takes over.
await markNeedsHuman(conversationId);
await notifyTeam(conversationId, 'Bot handed over: ' + j.alasan);
}
}
A PHP/Laravel, Python or Go version is the same shape: one POST, one branch on
jawab. What you must not do is show "sorry, I do not know" to the customer and stop
— jawab:false means a person continues.