Lewati ke isi

Referensi API

Webhook

Langganan event domain dan riwayat pengiriman (modul api). Langganan berlaku untuk seluruh organisasi.

OpenAPI 3.1 · versi 1.1.0 · 127 operasi · 30 event webhook

Basis URLhttps://api.medivana.cloud/api/v1

Daftar langganan webhook organisasi

Semua langganan organisasi (termasuk yang dibuat admin di aplikasi atau klien API lain). secret tidak pernah dikembalikan di sini.

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/webhooks" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
import os
import requests

resp = requests.get(
    "https://api.medivana.cloud/api/v1/webhooks",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Langganan (terbaru dulu)application/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001d001",
      "url": "https://his.contoh.test/medivana/webhook",
      "events": [
        "patient.created",
        "encounter.closed",
        "invoice.paid"
      ],
      "description": "Sinkron HIS",
      "is_active": true,
      "failure_count": 0,
      "disabled_reason": null,
      "created_at": "2026-10-29T08:00:00+07:00",
      "version": 1
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].urlstring (uri)
items[].eventsarray<string (31 nilai)>
items[].descriptionstring | null
items[].is_activeboolean
items[].failure_countintegerKegagalan beruntun; direset setelah pengiriman sukses
items[].disabled_reasonstring | null
items[].created_atstring (date-time)
items[].versioninteger
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Buat langganan webhook

url wajib https dan tidak boleh mengarah ke jaringan internal/privat. events berisi nama event dari GET /webhooks/events atau "*" untuk semua event. secret (whsec_…) hanya dikembalikan sekali di respons ini; simpan di brankas rahasia untuk memverifikasi X-Medivana-Signature.

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Body permintaan application/json

Body permintaan POST /webhooks
NamaTipeKeterangan
urlwajibstring (uri)
eventswajibarray<string (31 nilai)>
descriptionstring | null
{
  "url": "https://his.contoh.test/medivana/webhook",
  "events": [
    "patient.created",
    "encounter.closed",
    "invoice.paid"
  ],
  "description": "Sinkron HIS"
}

Contoh kode

Bahasa contoh kode
curl -X POST "https://api.medivana.cloud/api/v1/webhooks" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://his.contoh.test/medivana/webhook","events":["patient.created","encounter.closed","invoice.paid"],"description":"Sinkron HIS"}'
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    url: "https://his.contoh.test/medivana/webhook",
    events: [
      "patient.created",
      "encounter.closed",
      "invoice.paid",
    ],
    description: "Sinkron HIS",
  }),
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
import os
import requests

