Skip to content

API reference

Billing

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

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 tagihan pasien

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

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

Parameters GET /billing/invoices
NameInTypeDescription
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

Code examples

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

Responses

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

Detail tagihan dengan baris, diskon, dan pembayaran

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

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

Parameters GET /billing/invoices/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Code examples

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

Responses

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"
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
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)
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

Kuitansi tagihan (HTML siap cetak)

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

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

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

Code examples

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

Responses

200Dokumen HTMLtext/html

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

Daftar pembayaran

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

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

Parameters GET /billing/payments
NameInTypeDescription
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

Code examples

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

Responses

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"
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
itemsrequiredarray<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)
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

Detail pembayaran

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

Parameters GET /billing/payments/{id}
NameInTypeDescription
idrequiredpathstring (uuid)

Code examples

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

Responses

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"
}
Schema 200
Schema 200
NameTypeDescription
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)
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

Charge layanan dan barang pasien

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

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

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

Code examples

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

Responses

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"
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
itemsrequiredarray<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)
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

Saldo dan mutasi deposit pasien

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

Parameters GET /billing/deposits
NameInTypeDescription
patient_idrequiredquerystring (uuid)

Code examples

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

Responses

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"
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
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)
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

Paket prabayar yang dijual klinik

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Code examples

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

Responses

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

Paket prabayar milik pasien

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

Parameters GET /billing/patient-packages
NameInTypeDescription
patient_idquerystring (uuid)
statusqueryactive | used | expired | void

Code examples

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

Responses

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"
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
itemsrequiredarray<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
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

Master layanan dan tarif dasar

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

Parameters GET /billing/services
NameInTypeDescription
qquerystring
categoryquerystring (9 nilai)

Code examples

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

Responses

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

Penjamin dan aturan tanggungan

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

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Code examples

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

Responses

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

Daftar tarif per penjamin

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Code examples

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

Responses

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

Harga dalam satu daftar tarif

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

Parameters GET /billing/price-lists/{id}/items
NameInTypeDescription
idrequiredpathstring (uuid)

Code examples

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

Responses

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
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
itemsrequiredarray<object>
items[].service_idstring (uuid) | null
items[].item_idstring (uuid) | null
items[].codestring
items[].namestring
items[].pricenumber
items[].base_pricenumber
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

Harga efektif layanan/barang untuk penjamin

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

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

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

Code examples

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

Responses

200Hargaapplication/json

{
  "price": 45000,
  "source": "price_list:ASR1",
  "payer_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000f0003"
}
Schema 200
Schema 200
NameTypeDescription
pricenumber
sourcestringprice_list:<kode>, base_price, atau sale_price
payer_idstring (uuid) | null
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
  • 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)

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Code examples

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

Responses

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
}
Schema 200
Schema 200
NameTypeDescription
is_pkpboolean
ppn_rate_bpinteger
discount_approval_bpinteger
discount_approval_amountnumber
require_cash_sessionboolean
receipt_footerstring | null
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

Sesi kas kasir

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

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

Code examples

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

Responses

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

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.

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Code examples

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

Responses

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

Pencairan QRIS/kartu/gateway ke bank

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

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

Code examples

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

Responses

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"
    }
  ]
}
Schema 200
Schema 200
NameTypeDescription
itemsrequiredarray<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)
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

Umur piutang pasien

Per pasien, umur dihitung sejak tagihan final.

Scopes
invoices:read
RBAC permissions
cashier.bill · cashier.close · cashier.pay · cashier.void · invoice.read
Module
cashier

Parameters

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

Code examples

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

Responses

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