Panduan Lengkap SatuSehat FHIR: Cara Kirim Data ke Platform Kemenkes
N
Kembali ke Blog

Panduan Lengkap SatuSehat FHIR: Cara Kirim Data ke Platform Kemenkes

Industri Kesehatan
Nugroho Setiawan 12 May 2026 8 min baca 1,476 kata 37 views
Integrasi data kesehatan ke platform SatuSehat Kemenkes adalah keharusan bagi fasilitas kesehatan di Indonesia. Artikel ini memandu Anda langkah demi langkah, dari konsep dasar hingga implementasi teknis menggunakan PHP Laravel, memastikan sistem SIMRS/SIM Klinik Anda compliant dan efisien.

Transformasi digital di sektor kesehatan Indonesia semakin mendesak, terutama dengan diresmikannya platform SatuSehat oleh Kementerian Kesehatan. Berdasarkan Peraturan Menteri Kesehatan (PMK) Nomor 24 Tahun 2022, setiap fasilitas pelayanan kesehatan (fasyankes) diwajibkan untuk terintegrasi dengan SatuSehat. Bagi para Manajer IT Rumah Sakit, pemilik klinik, atau pengambil keputusan operasional, kewajiban ini seringkali menimbulkan pertanyaan besar: Bagaimana cara memulai dan memastikan data dari Sistem Informasi Manajemen Rumah Sakit (SIMRS) atau Sistem Informasi Manajemen Klinik (SIM Klinik) kami dapat dikirim secara akurat dan aman ke platform nasional tersebut? Tantangan utamanya bukan hanya memahami standar teknis FHIR (Fast Healthcare Interoperability Resources) yang menjadi tulang punggung SatuSehat, tetapi juga menerjemahkannya ke dalam implementasi praktis yang minim kesalahan dan sesuai regulasi. Artikel ini hadir sebagai panduan komprehensif, merinci setiap aspek mulai dari konsep dasar FHIR, persiapan lingkungan pengembangan, hingga contoh kode PHP Laravel yang dapat langsung Anda gunakan. Kami akan membahas strategi pemetaan data, penanganan error umum, serta praktik terbaik untuk memastikan integrasi SatuSehat Anda berjalan mulus dan efisien, menghindari penalti atau hambatan operasional di masa mendatang. Tujuan kami adalah membekali Anda dengan pengetahuan dan alat yang konkret agar proses adopsi SatuSehat menjadi lebih mudah dan terarah.

Konsep Dasar SatuSehat FHIR dan Urgensi Integrasi

SatuSehat adalah platform ekosistem kesehatan digital nasional yang dikembangkan oleh Kementerian Kesehatan Republik Indonesia, bertujuan untuk menyatukan data rekam medis pasien dari seluruh fasilitas kesehatan. Fondasi utama interkonektivitas ini adalah standar FHIR (Fast Healthcare Interoperability Resources) versi R4. FHIR R4 adalah standar interoperabilitas data kesehatan yang dikembangkan oleh HL7 International, menyediakan spesifikasi yang fleksibel dan dapat diperluas untuk pertukaran data klinis dan administratif. Urgensi integrasi ini tidak hanya bersifat regulasi berdasarkan PMK No. 24 Tahun 2022 yang mewajibkan fasyankes untuk berpartisipasi, tetapi juga strategis untuk meningkatkan kualitas layanan kesehatan melalui data yang terintegrasi dan akurat.

Dalam konteks SatuSehat, beberapa sumber daya FHIR (FHIR Resources) menjadi sangat krusial. Contohnya adalah Patient untuk data demografi pasien, Encounter untuk kunjungan pasien, Observation untuk hasil pemeriksaan, Condition untuk diagnosis, Procedure untuk tindakan medis, dan Immunization untuk data imunisasi. Setiap sumber daya ini memiliki struktur data yang terdefinisi dengan baik, termasuk elemen wajib dan opsional, serta referensi ke sumber daya lain. Misalnya, sebuah sumber daya Encounter akan mereferensikan Patient yang terlibat dalam kunjungan tersebut, serta Location (unit pelayanan) dan Practitioner (dokter/perawat) yang memberikan layanan.

Autentikasi ke platform SatuSehat menggunakan standar OAuth 2.0 dengan alur client credentials. Ini berarti aplikasi Anda (SIMRS/SIM Klinik) akan mengautentikasi dirinya sendiri menggunakan client_id dan client_secret untuk mendapatkan access_token. Token ini kemudian digunakan untuk setiap permintaan API ke endpoint FHIR SatuSehat. Endpoint API SatuSehat secara umum memiliki struktur https://api-satusehat-dev.kemenkes.go.id/fhir-r4/v1/{resource} untuk lingkungan pengembangan, atau https://api-satusehat.kemenkes.go.id/fhir-r4/v1/{resource} untuk lingkungan produksi. Pemahaman mengenai struktur URL ini sangat penting untuk memastikan permintaan API Anda diarahkan dengan benar.

