Skip to content

API reference

Webhooks

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

OpenAPI 3.1 · version 1.1.0 · 127 operations · 30 webhook events

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

Endpoint descriptions come from the OpenAPI specification and are written in Indonesian.

Daftar langganan webhook organisasi

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

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Code examples

Code example language
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()

Responses

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
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
itemsrequiredarray<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
Errors
  • 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.

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Request body application/json

Request body POST /webhooks
NameTypeDescription
urlrequiredstring (uri)
eventsrequiredarray<string (31 nilai)>
descriptionstring | null
{
  "url": "https://his.contoh.test/medivana/webhook",
  "events": [
    "patient.created",
    "encounter.closed",
    "invoice.paid"
  ],
  "description": "Sinkron HIS"
}

Code examples

Code example language
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()

Responses

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"
}
Schema 201
Schema 201
NameTypeDescription
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
secretrequiredstring
Errors
  • 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

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Code examples

Code example language
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()

Responses

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))>"
}
Schema 200
Schema 200
NameTypeDescription
itemsarray<string (31 nilai)>
signature_header"X-Medivana-Signature"
signature_formatstring
Errors
  • 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.

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Parameters

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

Request body application/json

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

Code examples

Code example language
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()

Responses

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
}
Schema 200
Schema 200
NameTypeDescription
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
Errors
  • 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.

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Parameters

Parameters DELETE /webhooks/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Code examples

Code example language
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()

Responses

204Dihapus

Errors
  • 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-secretLink to this operation: 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.

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Parameters

Parameters POST /webhooks/{id}/rotate-secret
NameInTypeDescription
idrequiredpathstring (uuid)

Code examples

Code example language
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()

Responses

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"
}
Schema 200
Schema 200
NameTypeDescription
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
secretrequiredstring
Errors
  • 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).

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Parameters

Parameters POST /webhooks/{id}/test
NameInTypeDescription
idrequiredpathstring (uuid)

Code examples

Code example language
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()

Responses

202Diantrekanapplication/json

{
  "status": "queued"
}
Schema 202
Schema 202
NameTypeDescription
status"queued"
Errors
  • 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).

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Parameters

Parameters GET /webhooks/{id}/deliveries
NameInTypeDescription
idrequiredpathstring (uuid)
statusquerypending | delivered | failed | dead
limitqueryinteger
cursorquerystringNilai next_cursor dari halaman sebelumnya

Code examples

Code example language
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()

Responses

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"
        }
      }
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
itemsrequiredarray<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.idrequiredstring (uuid)ID event (= header X-Medivana-Event-ID); pakai untuk deduplikasi
items[].payload.typerequiredstring (31 nilai)
items[].payload.created_atrequiredstring (date-time)Waktu event (UTC)
items[].payload.org_idrequiredstring (uuid)
items[].payload.branch_idstring (uuid)Tidak ada untuk event tingkat organisasi
items[].payload.datarequiredobjectid entitas + kunci data event. Ambil detail lengkap lewat API dengan token.
next_cursorstring
Errors
  • 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}/redeliverLink to this operation: 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.

Scopes
webhooks:manage
RBAC permissions
api_client.manage · webhook.manage
Module
api

Parameters

Parameters POST /webhooks/deliveries/{id}/redeliver
NameInTypeDescription
idrequiredpathstring (uuid)

Code examples

Code example language
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()

Responses

202Diantrekanapplication/json

{
  "status": "queued"
}
Schema 202
Schema 202
NameTypeDescription
status"queued"
Errors
  • 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

Webhook event catalog

Every event payload contains id, type, created_at, org_id, branch_id (when present), and data. Fetch full details through the API using data.id.

Uji koneksi

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

Data fields

Data fields ping
NameTypeDescription
idrequiredstringID 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.

Data fields

Data fields patient.created
NameTypeDescription
idrequiredstringpatient_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.

Data fields

Data fields patient.updated
NameTypeDescription
idrequiredstringpatient_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).

Data fields

Data fields patient.merged
NameTypeDescription
idrequiredstringpatient_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.

Data fields

Data fields encounter.started
NameTypeDescription
idrequiredstringencounter_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.

Data fields

Data fields encounter.closed
NameTypeDescription
idrequiredstringencounter_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.

Data fields

Data fields encounter.cancelled
NameTypeDescription
idrequiredstringencounter_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.

Data fields

Data fields allergy.recorded
NameTypeDescription
idrequiredstringallergy_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.

Data fields

Data fields queue.called
NameTypeDescription
idrequiredstringqueue_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.

Data fields

Data fields prescription.created
NameTypeDescription
idrequiredstringprescription_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.

Data fields

Data fields dispense.completed
NameTypeDescription
idrequiredstringdispense_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.

Data fields

Data fields dispense.returned
NameTypeDescription
idrequiredstringdispense_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.

Data fields

Data fields lab.order_created
NameTypeDescription
idrequiredstringorder_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.

Data fields

Data fields radiology.order_created
NameTypeDescription
idrequiredstringorder_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.

Data fields

Data fields lab.result_final
NameTypeDescription
idrequiredstringorder_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.

Data fields

Data fields radiology.result_final
NameTypeDescription
idrequiredstringorder_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.

Data fields

Data fields immunization.recorded
NameTypeDescription
idrequiredstringimmunization_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.

Data fields

Data fields appointment.booked
NameTypeDescription
idrequiredstringappointment_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.

Data fields

Data fields appointment.cancelled
NameTypeDescription
idrequiredstringappointment_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.

Data fields

Data fields appointment.checked_in
NameTypeDescription
idrequiredstringappointment_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.

Data fields

Data fields invoice.finalized
NameTypeDescription
idrequiredstringinvoice_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.

Data fields

Data fields invoice.paid
NameTypeDescription
idrequiredstringinvoice_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.

Data fields

Data fields invoice.voided
NameTypeDescription
idrequiredstringinvoice_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.

Data fields

Data fields payment.received
NameTypeDescription
idrequiredstringpayment_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.

Data fields

Data fields claim.submitted
NameTypeDescription
idrequiredstringclaim_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.

Data fields

Data fields claim.paid
NameTypeDescription
idrequiredstringclaim_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.

Data fields

Data fields claim.rejected
NameTypeDescription
idrequiredstringclaim_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.

Data fields

Data fields stock.below_minimum
NameTypeDescription
idrequiredstringitem_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.

Data fields

Data fields subscription.activated
NameTypeDescription
idrequiredstringsubscription_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.

Data fields

Data fields subscription.changed
NameTypeDescription
idrequiredstringsubscription_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"
  }
}