openapi: 3.0.1 info: title: Akute Health Customer API description: >- REST API for the Akute Health automation-first EHR platform. Exposes FHIR-aligned resources - patients, appointments, clinical notes (encounters), tasks, documents, medications and e-prescribing, lab orders, diagnostic reports and observations - plus webhook subscriptions for resource events. Authentication uses an API key passed in the X-API-Key header. Webhook deliveries are signed with HMAC-SHA256 in the x-akute-signature header. termsOfService: https://www.akutehealth.com/ contact: name: Akute Health Support email: support@akutehealth.com url: https://developer.akutehealth.com/ version: '1.0' servers: - url: https://api.akutehealth.com/v1 description: Production - url: https://api.staging.akutehealth.com/v1 description: Staging security: - APIKeyHeader: [] tags: - name: Patients - name: Appointments - name: Encounters - name: Tasks - name: Documents - name: Medications - name: Labs - name: Webhooks paths: /patients: post: operationId: createPatient tags: [Patients] summary: Create a patient requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PatientCreate' responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/Patient' get: operationId: searchPatients tags: [Patients] summary: Search patients description: >- Search patients by demographics, contact details, or external_id. Returns a paginated list. parameters: - name: external_id in: query schema: { type: string } - name: first_name in: query schema: { type: string } - name: last_name in: query schema: { type: string } - name: middle_name in: query schema: { type: string } - name: date_of_birth in: query schema: { type: string, format: date } - name: sex in: query schema: { type: string, enum: [male, female, other, unknown] } - name: email in: query schema: { type: string, format: email } - name: primary_phone_number in: query schema: { type: string } - name: status in: query schema: { type: string, enum: [active, inactive] } - name: limit in: query schema: { type: integer, default: 100 } - name: offset in: query schema: { type: integer, default: 0 } responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/Patient' /patients/{patient_id}: get: operationId: getPatient tags: [Patients] summary: Get a patient by id parameters: - $ref: '#/components/parameters/PatientId' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Patient' put: operationId: updatePatient tags: [Patients] summary: Update a patient parameters: - $ref: '#/components/parameters/PatientId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PatientCreate' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Patient' /patients/{patient_id}/external_ids: get: operationId: getPatientExternalIds tags: [Patients] summary: Get a patient's external ids parameters: - $ref: '#/components/parameters/PatientId' responses: '200': description: OK /appointments: post: operationId: createAppointment tags: [Appointments] summary: Create an appointment requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Appointment' responses: '201': description: Created get: operationId: searchAppointments tags: [Appointments] summary: Search appointments parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: practitioner_user_id in: query schema: { type: string } - name: start_range in: query schema: { type: string } - name: end_range in: query schema: { type: string } - name: status in: query schema: { type: string, enum: [booked, fulfilled, cancelled, noshow] } responses: '200': description: OK /appointments/{appointment_id}: get: operationId: getAppointment tags: [Appointments] summary: Get an appointment by id parameters: - $ref: '#/components/parameters/AppointmentId' responses: '200': description: OK put: operationId: updateAppointment tags: [Appointments] summary: Update an appointment parameters: - $ref: '#/components/parameters/AppointmentId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Appointment' responses: '200': description: OK delete: operationId: deleteAppointment tags: [Appointments] summary: Cancel/delete an appointment parameters: - $ref: '#/components/parameters/AppointmentId' responses: '200': description: OK /appointment_types: get: operationId: listAppointmentTypes tags: [Appointments] summary: List appointment types responses: '200': description: OK /availability: get: operationId: getAvailability tags: [Appointments] summary: Get practitioner availability parameters: - name: user_id in: query required: true schema: { type: string } - name: start_time in: query schema: { type: string, format: date-time } - name: end_time in: query schema: { type: string, format: date-time } responses: '200': description: OK /notes: post: operationId: createNote tags: [Encounters] summary: Create a clinical note (encounter) requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Note' responses: '201': description: Created get: operationId: searchNotes tags: [Encounters] summary: Search clinical notes parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: status in: query schema: { type: string, enum: [preliminary, final] } - name: service_date_start in: query schema: { type: string, format: date } - name: limit in: query schema: { type: integer } - name: offset in: query schema: { type: integer } responses: '200': description: OK /notes/{note_id}: get: operationId: getNote tags: [Encounters] summary: Get a clinical note by id parameters: - name: note_id in: path required: true schema: { type: string } responses: '200': description: OK /tasks: post: operationId: createTask tags: [Tasks] summary: Create a task requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Task' responses: '201': description: Created get: operationId: searchTasks tags: [Tasks] summary: Search tasks parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: owner_id in: query schema: { type: string } - name: status in: query schema: type: array items: type: string enum: [not-started, in-progress, completed] - name: priority in: query schema: { type: string, enum: [p1, p2, p3] } - name: due_date in: query schema: { type: string, format: date } - name: archived in: query schema: { type: boolean } - name: limit in: query schema: { type: integer } - name: offset in: query schema: { type: integer } responses: '200': description: OK /tasks/{task_id}: get: operationId: getTask tags: [Tasks] summary: Get a task by id parameters: - name: task_id in: path required: true schema: { type: string } responses: '200': description: OK put: operationId: updateTask tags: [Tasks] summary: Update a task parameters: - name: task_id in: path required: true schema: { type: string } requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Task' responses: '200': description: OK /documents: post: operationId: createDocument tags: [Documents] summary: Upload a document requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary patient_id: type: string responses: '201': description: Created get: operationId: searchDocuments tags: [Documents] summary: Search documents parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: no_patient in: query schema: { type: boolean } - name: sort in: query schema: { type: string, example: 'created_at:asc' } - name: limit in: query schema: { type: integer } - name: offset in: query schema: { type: integer } responses: '200': description: OK /documents/{document_id}: get: operationId: getDocument tags: [Documents] summary: Get a document by id parameters: - name: document_id in: path required: true schema: { type: string } responses: '200': description: OK /medications: get: operationId: searchMedications tags: [Medications] summary: Search medications or list a patient's medications parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: search_term in: query schema: { type: string } - name: start_date in: query schema: { type: string, format: date } - name: end_date in: query schema: { type: string, format: date } responses: '200': description: OK /medications/select: get: operationId: selectDispensableDrug tags: [Medications] summary: Look up a dispensable drug parameters: - name: dispensable_drug_id in: query required: true schema: { type: string } responses: '200': description: OK /medications/history: get: operationId: getMedicationHistory tags: [Medications] summary: Retrieve Surescripts medication history parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: prescriber_user_id in: query schema: { type: string } - name: start_date in: query schema: { type: string, format: date } - name: end_date in: query schema: { type: string, format: date } responses: '200': description: OK /medications/history/cached: get: operationId: getCachedMedicationHistory tags: [Medications] summary: Retrieve cached medication history parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } responses: '200': description: OK /procedures: get: operationId: searchProcedures tags: [Labs] summary: Search lab procedures parameters: - name: query in: query schema: { type: string } - name: performer_organization_id in: query schema: { type: string } - name: limit in: query schema: { type: integer } - name: offset in: query schema: { type: integer } responses: '200': description: OK /facilities: get: operationId: searchFacilities tags: [Labs] summary: Search lab facilities parameters: - name: name in: query schema: { type: string } - name: zipcode in: query schema: { type: string } - name: distance in: query schema: { type: integer } responses: '200': description: OK /orders: post: operationId: createOrder tags: [Labs] summary: Create a lab order requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OrderCreate' responses: '201': description: Created content: application/json: schema: type: object properties: id: { type: string } '202': description: Accepted (pending) content: application/json: schema: type: object properties: request_id: { type: string } get: operationId: searchOrders tags: [Labs] summary: Search lab orders parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: authoring_user_id in: query schema: { type: string } - name: start_date_range in: query schema: { type: string, format: date } responses: '200': description: OK /orders/{order_id}: get: operationId: getOrder tags: [Labs] summary: Get a lab order by id parameters: - $ref: '#/components/parameters/OrderId' responses: '200': description: OK /orders/requests/{order_request_id}: get: operationId: getOrderRequest tags: [Labs] summary: Get a lab order request status parameters: - name: order_request_id in: path required: true schema: { type: string } responses: '200': description: OK /orders/{order_id}/pdf: get: operationId: getOrderPdf tags: [Labs] summary: Get a lab order requisition PDF parameters: - $ref: '#/components/parameters/OrderId' responses: '200': description: OK content: application/pdf: schema: type: string format: binary /diagnosticreport: get: operationId: searchDiagnosticReports tags: [Labs] summary: Search diagnostic reports parameters: - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: order_id in: query schema: { type: string } - name: start_date_range in: query schema: { type: string, format: date } - name: limit in: query schema: { type: integer } - name: offset in: query schema: { type: integer } responses: '200': description: OK /diagnosticreport/{diagnostic_report_id}: get: operationId: getDiagnosticReport tags: [Labs] summary: Get a diagnostic report by id parameters: - $ref: '#/components/parameters/DiagnosticReportId' responses: '200': description: OK put: operationId: updateDiagnosticReport tags: [Labs] summary: Update a diagnostic report parameters: - $ref: '#/components/parameters/DiagnosticReportId' responses: '200': description: OK /diagnosticreport/{diagnostic_report_id}/pdf: get: operationId: getDiagnosticReportPdf tags: [Labs] summary: Get a diagnostic report PDF parameters: - $ref: '#/components/parameters/DiagnosticReportId' responses: '200': description: OK content: application/pdf: schema: type: string format: binary /observations: get: operationId: searchObservations tags: [Labs] summary: Search observations (lab results, vital signs) parameters: - name: category in: query schema: { type: string, enum: [laboratory, vital-signs] } - name: patient_id in: query schema: { type: string } - name: external_patient_id in: query schema: { type: string } - name: diagnostic_report_id in: query schema: { type: string } - name: order_id in: query schema: { type: string } responses: '200': description: OK /observations/{observation_id}: get: operationId: getObservation tags: [Labs] summary: Get an observation by id parameters: - name: observation_id in: path required: true schema: { type: string } responses: '200': description: OK /webhooks: get: operationId: listWebhooks tags: [Webhooks] summary: List webhook subscriptions parameters: - name: start_time in: query schema: { type: string, format: date-time } - name: end_time in: query schema: { type: string, format: date-time } responses: '200': description: OK /webhooks/{webhook_id}: get: operationId: getWebhook tags: [Webhooks] summary: Get a webhook subscription by id parameters: - name: webhook_id in: path required: true schema: { type: string } responses: '200': description: OK post: operationId: updateWebhook tags: [Webhooks] summary: Update a webhook subscription parameters: - name: webhook_id in: path required: true schema: { type: string } requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Webhook' responses: '200': description: OK components: securitySchemes: APIKeyHeader: type: apiKey in: header name: X-API-Key description: >- API key created on the Settings -> Developer page in Akute. Required on every request. parameters: PatientId: name: patient_id in: path required: true schema: { type: string } AppointmentId: name: appointment_id in: path required: true schema: { type: string } OrderId: name: order_id in: path required: true schema: { type: string } DiagnosticReportId: name: diagnostic_report_id in: path required: true schema: { type: string } schemas: Patient: type: object properties: id: { type: string } external_id: { type: string } first_name: { type: string } middle_name: { type: string } last_name: { type: string } date_of_birth: { type: string, format: date } sex: { type: string, enum: [male, female, other, unknown] } status: { type: string, enum: [active, inactive] } email: { type: string, format: email } primary_phone_number: { type: string } primary_phone_type: { type: string, enum: [mobile, home, work] } address_line_1: { type: string } address_line_2: { type: string } address_city: { type: string } address_state: { type: string } address_zipcode: { type: string } PatientCreate: type: object required: [first_name, last_name, date_of_birth, sex, status] properties: external_id: { type: string } first_name: { type: string } middle_name: { type: string } last_name: { type: string } date_of_birth: { type: string, format: date } sex: { type: string, enum: [male, female, other, unknown] } status: { type: string, enum: [active, inactive] } email: { type: string, format: email } primary_phone_number: { type: string } primary_phone_type: { type: string, enum: [mobile, home, work] } address_line_1: { type: string } address_line_2: { type: string } address_city: { type: string } address_state: { type: string } address_zipcode: { type: string } Appointment: type: object properties: id: { type: string } patient_id: { type: string } external_patient_id: { type: string } practitioner_user_id: { type: string } appointment_type_id: { type: string } start_time: { type: string, format: date-time } end_time: { type: string, format: date-time } status: { type: string, enum: [booked, fulfilled, cancelled, noshow] } description: { type: string } Note: type: object required: [type, authors, sections] properties: id: { type: string } type: type: string description: Type of note (e.g. Progress note, Phone note). patient_id: { type: string } external_patient_id: { type: string } service_date: { type: string, format: date } status: { type: string, enum: [preliminary, final] } signed: type: object properties: user_id: { type: string } authors: type: array items: type: object properties: user_id: { type: string } sections: type: array items: type: object properties: title: { type: string } text: { type: string } Task: type: object required: [task] properties: id: { type: string } task: { type: string } description: { type: string } due_date: { type: string, format: date } owner_id: { type: string } patient_id: { type: string } priority: { type: string, enum: [p1, p2, p3] } status: { type: string, enum: [not-started, in-progress, completed] } tags: type: array items: { type: string } OrderCreate: type: object required: [procedures] properties: patient_id: { type: string } external_patient_id: { type: string } procedures: type: array items: { type: string } billing_type: { type: string } delivery_option: { type: string } ordering_user_id: { type: string } performer_organization_id: { type: string } account_number: { type: string } diagnoses: type: array items: { type: string } Webhook: type: object properties: id: { type: string } resource: type: string enum: - patients - appointments - notes - tasks - medications - medicationPriorAuths - diagnosticReports - orders - orderRequests - faxes - conversations - conversationMessages event: type: string enum: [create, update, request] destination: { type: string, format: uri } secret: { type: string }