Setiap data yang dikirimkan ke SatuSehat memerlukan identifikasi unik, baik untuk organisasi (Organization.id) maupun untuk praktisi (Practitioner.id). ID ini biasanya didaftarkan melalui portal SatuSehat dan harus disertakan dalam payload FHIR Anda. Misalnya, saat mengirim sumber daya Encounter, Anda harus menyertakan referensi ke Organization yang menyediakan layanan dan Practitioner yang merawat pasien. Tanpa ID yang valid dan terdaftar, data Anda tidak akan diterima oleh platform. Dengan memahami dasar-dasar ini, kita dapat melangkah ke persiapan teknis yang lebih mendalam.

Persiapan dan Lingkungan Pengembangan untuk Integrasi

Sebelum memulai penulisan kode, ada beberapa prasyarat dan persiapan lingkungan yang harus dipenuhi untuk memastikan proses integrasi SatuSehat berjalan lancar. Pertama dan paling utama, Anda harus memiliki akun SatuSehat Developer dan telah mendaftarkan aplikasi Anda untuk mendapatkan client_id dan client_secret. Kredensial ini vital untuk proses autentikasi. Pastikan Anda menggunakan kredensial dari lingkungan sandbox/development terlebih dahulu sebelum beralih ke produksi.

Untuk implementasi teknis, kami akan menggunakan PHP sebagai bahasa pemrograman, khususnya dengan framework Laravel versi 11.x. Laravel menyediakan ekosistem yang kuat dan mudah dikelola untuk membangun aplikasi web dan API. Anda memerlukan Composer sebagai manajer dependensi PHP. Untuk komunikasi HTTP dengan API SatuSehat, kami akan memanfaatkan Guzzle HTTP Client versi 7.x, sebuah library HTTP client yang populer dan andal di ekosistem PHP. Sistem basis data yang direkomendasikan adalah PostgreSQL versi 16.x, meskipun MySQL juga dapat digunakan, PostgreSQL menawarkan fitur yang lebih canggih untuk pengelolaan data yang kompleks dan terstruktur.

Versi FHIR yang digunakan oleh SatuSehat saat ini adalah FHIR Release 4 (R4). Penting untuk selalu merujuk pada spesifikasi FHIR R4 dan profil SatuSehat yang relevan saat membuat payload data. Jangan mencoba mengirimkan data dengan struktur FHIR versi lain (misalnya R3 atau R5) karena akan ditolak oleh API. Proses autentikasi melibatkan dua langkah utama: pertama, mendapatkan access_token dari endpoint OAuth2 SatuSehat, dan kedua, menggunakan token tersebut sebagai header otorisasi (Bearer token) pada setiap permintaan ke endpoint FHIR. Token ini memiliki masa berlaku tertentu, biasanya 1 jam, sehingga Anda perlu mengimplementasikan mekanisme untuk memperbarui token secara otomatis atau menyimpannya dalam cache.

Strategi pemetaan data dari skema SIMRS/SIM Klinik yang ada ke struktur FHIR R4 adalah langkah krusial. Identifikasi entitas-entitas kunci dalam sistem Anda (Pasien, Kunjungan, Dokter, Obat, Diagnosis) dan petakan ke sumber daya FHIR yang sesuai. Misalnya, tabel pasien di SIMRS Anda mungkin memiliki kolom nama, tanggal_lahir, jenis_kelamin, dan alamat. Ini perlu dipetakan ke elemen name, birthDate, gender, dan address pada sumber daya FHIR Patient. Perhatikan penggunaan sistem kode (code systems) seperti SNOMED CT, LOINC, atau ICD-10/ICD-9-CM yang seringkali wajib dalam elemen-elemen FHIR tertentu. Pastikan data Anda bersih dan sesuai standar sebelum dikirimkan. Proses ini mungkin memerlukan sedikit transformasi data atau penambahan kolom di database Anda untuk menyimpan ID FHIR yang diterima dari SatuSehat.

Implementasi Kode Pengiriman Data FHIR dengan PHP Laravel

Bagian ini akan menyajikan contoh kode PHP menggunakan framework Laravel dan Guzzle HTTP Client untuk berinteraksi dengan API SatuSehat. Pertama, kita akan membuat fungsi untuk mendapatkan access_token, yang merupakan langkah awal autentikasi.

