Lewati ke isi

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_id diambil otomatis dari SatuSehat IHS API menggunakan NIK pasien untuk mencegah duplikasi identitas. Jika IHS API timeout, registrasi tetap berhasil dan ihs_id akan 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 via GET /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_at pada soap_notes terisi dan seluruh UPDATE berikutnya akan ditolak (HTTP 423 Locked). Modifikasi setelah lock hanya bisa dilakukan melalui endpoint POST /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 Conflict dengan 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.