resp = requests.post(
    "https://api.medivana.cloud/api/v1/webhooks",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    json={
        "url": "https://his.contoh.test/medivana/webhook",
        "events": [
            "patient.created",
            "encounter.closed",
            "invoice.paid",
        ],
        "description": "Sinkron HIS",
    },
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

201Langganan dibuat (dengan secret sekali tampil)application/json

{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001d001",
  "url": "https://his.contoh.test/medivana/webhook",
  "events": [
    "patient.created",
    "encounter.closed",
    "invoice.paid"
  ],
  "description": "Sinkron HIS",
  "is_active": true,
  "failure_count": 0,
  "disabled_reason": null,
  "created_at": "2026-10-29T08:00:00+07:00",
  "version": 1,
  "secret": "whsec_contohRahasiaJanganDipakai"
}
Skema 201
Skema 201
NamaTipeKeterangan
idstring (uuid)
urlstring (uri)
eventsarray<string (31 nilai)>
descriptionstring | null
is_activeboolean
failure_countintegerKegagalan beruntun; direset setelah pengiriman sukses
disabled_reasonstring | null
created_atstring (date-time)
versioninteger
secretwajibstring
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 422validationValidasi gagal; rincian per field di errors
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Katalog event dan format tanda tangan

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/webhooks/events" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks/events", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
import os
import requests

resp = requests.get(
    "https://api.medivana.cloud/api/v1/webhooks/events",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Katalogapplication/json

{
  "items": [
    "patient.created",
    "patient.updated",
    "encounter.closed"
  ],
  "signature_header": "X-Medivana-Signature",
  "signature_format": "t=<unix>,v1=<hex(HMAC-SHA256(secret, t + \".\" + body))>"
}
Skema 200
Skema 200
NamaTipeKeterangan
itemsarray<string (31 nilai)>
signature_header"X-Medivana-Signature"
signature_formatstring
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Ubah langganan webhook

is_active: true mengaktifkan kembali langganan yang dinonaktifkan (mis. setelah 410 Gone) dan mereset hitungan kegagalan.

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Parameter

Parameter PATCH /webhooks/{id}
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)
If-MatchheaderstringVersi dari ETag (mis. "3"). Bila tidak cocok → 412 stale.

Body permintaan application/json

Body permintaan PATCH /webhooks/{id}
NamaTipeKeterangan
urlstring (uri)
eventsarray<string (31 nilai)>
descriptionstring | null
is_activeboolean
{
  "events": [
    "*"
  ],
  "is_active": true
}

Contoh kode

Bahasa contoh kode
curl -X PATCH "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"events":["*"],"is_active":true}'
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001", {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    events: [
      "*",
    ],
    is_active: true,
  }),
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
import os
import requests

resp = requests.patch(
    "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    json={
        "events": [
            "*",
        ],
        "is_active": True,
    },
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Langgananapplication/json

{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "url": "https://contoh.test/webhook",
  "events": [
    "*"
  ],
  "description": "string",
  "is_active": true,
  "failure_count": 0,
  "disabled_reason": "string",
  "created_at": "2026-11-02T08:00:00+07:00",
  "version": 0
}
Skema 200
Skema 200
NamaTipeKeterangan
idstring (uuid)
urlstring (uri)
eventsarray<string (31 nilai)>
descriptionstring | null
is_activeboolean
failure_countintegerKegagalan beruntun; direset setelah pengiriman sukses
disabled_reasonstring | null
created_atstring (date-time)
versioninteger
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 404not-foundData tidak ada, milik organisasi lain, atau di luar cakupan cabang klien
  • 412staleIf-Match tidak cocok dengan versi terbaru
  • 422validationValidasi gagal; rincian per field di errors
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Hapus langganan webhook

Pengiriman yang masih antre untuk langganan ini dilewati.

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Parameter

Parameter DELETE /webhooks/{id}
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)

Contoh kode

