{"openapi":"3.0.3","info":{"title":"Best Beauty Clinics — Clinic API","version":"2.0","description":"Integration API over the clinic's Kizen system.\n\nKizen is read-only through this API: no endpoint writes to the vendor's database. Requests to create a patient or book an appointment are queued for a human at the clinic to enter.\n\nAmounts are summed from invoice line items, because Kizen's own invoice total column is empty on every row. Refunds are negative amounts, so totals are already net."},"servers":[{"url":"https://kizenapi.o2m8.me"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Authorization: Bearer <api key>"}},"x-scopes":{"patients:read":"Read patient records (name, phone, identity, doctor)","patients:write":"Queue new patients / edits for human review","appointments:read":"Read the appointment calendar and attendance","appointments:write":"Queue appointment requests for human review","financials:read":"Read invoices, payments and outstanding balances","clinical:read":"Read clinical visits, measurements and notes (sensitive)","catalog:read":"Read services, prices, doctors, rooms","inventory:read":"Read stock balances, movements and expiry dates","purchasing:read":"Read purchase invoices, suppliers and expenses","accounting:read":"Read the ledger, chart of accounts and cost centres","analytics:read":"Read aggregated reports (no patient identifiers)","enrichment:read":"Read our own fields: source, email, WhatsApp, consent","enrichment:write":"Write our own fields and record consent","leads:write":"Push inbound leads that are not yet Kizen patients","messages:read":"Read the outbound SMS log","admin":"Manage API clients, keys and view the audit log"}},"security":[{"BearerAuth":[]}],"paths":{"/v1/patients":{"get":{"summary":"Search and list patients","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:read"],"parameters":[{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"mobile","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"national_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"gender","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"doctor_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"created_by","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"registered_from","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"registered_to","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"since_id","in":"query","required":false,"description":"Return rows with an id above this, for incremental sync.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}":{"get":{"summary":"One patient","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/lookup":{"get":{"summary":"Find a patient by phone number in any stored format","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:read"],"parameters":[{"name":"phone","in":"query","required":false,"description":"Phone number in any format; it is normalised before matching.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}/summary":{"get":{"summary":"Full patient value view: lifetime billed and paid, outstanding balance, attendance record, top treatment categories","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:read","financials:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}/appointments":{"get":{"summary":"A patient's appointments","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:read","appointments:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}},{"name":"include_blocks","in":"query","required":false,"description":"Set to 1 to include blocked-out time, which is excluded by default.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}/invoices":{"get":{"summary":"A patient's invoices","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:read","financials:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}/payments":{"get":{"summary":"A patient's payments","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:read","financials:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}/notes":{"get":{"summary":"Front-desk notes on a patient","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}/enrichment":{"get":{"summary":"Our own fields for a patient: marketing source, email, WhatsApp, city, consent. Stored outside Kizen and never written back to it","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["enrichment:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}},"patch":{"summary":"Our own fields for a patient: marketing source, email, WhatsApp, city, consent. Stored outside Kizen and never written back to it","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["enrichment:write"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/appointments":{"get":{"summary":"The appointment calendar","tags":["appointments"],"security":[{"BearerAuth":[]}],"x-required-scopes":["appointments:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Filter by status. See /v1/lookups for valid values.","schema":{"type":"string"}},{"name":"doctor_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"patient_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"confirmed","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"include_blocks","in":"query","required":false,"description":"Set to 1 to include blocked-out time, which is excluded by default.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"created_since_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/appointments/{aid}":{"get":{"summary":"One appointment","tags":["appointments"],"security":[{"BearerAuth":[]}],"x-required-scopes":["appointments:read"],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/appointments/calendar":{"get":{"summary":"Daily slot occupancy per doctor","tags":["appointments"],"security":[{"BearerAuth":[]}],"x-required-scopes":["appointments:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"doctor_id","in":"query","required":false,"description":"","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/appointments/blocked-slots":{"get":{"summary":"Time the clinic has closed off","tags":["appointments"],"security":[{"BearerAuth":[]}],"x-required-scopes":["appointments:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/invoices":{"get":{"summary":"Invoices, with totals summed from their line items","tags":["invoices"],"security":[{"BearerAuth":[]}],"x-required-scopes":["financials:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"patient_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"doctor_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"room","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"payment_status","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"since_id","in":"query","required":false,"description":"Return rows with an id above this, for incremental sync.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/invoices/{iid}":{"get":{"summary":"One invoice with its lines, VAT breakdown and payments","tags":["invoices"],"security":[{"BearerAuth":[]}],"x-required-scopes":["financials:read"],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/payments":{"get":{"summary":"Payments and refunds","tags":["payments"],"security":[{"BearerAuth":[]}],"x-required-scopes":["financials:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"patient_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"doctor_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"method","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"invoice_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"refunds_only","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"since_id","in":"query","required":false,"description":"Return rows with an id above this, for incremental sync.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/outstanding":{"get":{"summary":"Unpaid and part-paid invoices - the clinic's receivables","tags":["outstanding"],"security":[{"BearerAuth":[]}],"x-required-scopes":["financials:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"min_amount","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/services":{"get":{"summary":"Service and product catalogue with prices","tags":["services"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"group","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"code","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"include_disabled","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/service-groups":{"get":{"summary":"Treatment categories","tags":["service-groups"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/doctors":{"get":{"summary":"Doctors","tags":["doctors"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[{"name":"include_inactive","in":"query","required":false,"description":"","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/rooms":{"get":{"summary":"Treatment rooms and laser devices","tags":["rooms"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/stores":{"get":{"summary":"Stock rooms","tags":["stores"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/staff":{"get":{"summary":"Clinic staff accounts","tags":["staff"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[{"name":"include_disabled","in":"query","required":false,"description":"","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/lookups":{"get":{"summary":"Every enumerated value this API can return","tags":["lookups"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/visits":{"get":{"summary":"Clinical visits","tags":["visits"],"security":[{"BearerAuth":[]}],"x-required-scopes":["clinical:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"patient_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"doctor_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/visits/{vid}":{"get":{"summary":"One clinical visit with its recorded fields","tags":["visits"],"security":[{"BearerAuth":[]}],"x-required-scopes":["clinical:read"],"parameters":[{"name":"vid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}/visits":{"get":{"summary":"A patient's clinical visits","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["clinical:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/visit-fields":{"get":{"summary":"Clinical form definitions and how often each is used","tags":["visit-fields"],"security":[{"BearerAuth":[]}],"x-required-scopes":["clinical:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/messages":{"get":{"summary":"Outbound SMS log","tags":["messages"],"security":[{"BearerAuth":[]}],"x-required-scopes":["messages:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"phone","in":"query","required":false,"description":"Phone number in any format; it is normalised before matching.","schema":{"type":"string"}},{"name":"appointment_id","in":"query","required":false,"description":"","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/inventory/items":{"get":{"summary":"Stock items with their last recorded balance and expiry","tags":["inventory"],"security":[{"BearerAuth":[]}],"x-required-scopes":["inventory:read"],"parameters":[{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"in_stock","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/inventory/expiring":{"get":{"summary":"Items whose expiry date is approaching or passed","tags":["inventory"],"security":[{"BearerAuth":[]}],"x-required-scopes":["inventory:read"],"parameters":[{"name":"days","in":"query","required":false,"description":"","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/inventory/movements":{"get":{"summary":"Stock transfers and issues","tags":["inventory"],"security":[{"BearerAuth":[]}],"x-required-scopes":["inventory:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"from_store_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"to_store_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"since_id","in":"query","required":false,"description":"Return rows with an id above this, for incremental sync.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/inventory/movements/{mid}":{"get":{"summary":"One stock movement with its lines","tags":["inventory"],"security":[{"BearerAuth":[]}],"x-required-scopes":["inventory:read"],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/purchases":{"get":{"summary":"Purchase invoices, totalled from their line items","tags":["purchases"],"security":[{"BearerAuth":[]}],"x-required-scopes":["purchasing:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"supplier_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"returns_only","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"since_id","in":"query","required":false,"description":"Return rows with an id above this, for incremental sync.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/purchases/{pid}":{"get":{"summary":"One purchase invoice with its lines","tags":["purchases"],"security":[{"BearerAuth":[]}],"x-required-scopes":["purchasing:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/suppliers":{"get":{"summary":"Suppliers","tags":["suppliers"],"security":[{"BearerAuth":[]}],"x-required-scopes":["purchasing:read"],"parameters":[{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"include_disabled","in":"query","required":false,"description":"","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/expenses":{"get":{"summary":"Recorded expenses - barely used by the clinic","tags":["expenses"],"security":[{"BearerAuth":[]}],"x-required-scopes":["purchasing:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"method","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/expense-categories":{"get":{"summary":"Expense categories","tags":["expense-categories"],"security":[{"BearerAuth":[]}],"x-required-scopes":["purchasing:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/purchasing":{"get":{"summary":"Stock spend by supplier, month or item","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"Aggregation key.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/offers":{"get":{"summary":"Package offers and what each bundles","tags":["offers"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[{"name":"include_disabled","in":"query","required":false,"description":"","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/offers":{"get":{"summary":"What each offer actually earned","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/consents":{"get":{"summary":"Signed treatment consents and pre/post-care forms","tags":["consents"],"security":[{"BearerAuth":[]}],"x-required-scopes":["clinical:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"patient_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"doctor","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"signed","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/consents/{cid}":{"get":{"summary":"One consent form with its full text","tags":["consents"],"security":[{"BearerAuth":[]}],"x-required-scopes":["clinical:read"],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/patients/{pid}/consents":{"get":{"summary":"A patient's signed consents","tags":["patients"],"security":[{"BearerAuth":[]}],"x-required-scopes":["clinical:read"],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/consent-forms":{"get":{"summary":"The distinct consent forms in use and how often signed","tags":["consent-forms"],"security":[{"BearerAuth":[]}],"x-required-scopes":["clinical:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/audit/kizen":{"get":{"summary":"Kizen's own activity log - who worked on which screen","tags":["audit"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"user","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"screen","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"action","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"device","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/audit/kizen/activity":{"get":{"summary":"Staff activity summary by user, screen, action, device or day","tags":["audit"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"Aggregation key.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/medicines":{"get":{"summary":"Standard drug reference list","tags":["medicines"],"security":[{"BearerAuth":[]}],"x-required-scopes":["catalog:read"],"parameters":[{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/accounting/accounts":{"get":{"summary":"Chart of accounts","tags":["accounting"],"security":[{"BearerAuth":[]}],"x-required-scopes":["accounting:read"],"parameters":[{"name":"kind","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"parent_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"include_disabled","in":"query","required":false,"description":"","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/accounting/cost-centers":{"get":{"summary":"Cost centres, down to individual doctors","tags":["accounting"],"security":[{"BearerAuth":[]}],"x-required-scopes":["accounting:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/accounting/entries":{"get":{"summary":"Journal entries","tags":["accounting"],"security":[{"BearerAuth":[]}],"x-required-scopes":["accounting:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"created_by","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"posted","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Free-text search.","schema":{"type":"string"}},{"name":"since_id","in":"query","required":false,"description":"Return rows with an id above this, for incremental sync.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/accounting/entries/{eid}":{"get":{"summary":"One journal entry with its lines","tags":["accounting"],"security":[{"BearerAuth":[]}],"x-required-scopes":["accounting:read"],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/accounting/ledger":{"get":{"summary":"Account statement with opening balance and running total","tags":["accounting"],"security":[{"BearerAuth":[]}],"x-required-scopes":["accounting:read"],"parameters":[{"name":"account_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/accounting/trial-balance":{"get":{"summary":"Debits and credits per account for a period","tags":["accounting"],"security":[{"BearerAuth":[]}],"x-required-scopes":["accounting:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/cost-centers":{"get":{"summary":"Contribution per cost centre - the only route to per-doctor profitability","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/summary":{"get":{"summary":"Headline figures for a period","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/revenue":{"get":{"summary":"Collected revenue grouped by day, month, doctor, room, payment method or staff member","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"Aggregation key.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/services":{"get":{"summary":"Revenue by treatment category or service name","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"Aggregation key.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/attendance":{"get":{"summary":"No-show and attendance rates by doctor, weekday, hour, day or month","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"Aggregation key.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/retention":{"get":{"summary":"New versus returning patients and what each is worth","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/marketing":{"get":{"summary":"Channel attribution, from our own enrichment store","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/patients":{"get":{"summary":"Patient mix, growth and lifetime-value bands","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[{"name":"from","in":"query","required":false,"description":"Start of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End of the date range, inclusive (YYYY-MM-DD).","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/aging":{"get":{"summary":"Unpaid balances bucketed by invoice age","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/leads":{"post":{"summary":"Inbound enquiries that are not Kizen patients yet","tags":["leads"],"security":[{"BearerAuth":[]}],"x-required-scopes":["leads:write"],"parameters":[{"name":"status","in":"query","required":false,"description":"Filter by status. See /v1/lookups for valid values.","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"unmatched","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}},"get":{"summary":"Inbound enquiries that are not Kizen patients yet","tags":["leads"],"security":[{"BearerAuth":[]}],"x-required-scopes":["leads:write"],"parameters":[{"name":"status","in":"query","required":false,"description":"Filter by status. See /v1/lookups for valid values.","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"unmatched","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/queue/patients":{"post":{"summary":"Ask for a patient to be created (queued, not written)","tags":["queue"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:write"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/queue/appointments":{"post":{"summary":"Ask for an appointment to be booked (queued, not written)","tags":["queue"],"security":[{"BearerAuth":[]}],"x-required-scopes":["appointments:write"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/queue":{"get":{"summary":"The review queue: write requests awaiting a human at the clinic","tags":["queue"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:write"],"parameters":[{"name":"status","in":"query","required":false,"description":"Filter by status. See /v1/lookups for valid values.","schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/queue/{rid}":{"get":{"summary":"One queued request","tags":["queue"],"security":[{"BearerAuth":[]}],"x-required-scopes":["patients:write"],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/queue/{rid}/resolve":{"post":{"summary":"Close a queued request once the clinic has handled it","tags":["queue"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/queue/{rid}/apply":{"post":{"summary":"Enter an approved request into Kizen. Dry run unless confirm=true - the only write path in the API","tags":["queue"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analytics/snapshot":{"get":{"summary":"Everything the dashboard needs in one call: facts aggregated to day x dimension, cached for 5 minutes","tags":["analytics"],"security":[{"BearerAuth":[]}],"x-required-scopes":["analytics:read"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/sync/entities":{"get":{"summary":"Which entities support incremental sync","tags":["sync"],"security":[],"x-required-scopes":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/sync/changes":{"get":{"summary":"Rows created or possibly changed since a watermark","tags":["sync"],"security":[],"x-required-scopes":[],"parameters":[{"name":"entity","in":"query","required":false,"description":"patients | appointments | invoices | payments","schema":{"type":"string"}},{"name":"since_id","in":"query","required":false,"description":"Return rows with an id above this, for incremental sync.","schema":{"type":"string"}},{"name":"window_days","in":"query","required":false,"description":"Also re-read rows dated within this many days, to catch edits (default 30).","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/sync/state":{"get":{"summary":"Where this client got to on each entity","tags":["sync"],"security":[],"x-required-scopes":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/sync/counts":{"get":{"summary":"Row counts and high-water marks, for consistency checks","tags":["sync"],"security":[],"x-required-scopes":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/webhooks/events":{"get":{"summary":"Every event that can be subscribed to","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/webhooks":{"get":{"summary":"Webhook subscriptions for this client","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}},"post":{"summary":"Webhook subscriptions for this client","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/webhooks/{sub_id}":{"patch":{"summary":"Update or delete a subscription","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}},"delete":{"summary":"Update or delete a subscription","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/webhooks/{sub_id}/secret":{"get":{"summary":"Read back a subscription's signing secret","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/webhooks/{sub_id}/deliveries":{"get":{"summary":"Delivery log for a subscription","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/webhooks/{sub_id}/test":{"post":{"summary":"Queue a ping so a receiver can be verified","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/webhooks/status":{"get":{"summary":"How far the change poller has read each Kizen table","tags":["webhooks"],"security":[],"x-required-scopes":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/admin/scopes":{"get":{"summary":"Available scopes and ready-made presets","tags":["admin"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/admin/clients":{"get":{"summary":"Connected systems","tags":["admin"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}},"post":{"summary":"Connected systems","tags":["admin"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/admin/clients/{cid}":{"patch":{"summary":"Update a connected system","tags":["admin"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/admin/clients/{cid}/keys":{"post":{"summary":"Issue another key for a client","tags":["admin"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/admin/keys/{kid}":{"delete":{"summary":"Revoke a key","tags":["admin"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[{"name":"kid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/admin/audit":{"get":{"summary":"Every call made through this API","tags":["admin"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[{"name":"client_id","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"path","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Filter by status. See /v1/lookups for valid values.","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"string"}},{"name":"page_size","in":"query","required":false,"description":"Rows per page, up to 500.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/admin/usage":{"get":{"summary":"Per-client traffic over the last 7 days","tags":["admin"],"security":[{"BearerAuth":[]}],"x-required-scopes":["admin"],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}},"/v1/admin/whoami":{"get":{"summary":"What the presented key is allowed to do","tags":["admin"],"security":[],"x-required-scopes":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Key lacks a required scope"},"429":{"description":"Rate limit exceeded"}}}}}}
