Loading...
Menyiapkan halaman Anda
API Reference
Integrasikan layanan kami ke CRM, ERP, atau sistem internal Anda. Semua endpoint memakai autentikasi API key dan dibatasi oleh scope.
https://tanyakan.ai/api/v1Base URL otomatis mengikuti domain yang Anda akses.
Sertakan API key sebagai Bearer token di tiap permintaan:
Authorization: Bearer tk_live_xxxxxBuat & kelola key di Dashboard → API Keys.
Content-Type: application/jsonWajib untuk request ber-body.Idempotency-Key: <uuid>Dianjurkan untuk POST — mencegah aksi terkirim ganda saat retry.Tiap API key punya kumpulan scope. Endpoint menolak key tanpa scope yang sesuai (403).
conversations:read | Baca daftar & detail percakapan |
conversations:write | Ubah percakapan (handoff, dll) |
messages:send | Kirim pesan ke percakapan |
products:read | Baca katalog produk |
products:write | Buat / ubah produk |
credits:read | Baca saldo credit |
usage:read | Baca laporan pemakaian |
admin:* | Akses penuh — beri hanya ke sistem terpercaya |
/api/v1/conversationsconversations:readDaftar percakapan. Mendukung filter status & paginasi cursor.
curl https://tanyakan.ai/api/v1/conversations?status=HUMAN \ -H "Authorization: Bearer tk_live_xxxxx"
/api/v1/conversations/:idconversations:readDetail satu percakapan beserta pesan terakhirnya.
curl https://tanyakan.ai/api/v1/conversations/{id} \
-H "Authorization: Bearer tk_live_xxxxx"/api/v1/conversations/:id/messagesmessages:sendKirim pesan ke percakapan (atas nama agen / sistem).
curl -X POST https://tanyakan.ai/api/v1/conversations/{id}/messages \
-H "Authorization: Bearer tk_live_xxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "text": "Halo dari sistem kami", "as": "HUMAN_AGENT" }'/api/v1/conversations/:id/handoffconversations:writeAlihkan percakapan ke agen manusia (status → HUMAN).
curl -X POST https://tanyakan.ai/api/v1/conversations/{id}/handoff \
-H "Authorization: Bearer tk_live_xxxxx"/api/v1/productsproducts:readDaftar produk katalog tenant.
curl https://tanyakan.ai/api/v1/products \ -H "Authorization: Bearer tk_live_xxxxx"
/api/v1/productsproducts:writeBuat produk baru di katalog.
curl -X POST https://tanyakan.ai/api/v1/products \
-H "Authorization: Bearer tk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{ "name": "Kemeja Batik", "price": 245000, "stock": 20 }'/api/v1/products/:idproducts:writePerbarui produk (harga, stok, dll) — sinkron dari sistem Anda.
curl -X PATCH https://tanyakan.ai/api/v1/products/{id} \
-H "Authorization: Bearer tk_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{ "stock": 5 }'/api/v1/creditscredits:readSaldo credit tenant (allowance, rollover, top-up).
curl https://tanyakan.ai/api/v1/credits \ -H "Authorization: Bearer tk_live_xxxxx"
/api/v1/usageusage:readRingkasan pemakaian credit & pesan dalam rentang waktu.
curl https://tanyakan.ai/api/v1/usage?days=30 \ -H "Authorization: Bearer tk_live_xxxxx"
/api/v1/ping— (tanpa scope)Cek koneksi & validitas API key.
curl https://tanyakan.ai/api/v1/ping \ -H "Authorization: Bearer tk_live_xxxxx"
Semua respons berformat JSON dengan field ok.
// Sukses
{ "ok": true, "data": { ... } }
// Gagal
{ "ok": false, "error": { "code": "FORBIDDEN", "message": "..." } }| HTTP | Kode | Arti |
|---|---|---|
| 400 | VALIDATION_ERROR | Input tidak valid — cek pesan error. |
| 401 | UNAUTHORIZED | API key tidak ada / tidak valid / sudah di-revoke. |
| 403 | FORBIDDEN | API key tidak punya scope yang dibutuhkan. |
| 404 | NOT_FOUND | Resource tidak ditemukan. |
| 429 | RATE_LIMITED | Melebihi batas rate limit key (default 60 rpm). |
| 500 | INTERNAL | Kesalahan server — coba lagi atau hubungi support. |
Rate limit default 60 permintaan/menit per key (dapat diatur saat membuat key). Melebihi batas → HTTP 429.
Alih-alih sistem Anda menanyai kami berulang kali, kami yang mengirim ke alamat Anda begitu sesuatu terjadi. Alamat penerima didaftarkan di dashboard (Developer → Webhooks), dan tiap alamat mendapat kunci rahasianya sendiri.
X-BantuCS-Event: order.paid X-BantuCS-Event-Id: evt_2f9c... # sama untuk semua percobaan ulang X-BantuCS-Delivery: dlv_8a31... # unik per percobaan X-BantuCS-Timestamp: 1754470800 X-BantuCS-Signature: t=1754470800,v1=9f86d081884c7d65...
Tanda tangan adalah HMAC-SHA256 atas timestamp, titik, lalu badan permintaan mentah. Hitung ulang dengan kunci rahasia alamat Anda dan bandingkan. Pakai badan mentah — mengurai lalu menyusun ulang JSON akan mengubah satu byte dan tanda tangannya tidak akan pernah cocok.
// Node.js — verifikasi sebelum memproses isi kiriman
import { createHmac, timingSafeEqual } from 'node:crypto';
function sahkah(header, badanMentah, rahasia) {
const bagian = Object.fromEntries(
header.split(',').map((x) => x.split('=')),
);
// Tolak kiriman yang terlalu tua — mencegah kiriman lama diputar ulang.
const umurDetik = Math.abs(Date.now() / 1000 - Number(bagian.t));
if (!Number.isFinite(umurDetik) || umurDetik > 300) return false;
const harapan = createHmac('sha256', rahasia)
.update(`${bagian.t}.${badanMentah}`)
.digest('hex');
const a = Buffer.from(harapan);
const b = Buffer.from(bagian.v1 ?? '');
return a.length === b.length && timingSafeEqual(a, b);
}Kami mencoba 7 kali selama kira-kira 38 jam bila alamat Anda tidak membalas 2xx: segera, lalu +1 menit, +5 menit, +30 menit, +2 jam, +12 jam, +24 jam. Batas waktu tiap percobaan 10 detik.
Karena ada percobaan ulang, alamat Anda bisa menerima kejadian yang sama lebih dari sekali — misalnya bila balasan Anda terlambat padahal isinya sudah diproses. Gunakan X-BantuCS-Event-Id sebagai penanda: simpan yang sudah diproses, dan abaikan yang berulang. Balas cepat (di bawah 10 detik) lalu kerjakan pekerjaan beratnya di belakang layar.
Balasan 410 Gone kami perlakukan sebagai permintaan berhenti: alamat itu langsung dinonaktifkan dan tidak dihubungi lagi sampai Anda mengaktifkannya kembali.
{
"id": "evt_2f9c8b14-...",
"type": "order.paid",
"created_at": "2026-08-06T03:20:00.000Z",
"tenant_id": "3a7f...",
"livemode": true,
"data": {
"order_id": "9c2e...",
"order_number": "INV-20260806-0042",
"status": "PAID",
"payment_status": "PAID",
"customer_name": "Rina",
"customer_phone": "628123456789",
"total": 175000,
"tracking_number": null,
"paid_at": "2026-08-06T03:19:58.000Z"
}
}Bisa didaftarkan satu per satu (order.paid), per kelompok (order.*), atau semuanya (*).
message.received | Pelanggan mengirim pesan masuk |
message.sent | Balasan terkirim ke pelanggan |
conversation.created | Percakapan baru dibuka |
conversation.handed_off | Percakapan dialihkan ke agen manusia |
conversation.released | Percakapan dikembalikan ke bot setelah agen diam |
conversation.closed | Percakapan ditutup karena sepi |
order.created | Pesanan baru dibuat |
order.paid | Pesanan lunas |
order.shipped | Pesanan dikirim |
order.delivered | Pesanan diterima pembeli |
order.cancelled | Pesanan dibatalkan |
credit.depleted | Saldo pemakaian habis |
credit.topup_succeeded | Isi ulang saldo berhasil |
subscription.activated | Langganan aktif |
subscription.expired | Langganan berakhir |
customer.first_message | Pelanggan menyapa untuk pertama kalinya |
Seluruh endpoint di atas tersedia sebagai berkas OpenAPI 3.1 — bisa langsung diimpor ke Postman, Insomnia, Swagger Editor, atau gateway API Anda untuk membuat klien secara otomatis, tanpa menyalin ulang dengan tangan.
curl -O ${baseUrl.replace(//api/v1$/, "")}/docs/api/openapi.jsonUpdate produk, tips CS AI, dan studi kasus pelanggan — langsung ke inbox Anda.
Maksimal 1 email/minggu. Bisa unsubscribe kapan saja.
© 2026 PT Tanyakan Asisten Interaktif
Dibuat di Indonesia, untuk Indonesia 🇮🇩
Made with ❤️ for Indonesia
Kepatuhan & Keamanan