Bahasa contoh kode
curl -X DELETE "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001", {
  method: "DELETE",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
import os
import requests

resp = requests.delete(
    "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()

Respons

204Dihapus

Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 404not-foundData tidak ada, milik organisasi lain, atau di luar cakupan cabang klien
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya
POST/webhooks/{id}/rotate-secretTautan ke operasi ini: Rotasi secret HMAC

Rotasi secret HMAC

Secret lama langsung tidak berlaku; pengiriman berikutnya ditandatangani secret baru. Perbarui verifikasi di penerima sebelum atau segera setelah rotasi.

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Parameter

Parameter POST /webhooks/{id}/rotate-secret
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)

Contoh kode

Bahasa contoh kode
curl -X POST "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/rotate-secret" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/rotate-secret", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
import os
import requests

resp = requests.post(
    "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/rotate-secret",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Langganan dengan secret baru (sekali tampil)application/json

{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "url": "https://contoh.test/webhook",
  "events": [
    "*"
  ],
  "description": "string",
  "is_active": true,
  "failure_count": 0,
  "disabled_reason": "string",
  "created_at": "2026-11-02T08:00:00+07:00",
  "version": 0,
  "secret": "string"
}
Skema 200
Skema 200
NamaTipeKeterangan
idstring (uuid)
urlstring (uri)
eventsarray<string (31 nilai)>
descriptionstring | null
is_activeboolean
failure_countintegerKegagalan beruntun; direset setelah pengiriman sukses
disabled_reasonstring | null
created_atstring (date-time)
versioninteger
secretwajibstring
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 404not-foundData tidak ada, milik organisasi lain, atau di luar cakupan cabang klien
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Kirim event uji ping

Mengantrekan event ping ke URL langganan (lihat riwayat pengiriman untuk hasilnya).

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Parameter

Parameter POST /webhooks/{id}/test
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)

Contoh kode

Bahasa contoh kode
curl -X POST "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/test" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/test", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
import os
import requests

resp = requests.post(
    "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/test",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

202Diantrekanapplication/json

{
  "status": "queued"
}
Skema 202
Skema 202
NamaTipeKeterangan
status"queued"
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 404not-foundData tidak ada, milik organisasi lain, atau di luar cakupan cabang klien
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Riwayat pengiriman webhook

Terbaru dulu. pending (antre), delivered (2xx), failed (akan dicoba ulang), dead (percobaan habis atau 410).

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Parameter

Parameter GET /webhooks/{id}/deliveries
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)
statusquerypending | delivered | failed | dead
limitqueryinteger
cursorquerystringNilai next_cursor dari halaman sebelumnya

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/deliveries" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/deliveries", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
import os
import requests

resp = requests.get(
    "https://api.medivana.cloud/api/v1/webhooks/3f0c2a10-5b7e-4c1d-9a2e-000000000001/deliveries",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Pengirimanapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001d101",
      "subscription_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001d001",
      "event": "patient.created",
      "event_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
      "entity_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
      "status": "delivered",
      "attempts": 1,
      "last_status_code": 200,
      "last_error": null,
      "delivered_at": "2026-10-29T08:15:03+07:00",
      "created_at": "2026-10-29T08:15:02+07:00",
      "payload": {
        "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
        "type": "patient.created",
        "created_at": "2026-10-29T01:15:02Z",
        "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
        "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
        "data": {
          "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
          "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1"
        }
      }
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].subscription_idstring (uuid)
items[].eventstring (31 nilai)
items[].event_idstring (uuid)
items[].entity_idstring | null
items[].statuspending | delivered | failed | dead
items[].attemptsinteger
items[].last_status_codeinteger | null
items[].last_errorstring | null
items[].delivered_atstring (date-time) | null
items[].created_atstring (date-time)
items[].payloadobject
items[].payload.idwajibstring (uuid)ID event (= header X-Medivana-Event-ID); pakai untuk deduplikasi
items[].payload.typewajibstring (31 nilai)
items[].payload.created_atwajibstring (date-time)Waktu event (UTC)
items[].payload.org_idwajibstring (uuid)
items[].payload.branch_idstring (uuid)Tidak ada untuk event tingkat organisasi
items[].payload.datawajibobjectid entitas + kunci data event. Ambil detail lengkap lewat API dengan token.
next_cursorstring
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 404not-foundData tidak ada, milik organisasi lain, atau di luar cakupan cabang klien
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya
POST/webhooks/deliveries/{id}/redeliverTautan ke operasi ini: Kirim ulang satu pengiriman

Kirim ulang satu pengiriman

Payload dan X-Medivana-Event-ID sama dengan pengiriman asli (deduplikasi di penerima tetap berlaku); tanda tangan dihitung ulang dengan waktu dan secret saat ini.

Scope
webhooks:manage
Izin RBAC
api_client.manage · webhook.manage
Modul
api

Parameter

Parameter POST /webhooks/deliveries/{id}/redeliver
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)

Contoh kode

Bahasa contoh kode
curl -X POST "https://api.medivana.cloud/api/v1/webhooks/deliveries/3f0c2a10-5b7e-4c1d-9a2e-000000000001/redeliver" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/webhooks/deliveries/3f0c2a10-5b7e-4c1d-9a2e-000000000001/redeliver", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.MEDIVANA_TOKEN}`,
  },
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
import os
import requests

