Lewati ke isi

Referensi API

Tagihan

Tagihan, pembayaran, deposit, paket, dan master tarif kasir; hanya baca (modul cashier).

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

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

Daftar tagihan pasien

Cabang aktif, terbaru dulu. Status: draft → finalized → partially_paid → paid, atau void. Item daftar tanpa lines, discounts, payments.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/invoices
NamaLokasiTipeKeterangan
X-Branch-IDheaderstring (uuid)Cabang aktif (opsional). Nilai di luar cabang klien diabaikan.
patient_idquerystring (uuid)
encounter_idquerystring (uuid)
payer_idquerystring (uuid)
statusquerystringDipisah koma
fromquerystring (date)
toquerystring (date)
limitqueryinteger
cursorquerystringNilai next_cursor dari halaman sebelumnya

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/invoices" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/invoices", {
  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/billing/invoices",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Tagihanapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b001",
      "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
      "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
      "patient_name": "Pasien Contoh",
      "patient_mrn": "RM-000123",
      "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
      "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0001",
      "payer_name": "Pasien Umum",
      "payer_kind": "umum",
      "number": "INV-202610-00042",
      "status": "paid",
      "subtotal": 195000,
      "discount": 0,
      "total": 195000,
      "patient_amount": 195000,
      "payer_amount": 0,
      "paid_amount": 195000,
      "outstanding": 0,
      "payer_outstanding": 0,
      "finalized_at": "2026-10-29T11:02:00+07:00",
      "paid_at": "2026-10-29T11:03:10+07:00",
      "created_at": "2026-10-29T10:58:00+07:00",
      "version": 3
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].branch_idstring (uuid)
items[].patient_idstring (uuid)
items[].patient_namestring
items[].patient_mrnstring
items[].encounter_idstring (uuid) | null
items[].payer_idstring (uuid)
items[].payer_namestring
items[].payer_kindumum | bpjs | insurance | company
items[].numberstring | null
items[].statusdraft | finalized | partially_paid | paid | void
items[].subtotalnumber
items[].discountnumber
items[].totalnumber
items[].patient_amountnumber
items[].payer_amountnumber
items[].package_amountnumber
items[].paid_amountnumber
items[].credit_patient_amountnumber
items[].credit_payer_amountnumber
items[].payer_paid_amountnumber
items[].payer_adjusted_amountnumber
items[].outstandingnumber
items[].payer_outstandingnumber
items[].notesstring | null
items[].finalized_atstring (date-time) | null
items[].paid_atstring (date-time) | null
items[].voided_atstring (date-time) | null
items[].void_reasonstring | null
items[].created_atstring (date-time)
items[].versioninteger
items[].linesarray<object>
items[].lines[].idstring (uuid)
items[].lines[].line_nointeger
items[].lines[].charge_idstring (uuid) | null
items[].lines[].service_idstring (uuid) | null
items[].lines[].item_idstring (uuid) | null
items[].lines[].practitioner_idstring (uuid) | null
items[].lines[].revenue_keystring
items[].lines[].categorystring
items[].lines[].descriptionstring
items[].lines[].quantitynumber
items[].lines[].unit_pricenumber
items[].lines[].grossnumber
items[].lines[].discountnumber
items[].lines[].totalnumber
items[].lines[].payer_sharenumber
items[].lines[].patient_sharenumber
items[].lines[].coveragepayer | excluded | none | package
items[].discountsarray<object>
items[].paymentsarray<object>
items[].payments[].idstring (uuid)
items[].payments[].branch_idstring (uuid)
items[].payments[].invoice_idstring (uuid)
items[].payments[].patient_idstring (uuid)
items[].payments[].numberstring
items[].payments[].methodcash | debit | credit | qris | transfer | deposit
items[].payments[].amountnumber
items[].payments[].tenderednumber | null
items[].payments[].change_amountnumber
items[].payments[].referencestring | null
items[].payments[].statuspending | completed | refunded | expired | failed
items[].payments[].paid_atstring (date-time) | null
items[].payments[].cash_session_idstring (uuid) | null
items[].payments[].gateway_providerstring | null
items[].payments[].external_idstring | null
items[].payments[].settlement_idstring (uuid) | null
items[].payments[].refunded_atstring (date-time) | null
items[].payments[].refund_reasonstring | null
items[].payments[].created_atstring (date-time)
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)
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Detail tagihan dengan baris, diskon, dan pembayaran

