โšก Berjalan penuh di edge cloud ยท tanpa server sendiri

Kirim invoice, tagih lewat QRIS dinamis, verifikasi user via WhatsApp.

Satu platform untuk dokumen transaksi (invoice, penawaran, PO/DO, nota, kwitansi, slip gaji), pembayaran QRIS bernominal, verifikasi LessOTP WhatsApp tanpa biaya SMS, dan Single Sign-On untuk aplikasi Anda.

Tanpa login untuk membuat & membagikan dokumen. Login hanya jika ingin dashboard, API key, webhook, dan laporan.

Satu langganan, empat modul

Semua yang dibutuhkan untuk menagih dan memverifikasi

Dipakai langsung dari browser, atau ditanam ke produk Anda lewat REST API dan webhook.

Dokumen & Invoice

Tujuh jenis dokumen siap pakai dengan preview real-time, diskon persen dan/atau nominal, pajak per item, PDF & cetak thermal.

  • Link + PIN untuk penerima
  • Status dibaca & pembayaran bertahap
  • Logo & tanda tangan berupa gambar
InvoiceNotaKwitansiSlip gaji

QRIS Dinamis

Ubah QRIS statis merchant menjadi QRIS dinamis dengan nominal terkunci. Konversi EMVCo TLV + CRC16 dilakukan di sisi klien.

  • Nominal, label tagihan, biaya layanan
  • Unduh PNG atau lampirkan ke invoice
  • Pindai QRIS statis dari gambar
EMVCoTag 54CRC16

LessOTP WhatsApp

Verifikasi nomor tanpa biaya SMS: sistem membuat link/QR wa.me berisi kode, user tinggal menekan kirim ke nomor admin.

  • Link & QR sekali pakai, TTL singkat
  • Auto-verify via WAHA di VPS Anda
  • Webhook lessotp.verified
Tanpa SMSWAHAHMAC SHA-512

SSO (OIDC-like)

Jadikan KirimInvoice sebagai penyedia identitas: Authorization Code + PKCE, JWT bertanda tangan, sesi cookie httpOnly.

  • /authorize, /token, /userinfo
  • JWKS & rotasi kunci
  • Redirect URI allowlist per aplikasi
PKCEJWTJWKS
โ„นRekber (rekening bersama) tersedia di dalam aplikasi, namun tidak dibuka sebagai API/integrasi SaaS โ€” dana dan mediasi dikelola langsung oleh tim internal kami.
LessOTP

Verifikasi WhatsApp yang dibalik arahnya โ€” user yang mengirim

OTP konvensional mengirim SMS ke user dan Anda membayar tiap pesan. LessOTP membalik alurnya: user mengirim kode ke nomor admin lewat WhatsApp. Biaya per verifikasi nol, dan nomor otomatis terbukti aktif.

Minta verifikasi

Aplikasi Anda memanggil /api/v1/lessotp/start dan menerima waLink, QR, serta requestId.

User menekan kirim

WhatsApp terbuka dengan pesan VERIFY <ref> <kode> yang sudah terisi. User hanya menekan tombol kirim.

Kode diterima

Nomor admin (WAHA di VPS Anda) menerima pesan dan meneruskannya ke webhook KirimInvoice.

Terverifikasi

Kami cocokkan kode + pengirim, lalu kirim event lessotp.verified ke webhook aplikasi Anda.

Mulai verifikasi

POST /api/v1/lessotp/start
Authorization: Bearer ki_live_xxx
Content-Type: application/json

{
  "phone": "628123456789",
  "purpose": "signup",
  "ttl": 300
}

โ†’ 200 OK
{
  "requestId": "lo_7QK2",
  "code": "418702",
  "waLink": "https://wa.me/62812...?text=VERIFY%20lo_7QK2%20418702",
  "qr": "data:image/png;base64,...",
  "expiresAt": "2026-08-27T07:05:00Z"
}

Cek status / verifikasi manual

POST /api/v1/lessotp/verify
{ "requestId": "lo_7QK2", "code": "418702" }

โ†’ { "verified": true, "phone": "628123456789" }

// Webhook ke aplikasi Anda
POST https://app.anda.com/hooks/ki
X-KI-Event: lessotp.verified
X-KI-Signature: sha512=9f2c...

{
  "event": "lessotp.verified",
  "requestId": "lo_7QK2",
  "phone": "628123456789",
  "verifiedAt": "2026-08-27T07:02:11Z"
}
โš Kode OTP tidak pernah dicatat di log. Verifikasi tanda tangan webhook memakai raw body sebelum JSON.parse.
QRIS Dinamis

Satu QRIS statis, tak terbatas QR bernominal

