JMO Data API: JHT Balances, KPJ Cards and Claims
JMO (Jamsostek Mobile) is the official Android app of BPJS Ketenagakerjaan, Indonesia's employment social-security administrator (Jamsostek). After a member signs in, Home and Account screens show Jaminan Hari Tua (JHT) old-age savings, Jaminan Pensiun (JP) pension details, a digital KPJ card for PU, BPU and PMI membership segments, JHT claim tracking with in-app liveness and face-match checks, JKK/JKM/JHT tuition payments, branch-office antrian booking, and worker-scholarship applications. Dana Siaga / Xtradana, BSU wage-subsidy checks, JKP job-loss benefits, syariah e-akad and an office locator sit on the same menu. The app serves Indonesian formal employees (PU), informal workers (BPU) and Indonesian migrant workers (PMI) who hold a KPJ number, sitting next to BPJS Kesehatan's JKN Mobile for health coverage and the rest of the government's social-protection stack.
JHT ledgers land in a saldoJht array: each row carries nomSaldo, kodePerusahaan, namaPerusahaan, npp, kpj, bulanIuranTerakhir and statusKepesertaan for the signed-in worker. Contribution months arrive as blth with jhtContribution and salary. The member card under profile holds namaLengkap, nik, noKk and msisdn; digital-card rows add hash, kodeSegmen and kodeTk. JP benefit rows expose nomManfaatNetto, nomRapel, kodeKlaim and statusLunas. Tuition settlements split amountJht, amountJkk, amountJkm and amountTotal. Branch bookings return kodePengajuan, tanggalBooking, namaKantorCabang and layanan.
Payroll and HR stacks reconcile employer npp against the worker's nomSaldo. Claims desks watch tahapKlaim and isPaid. Branch operations consume antrian slots and office kode / nama pins. openData Studio turns those fields into callable open data.
Screenshots
API surface
Request/response examples are illustrative, reconstructed from the app's interface — not a live capture.
Login v2
POST
/user/login-v2osintSigns the member in with email and password and mints the accessToken and refreshToken later calls attach as Bearer.
Auth: email and password in the JSON body; response mints accessToken and refreshToken.
- password
- deviceId
- lastInstalledVersion
- deviceBrand
- deviceModel
- latitude
- longitude
- locality
- publicKey
- signature
- accessToken
- refreshToken
- titleMessage
- jenisForm
- transactionId
- ret
POST /user/login-v2 HTTP/1.1 Content-Type: application/json { "email": "[email protected]", "password": "********", "deviceId": "a1b2c3d4e5", "lastInstalledVersion": "4.18.4", "deviceBrand": "samsung", "deviceModel": "SM-S911B", "latitude": "-6.2088", "longitude": "106.8456", "locality": "Jakarta", "publicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A", "signature": "base64-signature" }{ "accessToken": "eyJhbGciOi...", "refreshToken": "rt_8f21c0", "titleMessage": "Login berhasil", "jenisForm": "HOME", "transactionId": "TRX-20261015-001", "ret": "0", "deviceId": "a1b2c3d4e5" }Member profile
POST
/user/profileosintLoads the signed-in member card wrapped as profile: namaLengkap, nik, noKk, msisdn, address fields and the kpj membership list used on Account.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- profile
- namaLengkap
- nik
- noKk
- msisdn
- jenisKelamin
- tempatLahir
- tglLahir
- alamat
- propinsi
- kabupaten
- kecamatan
- kodePos
- statusPeserta
- statusPelapor
- isEligibleRaya
- displayPict
- listFitur
- kpj
POST /user/profile HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]", "deviceId": "a1b2c3d4e5" }{ "profile": { "namaLengkap": "Siti Nurhaliza", "nik": "3174011204940001", "noKk": "3174010101010001", "email": "[email protected]", "msisdn": "081234567890", "jenisKelamin": "P", "tempatLahir": "Jakarta", "tglLahir": "1994-04-12", "alamat": "Jl. Sudirman No. 1", "propinsi": "DKI Jakarta", "kabupaten": "Jakarta Pusat", "kecamatan": "Tanah Abang", "kodePos": "10270", "statusPeserta": "AKTIF", "statusPelapor": "0", "isEligibleRaya": false, "displayPict": "https://example.invalid/pict.jpg", "listFitur": ["JHT", "JP", "JKP"], "kpj": [{ "kpj": "19011234567", "kodeTk": "TK001", "kodeSegmen": "PU", "namaTk": "Siti Nurhaliza", "nomorIdentitas": "3174011204940001", "program": "JHT,JP,JKK,JKM", "statusKepesertaan": "AKTIF", "tglKepesertaan": "2018-03-01" }] } }KPJ membership cards
POST
/user/kpjopenfinanceReturns the worker's KPJ numbers with kodeSegmen (PU/BPU/PMI), subscribed program codes and statusKepesertaan.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- kpj
- kodeTk
- kodeSegmen
- namaTk
- nomorIdentitas
- program
- statusKepesertaan
- tglKepesertaan
POST /user/kpj HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]", "deviceId": "a1b2c3d4e5" }{ "kpj": [{ "kpj": "19011234567", "kodeTk": "TK001", "kodeSegmen": "PU", "namaTk": "Siti Nurhaliza", "nomorIdentitas": "3174011204940001", "program": "JHT,JP,JKK,JKM", "statusKepesertaan": "AKTIF", "tglKepesertaan": "2018-03-01" }] }JHT balance
POST
/jht/balanceopenbankingReturns JHT old-age savings as saldoJht rows: nomSaldo, employer kodePerusahaan / npp / namaPerusahaan, last tuition month and membership status.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- saldoJht
- kodePerusahaan
- kodeSegmen
- kodeTk
- kpj
- namaPerusahaan
- nomSaldo
- npp
- jumlahTk
- program
- bulanIuranTerakhir
- tanggalIuranTerakhir
- statusKepesertaan
- kodeDivisi
POST /jht/balance HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]", "isRecordPoin": false }{ "saldoJht": [{ "kodePerusahaan": "P1234567", "kodeSegmen": "PU", "kodeTk": "TK001", "kpj": "19011234567", "namaPerusahaan": "PT Contoh Sejahtera", "nomSaldo": "87543000", "npp": "123456789012", "jumlahTk": "1", "program": "JHT", "bulanIuranTerakhir": "202610", "tanggalIuranTerakhir": "2026-10-10", "statusKepesertaan": "AKTIF", "kodeDivisi": "01" }] }JHT contribution detail
POST
/jht/contribution-detailopenbankingPages JHT contribution months as blth rows with jhtContribution, salary, rapel and paymentDate against the employer companyCode.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- workerCode
- companyCode
- divisionCode
- membershipCode
- contributionCode
- segmenCode
- blth
- paymentDate
- jhtContribution
- salary
- rapel
- sort
POST /jht/contribution-detail HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]", "kpj": "19011234567" }{ "data": [{ "workerCode": "TK001", "companyCode": "P1234567", "divisionCode": "01", "membershipCode": "19011234567", "contributionCode": "IUR-202610", "segmenCode": "PU", "blth": "202610", "paymentDate": "2026-10-10", "jhtContribution": "450000", "salary": "8500000", "rapel": "0", "sort": "1" }] }Track JHT claim
POST
/jht/track-claimopenfinanceTracks a JHT claim: isSuccessful, tahapKlaim stages and isPaid so the claim screen can show whether the benefit has settled.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- isSuccessful
- message
- isPaid
- titleKlaim
- tahapKlaim
POST /jht/track-claim HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]", "kpj": "19011234567" }{ "isSuccessful": true, "message": "Klaim diproses", "isPaid": "N", "titleKlaim": { "title": "Klaim JHT" }, "tahapKlaim": [{ "tahap": "VERIFIKASI", "status": "PROSES" }] }Digital KPJ cards
POST
/digital-card/cardsopendataLists digital KPJ cards the member can render: hash, kodeSegmen, kodeTk and kpj. PU/BPU/PMI membership information rides sibling methods on the same client.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- hash
- kodeSegmen
- kodeTk
- kpj
POST /digital-card/cards HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]", "deviceId": "a1b2c3d4e5" }{ "data": [{ "hash": "9f2c1a8b0e", "kodeSegmen": "PU", "kodeTk": "TK001", "kpj": "19011234567" }] }JP benefit information
POST
/jp/benefit-informationopenfinanceReturns JP pension benefit amounts: nomManfaatNetto, nomRapel, nomBerjalan, kodeKlaim, statusLunas and tglKonfirmasiBaru.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- dataFound
- kodeKlaim
- noProses
- nomRapel
- nomKompensasi
- nomBerjalan
- nomManfaatNetto
- blthProses
- countRapel
- countRapelAll
- statusLunas
- tglKonfirmasiBaru
POST /jp/benefit-information HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]", "kpj": "19011234567" }{ "dataFound": "Y", "kodeKlaim": "JP-2026-00421", "noProses": "PR-8891", "nomRapel": "1500000", "nomKompensasi": "0", "nomBerjalan": "2100000", "nomManfaatNetto": "3600000", "blthProses": "202610", "countRapel": "2", "countRapelAll": "2", "statusLunas": "BELUM", "tglKonfirmasiBaru": "2026-10-20" }Nearest branch office
POST
/office/nearest-branchopendataReturns the nearest BPJS Ketenagakerjaan branch: nama, kode, alamat and lat/long (wire aliases namaKantorCabang, kodeKantorCabang, alamatKantorCabang).
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- alamat
- kode
- latitude
- longitude
- nama
POST /office/nearest-branch HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "latitude": -6.2088, "longitude": 106.8456 }{ "alamat": "Jl. Gatot Subroto Kav. 79", "kode": "KCJKT01", "latitude": -6.2395, "longitude": 106.8321, "nama": "Kantor Cabang Jakarta Gatot Subroto" }Branch queue booking
POST
/queueing/antrianopendataReads a booked branch antrian: kodePengajuan, tanggalBooking, namaKantorCabang, layanan, shift codes and the qrCode the member shows at the counter.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument. Queueing overloads also send an x-transaction-id header.
- isSuccessful
- message
- qrCode
- data
- kodePengajuan
- nama
- nomorIdentitas
- kpj
- handphone
- alamatKantor
- kantorCabang
- namaKantorCabang
- kodeProvinsi
- kodeShift
- namaShift
- layanan
- tanggalBooking
POST /queueing/antrian HTTP/1.1 Authorization: Bearer eyJhbGciOi... x-transaction-id: TRX-20261015-001 Content-Type: application/json { "email": "[email protected]", "kpj": "19011234567" }{ "isSuccessful": true, "message": "Antrian ditemukan", "qrCode": "JMO-QR-88421", "data": { "kodePengajuan": "ANTR-20261015-0042", "nama": "Siti Nurhaliza", "nomorIdentitas": "3174011204940001", "kpj": "19011234567", "handphone": "081234567890", "email": "[email protected]", "alamatKantor": "Jl. Gatot Subroto Kav. 79", "kantorCabang": "KCJKT01", "namaKantorCabang": "Kantor Cabang Jakarta Gatot Subroto", "kodeProvinsi": "31", "kodeShift": "PAGI", "namaShift": "Pagi", "layanan": "KLAIM JHT", "tanggalBooking": "2026-10-20" } }Tuition payment history
POST
/tuition/payment-historyopenbankingLists JKK/JKM/JHT tuition settlements: per-program amounts, amountTotal, paymentMethod, transactionDate and settlementDate.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- transactionId
- amountJkk
- amountJkm
- amountJht
- amountTotal
- status
- quantity
- fullname
- transactionDate
- settlementDate
- customerIdentifier
- paymentMethod
- customField
POST /tuition/payment-history HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]" }{ "data": [{ "transactionId": "PAY-889120", "amountJkk": "12000", "amountJkm": "8000", "amountJht": "450000", "amountTotal": "470000", "status": "SETTLED", "quantity": "1", "fullname": "Siti Nurhaliza", "transactionDate": "2026-10-10T09:14:00+07:00", "settlementDate": "2026-10-10T09:16:22+07:00", "customerIdentifier": "19011234567", "paymentMethod": "MIDTRANS", "customField": "JHT+JKK+JKM" }] }Scholarship eligibility
POST
/scholarship/eligibleopendataChecks worker-scholarship eligibility: statusDesc, eligibleData, signature, plus chosen-scholar lists dataPenerimaManfaatBeasiswa and dataDaftarPenerimaBeasiswa.
Auth: Bearer accessToken from POST /user/login-v2. Client methods take the session token as the first String argument.
- statusDesc
- eligibleData
- signature
- dataPenerimaManfaatBeasiswa
- dataDaftarPenerimaBeasiswa
POST /scholarship/eligible HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "email": "[email protected]", "kpj": "19011234567" }{ "statusDesc": "ELIGIBLE", "eligibleData": [{ "kpj": "19011234567", "eligible": true }], "signature": "base64-signature", "dataPenerimaManfaatBeasiswa": [], "dataDaftarPenerimaBeasiswa": [] }
Data categories
- balances
- contributions
- identity
- claims
- locations
- payments
Where teams use this data
Employer JHT reconciliation
Payroll stacks match npp and kodePerusahaan on saldoJht rows against the worker's nomSaldo, bulanIuranTerakhir and blth contribution months so HR can spot missing JHT tuition before month-close.
Claims-desk status board
Benefits operations pull tahapKlaim and isPaid for JHT, and nomManfaatNetto / statusLunas / tglKonfirmasiBaru for JP, to drive a shared queue of unsettled claims.
Branch antrian operations
Branch software consumes kodePengajuan, tanggalBooking, layanan and namaKantorCabang so the counter can scan the member's qrCode against the booked shift.
Scholarship eligibility check
HR benefits tools read statusDesc and eligibleData before opening a worker-scholarship file, then keep dataPenerimaManfaatBeasiswa as the chosen-recipient roster.
Frequently asked questions
What member identifiers does JMO expose?
The profile object carries namaLengkap, nik, noKk, msisdn and a kpj list. Digital-card rows add hash, kodeSegmen and kodeTk for PU, BPU and PMI segments.
How is JHT savings represented?
JHT balances arrive as a saldoJht array of nomSaldo rows keyed by kpj, npp and kodePerusahaan, with bulanIuranTerakhir and statusKepesertaan. Contribution months use blth, jhtContribution and salary.
Can I follow a JHT or JP claim?
JHT tracking returns tahapKlaim stages plus isPaid. JP benefit information returns nomManfaatNetto, nomRapel, kodeKlaim, statusLunas and tglKonfirmasiBaru.
How does JMO authenticate members?
Login v2 accepts email and password (plus device and location fields) and returns accessToken and refreshToken. Later calls send Authorization: Bearer; queueing overloads also send x-transaction-id.
Apps similar to JMO (Jamsostek Mobile)
- Mobile JKN — Mobile JKN is BPJS Kesehatan's Android app for Indonesia's Jaminan Kesehatan Nasional: members look up membership by card number, NIK or family-card number, find nearby faskes, check iuran bills and virtual-account numbers, and register as informal (BPU) participants.
- Andal by Taspen — Andal by Taspen is PT TASPEN's app for Indonesian civil servants (ASN), with online claim and non-claim filings, THT old-age benefit estimates, monthly pension information and workplace-accident (JKK) reporting.
- MyJasfren — MyJasfren is PT Jasa Raharja's app for Indonesia's compulsory traffic-accident cover, with online santunan claims, public-transport vehicle protection payments and SWDKLLJ checks for private motorcycles.
- SIAPkerja — SIAPkerja is the Indonesian Ministry of Manpower (Kemnaker) labour-services app that bundles job matching (Karirhub), skills training, competency certificates and JKP job-loss social security for laid-off workers.
- MyASN BKN — MyASN BKN is Badan Kepegawaian Negara's personnel app for Indonesian civil servants, showing ASN profile data plus linked BPJS Ketenagakerjaan, BPJS Kesehatan, Taspen and KTP records.
- VssID — VssID is Vietnam Social Security's citizen app for looking up social-, health- and unemployment-insurance records and presenting a digital health-insurance card in place of the physical BHYT card.
- GOSI — GOSI is the Android client of Saudi Arabia's General Organization for Social Insurance, the agency that runs contributory social insurance for private-sector workers, employers and beneficiaries.
Topics
- JMO API
- Jamsostek Mobile
- BPJS Ketenagakerjaan
- JHT nomSaldo
- KPJ card
- JP nomManfaatNetto
- antrian booking
- Indonesia employment social security
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use