Akute Appointments API

Book, update, cancel, and search appointments, list appointment types, and query practitioner availability windows for scheduling across the practice.

OpenAPI Specification

akute-openapi.yml Raw ↑
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 }