Provet Cloud Appointments API

Create appointments and drive an online booking platform - book appointments against a department, reason, and supervising user, send appointment confirmations, create appointment reminders, and register online-booking clients and patients as part of a self-service booking flow.

OpenAPI Specification

provet-cloud-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Provet Cloud REST API
  description: >-
    The Provet Cloud REST API gives approved integration partners programmatic
    access to the data in a Provet Cloud veterinary practice management (PIMS)
    installation built by Nordhealth. The API is browsable, returns JSON, and is
    versioned at 0.1. The base URL is installation-specific:
    https://provetcloud.com/<provet_id>/api/0.1/ (or a regional domain such as
    us.provetcloud.com or enterprise.provetcloud.com). Requests are authorized
    with OAuth 2.0 - Client Credentials for backend services, or Authorization
    Code with PKCE for user-facing apps - using the token endpoint
    https://provetcloud.com/<provet_id>/oauth2/token/ and the "restapi" scope.
    A legacy "Authorization: Token <key>" header exists but is deprecated.
    Integrations must be registered and approved by Provet's support team per
    installation, so exact request/response schemas are seen against a live
    instance; the paths below are grounded in the public documentation, and
    request/response bodies are modeled where the public how-to pages do not
    print a full schema.
  version: '0.1'
  contact:
    name: Provet Cloud (Nordhealth)
    url: https://developers.provetcloud.com/restapi/
servers:
  - url: https://provetcloud.com/{provet_id}/api/0.1
    description: Provet Cloud installation (EU / default region)
    variables:
      provet_id:
        default: '0'
        description: Your installation's unique Provet Cloud ID.
  - url: https://us.provetcloud.com/{provet_id}/api/0.1
    description: Provet Cloud installation (US region)
    variables:
      provet_id:
        default: '0'
        description: Your installation's unique Provet Cloud ID.
security:
  - oauth2: []
tags:
  - name: Clients
    description: Animal owners / bill payers.
  - name: Patients
    description: The animals under care.
  - name: Appointments
    description: Appointments and online booking.
  - name: Consultations
    description: Clinical visits and their items.
  - name: Billing
    description: Invoices, refunds, and payments.
  - name: Reference Data
    description: Items, departments, users, and code lists.
  - name: Webhooks
    description: Event subscriptions.