resp = requests.post(
    "https://api.medivana.cloud/api/v1/webhooks/deliveries/3f0c2a10-5b7e-4c1d-9a2e-000000000001/redeliver",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

202Diantrekanapplication/json

{
  "status": "queued"
}
Skema 202
Skema 202
NamaTipeKeterangan
status"queued"
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 402module-lockedModul tidak aktif di paket organisasi
  • 403forbiddenScope token tidak memberi izin (forbidden), atau langganan klinik baca-saja untuk operasi tulis (read-only)
  • 404not-foundData tidak ada, milik organisasi lain, atau di luar cakupan cabang klien
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Katalog event webhook

Payload setiap event berisi id, type, created_at, org_id, branch_id (bila ada), dan data. Ambil detail lengkap lewat API memakai data.id.

Uji koneksi

Dikirim oleh POST /webhooks/{id}/test. Data entitas: data.id = ID langganan (subscription_id).

Isi data

Isi data ping
NamaTipeKeterangan
idwajibstringID langganan (subscription_id)
messagestring
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "ping",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001d001",
    "message": "Tes webhook Medivana"
  }
}

Pasien baru terdaftar

Setelah POST /patients atau pendaftaran di aplikasi. Data entitas: data.id = patient_id.

Isi data

Isi data patient.created
NamaTipeKeterangan
idwajibstringpatient_id
branch_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "patient.created",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1"
  }
}

Data pasien berubah

Identitas atau kontak pasien diubah. Data entitas: data.id = patient_id.

Isi data

Isi data patient.updated
NamaTipeKeterangan
idwajibstringpatient_id
branch_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "patient.updated",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1"
  }
}

Pasien ganda digabung

data.id = pasien yang dipertahankan; merged_from = pasien sumber yang kini nonaktif (merged_into). Pindahkan referensi di sistem Anda. Data entitas: data.id = patient_id (tujuan).

Isi data

Isi data patient.merged
NamaTipeKeterangan
idwajibstringpatient_id (tujuan)
merged_fromstring (uuid)
branch_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "patient.merged",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "merged_from": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0002",
    "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1"
  }
}

Kunjungan terdaftar

Saat pendaftaran kunjungan (termasuk check-in booking). appointment_id bernilai UUID nol bila bukan dari booking. Data entitas: data.id = encounter_id.

Isi data

Isi data encounter.started
NamaTipeKeterangan
idwajibstringencounter_id
patient_idstring (uuid)
unit_idstring (uuid)
practitioner_idstring (uuid) | null
payer_idstring (uuid)
payer_kindstring
appointment_idstring (uuid) | null
queue_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "encounter.started",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "unit_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000c0001",
    "practitioner_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d0001",
    "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0001",
    "payer_kind": "umum",
    "appointment_id": null,
    "queue_id": "3f0c2a10-5b7e-4c1d-9a2e-000000005001"
  }
}

Kunjungan ditutup dan ditandatangani

Rekam medis kunjungan final (tanda tangan elektronik). Ambil isi lengkap lewat GET /encounters/{id}. Data entitas: data.id = encounter_id.

Isi data

Isi data encounter.closed
NamaTipeKeterangan
idwajibstringencounter_id
patient_idstring (uuid)
practitioner_idstring (uuid) | null
payer_idstring (uuid)
payer_kindstring
unit_idstring (uuid)
appointment_idstring (uuid)
signature_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "encounter.closed",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "practitioner_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d0001",
    "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0001",
    "payer_kind": "umum",
    "unit_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000c0001",
    "appointment_id": "00000000-0000-0000-0000-000000000000",
    "signature_id": "3f0c2a10-5b7e-4c1d-9a2e-000000006301"
  }
}

Kunjungan dibatalkan

Data entitas: data.id = encounter_id.

