KlaimGuard API
Cek berkas klinis terhadap kaidah klaim BPJS per tahap clinical pathway. Hasilnya: apa yang kurang, apa yang tidak konsisten, dan contoh isian siap-salin untuk nakes.
api.healthguardinnovation.com/klaimguard/v1 belum aktif.Tahap clinical pathway
stage | Tahap | Alias endpoint | Status |
|---|---|---|---|
igd_asesmen_awal | IGD — Asesmen Awal | /igd/asesmen-awal | Logika siap (R&D RS) |
ranap_cppt | Ranap — CPPT / Early Warning | /ranap/cppt | Logika siap (R&D RS) |
ranap_resume | Ranap — Resume Pulang | /ranap/resume | Logika siap (R&D RS) |
rajal_soap | Rajal — SOAP Poli | /rajal/soap | Logika siap (R&D klinik) |
| — | Hilir — Casemix (overview episode sebelum klaim INA-CBG) | — | Direncanakan |
Semua tahap memakai satu endpoint POST /checks. Alias di atas hanya jalan pintas yang mengisi stage otomatis.
3 cara mengirim data
| Opsi | Untuk siapa | Isi request | |
|---|---|---|---|
| ① | FHIR R4 — SATUSEHAT default | SIMRS yang sudah terintegrasi SATUSEHAT | stage + bundle |
| ② | Simple | SIMRS yang belum terintegrasi SATUSEHAT | stage + encounter + sections[] (label form Anda sendiri) |
| ③ | Kustomisasi / on-premise | Format khusus atau instalasi di server RS | Adapter khusus dipasang HealthGuard pada API key Anda. Hubungi kami |
Ketiganya diolah oleh mesin verifikasi yang sama. Isi klinis yang sama menghasilkan temuan yang sama.
Mulai dalam 4 langkah
- Dapatkan API key per faskes dari tim HealthGuard. Kirim di header
X-API-Key. - Pakai ulang mapping SATUSEHAT Anda. Kumpulkan resource satu kunjungan (Encounter, Observation, Condition, Procedure, dst.) ke dalam satu
Bundle. SIMRS belum SATUSEHAT? Pakai opsi ②simple. - Kirim
POST /checksdenganstageyang sesuai. Tambahkan headerIdempotency-Keyagar aman saat diulang. - Baca
summary.status, lalu tampilkanfindings[].rekomendasidancontoh_isianke dokter/perawat di layar SIMRS.
① FHIR R4 — SATUSEHAT (default)
KlaimGuard membaca resource dan code system yang sama dengan SATUSEHAT (HL7 FHIR R4 4.0.1). Wajib hanya satu Encounter. Resource lain dibaca bila ada; semakin lengkap, semakin tajam verifikasinya.
| Yang diverifikasi | Resource SATUSEHAT | Kode |
|---|---|---|
| Kunjungan & jenis layanan | Encounter — class, period, hospitalization.admitSource, identifier | v3-ActCode EMER / IMP / AMB |
| Diagnosa utama & sekunder | Condition (category encounter-diagnosis), urutan via Encounter.diagnosis.rank | ICD-10 http://hl7.org/fhir/sid/icd-10 |
| Tindakan | Procedure | ICD-9-CM http://hl7.org/fhir/sid/icd-9-cm |
| Tanda vital (TD, nadi, RR, suhu, SpO2, BB, TB, GCS, nyeri, GDA) | Observation category vital-signs; TD = panel 85354-9 | LOINC + UCUM |
| Hasil laboratorium | DiagnosticReport (LAB) + Observation category laboratory | LOINC / kode lokal |
| Radiologi | DiagnosticReport category RAD — conclusion | — |
| Resep / obat | MedicationRequest | KFA http://sys-ids.kemkes.go.id/kfa (opsional) |
| Alergi | AllergyIntolerance | SNOMED CT (opsional) |
| Narasi klinis tanpa resource berkode (primary survey, pemeriksaan fisik, CPPT SOAP, resume, laporan operasi) | QuestionnaireResponse — satu per bagian, questionnaire = …/Questionnaire/<section>, linkId = label field SIMRS | — |
Patient. Identifikasi pasien memakai nomor IHS SATUSEHAT atau nomor RM. Bagian ini boleh dikosongkan.Contoh request (Bundle yang hanya berisi resource SATUSEHAT):
curl -X POST https://api.healthguardinnovation.com/klaimguard/v1/checks \
-H "X-API-Key: $KLAIMGUARD_KEY" -H "Content-Type: application/fhir+json" \
-H "Idempotency-Key: IGD-2026-000123" -d @bundle.json
{
"stage": "igd_asesmen_awal",
"bundle": {
"resourceType": "Bundle",
"type": "collection",
"entry": [
{
"fullUrl": "urn:uuid:19aca3b2-1833-4137-b71f-1815f9fc511b",
"resource": {
"resourceType": "Patient"
}
},
{
"fullUrl": "urn:uuid:9e51db9f-0133-4451-b9d9-7f81a828b11e",
"resource": {
"resourceType": "Encounter",
"status": "finished",
"class": {
"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "EMER",
"display": "emergency"
},
"identifier": [
{
"system": "https://docs.healthguardinnovation.com/fhir/sid/visit-id",
"value": "DEMO-IGD-DATA-VALID-TINDAKAN-"
}
],
"subject": {
"reference": "urn:uuid:19aca3b2-1833-4137-b71f-1815f9fc511b"
},
"hospitalization": {
"admitSource": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/admit-source",
"code": "emd"
}
],
"text": "IGD"
}
},
"diagnosis": [
{
"condition": {
"reference": "urn:uuid:fd9c0e0c-d906-4310-b86a-7348bc113236"
},
"rank": 1,
"use": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/diagnosis-role",
"code": "AD"
}
]
}
}
]
}
},
{
"fullUrl": "urn:uuid:4879ae53-a092-4da9-b649-537e97a4208e",
"resource": {
"resourceType": "AllergyIntolerance",
"clinicalStatus": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical",
"code": "active"
}
]
},
"verificationStatus": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification",
"code": "confirmed"
}
]
},
"code": {
"text": "Tidak ada alergi obat maupun makanan",
"coding": [
{
"system": "http://snomed.info/sct",
"code": "716186003",
"display": "No known allergy"
}
]
},
"patient": {
"reference": "urn:uuid:19aca3b2-1833-4137-b71f-1815f9fc511b"
}
}
},
{
"fullUrl": "urn:uuid:d4dc3afe-a965-4437-baa8-a81cafe458d5",
"resource": {
"resourceType": "Observation",
"status": "final",
"category": [
{
"codin
… (dipotong — lihat file lengkap)
Isi Bundle contoh ini: Patient×1, Encounter×1, AllergyIntolerance×1, Observation×12, Condition×1, Procedure×2. Kirim penjamin di tingkat request (default BPJS) karena SATUSEHAT Encounter tidak punya elemen penjamin. Untuk ranap_cppt, diagnosa klaim saat ini diambil dari Encounter.diagnosis dengan use billing.
② Simple
Kirim bagian-bagian form SIMRS apa adanya. Label field Anda dipakai langsung, tanpa mapping ke kode.
{
"stage": "igd_asesmen_awal",
"penjamin": "BPJS",
"encounter": {
"visit_id": "DEMO-IGD-BACKWARD-COMPAT-TANP",
"class": "EMER",
"origin": "IGD"
},
"sections": [
{
"key": "dataPasien",
"label": "Data Pasien",
"data": {
"Cara Datang": "Sendiri",
"Jenis Kebutuhan Pelayanan": "kuratif",
"Sarana Transportasi": "Mobil",
"Pengantar": "Keluarga",
"Hubungan Pengantar": "-",
"Jenis Prioritas / Triase": "Kuning",
"Jam Kedatangan Ada": "2026-07-12T00:55:43.000Z",
"Jam Diperiksa Dokter Ada": "2026-07-12T00:55:43.000Z",
"Jenis Kasus": "ipd",
"Diagnosa Rujukan": "-"
}
},
{
"key": "anamnesa",
"label": "Anamnesa",
"data": {
"Keluhan Utama": "nyeri perut",
"Riwayat Penyakit Sekarang": "pasien datang dengan keluhan nyeri perut terutama di ulu hati disertai mual muntah. sesak (-) nyeri dada (-) BAK dan BAB tidak ada keluhan. flatus (+)",
"Riwayat Penyakit Dahulu": "-",
"Riwayat Penggunaan Obat": "-",
"Riwayat Alergi": "Tidak"
}
},
{
"key": "primarySurvey",
"label": "Primary Survey (ABCDE)",
"data": {
"Airway": "jalan nafas: paten, Kesimpulan: Aman",
"Breathing": "Pernapasan: spontan, regular, Gerakan Dada: simetris, Tipe pernapasan: normal, Kesimpulan: Aman",
"Circulation": "Nadi: reguler, kuat, Kulit/mukosa: normal, Akral: hangat, kering, CRT: kurangDari2Detik, Kesimpulan: Aman",
"Disability GCS": "e: 4, v: 5, m: 6",
"Disability Pupil": "Pupil: Isokor, Lateralisasi: Tidak Ada, Kesimpulan: Aman",
"Exposure": "Eksposur: dalamBatasNormal, Kesimpulan: Aman"
}
},
{
"key": "ttv",
"label": "TTV & Keadaan Umum",
"data": {
"Keadaan Umum": "Sedang",
"GCS - E": "4",
"GCS - V": "5",
"GCS - M": "6",
"Tingkat Kesadaran": "1.Sadar Baik/Alert: 0",
"Tekanan Darah (mmHg)": "140/80",
"Suhu (°C)": "37",
"Nadi (x/menit)": "100",
"Pernafasan (x/menit)": "20",
"SpO2 (%)": "98",
"Berat Badan (kg)": "-",
"Tinggi Badan (cm)": "-",
"GDA (mg/dl)": "-",
"Skala Nyeri (0-10)": "4-5"
}
},
{
"key": "pemeriksaanFisik",
"label": "Pemeriksaan Fisik",
"data": {
"Kepala": "Normal",
"Mata": "Normal",
"Telinga": "Normal",
"Hidung": "Normal",
"Leher": "Normal",
"Dada": "Normal simetris, S1S2 reg, ves/ves, wh-/-, rh-/-",
… (dipotong — lihat file lengkap)
③ Kustomisasi / on-premise
Untuk format SIMRS khusus, integrasi langsung database, atau instalasi di server RS. HealthGuard memasang adapter khusus pada API key faskes Anda. Respons tetap sama persis, jadi layar SIMRS tidak perlu diubah. Hasilnya menandai meta.profile = "custom".
Bentuk respons (sama untuk semua tahap)
| Field | Arti |
|---|---|
summary.status | Status terburuk di dokumen: lengkap · belum_lengkap · perbaiki |
summary.claim_ready | true hanya jika semua lengkap |
findings[] | Satu penilaian per bagian: rekomendasi, contoh_isian, penjelasan |
claim_impact | Dampak ke klaim (under-coding / risiko upcoding / optimal). Tahap ranap. |
diagnosis_suggestions, medication_review, document_sync | Khusus ranap_cppt (Early Warning selama rawat) |
coding_warnings[] | Peringatan aturan klaim deterministik (masa berlaku rujukan, tindakan berulang). Tahap rajal. |
notices[] | Saran tambahan, mis. berkas yang perlu di-bridging agar saran koding lebih akurat |
skipped + skip_reason | non_bpjs · origin_not_supported · no_cppt_entries · missing_required_documents. Gratis, tanpa panggilan AI. |
Blok yang tidak berlaku untuk suatu tahap bernilai null, tidak pernah hilang. Satu parser cukup untuk semua tahap.
{
"check_id": "chk_e89f49da4c8d079e",
"api_version": "v1",
"stage": "ranap_cppt",
"pathway": "igd_ranap",
"encounter_ref": {
"visit_id": "DEMO-EWS-ASAL-MASUK-POLI-EXPE",
"patient_ref": null
},
"skipped": true,
"skip_reason": "origin_not_supported",
"skip_detail": "Alur masuk \"POLI\" belum didukung — modul ini hanya untuk alur IGD → rawat inap.",
"summary": {
"status": null,
"claim_ready": null,
"counts": {
"lengkap": 0,
"belum_lengkap": 0,
"perbaiki": 0
}
},
"notices": [],
"findings": [],
"claim_impact": null,
"diagnosis_suggestions": null,
"medication_review": null,
"document_sync": null,
"coding_warnings": [],
"meta": {
"latency_ms": null,
"engine": "rules+llm",
"model": null,
"profile": "simple",
"origin_normalized": "POLI"
}
}
Kode error
| HTTP | Kapan | Tindakan |
|---|---|---|
| 400 | Payload tidak sesuai skema (details berisi lokasi field) | Perbaiki mapping |
| 401 | API key salah / dicabut | Hubungi HealthGuard |
| 413 | Payload > 5 MB | Kirim ringkasan lab/radiologi |
| 422 | JSON valid tapi tidak bisa dipakai (mis. Bundle tanpa Encounter) | Perbaiki data |
| 429 | Batas request per faskes terlampaui | Tunggu Retry-After |
| 502 | Penyedia AI gagal setelah retry | Ulangi dengan Idempotency-Key yang sama |
Privasi
Jangan pernah mengirim nama, NIK, atau nomor HP pasien. patient_ref = nomor RM atau ID internal; nilai berbentuk NIK (16 digit) ditolak. Data disimpan di server Indonesia. Tahap yang di-skip tidak memanggil AI.
Contoh lengkap & skema
Semua contoh di bawah adalah data sintetis dan lolos validasi skema serta validasi FHIR R4 (4.0.1).
- Skenario 1 — Semua Lengkap (Tanpa Peringatan) (rajal_soap) — FHIR (SATUSEHAT) · FHIR + form · simple · FHIR document
- Skenario 2 — Sebagian Kurang Lengkap (rajal_soap) — FHIR (SATUSEHAT) · FHIR + form · simple
- Skenario 3 — Banyak Peringatan (Massive Warning) (rajal_soap) — FHIR (SATUSEHAT) · FHIR + form · simple
- Skenario 4 — Pasien BPJS dengan Riwayat PRP (contoh awal) (rajal_soap) — FHIR (SATUSEHAT) · FHIR + form · simple
- Skenario 5 — Pasien UMUM (Auto-Skip) (rajal_soap) — FHIR + form · simple
- ✅ IGD — Data VALID + Tindakan ICD-9-CM (vulnus minor) (igd_asesmen_awal) — FHIR (SATUSEHAT) · FHIR + form · simple · FHIR document
- ✅ IGD — Backward compat: TANPA ICD-9-CM (abdominal pain) (igd_asesmen_awal) — FHIR (SATUSEHAT) · FHIR + form · simple
- 🟡 IGD — Data KURANG VALID (CKD+CHF+Septic Shock — ada gap) (igd_asesmen_awal) — FHIR (SATUSEHAT) · FHIR + form · simple
- 🔴 IGD — Data TIDAK VALID (banyak kosong, diagnosa asal) (igd_asesmen_awal) — FHIR (SATUSEHAT) · FHIR + form · simple
- ⏭️ IGD — Non-BPJS (expect skipped, AI tidak dipanggil) (igd_asesmen_awal) — FHIR + form · simple
- 📘 Ranap — REFERENSI BRIDGING (asesmenAwalIgd + cpptDokter + cpoObat) (ranap_resume) — FHIR (SATUSEHAT) · FHIR + form · simple · FHIR document
- ✅ Ranap — Data VALID (CAP pneumonia + CURB-65, 4 hari rawat) (ranap_resume) — FHIR (SATUSEHAT) · FHIR + form · simple
- 🟡 Ranap — Data KURANG VALID (gap sektor Anamnesis & Diagnosa) (ranap_resume) — FHIR (SATUSEHAT) · FHIR + form · simple
- 🟢 Ranap — BERKAS SUPER LENGKAP (15 berkas, kasus bedah kompleks) (ranap_resume) — FHIR (SATUSEHAT) · FHIR + form · simple
- ⚪ Ranap — BERKAS MINIMAL (4 berkas wajib, kasus sederhana) (ranap_resume) — FHIR (SATUSEHAT) · FHIR + form · simple
- ⏭️ Ranap — Non-BPJS (expect skipped) (ranap_resume) — FHIR + form · simple
- ⏭️ Ranap — Asal masuk POLI (expect skipped) (ranap_resume) — FHIR + form · simple
- ✅ EWS — Data BERMASALAH (CAP + Klebsiella + DM tidak terkontrol, hari ke-4) (ranap_cppt) — FHIR (SATUSEHAT) · FHIR + form · simple · response · FHIR document
- ✅ EWS — Data OPTIMAL (ISK sederhana, semua sinkron, tidak ada temuan) (ranap_cppt) — FHIR (SATUSEHAT) · FHIR + form · simple · response
- ⏭️ EWS — Non-BPJS (expect skipped) (ranap_cppt) — FHIR (SATUSEHAT) · FHIR + form · simple · response
- ⏭️ EWS — Asal masuk POLI (expect skipped) (ranap_cppt) — FHIR (SATUSEHAT) · FHIR + form · simple · response
- ⏭️ EWS — Belum ada entri CPPT (expect skipped) (ranap_cppt) — FHIR (SATUSEHAT) · FHIR + form · simple · response
Skema JSON: request.schema.json · response.schema.json · OpenAPI: yaml / json