Verify NIK. Issue e-Faktur. Accept QRIS. One API, from Jakarta.
Kait connects your app to Dukcapil, DJP's Coretax and the QRIS network through one tidy API. One key, one error format, one webhook for all of it.
npm i @kait/nodecomposer require kait/kait-phpgo get github.com/kait-id/kait-gopip install kaitSandbox keys are free forever. No credit card.
fig. 01 · kait.mark
56 × 3644 × 24 cells
move your cursor to turn the linkscroll to turn the link
poster · server rendered
{ "objek": "validasi_npwp", "npwp": "0012345678091000", "valid": true, "nama": "PT LAPAK GROSIR NUSANTARA", "jenis": "badan", "pkp": true, "kpp": "KPP Madya Jakarta Selatan I", "nitku": "0012345678091000000000", "diperiksa_pada": "2026-10-11T07:32:08Z" }
Batch e-Faktur: 500 invoices in one call
Marketplaces and ERPs can now send up to 500 invoices at once. Kait splits them to fit Coretax's limits, sends them in parallel and reports each invoice's outcome in a single webhook.
- New endpoint POST /v1/faktur/batch
- The faktur.batch_selesai webhook carries a summary per invoice
- Node and Go SDKs 3.8.0 support it today; PHP follows next week
- for (const pesanan of pesananHariIni) {- await kait.faktur.terbitkan(pesanan)- }+ await kait.faktur.terbitkanBatch(pesananHariIni)
Used by 2,300 engineering teams, from marketplaces to clinics
- Lapak Grosir
- Kopiloka
- Slipku
- Armada Kirim
- Klinik Medira
- Sewaruang
- Neraca Kita
- Dana Panen
Endpoints
Four doors, one key.
Every endpoint shares the same key, error format and webhooks. Learn one and you know them all.
{ "objek": "verifikasi_nik", "id": "nik_01JA7RC0QF", "nik": "3171••••••••0001", "status": "terverifikasi", "cocok": { "nama": 0.98, "tanggal_lahir": true, "tempat_lahir": true }, "sumber": "dukcapil" }
Match a NIK, name and date of birth against Dukcapil's records. You get a match score per field, not just a yes or a no.
{ "objek": "validasi_npwp", "npwp": "0012345678091000", "valid": true, "pkp": true, "kpp": "KPP Madya Jakarta Selatan I", "nitku": "0012345678091000000000" }
PKP status, registered tax office and NITKU from a 16-digit NPWP. The old 15-digit format is converted for you.
{ "objek": "faktur", "id": "fkt_01JA7R2C9W", "status": "antre", "kode_transaksi": "04", "dpp": 11000000, "ppn": 1320000, "npwp_pembeli": "0012345678091000", "webhook": "faktur.disetujui" }
Send the transaction. Kait builds the invoice the way Coretax expects, signs it with your electronic certificate and tells you by webhook once it is approved.
{ "objek": "qris", "id": "qr_01JA7RB4KX", "nominal": 86500, "status": "menunggu", "kedaluwarsa_pada": "2026-10-11T07:47:08Z", "qr_string": "00020101021226650016ID.CO.KAIT..." }
A QRIS with a fixed amount for every order, valid for 15 minutes, with a paid notification within seconds.
Latency
Measured from Jakarta, not from a brochure.
We called NPWP validation 10,000 times from Jakarta and compared it with a similar API served from Singapore.
kait bench npwp --dari jakarta --n 10000
Kait, jkt-1API via Singapore
Tested 4 to 6 October 2026 from our office in Kuningan, on a 100 Mbps fibre line.
99.98%
jkt-1 uptime over the last 90 days
Pro plan SLA is 99.95%
11 min
median from sign-up to the first successful call
2,140 new developers, August to September 2026
4.2M
API calls a day
peaking at 9.8M during the 9.9 sale
SDKs
Install it in the language your team writes.
Official SDKs with full types, automatic retries and webhook signature checks. All of them open source.
npm i @kait/nodeimport Kait from "@kait/node"; const kait = new Kait(process.env.KAIT_KEY); const npwp = await kait.npwp.validasi({ npwp: "0012345678091000", }); console.log(npwp.pkp); // true
composer require kait/kait-php$kait = new Kait\Client(getenv('KAIT_KEY')); $faktur = $kait->faktur->terbitkan([ 'npwp_pembeli' => '0012345678091000', 'barang' => [ ['nama' => 'Kopi Gayo 1 kg', 'harga' => 185000, 'jumlah' => 12], ], ]); echo $faktur->status; // antre
go get github.com/kait-id/kait-goclient := kait.New(os.Getenv("KAIT_KEY")) qr, err := client.QRIS.Buat(ctx, &kait.QRISParams{ Nominal: 86500, Kedaluwarsa: 15 * time.Minute, }) if err != nil { return err } fmt.Println(qr.Status) // menunggu
pip install kaitimport os, kait client = kait.Client(os.environ["KAIT_KEY"]) hasil = client.nik.verifikasi( nik="3171010101900001", nama="Siti Rahmawati", ) print(hasil.status) # terverifikasi
An honest sandbox, failures included.
kait_test_ keys never touch Dukcapil, DJP or real money. The magic values below trigger every outcome, so your failure paths are tested before a customer finds them.
Magic values
| Input | Result |
|---|---|
3171010101900001 | terverifikasiNIK matches on every field |
3171010101900002 | nama_tidak_cocokname score 0.41 |
3171010101900003 | tidak_ditemukanNIK is not registered |
0000000000000001 | npwp_nonaktifNPWP has been revoked |
Rp10.001 | qris_kedaluwarsaQRIS expires in 5 seconds |
Rp99.999 | coretax_sibukinvoice queued, approved 2 minutes later |
$ kait listen --teruskan localhost:3000/webhook ready, forwarding to localhost:3000/webhook 07:32:41 faktur.disetujui fkt_01JA7R2C9W 200 18 ms 07:32:58 qris.lunas qr_01JA7RB4KX 200 11 ms 07:33:02 nik.terverifikasi nik_01JA7RC0QF 500 34 ms 07:33:03 retry 1 of 8 nik_01JA7RC0QF 200 15 ms
From the engineers who use it every day
We deleted 2,400 lines of tax integration code and replaced them with one call. Invoices are now issued before the courier leaves.
The sandbox is honest. Every error we ever met in production turned out to be one we had already tested with its magic values.
NIK verification under 200 ms is not a marketing number. We measure it ourselves across 12,000 courier sign-ups a day.
Your first call, before your coffee goes cold.
Sign up, copy a sandbox key, run one command. Our median developer gets a first response in 11 minutes.