Isi data

Isi data encounter.cancelled
NamaTipeKeterangan
idwajibstringencounter_id
patient_idstring (uuid)
reasonstring
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "encounter.cancelled",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "reason": "Pasien pulang sebelum diperiksa"
  }
}

Alergi dicatat

Data entitas: data.id = allergy_id.

Isi data

Isi data allergy.recorded
NamaTipeKeterangan
idwajibstringallergy_id
patient_idstring (uuid)
encounter_idstring (uuid)
categoryobat | makanan | lingkungan
severityringan | sedang | berat
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "allergy.recorded",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a8001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "category": "obat",
    "severity": "berat"
  }
}

Nomor antrean dipanggil

Termasuk panggil ulang (call_count bertambah). Data entitas: data.id = queue_id.

Isi data

Isi data queue.called
NamaTipeKeterangan
idwajibstringqueue_id
patient_idstring (uuid)
unit_idstring (uuid)
numberinteger
labelstring
encounter_idstring (uuid)
call_countinteger
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "queue.called",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000005001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "unit_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000c0001",
    "number": 3,
    "label": "U-003",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "call_count": 1
  }
}

Resep dibuat

Modul farmasi. Data entitas: data.id = prescription_id.

Isi data

Isi data prescription.created
NamaTipeKeterangan
idwajibstringprescription_id
patient_idstring (uuid)
encounter_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "prescription.created",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001"
  }
}

Obat diserahkan

Modul farmasi. Data entitas: data.id = dispense_id.

Isi data

Isi data dispense.completed
NamaTipeKeterangan
idwajibstringdispense_id
patient_idstring (uuid)
encounter_idstring (uuid)
prescription_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "dispense.completed",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001101",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "prescription_id": "3f0c2a10-5b7e-4c1d-9a2e-000000001001"
  }
}

Obat diretur

billed_charges = jumlah charge retur yang sudah ditagih (memicu nota kredit). Data entitas: data.id = dispense_id.

Isi data

Isi data dispense.returned
NamaTipeKeterangan
idwajibstringdispense_id
patient_idstring (uuid)
encounter_idstring (uuid)
return_idstring (uuid)
reasonstring
billed_chargesinteger
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "dispense.returned",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001101",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "return_id": "3f0c2a10-5b7e-4c1d-9a2e-000000001201",
    "reason": "Pasien alergi",
    "billed_charges": 0
  }
}

Order laboratorium dibuat

Satu event per pemeriksaan; order sekali kirim berbagi request_id. Data entitas: data.id = order_id.

Isi data

Isi data lab.order_created
NamaTipeKeterangan
idwajibstringorder_id
patient_idstring (uuid)
encounter_idstring (uuid)
service_idstring (uuid)
request_idstring (uuid)
priorityroutine | cito
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "lab.order_created",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001c001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "service_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001f001",
    "request_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001c0a0",
    "priority": "cito"
  }
}

Order radiologi dibuat

Data entitas: data.id = order_id.

Isi data

Isi data radiology.order_created
NamaTipeKeterangan
idwajibstringorder_id
patient_idstring (uuid)
encounter_idstring (uuid)
service_idstring (uuid)
request_idstring (uuid)
priorityroutine | cito
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "radiology.order_created",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001c101",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "service_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001f001",
    "request_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001c0a0",
    "priority": "routine"
  }
}

Hasil laboratorium final

critical: true bila ada nilai kritis. Ambil hasil lewat GET /lab/orders/{id}. Data entitas: data.id = order_id.

Isi data

Isi data lab.result_final
NamaTipeKeterangan
idwajibstringorder_id
patient_idstring (uuid)
encounter_idstring (uuid)
request_idstring (uuid)
service_idstring (uuid)
criticalboolean
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "lab.result_final",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001c001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "request_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001c0a0",
    "service_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001f001",
    "critical": true
  }
}

Ekspertise radiologi final

