Sentra Healthcare — API Documentation¶
Semua API menggunakan standard RESTful berbasis JSON terenkripsi SSL/TLS 1.3, terstruktur sesuai standar interoperabilitas rekam medis.
POST /api/v1/patients — Registrasi Pasien Baru¶
Mengintegrasikan data identitas pasien lokal dengan verifikasi NIK dan IHS ID SatuSehat secara real-time.
Request Header:
Content-Type: application/json
Authorization: Bearer <jwt_token>
X-Clinic-Signature: <hmac_sha256_hash>
Request Body:
{
"nik": "3174092108920005",
"full_name": "Budi Santoso",
"gender": "Laki-laki",
"birth_date": "1992-08-21",
"phone_number": "081234567890",
"allergies": [
{
"allergen": "Amoxicillin",
"severity": "High",
"reaction": "Skin rash, anaphylaxis"
}
]
}
Response Body (201 Created):
{
"status": "success",
"data": {
"id": "7ac16c72-911a-4c22-9e8d-8c17b01b63ef",
"rm_number": "RM/2026/05/00021",
"nik": "3174092108920005",
"ihs_id": "P0002891789",
"full_name": "Budi Santoso",
"birth_date": "1992-08-21",
"allergies": [
{
"allergen": "Amoxicillin",
"severity": "High",
"reaction": "Skin rash, anaphylaxis"
}
],
"created_at": "2026-05-21T20:18:00+07:00"
}
}
Note:
ihs_iddiambil otomatis dari SatuSehat IHS API menggunakan NIK pasien untuk mencegah duplikasi identitas. Jika IHS API timeout, registrasi tetap berhasil danihs_idakan di-populate secara asinkron.
POST /api/v1/encounters — Inisiasi Pemeriksaan & Bridging SatuSehat¶
API ini dipicu ketika pasien dipanggil ke poli dari antrean untuk memulai pertemuan medis (Encounter). Endpoint ini secara sinkron membuat entitas di database lokal dan secara asinkron memicu event pembuatan status Encounter HL7 FHIR di SatuSehat.
Request Body:
{
"patient_id": "7ac16c72-911a-4c22-9e8d-8c17b01b63ef",
"doctor_id": "14f09d83-49a7-47ab-b29b-75f12dbefb01",
"branch_id": "99ea7b42-1200-4b32-8411-d00db60ab292",
"billing_type": "BPJS"
}
Response Body (200 OK):
{
"status": "success",
"data": {
"encounter_id": "ca21b01c-6d1a-41d1-9311-bf17b0c34da8",
"status": "TRIAGE",
"check_in_time": "2026-05-21T20:18:15+07:00",
"satusehat_sync": {
"status": "QUEUED",
"job_id": "job_fhir_enc_8927192"
}
}
}
Note:
satusehat_sync.status = "QUEUED"berarti payload FHIR R4 Encounter telah masuk ke antrian RabbitMQ. Background worker akan mengirimkan ke SatuSehat IHS API secara asinkron. Status akhir bisa dipoll viaGET /api/v1/encounters/:id/satusehat-sync-status.
PUT /api/v1/encounters/:id/soap — Submit SOAP & Kunci RME¶
Tempat dokter memasukkan hasil diagnosa pemeriksaan rekam medis. Begitu ditandatangani secara digital menggunakan BSrE, rekam medis akan dikunci agar tidak bisa dimodifikasi secara sembarang sesuai aturan Permenkes 24/2022.
Request Body:
{
"subjective": "Pasien mengeluhkan pusing hebat di bagian tengkuk sejak 3 hari lalu, lemas, dan kurang tidur.",
"objective": "TD: 155/95 mmHg, Temp: 36.8 C, HR: 88 bpm, SpO2: 98%",
"assessment_icd10": [
{
"code": "I10",
"name": "Essential (primary) hypertension"
}
],
"plan": "Edukasi pembatasan konsumsi garam. Pemberian obat antihipertensi Amlodipine 10mg sekali sehari. Kontrol ulang 1 minggu lagi.",
"doctor_digital_signature": "bsre:sig_hash_8a2d1f8876c12ba309ae848f029a17ccf"
}
Response Body (200 OK):
{
"status": "success",
"message": "Medical record signed and locked successfully",
"data": {
"encounter_id": "ca21b01c-6d1a-41d1-9311-bf17b0c34da8",
"soap_id": "fd91a7c2-9011-4822-ba33-df18b99c1d01",
"locked_at": "2026-05-21T20:25:30+07:00",
"digital_signature_hash": "a4f107f9c8f000b217aefb9090deec8f293b490f892a013adcfbc30a6c0e81c1"
}
}
RME Lock: Setelah endpoint ini berhasil, kolom
signed_atpadasoap_notesterisi dan seluruh UPDATE berikutnya akan ditolak (HTTP 423 Locked). Modifikasi setelah lock hanya bisa dilakukan melalui endpointPOST /api/v1/soap/:id/addendum.
Error Responses:
| Code | Scenario |
|---|---|
400 Bad Request |
Field SOAP tidak lengkap / ICD-10 code tidak valid |
409 Conflict |
RME sudah pernah di-sign sebelumnya (duplicate sign attempt) |
422 Unprocessable |
BSrE signature validation gagal |
423 Locked |
Attempt modifikasi SOAP setelah lock |
POST /api/v1/prescriptions — E-Prescribing & Alokasi Stok FEFO¶
Menerima resep dari EMR dokter dan menahannya secara otomatis berdasarkan batch terdekat dari tanggal kadaluwarsa (FEFO) untuk menghindari perselisihan stok fisik.
Request Body:
{
"encounter_id": "ca21b01c-6d1a-41d1-9311-bf17b0c34da8",
"items": [
{
"medicine_id": "b9cf8721-a01c-4b92-809c-7c01bda8f212",
"dosage_instruction": "1x1 Tablet Pagi hari, sesudah makan",
"quantity": 10,
"is_racikan": false
},
{
"medicine_id": "d09a7bcf-9e12-4c22-ba91-ef17b0b2e811",
"dosage_instruction": "3x1 Puyer Sehari (Pagi-Siang-Malam)",
"quantity": 15,
"is_racikan": true,
"racikan_group_id": "RACIK/ANAK/01"
}
]
}
Response Body (201 Created):
{
"status": "success",
"data": {
"prescription_id": "ea91b01c-7f12-411a-82ee-001bc93bc8ff",
"prescription_number": "RX/260521/0088",
"allocated_items": [
{
"medicine_name": "Amlodipine 10mg",
"allocated_batch": "BATCH-202611-009A",
"expiry_date": "2026-11-30",
"qty_allocated": 10
}
],
"status": "PENDING"
}
}
FEFO Lock: Alokasi batch dilakukan dalam atomic PostgreSQL transaction. Stok terpotong sementara saat resep dibuat; jika resep dibatalkan, stok dikembalikan. Jika stok tidak mencukupi, API mengembalikan
409 Conflictdengan detail batch yang tersedia.
POST /api/v1/soap/:id/addendum — Koreksi RME (Addendum)¶
Satu-satunya cara legal untuk memodifikasi RME yang sudah terkunci (setelah BSrE sign-off). Addendum tidak menghapus data lama — data lama disalin ke soap_notes_history dan versi baru dicatat sebagai Addendum.
Request Body:
{
"addendum_reason": "Koreksi diagnosa sekunder: tambah J06.9 (ISPA) berdasarkan hasil lab terbaru.",
"updated_assessment_icd10": [
{ "code": "I10", "name": "Essential (primary) hypertension" },
{ "code": "J06.9", "name": "Acute upper respiratory infection, unspecified" }
],
"doctor_digital_signature": "bsre:sig_amend_abc123def456"
}
Response (200 OK): Addendum tersimpan di soap_notes_history dengan version incremental; RME original tetap intact.