Lewati ke isi

Referensi API

Konteks

Identitas token, organisasi, cabang, unit layanan, dan tenaga kesehatan untuk mengisi referensi ID.

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

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

Identitas token dan izin efektif

Identitas teknis klien API (pengguna API: <nama>), izin RBAC hasil scope token, cabang aktif, dan entitlement paket. Berguna untuk memeriksa scope sebelum memanggil endpoint lain.

Scope
Token apa pun

Parameter

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

Respons

200Konteks tokenapplication/json

{
  "user_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000a11",
  "email": "mdn_ci_7f3k2q9x",
  "name": "API: Integrasi HIS",
  "org": {
    "id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
    "name": "Klinik Sehat Contoh",
    "slug": "klinik-sehat-contoh",
    "clinic_kind": "pratama",
    "status": "active",
    "demo_expires_at": null,
    "default_locale": "id"
  },
  "branch_id": null,
  "branches": [],
  "roles": [
    "api_client"
  ],
  "permissions": [
    "encounter.read",
    "patient.read",
    "webhook.manage"
  ],
  "data_scope": "org",
  "two_factor": true,
  "entitlements": {
    "plan": "klinik_pro",
    "plan_name": "Klinik Pro",
    "status": "active",
    "modules": {
      "api": true,
      "frontoffice": true,
      "rme": true,
      "booking": true
    }
  },
  "is_demo": false,
  "break_glass": false,
  "locale": "id",
  "effective_locale": "id"
}
Skema 200
Skema 200
NamaTipeKeterangan
user_idstring (uuid)Identitas teknis klien API
emailstringclient_id klien
namestring
orgobject
branch_idstring (uuid) | nullCabang aktif permintaan ini
branchesarray<object>
branches[].idstring (uuid)
branches[].codestring
branches[].namestring
branches[].addressstring | null
branches[].citystring | null
branches[].phonestring | null
branches[].latitudenumber | null
branches[].longitudenumber | null
branches[].geofence_minteger
branches[].satusehat_location_ihsstring | null
branches[].bpjs_ppk_codestring | null
branches[].is_activeboolean
branches[].versioninteger
rolesarray<string>
permissionsarray<string>Izin RBAC hasil scope token
data_scopestring
two_factorboolean
entitlementsobject
entitlements.org_idstring (uuid)
entitlements.planstring
entitlements.plan_namestring
entitlements.statusactive | grace | read_only | cancelled | none
entitlements.billing_cyclestring
entitlements.branchesinteger
entitlements.modulesobject
entitlements.limitsobject
entitlements.addonsarray<string>
entitlements.bi_levelstring
entitlements.accounting_levelstring
entitlements.current_period_endstring (date-time)
entitlements.grace_untilstring (date-time)
entitlements.is_demoboolean
is_demoboolean
break_glassboolean
localestring
effective_localestring
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Paket, modul aktif, dan batas paket organisasi

Gunakan modules untuk mengetahui endpoint mana yang akan menjawab 402 module-locked.

Scope
Token apa pun

Contoh kode

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

Respons

200Entitlementapplication/json

{
  "org_id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "plan": "klinik_pro",
  "plan_name": "Klinik Pro",
  "status": "active",
  "billing_cycle": "annual",
  "branches": 3,
  "modules": {
    "api": true,
    "frontoffice": true,
    "rme": true,
    "booking": true,
    "cashier": true,
    "lab": true,
    "satusehat": true,
    "bpjs": true
  },
  "limits": {
    "users": 50,
    "branches": 3
  },
  "addons": [],
  "bi_level": "basic",
  "accounting_level": "basic",
  "current_period_end": "2027-10-31T23:59:59+07:00",
  "is_demo": false
}
Skema 200
Skema 200
NamaTipeKeterangan
org_idstring (uuid)
planstring
plan_namestring
statusactive | grace | read_only | cancelled | none
billing_cyclestring
branchesinteger
modulesobject
limitsobject
addonsarray<string>
bi_levelstring
accounting_levelstring
current_period_endstring (date-time)
grace_untilstring (date-time)
is_demoboolean
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Profil organisasi (klinik)

Scope
Token apa pun

Contoh kode

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

Respons

200Organisasi (ETag)application/json