outstanding = sisa bagian pasien; payer_outstanding = sisa piutang penjamin. coverage baris: payer, excluded, none, package.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/invoices/{id}
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/invoices/3f0c2a10-5b7e-4c1d-9a2e-000000000001" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/invoices/3f0c2a10-5b7e-4c1d-9a2e-000000000001", {
  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/billing/invoices/3f0c2a10-5b7e-4c1d-9a2e-000000000001",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Tagihanapplication/json

{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
  "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
  "patient_name": "Pasien Contoh",
  "patient_mrn": "RM-000123",
  "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
  "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0001",
  "payer_name": "Pasien Umum",
  "payer_kind": "umum",
  "number": "INV-202610-00042",
  "status": "paid",
  "subtotal": 195000,
  "discount": 0,
  "total": 195000,
  "patient_amount": 195000,
  "payer_amount": 0,
  "package_amount": 0,
  "paid_amount": 195000,
  "outstanding": 0,
  "payer_outstanding": 0,
  "finalized_at": "2026-10-29T11:02:00+07:00",
  "paid_at": "2026-10-29T11:03:10+07:00",
  "created_at": "2026-10-29T10:58:00+07:00",
  "version": 3,
  "lines": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b011",
      "line_no": 1,
      "charge_id": "3f0c2a10-5b7e-4c1d-9a2e-000000009001",
      "service_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001f002",
      "item_id": null,
      "revenue_key": "rev_consultation",
      "category": "konsultasi",
      "description": "Konsultasi dokter umum",
      "quantity": 1,
      "unit_price": 50000,
      "gross": 50000,
      "discount": 0,
      "total": 50000,
      "payer_share": 0,
      "patient_share": 50000,
      "coverage": "none"
    },
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b012",
      "line_no": 2,
      "charge_id": "3f0c2a10-5b7e-4c1d-9a2e-000000009002",
      "service_id": null,
      "item_id": "3f0c2a10-5b7e-4c1d-9a2e-000000001701",
      "revenue_key": "rev_drug",
      "category": "obat",
      "description": "Amoksisilin 500 mg",
      "quantity": 15,
      "unit_price": 3000,
      "gross": 45000,
      "discount": 0,
      "total": 45000,
      "payer_share": 0,
      "patient_share": 45000,
      "coverage": "none"
    }
  ],
  "discounts": [],
  "payments": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b101",
      "number": "PAY-202610-00003",
      "method": "qris",
      "amount": 195000,
      "status": "completed",
      "paid_at": "2026-10-29T11:03:10+07:00"
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
idstring (uuid)
branch_idstring (uuid)
patient_idstring (uuid)
patient_namestring
patient_mrnstring
encounter_idstring (uuid) | null
payer_idstring (uuid)
payer_namestring
payer_kindumum | bpjs | insurance | company
numberstring | null
statusdraft | finalized | partially_paid | paid | void
subtotalnumber
discountnumber
totalnumber
patient_amountnumber
payer_amountnumber
package_amountnumber
paid_amountnumber
credit_patient_amountnumber
credit_payer_amountnumber
payer_paid_amountnumber
payer_adjusted_amountnumber
outstandingnumber
payer_outstandingnumber
notesstring | null
finalized_atstring (date-time) | null
paid_atstring (date-time) | null
voided_atstring (date-time) | null
void_reasonstring | null
created_atstring (date-time)
versioninteger
linesarray<object>
lines[].idstring (uuid)
lines[].line_nointeger
lines[].charge_idstring (uuid) | null
lines[].service_idstring (uuid) | null
lines[].item_idstring (uuid) | null
lines[].practitioner_idstring (uuid) | null
lines[].revenue_keystring
lines[].categorystring
lines[].descriptionstring
lines[].quantitynumber
lines[].unit_pricenumber
lines[].grossnumber
lines[].discountnumber
lines[].totalnumber
lines[].payer_sharenumber
lines[].patient_sharenumber
lines[].coveragepayer | excluded | none | package
discountsarray<object>
paymentsarray<object>
payments[].idstring (uuid)
payments[].branch_idstring (uuid)
payments[].invoice_idstring (uuid)
payments[].patient_idstring (uuid)
payments[].numberstring
payments[].methodcash | debit | credit | qris | transfer | deposit
payments[].amountnumber
payments[].tenderednumber | null
payments[].change_amountnumber
payments[].referencestring | null
payments[].statuspending | completed | refunded | expired | failed
payments[].paid_atstring (date-time) | null
payments[].cash_session_idstring (uuid) | null
payments[].gateway_providerstring | null
payments[].external_idstring | null
payments[].settlement_idstring (uuid) | null
payments[].refunded_atstring (date-time) | null
payments[].refund_reasonstring | null
payments[].created_atstring (date-time)
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