Ambil ekspertise dan berkas lewat GET /radiology/orders/{id}. Data entitas: data.id = order_id.

Isi data

Isi data radiology.result_final
NamaTipeKeterangan
idwajibstringorder_id
patient_idstring (uuid)
encounter_idstring (uuid)
request_idstring (uuid)
service_idstring (uuid)
criticalboolean
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "radiology.result_final",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001c101",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "request_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001c0a0",
    "service_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001f001",
    "critical": false
  }
}

Imunisasi dicatat

Modul KIA. encounter_id null bila dicatat tanpa kunjungan. Data entitas: data.id = immunization_id.

Isi data

Isi data immunization.recorded
NamaTipeKeterangan
idwajibstringimmunization_id
patient_idstring (uuid)
encounter_idstring (uuid) | null
vaccine_codestring
dose_nointeger
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "immunization.recorded",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000003101",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0003",
    "encounter_id": null,
    "vaccine_code": "DPT-HB-HIB",
    "dose_no": 1
  }
}

Booking dibuat atau dijadwal ulang

rescheduled: true bila berasal dari jadwal ulang. patient_id null untuk pasien baru yang belum terdaftar. Data entitas: data.id = appointment_id.

Isi data

Isi data appointment.booked
NamaTipeKeterangan
idwajibstringappointment_id
patient_idstring (uuid) | null
practitioner_idstring (uuid)
start_atstring (date-time)
unit_idstring (uuid)
sourcestring
codestring
rescheduledboolean
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "appointment.booked",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001a001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "practitioner_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d0001",
    "start_at": "2026-11-02T08:15:00+07:00",
    "unit_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000c0001",
    "source": "admin",
    "code": "BK-7KQ2MZ"
  }
}

Booking dibatalkan

Data entitas: data.id = appointment_id.

Isi data

Isi data appointment.cancelled
NamaTipeKeterangan
idwajibstringappointment_id
patient_idstring (uuid) | null
practitioner_idstring (uuid)
start_atstring (date-time)
reasonstring
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "appointment.cancelled",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001a001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "practitioner_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d0001",
    "start_at": "2026-11-02T08:15:00+07:00",
    "reason": "Pasien berhalangan"
  }
}

Pasien check-in booking

Kunjungan dan antrean dibuat otomatis (lihat encounter.started). Data entitas: data.id = appointment_id.

Isi data

Isi data appointment.checked_in
NamaTipeKeterangan
idwajibstringappointment_id
appointment_idstring (uuid)
patient_idstring (uuid)
practitioner_idstring (uuid)
unit_idstring (uuid)
payer_idstring (uuid) | null
payer_kindstring
branch_idstring (uuid)
start_atstring (date-time)
complaintstring
chief_complaintstring
sourcestring
service_idstring (uuid) | null
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "appointment.checked_in",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001a001",
    "appointment_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001a001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "practitioner_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d0001",
    "unit_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000c0001",
    "payer_id": null,
    "payer_kind": "umum",
    "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
    "start_at": "2026-11-02T08:15:00+07:00",
    "complaint": "Demam 3 hari",
    "chief_complaint": "Demam 3 hari",
    "source": "admin",
    "service_id": null
  }
}

Tagihan final (nomor terbit)

Bila bagian pasien 0, langsung diikuti invoice.paid. Data entitas: data.id = invoice_id.

Isi data

Isi data invoice.finalized
NamaTipeKeterangan
idwajibstringinvoice_id
patient_idstring (uuid)
encounter_idstring (uuid)
payer_idstring (uuid)
totalstringAngka desimal rupiah sebagai string
patient_amountstringAngka desimal rupiah sebagai string
payer_amountstringAngka desimal rupiah sebagai string
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "invoice.finalized",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0001",
    "total": "195000",
    "patient_amount": "195000",
    "payer_amount": "0"
  }
}

Tagihan lunas (bagian pasien)