Tempel payload QRIS statis atau pindai gambarnya. Kami set tag 01 menjadi 12, menyisipkan tag 54 (nominal), opsional tag 55โ€“57 (biaya layanan) dan label tagihan pada tag 62, lalu menghitung ulang CRC pada tag 63.

ValidasiCRC16 + struktur TLV
PrivasiKonversi di perangkat
OutputPayload, PNG, lampiran invoice
POST /api/v1/qris/dynamic
Authorization: Bearer ki_live_xxx

{
  "staticPayload": "000201010211...",
  "amount": 150000,
  "label": "INV-2026-A1B2",
  "fee": { "type": "rupiah", "value": 1000 }
}

โ†’ {
  "payload": "000201010212...6304AB12",
  "merchant": "TOKO BERKAH JAYA",
  "nmid": "ID1024xxxxxxx",
  "amount": 150000
}
โ„นEndpoint ini tidak menyimpan payload statis Anda. Untuk kebutuhan offline, konversi tetap bisa dilakukan sepenuhnya di browser.
Single Sign-On

Satu identitas untuk semua aplikasi Anda

Pengguna login sekali dengan nomor WhatsApp + password (opsional dikuatkan LessOTP), lalu dapat mengakses seluruh aplikasi Anda. Alur mengikuti OAuth2 Authorization Code + PKCE sehingga kompatibel dengan library OIDC populer.

SesiCookie httpOnly, Secure, SameSite
TokenJWT + JWKS, TTL pendek
KontrolRedirect URI allowlist
GET /api/v1/sso/authorize
  ?client_id=app_kasir
  &redirect_uri=https://kasir.anda.com/cb
  &response_type=code
  &scope=openid%20profile%20phone
  &code_challenge=E9Me...
  &code_challenge_method=S256
  &state=xyz

POST /api/v1/sso/token
{ "grant_type":"authorization_code",
  "code":"...", "code_verifier":"...",
  "client_id":"app_kasir" }

โ†’ { "access_token":"...", "id_token":"...",
    "token_type":"Bearer", "expires_in":900 }
API & Webhook

Integrasi dalam hitungan menit

Kelola API key, endpoint webhook, percobaan ulang, dan log pengiriman langsung dari dashboard.

Event webhook

lessotp.verifiedNomor terverifikasi
lessotp.expiredPermintaan kedaluwarsa
sso.loginLogin berhasil
qris.generatedQR dinamis dibuat
invoice.sentDokumen dikirim
invoice.readDibuka penerima
invoice.paidDinyatakan lunas
โš Event rekber tidak dipublikasikan ke webhook pelanggan.

Verifikasi tanda tangan (Worker edge)

const raw = await request.text();          // WAJIB raw
const sig = request.headers.get('X-KI-Signature');
const key = await crypto.subtle.importKey(
  'raw', new TextEncoder().encode(env.KI_WEBHOOK_SECRET),
  { name: 'HMAC', hash: 'SHA-512' }, false, ['sign']);
const mac = await crypto.subtle.sign('HMAC', key,
  new TextEncoder().encode(raw));
const hex = [...new Uint8Array(mac)]
  .map(b => b.toString(16).padStart(2, '0')).join('');

if (!timingSafeEqual(`sha512=${hex}`, sig))
  return new Response('invalid signature', { status: 401 });

const event = JSON.parse(raw);              // baru parse
FAQ

Pertanyaan yang sering muncul

Apakah harus login untuk membuat invoice?

Tidak. Halaman utama dan pembuat dokumen bisa dipakai tanpa login โ€” dokumen tersimpan di perangkat dan dibagikan lewat link + PIN. Login diperlukan untuk dashboard, API key, webhook, laporan, dan sinkronisasi antar perangkat.

Apakah LessOTP benar-benar tanpa biaya SMS?

Ya. Tidak ada gateway SMS. User mengirim pesan WhatsApp berisi kode ke nomor admin, sehingga biayanya hanya kuota data user dan hosting WAHA di VPS Anda.

Apakah QRIS statis saya dikirim ke server?

Tidak, jika Anda memakai alat di browser โ€” seluruh konversi TLV dan CRC16 dijalankan di perangkat. Endpoint API tersedia untuk otomatisasi server-to-server dan tidak menyimpan payload statis.

Kenapa rekber tidak punya API?

Rekber menyangkut penguasaan dana pihak ketiga dan mediasi sengketa, sehingga kami kelola secara internal dengan verifikasi manual. Membuka API rekber berarti membuka risiko penyalahgunaan yang tidak sepadan.

Di mana data disimpan?

Penyimpanan edge: D1 (data transaksional), KV (sesi & kode sekali pakai), dan R2 (logo, tanda tangan, lampiran). Semua berjalan di edge tanpa server tradisional.

Mulai kirim invoice hari ini

Gratis untuk pemakaian pribadi. Tanpa kartu kredit, tanpa instalasi.