{
  "id": "3f0c2a10-5b7e-4c1d-9a2e-000000000001",
  "name": "Klinik Sehat Contoh",
  "slug": "klinik-sehat-contoh",
  "legal_name": "PT Sehat Contoh Sejahtera",
  "npwp": null,
  "is_pkp": false,
  "clinic_kind": "pratama",
  "status": "active",
  "is_demo": false,
  "satusehat_org_ihs": "100000000",
  "settings": {},
  "default_locale": "id",
  "version": 4
}
Skema 200
Skema 200
NamaTipeKeterangan
idstring (uuid)
namestring
slugstring
legal_namestring | null
npwpstring | null
is_pkpboolean
clinic_kindstring
statusstring
is_demoboolean
satusehat_org_ihsstring | null
settingsobject
default_localeid | en
versioninteger
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Daftar cabang

Nilai id dipakai sebagai header X-Branch-ID.

Scope
Token apa pun

Contoh kode

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

Respons

200Cabang (urut kode)application/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
      "code": "PST",
      "name": "Klinik Sehat Contoh Pusat",
      "address": "Jl. Contoh No. 1",
      "city": "Semarang",
      "phone": "6224000001",
      "latitude": -6.99,
      "longitude": 110.42,
      "geofence_m": 150,
      "satusehat_location_ihs": null,
      "bpjs_ppk_code": "0000X001",
      "is_active": true,
      "version": 2
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].codestring
items[].namestring
items[].addressstring | null
items[].citystring | null
items[].phonestring | null
items[].latitudenumber | null
items[].longitudenumber | null
items[].geofence_minteger
items[].satusehat_location_ihsstring | null
items[].bpjs_ppk_codestring | null
items[].is_activeboolean
items[].versioninteger
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Daftar unit layanan (poli, farmasi, laboratorium, …)

id dipakai sebagai unit_id saat mendaftarkan kunjungan atau membaca jadwal. Tanpa branch_id: cabang aktif, atau semua cabang bila tidak ada cabang aktif.

Scope
Token apa pun

Parameter

Parameter GET /units
NamaLokasiTipeKeterangan
X-Branch-IDheaderstring (uuid)Cabang aktif (opsional). Nilai di luar cabang klien diabaikan.
branch_idquerystring (uuid)
kindquerystring (9 nilai)

Contoh kode

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

Respons

200Unit layananapplication/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000c0001",
      "branch_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000000b1",
      "kind": "poli",
      "code": "UMUM",
      "name": "Poli Umum",
      "specialty": "umum",
      "satusehat_location_ihs": null,
      "bpjs_poli_code": "001",
      "is_active": true
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)
items[].branch_idstring (uuid)
items[].kindstring
items[].codestring
items[].namestring
items[].specialtystring | null
items[].satusehat_location_ihsstring | null
items[].bpjs_poli_codestring | null
items[].is_activeboolean
Galat
  • 400bad-requestParameter atau format permintaan tidak valid
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya

Daftar tenaga kesehatan aktif

id adalah ID keanggotaan yang dipakai sebagai practitioner_id di kunjungan, jadwal, dan booking. Difilter ke cabang aktif bila X-Branch-ID dikirim. Tidak memuat NIK/STR.

Scope
Token apa pun

Parameter

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

Respons

200Tenaga kesehatan (urut nama)application/json

{
  "items": [
    {
      "id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d0001",
      "user_id": "3f0c2a10-5b7e-4c1d-9a2e-0000000d1001",
      "name": "dr. Rina Contoh",
      "display_title": "dr.",
      "profession": "dokter",
      "practitioner_ihs": null,
      "branch_ids": [],
      "all_branches": true
    }
  ]
}
Skema 200
Skema 200
NamaTipeKeterangan
itemswajibarray<object>
items[].idstring (uuid)ID keanggotaan (practitioner_id)
items[].user_idstring (uuid)
items[].namestring
items[].display_titlestring | null
items[].professionstring
items[].practitioner_ihsstring | null
items[].branch_idsarray<string (uuid)>
items[].all_branchesboolean
Galat
  • 401unauthorizedToken tidak ada, tidak valid, kedaluwarsa, atau dicabut
  • 429rate-limitedBatas laju klien (rate_limit_per_min) terlampaui; coba lagi pada menit berikutnya