paths:
  /client/:
    get:
      operationId: listClients
      tags: [Clients]
      summary: List clients
      description: >-
        Fetch clients with optional filters such as firstname, lastname,
        organization name, email, phone number, and archived status. Confirmed
        in the Clients & Patients how-to.
      parameters:
        - { name: firstname, in: query, schema: { type: string } }
        - { name: lastname, in: query, schema: { type: string } }
        - { name: email, in: query, schema: { type: string } }
        - { name: archived, in: query, schema: { type: boolean } }
      responses:
        '200':
          description: A paginated list of clients.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/ClientList' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '429': { $ref: '#/components/responses/RateLimited' }
    post:
      operationId: createClient
      tags: [Clients]
      summary: Create a client
      description: Create a new client record (name, email, country, customer type).
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Client' }
      responses:
        '201':
          description: The created client.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Client' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '429': { $ref: '#/components/responses/RateLimited' }
  /client/{id}/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    patch:
      operationId: updateClient
      tags: [Clients]
      summary: Update a client
      description: Patch specific client fields such as email or communication preferences.
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Client' }
      responses:
        '200':
          description: The updated client.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Client' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /client/{id}/custom_field_values/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: getClientCustomFieldValues
      tags: [Clients]
      summary: Get client custom field values
      responses:
        '200': { description: Custom field values for the client. }
    post:
      operationId: setClientCustomFieldValues
      tags: [Clients]
      summary: Set client custom field values
      responses:
        '200': { description: Updated custom field values. }
  /phonenumber/:
    get:
      operationId: listPhoneNumbers
      tags: [Clients]
      summary: List phone numbers
      description: List phone numbers associated with a client.
      responses:
        '200': { description: A list of phone numbers. }
    post:
      operationId: createPhoneNumber
      tags: [Clients]
      summary: Add a phone number
      description: Add a phone number to a client record.
      responses:
        '201': { description: The created phone number. }
  /patient/:
    get:
      operationId: listPatients
      tags: [Patients]
      summary: List patients
      description: >-
        Fetch patients (animals) with filters such as client ID, name, microchip,
        species, and modification date.
      parameters:
        - { name: client, in: query, schema: { type: integer } }
        - { name: microchip, in: query, schema: { type: string } }
        - { name: species, in: query, schema: { type: string } }
      responses:
        '200':
          description: A paginated list of patients.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/PatientList' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '429': { $ref: '#/components/responses/RateLimited' }
    post:
      operationId: createPatient
      tags: [Patients]
      summary: Create a patient
      description: Create a single patient record linked to a client.
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Patient' }
      responses:
        '201':
          description: The created patient.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Patient' }
  /patient/bulk/:
    post:
      operationId: bulkCreatePatients
      tags: [Patients]
      summary: Bulk create patients
      description: Create multiple patients in a single request, with partial success support.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items: { $ref: '#/components/schemas/Patient' }
      responses:
        '200': { description: Per-record creation results. }
  /patient/{id}/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    patch:
      operationId: updatePatient
      tags: [Patients]
      summary: Update a patient
      description: Patch patient details such as microchip, weight, or deceased status.
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Patient' }
      responses:
        '200':
          description: The updated patient.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Patient' }
  /patient/{id}/custom_field_values/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: getPatientCustomFieldValues
      tags: [Patients]
      summary: Get patient custom field values
      responses:
        '200': { description: Custom field values for the patient. }
    post:
      operationId: setPatientCustomFieldValues
      tags: [Patients]
      summary: Set patient custom field values
      responses:
        '200': { description: Updated custom field values. }
  /appointment/:
    post:
      operationId: createAppointment
      tags: [Appointments]
      summary: Create an appointment
      description: >-
        Create an appointment against a department, reason, and supervising user.
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Appointment' }
      responses:
        '201':
          description: The created appointment.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Appointment' }
  /appointment/{id}/send_appointment_confirmation/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: sendAppointmentConfirmation
      tags: [Appointments]
      summary: Send appointment confirmation
      description: Send a confirmation email/SMS for an appointment.
      responses:
        '200': { description: Confirmation queued. }
  /appointment_reminder/:
    post:
      operationId: createAppointmentReminder
      tags: [Appointments]
      summary: Create an appointment reminder
      responses:
        '201': { description: The created reminder. }
  /onlinebookingclient/:
    post:
      operationId: createOnlineBookingClient
      tags: [Appointments]
      summary: Create an online booking client
      description: Register a client as part of a self-service online booking flow.
      responses:
        '201': { description: The created online booking client. }
  /onlinebookingpatient/:
    post:
      operationId: createOnlineBookingPatient
      tags: [Appointments]
      summary: Create an online booking patient
      description: Register a patient as part of a self-service online booking flow.
      responses:
        '201': { description: The created online booking patient. }
  /consultation/:
    get:
      operationId: listConsultations
      tags: [Consultations]
      summary: List consultations
      description: Retrieve and filter existing consultations.
      responses:
        '200':
          description: A paginated list of consultations.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/ConsultationList' }
    post:
      operationId: createConsultation
      tags: [Consultations]
      summary: Create a consultation
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Consultation' }
      responses:
        '201':
          description: The created consultation.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Consultation' }
  /consultation/{id}/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: getConsultation
      tags: [Consultations]
      summary: Get a consultation
      responses:
        '200':
          description: The consultation.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Consultation' }
  /consultation/{id}/update_status/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: updateConsultationStatus
      tags: [Consultations]
      summary: Update consultation status
      description: Advance a consultation through its lifecycle states.
      responses:
        '200': { description: Updated status. }
  /consultation/{id}/mark_sent/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: markConsultationSent
      tags: [Consultations]
      summary: Mark consultation sent
      description: Mark a consultation as exported to an external system.
      responses:
        '200': { description: Marked as sent. }
  /consultation/{id}/medicines/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: listConsultationMedicines
      tags: [Consultations]
      summary: List consultation medicines
      responses:
        '200': { description: Medicines on the consultation. }
    post:
      operationId: addConsultationMedicine
      tags: [Consultations]
      summary: Add a medicine to a consultation
      responses:
        '201': { description: The added medicine item. }
  /consultation/{id}/procedures/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: listConsultationProcedures
      tags: [Consultations]
      summary: List consultation procedures
      responses:
        '200': { description: Procedures on the consultation. }
    post:
      operationId: addConsultationProcedure
      tags: [Consultations]
      summary: Add a procedure to a consultation
      responses:
        '201': { description: The added procedure item. }
  /consultation/{id}/supplies/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: listConsultationSupplies
      tags: [Consultations]
      summary: List consultation supplies
      responses:
        '200': { description: Supplies on the consultation. }
    post:
      operationId: addConsultationSupply
      tags: [Consultations]
      summary: Add a supply to a consultation
      responses:
        '201': { description: The added supply item. }
  /consultation/{id}/foods/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: listConsultationFoods
      tags: [Consultations]
      summary: List consultation foods
      responses:
        '200': { description: Food items on the consultation. }
    post:
      operationId: addConsultationFood
      tags: [Consultations]
      summary: Add a food item to a consultation
      responses:
        '201': { description: The added food item. }
  /consultation/{id}/consultationdiagnosis/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: addConsultationDiagnosis
      tags: [Consultations]
      summary: Add a diagnosis to a consultation
      description: Record a diagnosis linked to the patient on this consultation.
      responses:
        '201': { description: The added diagnosis. }
  /consultation/{id}/consultationnote/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: addConsultationNote
      tags: [Consultations]
      summary: Add a note to a consultation
      description: Add a clinical note (history, observations, preliminary).
      responses:
        '201': { description: The added note. }
  /consultation/{id}/consultationdischargeinstruction/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: addConsultationDischargeInstruction
      tags: [Consultations]
      summary: Add a discharge instruction
      description: Document post-visit patient care instructions.
      responses:
        '201': { description: The added discharge instruction. }
  /consultationitem/:
    get:
      operationId: listConsultationItems
      tags: [Consultations]
      summary: List consultation items
      description: Read-only access to all clinical items across types.
      responses:
        '200': { description: A list of consultation items. }
  /invoice/:
    get:
      operationId: listInvoices
      tags: [Billing]
      summary: List invoices
      description: Retrieve invoices with filtering options.
      responses:
        '200':
          description: A paginated list of invoices.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/InvoiceList' }
  /invoice/{id}/full_refund/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: fullRefundInvoice
      tags: [Billing]
      summary: Full refund (credit note)
      description: Generate a complete credit note for an invoice.
      responses:
        '200': { description: The credit note. }
  /invoice/{id}/partial_refund/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: partialRefundInvoice
      tags: [Billing]
      summary: Partial refund (credit note)
      description: Generate a partial credit note for selected invoice rows.
      responses:
        '200': { description: The partial credit note. }
  /invoicerow/:
    get:
      operationId: listInvoiceRows
      tags: [Billing]
      summary: List invoice rows
      description: Fetch line items for invoices.
      responses:
        '200': { description: A list of invoice rows. }
  /invoicerow/{id}/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: getInvoiceRow
      tags: [Billing]
      summary: Get an invoice row
      description: Retrieve an invoice row, optionally exposing related fields.
      responses:
        '200': { description: The invoice row. }
  /invoicepayment/:
    get:
      operationId: listInvoicePayments
      tags: [Billing]
      summary: List invoice payments
      responses:
        '200': { description: A list of payments. }
    post:
      operationId: createInvoicePayment
      tags: [Billing]
      summary: Record an invoice payment
      description: >-
        Record a payment against a finalized invoice (status 3). Payments can
        only be recorded against finalized invoices.
      responses:
        '201': { description: The recorded payment. }
  /invoicepayment/{id}/cancel_payment/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    post:
      operationId: cancelInvoicePayment
      tags: [Billing]
      summary: Cancel an invoice payment
      description: Reverse an incorrectly recorded payment.
      responses:
        '200': { description: The cancelled payment. }
  /unallocatedpayment/:
    get:
      operationId: listUnallocatedPayments
      tags: [Billing]
      summary: List unallocated payments
      description: Retrieve prepayment records and available balances.
      responses:
        '200': { description: A list of unallocated payments. }
    post:
      operationId: createUnallocatedPayment
      tags: [Billing]
      summary: Record an unallocated payment
      description: Record funds received before invoice creation (a prepayment).
      responses:
        '201': { description: The recorded prepayment. }
  /item/:
    get:
      operationId: listItems
      tags: [Reference Data]
      summary: List items
      description: Retrieve the master catalog for medicines, procedures, supplies, and food.
      responses:
        '200': { description: A list of catalog items. }
  /department/{id}/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: getDepartment
      tags: [Reference Data]
      summary: Get a department
      responses:
        '200': { description: The department. }
  /reason/{id}/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: getReason
      tags: [Reference Data]
      summary: Get an appointment reason
      responses:
        '200': { description: The appointment reason. }
  /user/{id}/:
    parameters:
      - { name: id, in: path, required: true, schema: { type: integer } }
    get:
      operationId: getUser
      tags: [Reference Data]
      summary: Get a user
      responses:
        '200': { description: The user. }
  /custom_fields/:
    get:
      operationId: listCustomFields
      tags: [Reference Data]
      summary: List custom field definitions
      description: List all custom field definitions for the installation.
      responses:
        '200': { description: A list of custom field definitions. }
  /codelist/species/:
    get:
      operationId: listSpeciesCodes
      tags: [Reference Data]
      summary: List species codes
      responses:
        '200': { description: Valid species codes. }
  /codelist/breeds/:
    get:
      operationId: listBreedCodes
      tags: [Reference Data]
      summary: List breed codes
      responses:
        '200': { description: Valid breed codes. }
  /codelist/diagnoses/:
    get:
      operationId: listDiagnosisCodes
      tags: [Reference Data]
      summary: List diagnosis codes
      responses:
        '200': { description: Available diagnostic codes. }
  /webhook/:
    get:
      operationId: listWebhooks
      tags: [Webhooks]
      summary: List webhooks
      description: >-
        List webhook subscriptions. Webhooks can also be managed in Settings >
        General > Integrations > Webhooks; automating creation via the API is
        recommended. Path modeled from the documented webhook-management behavior.
      responses:
        '200': { description: A list of webhook subscriptions. }
    post:
      operationId: createWebhook
      tags: [Webhooks]
      summary: Create a webhook
      description: >-
        Create a webhook subscription for a trigger, scoped organization-wide or
        to a department. Provet Cloud POSTs the changed object's ID to the target
        URL and retries up to 10 times on non-200 responses.
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Webhook' }
      responses:
        '201': { description: The created webhook subscription. }