<?phpnamespace AppHttpServices;use GuzzleHttpClient;use GuzzleHttpExceptionRequestException;class SatuSehatService{    protected $clientId;    protected $clientSecret;    protected $baseUrl;    protected $oauthUrl;    public function __construct()    {        $this->clientId = env('SATUSEHAT_CLIENT_ID');        $this->clientSecret = env('SATUSEHAT_CLIENT_SECRET');        $this->baseUrl = env('SATUSEHAT_BASE_URL', 'https://api-satusehat-dev.kemenkes.go.id/fhir-r4/v1');        $this->oauthUrl = env('SATUSEHAT_OAUTH_URL', 'https://api-satusehat-dev.kemenkes.go.id/oauth2/v1/accesstoken');    }    public function getAccessToken(): ?string    {        $client = new HttpClient();        try {            $response = $client->post($this->oauthUrl, [                'form_params' => [                    'client_id' => $this->clientId,                    'client_secret' => $this->clientSecret,                    'grant_type' => 'client_credentials'                ],                'headers' => [                    'Content-Type' => 'application/x-www-form-urlencoded'                ]            ]);            $body = json_decode($response->getBody()->getContents(), true);            return $body['access_token'] ?? null;        } catch (RequestException $e) {            // Log error or throw custom exception            logger()->error('Failed to get SatuSehat access token: ' . $e->getMessage());            return null;        }    }}

Kode di atas mendefinisikan sebuah service SatuSehatService yang menginisialisasi kredensial dari environment variables (.env file). Fungsi getAccessToken mengirimkan permintaan POST ke endpoint OAuth2 SatuSehat dengan client_id, client_secret, dan grant_type='client_credentials'. Jika berhasil, ia mengembalikan access_token. Penting untuk menyimpan token ini (misalnya di cache Redis atau database) bersama dengan waktu kedaluwarsanya untuk menghindari permintaan token berulang kali.

Selanjutnya, kita akan menggunakan token ini untuk mengirimkan sumber daya FHIR, misalnya Patient. Contoh ini menunjukkan bagaimana Anda dapat membuat payload JSON untuk sumber daya Patient dan mengirimkannya ke API SatuSehat.

<?phpnamespace AppHttpServices;use GuzzleHttpClient;use GuzzleHttpExceptionRequestException;class SatuSehatService{    // ... (previous code for __construct and getAccessToken) ...    public function sendPatientResource(array $patientData): ?array    {        $accessToken = $this->getAccessToken();        if (!$accessToken) {            return ['error' => 'Could not get access token.'];        }        $client = new HttpClient();        try {            $response = $client->post($this->baseUrl . '/Patient', [                'headers' => [                    'Authorization' => 'Bearer ' . $accessToken,                    'Content-Type' => 'application/fhir+json'                ],                'json' => $patientData // FHIR Patient resource payload                // Example $patientData structure:                // [                //     'resourceType' => 'Patient',                //     'meta' => ['profile' => ['http://hl7.org/fhir/StructureDefinition/Patient']],                //     'identifier' => [                    //         [                    //             'system' => 'http://sys-ids.kemkes.go.id/nik',                    //             'value' => '3276011234567890'                    //         ]                //     ],                //     'name' => [                    //         [                    //             'use' => 'official',                    //             'text' => 'Budi Santoso'                    //         ]                //     ],                //     'gender' => 'male',                //     'birthDate' => '1990-01-15',                //     'address' => [                    //         [                    //             'use' => 'home',                    //             'line' => ['Jl. Contoh No. 1'],                    //             'city' => 'Jakarta',                    //             'postalCode' => '12345',                    //             'country' => 'ID'                    //         ]                //     ]                // ]            ]);            return json_decode($response->getBody()->getContents(), true);        } catch (RequestException $e) {            $responseBody = $e->hasResponse() ? $e->getResponse()->getBody()->getContents() : $e->getMessage();            logger()->error('Failed to send Patient resource to SatuSehat: ' . $responseBody);            return ['error' => 'Failed to send data', 'details' => json_decode($responseBody, true)];        }    }}

Fungsi sendPatientResource mengambil data pasien dalam bentuk array (yang akan di-encode menjadi JSON) dan mengirimkannya ke endpoint /Patient. Penting untuk mengatur header Authorization dengan Bearer token yang valid dan Content-Type menjadi application/fhir+json. Setiap respons dari SatuSehat, baik sukses maupun gagal, akan di-log untuk memudahkan debugging. Struktur payload $patientData harus mengikuti spesifikasi FHIR R4 dan profil SatuSehat yang ditetapkan. Misalnya, penggunaan meta.profile mengindikasikan profil FHIR yang digunakan, dan identifier.system menggunakan URI standar Kemenkes untuk jenis identifikasi seperti NIK. Implementasi yang cermat pada tahap ini akan sangat menentukan keberhasilan integrasi.

Contoh Payload Data FHIR Realistis dan Penanganan Error

Memahami struktur payload yang benar adalah kunci keberhasilan integrasi SatuSehat. Berikut adalah contoh payload JSON untuk sumber daya FHIR Encounter (Kunjungan) yang realistis, lengkap dengan referensi ke sumber daya lain seperti Patient dan Location. Payload ini mencerminkan struktur yang diharapkan oleh SatuSehat berdasarkan profil FHIR R4.

{  
Terakhir diperbarui 12 May 2026

Komentar

Komentar ditinjau sebelum tampil.

Belum ada komentar. Jadilah yang pertama!