Kuitansi tagihan (HTML siap cetak)

Thermal 58/80 mm atau A5. Bahasa dari lang, lalu preferensi pasien, lalu default organisasi.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/invoices/{id}/receipt
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)
formatquery58 | 80 | a5
langqueryid | enBahasa dokumen cetak; default bahasa pasien lalu default organisasi.

Contoh kode

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

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

Respons

200Dokumen HTMLtext/html

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

Daftar pembayaran

Status: pending, completed, refunded, expired, failed. unsettled=true = pembayaran non-tunai yang belum cair ke bank.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/payments
NamaLokasiTipeKeterangan
X-Branch-IDheaderstring (uuid)Cabang aktif (opsional). Nilai di luar cabang klien diabaikan.
invoice_idquerystring (uuid)
datequerystring (date)
methodquerystringDipisah koma: cash, debit, credit, qris, transfer, deposit
unsettledqueryboolean

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/payments" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/payments", {
  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/billing/payments",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Pembayaranapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b101",
      "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
      "invoice_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b001",
      "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
      "number": "PAY-202610-00003",
      "method": "qris",
      "amount": 195000,
      "tendered": null,
      "change_amount": 0,
      "reference": null,
      "status": "completed",
      "paid_at": "2026-10-29T11:03:10+07:00",
      "cash_session_id": null,
      "gateway_provider": null,
      "external_id": null,
      "settlement_id": null,
      "refunded_at": null,
      "refund_reason": null,
      "created_at": "2026-10-29T11:03:00+07:00"
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].branch_idstring (uuid)
items[].invoice_idstring (uuid)
items[].patient_idstring (uuid)
items[].numberstring
items[].methodcash | debit | credit | qris | transfer | deposit
items[].amountnumber
items[].tenderednumber | null
items[].change_amountnumber
items[].referencestring | null
items[].statuspending | completed | refunded | expired | failed
items[].paid_atstring (date-time) | null
items[].cash_session_idstring (uuid) | null
items[].gateway_providerstring | null
items[].external_idstring | null
items[].settlement_idstring (uuid) | null
items[].refunded_atstring (date-time) | null
items[].refund_reasonstring | null
items[].created_atstring (date-time)
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