components:
  securitySchemes:
    oauth2:
      type: oauth2
      description: >-
        OAuth 2.0. Client Credentials for backend services; Authorization Code
        with PKCE for user-facing apps. Token endpoint is
        https://provetcloud.com/<provet_id>/oauth2/token/ with scope "restapi".
      flows:
        clientCredentials:
          tokenUrl: https://provetcloud.com/0/oauth2/token/
          scopes:
            restapi: Access the Provet Cloud REST API.
        authorizationCode:
          authorizationUrl: https://provetcloud.com/0/oauth2/authorize/
          tokenUrl: https://provetcloud.com/0/oauth2/token/
          scopes:
            restapi: Access the Provet Cloud REST API.
            openid: Obtain additional user details.
  responses:
    Unauthorized:
      description: Missing or invalid OAuth 2.0 access token.
    RateLimited:
      description: >-
        Too Many Requests. Rate limits are per-endpoint over a rolling 60-second
        window; a Retry-After header indicates how long to wait.
      headers:
        Retry-After:
          schema: { type: integer }
          description: Seconds to wait before retrying.
  schemas:
    Client:
      type: object
      description: An animal owner / bill payer.
      properties:
        id: { type: integer, readOnly: true }
        firstname: { type: string }
        lastname: { type: string }
        organization_name: { type: string }
        email: { type: string, format: email }
        country: { type: string }
        customer_type: { type: integer }
        archived: { type: boolean }
    ClientList:
      type: object
      properties:
        count: { type: integer }
        next: { type: string, nullable: true }
        previous: { type: string, nullable: true }
        results:
          type: array
          items: { $ref: '#/components/schemas/Client' }
    Patient:
      type: object
      description: An animal under care, linked to a client.
      properties:
        id: { type: integer, readOnly: true }
        client: { type: integer }
        name: { type: string }
        species: { type: integer }
        breed: { type: integer }
        gender: { type: string }
        microchip: { type: string }
        weight: { type: number }
        deceased: { type: boolean }
        date_of_registration: { type: string, format: date }
    PatientList:
      type: object
      properties:
        count: { type: integer }
        next: { type: string, nullable: true }
        previous: { type: string, nullable: true }
        results:
          type: array
          items: { $ref: '#/components/schemas/Patient' }
    Appointment:
      type: object
      properties:
        id: { type: integer, readOnly: true }
        client: { type: integer }
        patient: { type: integer }
        department: { type: integer }
        reason: { type: integer }
        supervising_user: { type: integer }
        start_time: { type: string, format: date-time }
        end_time: { type: string, format: date-time }
    Consultation:
      type: object
      properties:
        id: { type: integer, readOnly: true }
        client: { type: integer }
        patients:
          type: array
          items: { type: integer }
        department: { type: integer }
        complaint: { type: string }
        admitted_time: { type: string, format: date-time }
        status: { type: integer }
    ConsultationList:
      type: object
      properties:
        count: { type: integer }
        next: { type: string, nullable: true }
        previous: { type: string, nullable: true }
        results:
          type: array
          items: { $ref: '#/components/schemas/Consultation' }
    InvoiceList:
      type: object
      properties:
        count: { type: integer }
        next: { type: string, nullable: true }
        previous: { type: string, nullable: true }
        results:
          type: array
          items:
            type: object
            properties:
              id: { type: integer }
              status:
                type: integer
                description: 3 = Finalized (required before recording payments).
              total: { type: number }
    Webhook:
      type: object
      properties:
        id: { type: integer, readOnly: true }
        name: { type: string }
        trigger:
          type: string
          description: One of the 60+ documented webhook triggers.
        url: { type: string, format: uri }
        department:
          type: integer
          nullable: true
          description: If empty, the webhook is organization-wide.
        active: { type: boolean }