Data entitas: data.id = invoice_id.

Isi data

Isi data invoice.paid
NamaTipeKeterangan
idwajibstringinvoice_id
patient_idstring (uuid)
encounter_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "invoice.paid",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001"
  }
}

Tagihan dibatalkan (void)

Data entitas: data.id = invoice_id.

Isi data

Isi data invoice.voided
NamaTipeKeterangan
idwajibstringinvoice_id
patient_idstring (uuid)
encounter_idstring (uuid)
reasonstring
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "invoice.voided",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b001",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
    "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
    "reason": "Salah penjamin"
  }
}

Pembayaran diterima

Satu event per pembayaran (pembayaran campuran → beberapa event). Data entitas: data.id = payment_id.

Isi data

Isi data payment.received
NamaTipeKeterangan
idwajibstringpayment_id
invoice_idstring (uuid)
amountstringAngka desimal rupiah sebagai string
methodcash | debit | credit | qris | transfer | deposit
patient_idstring (uuid)
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "payment.received",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b101",
    "invoice_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b001",
    "amount": "195000",
    "method": "qris",
    "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001"
  }
}

Klaim penjamin diajukan

Modul klaim. kind = jenis klaim. Data entitas: data.id = claim_id.

Isi data

Isi data claim.submitted
NamaTipeKeterangan
idwajibstringclaim_id
payer_idstring (uuid)
amountstringAngka desimal rupiah sebagai string
kindstring
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "claim.submitted",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001301",
    "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0003",
    "amount": "1250000",
    "kind": "insurance"
  }
}

Klaim dibayar penjamin

amount = nominal pembayaran yang dicatat. Data entitas: data.id = claim_id.

Isi data

Isi data claim.paid
NamaTipeKeterangan
idwajibstringclaim_id
payer_idstring (uuid)
amountstringAngka desimal rupiah sebagai string
kindstring
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "claim.paid",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001301",
    "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0003",
    "amount": "1200000",
    "kind": "insurance"
  }
}

Klaim ditolak penjamin

Data entitas: data.id = claim_id.

Isi data

Isi data claim.rejected
NamaTipeKeterangan
idwajibstringclaim_id
payer_idstring (uuid)
amountstringAngka desimal rupiah sebagai string
kindstring
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "claim.rejected",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001301",
    "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0003",
    "amount": "1250000",
    "kind": "insurance"
  }
}

Stok di bawah minimum

Maksimal sekali per barang per gudang per hari. data.id = ID barang. Data entitas: data.id = item_id.

Isi data

Isi data stock.below_minimum
NamaTipeKeterangan
idwajibstringitem_id
warehouse_idstring (uuid)
on_handstringAngka desimal rupiah sebagai string
min_stockstringAngka desimal rupiah sebagai string
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "stock.below_minimum",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001401",
    "warehouse_id": "3f0c2a10-5b7e-4c1d-9a2e-000000001501",
    "on_hand": "8",
    "min_stock": "20"
  }
}

Langganan Medivana aktif

Paket organisasi aktif (tanpa branch_id). Data entitas: data.id = subscription_id.

Isi data

Isi data subscription.activated
NamaTipeKeterangan
idwajibstringsubscription_id
planstring
billing_cyclestring
branchesinteger
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "subscription.activated",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001601",
    "plan": "klinik_pro",
    "billing_cycle": "annual",
    "branches": 3
  }
}

Paket langganan berubah

Upgrade/downgrade paket (tanpa branch_id). Data entitas: data.id = subscription_id.

Isi data

Isi data subscription.changed
NamaTipeKeterangan
idwajibstringsubscription_id
planstring
previous_planstring
billing_cyclestring
{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001e001",
  "type": "subscription.changed",
  "created_at": "2026-10-29T01:15:02Z",
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "data": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000001601",
    "plan": "enterprise",
    "previous_plan": "klinik_pro",
    "billing_cycle": "annual"
  }
}