{"version":"2.0","count":101,"endpoints":[{"path":"/","methods":["GET"],"scopes":[],"summary":"undocumented","parameters":[]},{"path":"/dashboard","methods":["GET"],"scopes":[],"summary":"undocumented","parameters":[]},{"path":"/docs","methods":["GET"],"scopes":[],"summary":"undocumented","parameters":[]},{"path":"/health","methods":["GET"],"scopes":[],"summary":"undocumented","parameters":[]},{"path":"/openapi.json","methods":["GET"],"scopes":[],"summary":"undocumented","parameters":[]},{"path":"/v1/accounting/accounts","methods":["GET"],"scopes":["accounting:read"],"summary":"Chart of accounts","parameters":["kind","parent_id","q","include_disabled"]},{"path":"/v1/accounting/cost-centers","methods":["GET"],"scopes":["accounting:read"],"summary":"Cost centres, down to individual doctors","parameters":[]},{"path":"/v1/accounting/entries","methods":["GET"],"scopes":["accounting:read"],"summary":"Journal entries","parameters":["from","to","created_by","posted","q","since_id","page","page_size"]},{"path":"/v1/accounting/entries/<int:eid>","methods":["GET"],"scopes":["accounting:read"],"summary":"One journal entry with its lines","parameters":[]},{"path":"/v1/accounting/ledger","methods":["GET"],"scopes":["accounting:read"],"summary":"Account statement with opening balance and running total","parameters":["account_id","from","to","page","page_size"]},{"path":"/v1/accounting/trial-balance","methods":["GET"],"scopes":["accounting:read"],"summary":"Debits and credits per account for a period","parameters":["from","to"]},{"path":"/v1/admin/audit","methods":["GET"],"scopes":["admin"],"summary":"Every call made through this API","parameters":["client_id","path","status","since","page","page_size"]},{"path":"/v1/admin/clients","methods":["GET"],"scopes":["admin"],"summary":"Connected systems","parameters":[]},{"path":"/v1/admin/clients","methods":["POST"],"scopes":["admin"],"summary":"Connected systems","parameters":[]},{"path":"/v1/admin/clients/<cid>","methods":["PATCH"],"scopes":["admin"],"summary":"Update a connected system","parameters":[]},{"path":"/v1/admin/clients/<cid>/keys","methods":["POST"],"scopes":["admin"],"summary":"Issue another key for a client","parameters":[]},{"path":"/v1/admin/keys/<kid>","methods":["DELETE"],"scopes":["admin"],"summary":"Revoke a key","parameters":[]},{"path":"/v1/admin/scopes","methods":["GET"],"scopes":["admin"],"summary":"Available scopes and ready-made presets","parameters":[]},{"path":"/v1/admin/usage","methods":["GET"],"scopes":["admin"],"summary":"Per-client traffic over the last 7 days","parameters":[]},{"path":"/v1/admin/whoami","methods":["GET"],"scopes":[],"summary":"What the presented key is allowed to do","parameters":[]},{"path":"/v1/analytics/aging","methods":["GET"],"scopes":["analytics:read"],"summary":"Unpaid balances bucketed by invoice age","parameters":[]},{"path":"/v1/analytics/attendance","methods":["GET"],"scopes":["analytics:read"],"summary":"No-show and attendance rates by doctor, weekday, hour, day or month","parameters":["from","to","group_by"]},{"path":"/v1/analytics/cost-centers","methods":["GET"],"scopes":["analytics:read"],"summary":"Contribution per cost centre - the only route to per-doctor profitability","parameters":["from","to"]},{"path":"/v1/analytics/marketing","methods":["GET"],"scopes":["analytics:read"],"summary":"Channel attribution, from our own enrichment store","parameters":["from","to"]},{"path":"/v1/analytics/offers","methods":["GET"],"scopes":["analytics:read"],"summary":"What each offer actually earned","parameters":["from","to"]},{"path":"/v1/analytics/patients","methods":["GET"],"scopes":["analytics:read"],"summary":"Patient mix, growth and lifetime-value bands","parameters":["from","to"]},{"path":"/v1/analytics/purchasing","methods":["GET"],"scopes":["analytics:read"],"summary":"Stock spend by supplier, month or item","parameters":["from","to","group_by","page","page_size"]},{"path":"/v1/analytics/retention","methods":["GET"],"scopes":["analytics:read"],"summary":"New versus returning patients and what each is worth","parameters":["from","to"]},{"path":"/v1/analytics/revenue","methods":["GET"],"scopes":["analytics:read"],"summary":"Collected revenue grouped by day, month, doctor, room, payment method or staff member","parameters":["from","to","group_by"]},{"path":"/v1/analytics/services","methods":["GET"],"scopes":["analytics:read"],"summary":"Revenue by treatment category or service name","parameters":["from","to","group_by","page","page_size"]},{"path":"/v1/analytics/snapshot","methods":["GET"],"scopes":["analytics:read"],"summary":"Everything the dashboard needs in one call: facts aggregated to day x dimension, cached for 5 minutes","parameters":[]},{"path":"/v1/analytics/summary","methods":["GET"],"scopes":["analytics:read"],"summary":"Headline figures for a period","parameters":["from","to"]},{"path":"/v1/appointments","methods":["GET"],"scopes":["appointments:read"],"summary":"The appointment calendar","parameters":["from","to","status","doctor_id","patient_id","confirmed","include_blocks","q","created_since_id","page","page_size"]},{"path":"/v1/appointments/<int:aid>","methods":["GET"],"scopes":["appointments:read"],"summary":"One appointment","parameters":[]},{"path":"/v1/appointments/blocked-slots","methods":["GET"],"scopes":["appointments:read"],"summary":"Time the clinic has closed off","parameters":["from","to"]},{"path":"/v1/appointments/calendar","methods":["GET"],"scopes":["appointments:read"],"summary":"Daily slot occupancy per doctor","parameters":["from","to","doctor_id"]},{"path":"/v1/audit/kizen","methods":["GET"],"scopes":["admin"],"summary":"Kizen's own activity log - who worked on which screen","parameters":["from","to","user","screen","action","device","q","page","page_size"]},{"path":"/v1/audit/kizen/activity","methods":["GET"],"scopes":["admin"],"summary":"Staff activity summary by user, screen, action, device or day","parameters":["from","to","group_by"]},{"path":"/v1/consent-forms","methods":["GET"],"scopes":["clinical:read"],"summary":"The distinct consent forms in use and how often signed","parameters":[]},{"path":"/v1/consents","methods":["GET"],"scopes":["clinical:read"],"summary":"Signed treatment consents and pre/post-care forms","parameters":["from","to","patient_id","doctor","signed","q","page","page_size"]},{"path":"/v1/consents/<int:cid>","methods":["GET"],"scopes":["clinical:read"],"summary":"One consent form with its full text","parameters":[]},{"path":"/v1/doctors","methods":["GET"],"scopes":["catalog:read"],"summary":"Doctors","parameters":["include_inactive"]},{"path":"/v1/endpoints","methods":["GET"],"scopes":[],"summary":"undocumented","parameters":[]},{"path":"/v1/expense-categories","methods":["GET"],"scopes":["purchasing:read"],"summary":"Expense categories","parameters":[]},{"path":"/v1/expenses","methods":["GET"],"scopes":["purchasing:read"],"summary":"Recorded expenses - barely used by the clinic","parameters":["from","to","category","method","page","page_size"]},{"path":"/v1/inventory/expiring","methods":["GET"],"scopes":["inventory:read"],"summary":"Items whose expiry date is approaching or passed","parameters":["days"]},{"path":"/v1/inventory/items","methods":["GET"],"scopes":["inventory:read"],"summary":"Stock items with their last recorded balance and expiry","parameters":["q","in_stock","page","page_size"]},{"path":"/v1/inventory/movements","methods":["GET"],"scopes":["inventory:read"],"summary":"Stock transfers and issues","parameters":["from","to","kind","from_store_id","to_store_id","since_id","page","page_size"]},{"path":"/v1/inventory/movements/<int:mid>","methods":["GET"],"scopes":["inventory:read"],"summary":"One stock movement with its lines","parameters":[]},{"path":"/v1/invoices","methods":["GET"],"scopes":["financials:read"],"summary":"Invoices, with totals summed from their line items","parameters":["from","to","patient_id","doctor_id","room","payment_status","since_id","page","page_size"]},{"path":"/v1/invoices/<int:iid>","methods":["GET"],"scopes":["financials:read"],"summary":"One invoice with its lines, VAT breakdown and payments","parameters":[]},{"path":"/v1/leads","methods":["GET"],"scopes":["leads:write"],"summary":"Inbound enquiries that are not Kizen patients yet","parameters":["status","source","unmatched","page","page_size"]},{"path":"/v1/leads","methods":["POST"],"scopes":["leads:write"],"summary":"Inbound enquiries that are not Kizen patients yet","parameters":["status","source","unmatched","page","page_size"]},{"path":"/v1/lookups","methods":["GET"],"scopes":["catalog:read"],"summary":"Every enumerated value this API can return","parameters":[]},{"path":"/v1/medicines","methods":["GET"],"scopes":["catalog:read"],"summary":"Standard drug reference list","parameters":["q","page","page_size"]},{"path":"/v1/messages","methods":["GET"],"scopes":["messages:read"],"summary":"Outbound SMS log","parameters":["from","to","type","phone","appointment_id"]},{"path":"/v1/offers","methods":["GET"],"scopes":["catalog:read"],"summary":"Package offers and what each bundles","parameters":["include_disabled"]},{"path":"/v1/outstanding","methods":["GET"],"scopes":["financials:read"],"summary":"Unpaid and part-paid invoices - the clinic's receivables","parameters":["from","to","min_amount","page","page_size"]},{"path":"/v1/patients","methods":["GET"],"scopes":["patients:read"],"summary":"Search and list patients","parameters":["q","mobile","national_id","gender","doctor_id","created_by","registered_from","registered_to","since_id","page","page_size"]},{"path":"/v1/patients/<int:pid>","methods":["GET"],"scopes":["patients:read"],"summary":"One patient","parameters":[]},{"path":"/v1/patients/<int:pid>/appointments","methods":["GET"],"scopes":["patients:read","appointments:read"],"summary":"A patient's appointments","parameters":["include_blocks","page"]},{"path":"/v1/patients/<int:pid>/consents","methods":["GET"],"scopes":["clinical:read"],"summary":"A patient's signed consents","parameters":[]},{"path":"/v1/patients/<int:pid>/enrichment","methods":["GET"],"scopes":["enrichment:read"],"summary":"Our own fields for a patient: marketing source, email, WhatsApp, city, consent. Stored outside Kizen and never written back to it","parameters":[]},{"path":"/v1/patients/<int:pid>/enrichment","methods":["PATCH"],"scopes":["enrichment:write"],"summary":"Our own fields for a patient: marketing source, email, WhatsApp, city, consent. Stored outside Kizen and never written back to it","parameters":[]},{"path":"/v1/patients/<int:pid>/invoices","methods":["GET"],"scopes":["patients:read","financials:read"],"summary":"A patient's invoices","parameters":["page","page_size"]},{"path":"/v1/patients/<int:pid>/notes","methods":["GET"],"scopes":["patients:read"],"summary":"Front-desk notes on a patient","parameters":[]},{"path":"/v1/patients/<int:pid>/payments","methods":["GET"],"scopes":["patients:read","financials:read"],"summary":"A patient's payments","parameters":["page","page_size"]},{"path":"/v1/patients/<int:pid>/summary","methods":["GET"],"scopes":["patients:read","financials:read"],"summary":"Full patient value view: lifetime billed and paid, outstanding balance, attendance record, top treatment categories","parameters":[]},{"path":"/v1/patients/<int:pid>/visits","methods":["GET"],"scopes":["clinical:read"],"summary":"A patient's clinical visits","parameters":[]},{"path":"/v1/patients/lookup","methods":["GET"],"scopes":["patients:read"],"summary":"Find a patient by phone number in any stored format","parameters":["phone"]},{"path":"/v1/payments","methods":["GET"],"scopes":["financials:read"],"summary":"Payments and refunds","parameters":["from","to","patient_id","doctor_id","method","invoice_id","refunds_only","since_id","page","page_size"]},{"path":"/v1/purchases","methods":["GET"],"scopes":["purchasing:read"],"summary":"Purchase invoices, totalled from their line items","parameters":["from","to","supplier_id","q","returns_only","since_id","page","page_size"]},{"path":"/v1/purchases/<int:pid>","methods":["GET"],"scopes":["purchasing:read"],"summary":"One purchase invoice with its lines","parameters":[]},{"path":"/v1/queue","methods":["GET"],"scopes":["patients:write"],"summary":"The review queue: write requests awaiting a human at the clinic","parameters":["status","kind","page","page_size"]},{"path":"/v1/queue/<rid>","methods":["GET"],"scopes":["patients:write"],"summary":"One queued request","parameters":[]},{"path":"/v1/queue/<rid>/apply","methods":["POST"],"scopes":["admin"],"summary":"Enter an approved request into Kizen. Dry run unless confirm=true - the only write path in the API","parameters":[]},{"path":"/v1/queue/<rid>/resolve","methods":["POST"],"scopes":["admin"],"summary":"Close a queued request once the clinic has handled it","parameters":[]},{"path":"/v1/queue/appointments","methods":["POST"],"scopes":["appointments:write"],"summary":"Ask for an appointment to be booked (queued, not written)","parameters":[]},{"path":"/v1/queue/patients","methods":["POST"],"scopes":["patients:write"],"summary":"Ask for a patient to be created (queued, not written)","parameters":[]},{"path":"/v1/rooms","methods":["GET"],"scopes":["catalog:read"],"summary":"Treatment rooms and laser devices","parameters":[]},{"path":"/v1/service-groups","methods":["GET"],"scopes":["catalog:read"],"summary":"Treatment categories","parameters":[]},{"path":"/v1/services","methods":["GET"],"scopes":["catalog:read"],"summary":"Service and product catalogue with prices","parameters":["q","group","code","kind","include_disabled","page","page_size"]},{"path":"/v1/staff","methods":["GET"],"scopes":["catalog:read"],"summary":"Clinic staff accounts","parameters":["include_disabled"]},{"path":"/v1/stores","methods":["GET"],"scopes":["catalog:read"],"summary":"Stock rooms","parameters":[]},{"path":"/v1/suppliers","methods":["GET"],"scopes":["purchasing:read"],"summary":"Suppliers","parameters":["q","include_disabled"]},{"path":"/v1/sync/changes","methods":["GET"],"scopes":[],"summary":"Rows created or possibly changed since a watermark","parameters":["entity","since_id","window_days","page","page_size"]},{"path":"/v1/sync/counts","methods":["GET"],"scopes":[],"summary":"Row counts and high-water marks, for consistency checks","parameters":[]},{"path":"/v1/sync/entities","methods":["GET"],"scopes":[],"summary":"Which entities support incremental sync","parameters":[]},{"path":"/v1/sync/state","methods":["GET"],"scopes":[],"summary":"Where this client got to on each entity","parameters":[]},{"path":"/v1/visit-fields","methods":["GET"],"scopes":["clinical:read"],"summary":"Clinical form definitions and how often each is used","parameters":[]},{"path":"/v1/visits","methods":["GET"],"scopes":["clinical:read"],"summary":"Clinical visits","parameters":["from","to","patient_id","doctor_id","page"]},{"path":"/v1/visits/<int:vid>","methods":["GET"],"scopes":["clinical:read"],"summary":"One clinical visit with its recorded fields","parameters":[]},{"path":"/v1/webhooks","methods":["GET"],"scopes":[],"summary":"Webhook subscriptions for this client","parameters":[]},{"path":"/v1/webhooks","methods":["POST"],"scopes":[],"summary":"Webhook subscriptions for this client","parameters":[]},{"path":"/v1/webhooks/<sub_id>","methods":["DELETE"],"scopes":[],"summary":"Update or delete a subscription","parameters":[]},{"path":"/v1/webhooks/<sub_id>","methods":["PATCH"],"scopes":[],"summary":"Update or delete a subscription","parameters":[]},{"path":"/v1/webhooks/<sub_id>/deliveries","methods":["GET"],"scopes":[],"summary":"Delivery log for a subscription","parameters":["page","page_size"]},{"path":"/v1/webhooks/<sub_id>/secret","methods":["GET"],"scopes":[],"summary":"Read back a subscription's signing secret","parameters":[]},{"path":"/v1/webhooks/<sub_id>/test","methods":["POST"],"scopes":[],"summary":"Queue a ping so a receiver can be verified","parameters":[]},{"path":"/v1/webhooks/events","methods":["GET"],"scopes":[],"summary":"Every event that can be subscribed to","parameters":[]},{"path":"/v1/webhooks/status","methods":["GET"],"scopes":[],"summary":"How far the change poller has read each Kizen table","parameters":[]}]}