Detail pembayaran

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/payments/{id}
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/payments/3f0c2a10-5b7e-4c1d-9a2e-000000000001" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/payments/3f0c2a10-5b7e-4c1d-9a2e-000000000001", {
  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/billing/payments/3f0c2a10-5b7e-4c1d-9a2e-000000000001",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Pembayaranapplication/json

{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "invoice_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "number": "string",
  "method": "cash",
  "amount": 0,
  "tendered": 0,
  "change_amount": 0,
  "reference": "string",
  "status": "pending",
  "paid_at": "2026-11-02T08:00:00+07:00",
  "cash_session_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "gateway_provider": "string",
  "external_id": "string",
  "settlement_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "refunded_at": "2026-11-02T08:00:00+07:00",
  "refund_reason": "string",
  "created_at": "2026-11-02T08:00:00+07:00"
}
Skema 200
Skema 200
NamaTipeKeterangan
idstring (uuid)
branch_idstring (uuid)
invoice_idstring (uuid)
patient_idstring (uuid)
numberstring
methodcash | debit | credit | qris | transfer | deposit
amountnumber
tenderednumber | null
change_amountnumber
referencestring | null
statuspending | completed | refunded | expired | failed
paid_atstring (date-time) | null
cash_session_idstring (uuid) | null
gateway_providerstring | null
external_idstring | null
settlement_idstring (uuid) | null
refunded_atstring (date-time) | null
refund_reasonstring | null
created_atstring (date-time)
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

Charge layanan dan barang pasien

Charge dibuat modul klinis (pendaftaran, tindakan, obat, penunjang) lalu ditagihkan kasir. Status pending, billed, cancelled.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/charges
NamaLokasiTipeKeterangan
X-Branch-IDheaderstring (uuid)Cabang aktif (opsional). Nilai di luar cabang klien diabaikan.
patient_idquerystring (uuid)
encounter_idquerystring (uuid)
statusquerypending | billed | cancelled

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/charges" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/charges", {
  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/billing/charges",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Chargeapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-000000009001",
      "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
      "encounter_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
      "source_type": "encounter",
      "source_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000e0001",
      "service_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001f002",
      "item_id": null,
      "description": "Konsultasi dokter umum",
      "quantity": 1,
      "unit_price": null,
      "revenue_key": "rev_consultation",
      "practitioner_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d0001",
      "status": "pending",
      "invoice_id": null,
      "created_at": "2026-10-29T10:45:00+07:00"
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].patient_idstring (uuid)
items[].encounter_idstring (uuid) | null
items[].source_typestring
items[].source_idstring
items[].service_idstring (uuid) | null
items[].item_idstring (uuid) | null
items[].descriptionstring
items[].quantitynumber
items[].unit_pricenumber | nullnull = harga dari daftar tarif saat ditagih
items[].revenue_keystring
items[].practitioner_idstring (uuid) | null
items[].statuspending | billed | cancelled
items[].invoice_idstring (uuid) | null
items[].created_atstring (date-time)
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

Saldo dan mutasi deposit pasien

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/deposits
NamaLokasiTipeKeterangan
patient_idwajibquerystring (uuid)

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/deposits?patient_id=3f0c2a10-5b7e-4c1d-9a2e-000000000001" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/deposits?patient_id=3f0c2a10-5b7e-4c1d-9a2e-000000000001", {
  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/billing/deposits?patient_id=3f0c2a10-5b7e-4c1d-9a2e-000000000001",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Depositapplication/json

{
  "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
  "balance": 300000,
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b201",
      "number": "DEP-202610-00007",
      "kind": "topup",
      "amount": 500000,
      "balance_after": 500000,
      "method": "transfer",
      "invoice_id": null,
      "payment_id": null,
      "reference": "TRF-0001",
      "notes": null,
      "created_at": "2026-10-20T09:00:00+07:00"
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
patient_idstring (uuid)
balancenumber
itemsarray<object>
items[].idstring (uuid)
items[].numberstring
items[].kindtopup | usage | refund | credit | usage_reversal
items[].amountnumberPositif masuk, negatif keluar
items[].balance_afternumber
items[].methodstring | null
items[].invoice_idstring (uuid) | null
items[].payment_idstring (uuid) | null
items[].referencestring | null
items[].notesstring | null
items[].created_atstring (date-time)
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

Paket prabayar yang dijual klinik

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/packages" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/packages", {
  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/billing/packages",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Paketapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b301",
      "code": "PKT-FISIO-8",
      "name": "Paket Fisioterapi 8 Sesi",
      "description": null,
      "service_ids": [
        "3f0c2a10-5b7e-4c1d-9a2e-00000001f003"
      ],
      "sessions": 8,
      "price": 1000000,
      "valid_days": 180,
      "is_active": true
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].codestring
items[].namestring
items[].descriptionstring | null
items[].service_idsarray<string (uuid)>
items[].sessionsinteger
items[].pricenumber
items[].valid_daysinteger | null
items[].is_activeboolean
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

Paket prabayar milik pasien

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/patient-packages
NamaLokasiTipeKeterangan
patient_idquerystring (uuid)
statusqueryactive | used | expired | void

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/patient-packages" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/patient-packages", {
  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/billing/patient-packages",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Paket pasienapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b401",
      "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
      "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
      "package_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b301",
      "package_name": "Paket Fisioterapi 8 Sesi",
      "number": "PKG-202610-00002",
      "service_ids": [
        "3f0c2a10-5b7e-4c1d-9a2e-00000001f003"
      ],
      "sessions_total": 8,
      "sessions_used": 2,
      "price": 1000000,
      "remaining_value": 750000,
      "payment_methods": [
        "transfer"
      ],
      "status": "active",
      "sold_at": "2026-10-01T10:00:00+07:00",
      "expires_at": "2027-03-30T23:59:59+07:00"
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].branch_idstring (uuid)
items[].patient_idstring (uuid)
items[].package_idstring (uuid)
items[].package_namestring
items[].numberstring
items[].service_idsarray<string (uuid)>
items[].sessions_totalinteger
items[].sessions_usedinteger
items[].pricenumber
items[].remaining_valuenumber
items[].payment_methodsarray<string>
items[].statusstring
items[].sold_atstring (date-time)
items[].expires_atstring (date-time) | null
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

Master layanan dan tarif dasar

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/services
NamaLokasiTipeKeterangan
qquerystring
categoryquerystring (9 nilai)

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/services" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/services", {
  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/billing/services",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Layananapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001f002",
      "code": "KONS-UMUM",
      "name": "Konsultasi dokter umum",
      "category": "konsultasi",
      "revenue_key": "rev_consultation",
      "base_price": 50000,
      "icd9cm_code": null,
      "loinc_code": null,
      "specialty": "umum",
      "fee_eligible": true,
      "is_active": true,
      "version": 1
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].codestring
items[].namestring
items[].categorystring
items[].revenue_keystring
items[].base_pricenumber
items[].icd9cm_codestring | null
items[].loinc_codestring | null
items[].specialtystring | null
items[].fee_eligibleboolean
items[].is_activeboolean
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

Penjamin dan aturan tanggungan

coverage_bp = porsi ditanggung (basis poin, 10000 = 100%); max_per_invoice = plafon per tagihan; excluded_categories = kategori yang ditanggung pasien.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/payers" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/payers", {
  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/billing/payers",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Penjaminapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0003",
      "code": "ASR1",
      "name": "Asuransi Contoh",
      "kind": "insurance",
      "payment_terms_days": 30,
      "coverage_bp": 8000,
      "max_per_invoice": 300000,
      "excluded_categories": [
        "retail",
        "treatment"
      ],
      "is_active": true,
      "version": 1
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].codestring
items[].namestring
items[].kindumum | bpjs | insurance | company
items[].payment_terms_daysinteger | null
items[].coverage_bpinteger
items[].max_per_invoicenumber | null
items[].excluded_categoriesarray<string>
items[].is_activeboolean
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

Daftar tarif per penjamin

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/price-lists" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/price-lists", {
  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/billing/price-lists",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Daftar tarifapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b501",
      "code": "UMUM",
      "name": "Tarif Umum",
      "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0001",
      "branch_id": null,
      "valid_from": null,
      "valid_to": null,
      "is_active": true
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].codestring
items[].namestring
items[].payer_idstring (uuid)
items[].branch_idstring (uuid) | null
items[].valid_fromstring (date) | null
items[].valid_tostring (date) | null
items[].is_activeboolean
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

Harga dalam satu daftar tarif

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/price-lists/{id}/items
NamaLokasiTipeKeterangan
idwajibpathstring (uuid)

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/price-lists/3f0c2a10-5b7e-4c1d-9a2e-000000000001/items" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/price-lists/3f0c2a10-5b7e-4c1d-9a2e-000000000001/items", {
  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/billing/price-lists/3f0c2a10-5b7e-4c1d-9a2e-000000000001/items",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Hargaapplication/json

{
  "items": [
    {
      "service_id": "3f0c2a10-5b7e-4c1d-9a2e-00000001f002",
      "item_id": null,
      "code": "KONS-UMUM",
      "name": "Konsultasi dokter umum",
      "price": 60000,
      "base_price": 50000
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].service_idstring (uuid) | null
items[].item_idstring (uuid) | null
items[].codestring
items[].namestring
items[].pricenumber
items[].base_pricenumber
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

Harga efektif layanan/barang untuk penjamin

Urutan: daftar tarif penjamin cabang → penjamin semua cabang → tarif default cabang → semua cabang → harga dasar.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/prices/resolve
NamaLokasiTipeKeterangan
X-Branch-IDheaderstring (uuid)Cabang aktif (opsional). Nilai di luar cabang klien diabaikan.
payer_idquerystring (uuid)
service_idquerystring (uuid)
item_idquerystring (uuid)

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/prices/resolve" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/prices/resolve", {
  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/billing/prices/resolve",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Hargaapplication/json

{
  "price": 45000,
  "source": "price_list:ASR1",
  "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0003"
}
Skema 200
Skema 200
NamaTipeKeterangan
pricenumber
sourcestringprice_list:<kode>, base_price, atau sale_price
payer_idstring (uuid) | null
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
  • 422validationValidasi gagal; rincian per field di errors
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Pengaturan kasir (PPN, persetujuan diskon)

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/settings" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/settings", {
  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/billing/settings",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Pengaturanapplication/json

{
  "is_pkp": false,
  "ppn_rate_bp": 1100,
  "discount_approval_bp": 1000,
  "discount_approval_amount": 100000,
  "require_cash_session": true,
  "receipt_footer": "Semoga lekas sembuh",
  "version": 1
}
Skema 200
Skema 200
NamaTipeKeterangan
is_pkpboolean
ppn_rate_bpinteger
discount_approval_bpinteger
discount_approval_amountnumber
require_cash_sessionboolean
receipt_footerstring | null
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
GET/billing/cash-sessionsTautan ke operasi ini: Sesi kas kasir

Sesi kas kasir

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/cash-sessions
NamaLokasiTipeKeterangan
X-Branch-IDheaderstring (uuid)Cabang aktif (opsional). Nilai di luar cabang klien diabaikan.
datequerystring (date)
statusqueryopen | closed

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/cash-sessions" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/cash-sessions", {
  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/billing/cash-sessions",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Sesi kasapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b601",
      "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
      "user_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d2001",
      "user_name": "Kasir Contoh",
      "number": "KAS-202610-00001",
      "status": "closed",
      "opened_at": "2026-10-29T07:30:00+07:00",
      "opening_float": 200000,
      "cash_in": 100000,
      "cash_out": 0,
      "expected_cash": 300000,
      "closed_at": "2026-10-29T16:00:00+07:00",
      "counted_cash": 299000,
      "difference": -1000,
      "notes": null,
      "version": 2
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].branch_idstring (uuid)
items[].user_idstring (uuid)
items[].user_namestring
items[].numberstring
items[].statusopen | closed
items[].opened_atstring (date-time)
items[].opening_floatnumber
items[].cash_innumber
items[].cash_outnumber
items[].expected_cashnumber
items[].closed_atstring (date-time) | null
items[].counted_cashnumber | null
items[].differencenumber | null
items[].notesstring | null
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

Sesi kas terbuka milik pemanggil

Sesi kas dibuka per pengguna kasir. Identitas klien API tidak pernah membuka sesi kas, jadi untuk token API endpoint ini selalu 404; gunakan GET /billing/cash-sessions?status=open.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/cash-sessions/current" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/cash-sessions/current", {
  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/billing/cash-sessions/current",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Sesi kas terbukaapplication/json

{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "user_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "user_name": "string",
  "number": "string",
  "status": "open",
  "opened_at": "2026-11-02T08:00:00+07:00",
  "opening_float": 0,
  "cash_in": 0,
  "cash_out": 0,
  "expected_cash": 0,
  "closed_at": "2026-11-02T08:00:00+07:00",
  "counted_cash": 0,
  "difference": 0,
  "notes": "string",
  "version": 0
}
Skema 200
Skema 200
NamaTipeKeterangan
idstring (uuid)
branch_idstring (uuid)
user_idstring (uuid)
user_namestring
numberstring
statusopen | closed
opened_atstring (date-time)
opening_floatnumber
cash_innumber
cash_outnumber
expected_cashnumber
closed_atstring (date-time) | null
counted_cashnumber | null
differencenumber | null
notesstring | null
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
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Pencairan QRIS/kartu/gateway ke bank

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/settlements
NamaLokasiTipeKeterangan
X-Branch-IDheaderstring (uuid)Cabang aktif (opsional). Nilai di luar cabang klien diabaikan.

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/settlements" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/settlements", {
  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/billing/settlements",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Settlementapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-00000001b701",
      "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
      "number": "STL-202610-00004",
      "channel": "gateway",
      "gross": 1250000,
      "mdr": 8750,
      "net": 1241250,
      "settled_at": "2026-10-30",
      "reference": "SETTLEMENT-CONTOH-01",
      "created_at": "2026-10-30T08:00:00+07:00"
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].branch_idstring (uuid)
items[].numberstring
items[].channelstring
items[].grossnumber
items[].mdrnumber
items[].netnumber
items[].settled_atstring (date)
items[].referencestring | null
items[].created_atstring (date-time)
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
GET/billing/reports/ar-agingTautan ke operasi ini: Umur piutang pasien

Umur piutang pasien

Per pasien, umur dihitung sejak tagihan final.

Scope
invoices:read
Izin RBAC
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Modul
cashier

Parameter

Parameter GET /billing/reports/ar-aging
NamaLokasiTipeKeterangan
X-Branch-IDheaderstring (uuid)Cabang aktif (opsional). Nilai di luar cabang klien diabaikan.
as_ofquerystring (date)Default hari ini

Contoh kode

Bahasa contoh kode
curl -X GET "https://api.medivana.cloud/api/v1/billing/reports/ar-aging" \
  -H "Authorization: Bearer $MEDIVANA_TOKEN"
const res = await fetch("https://api.medivana.cloud/api/v1/billing/reports/ar-aging", {
  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/billing/reports/ar-aging",
    headers={"Authorization": f"Bearer {os.environ['MEDIVANA_TOKEN']}"},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()

Respons

200Agingapplication/json

{
  "as_of": "2026-10-31",
  "items": [
    {
      "patient_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000a0001",
      "patient_name": "Pasien Contoh",
      "patient_mrn": "RM-000123",
      "invoices": 1,
      "days_0_30": 45000,
      "days_31_60": 0,
      "days_61_90": 0,
      "days_over_90": 0,
      "total": 45000
    }
  ],
  "totals": {
    "days_0_30": 45000,
    "days_31_60": 0,
    "days_61_90": 0,
    "days_over_90": 0,
    "total": 45000
  }
}
Skema 200
Skema 200
NamaTipeKeterangan
as_ofstring (date)
itemsarray<object>
items[].patient_idstring (uuid)
items[].patient_namestring
items[].patient_mrnstring
items[].invoicesinteger
items[].days_0_30number
items[].days_31_60number
items[].days_61_90number
items[].days_over_90number
items[].totalnumber
totalsobject
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