Jane Appointments API

The Appointments API from Jane — 2 operation(s) for appointments.

Operations 2

GET /api/2026-01-01/appointments/{appointment_id} Get an Appointment #
GET /api/2026-01-01/appointments List Appointments #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/jane-app-appointments-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

jane-app-appointments-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: JDP Appointments API
  description: 'Open API specification for the JDP API


    ## Rate Limits


    All JDP API endpoints have a rate limit of **100 requests per minute** per endpoint per clinic.


    Rate limit information is returned in response headers:

    - `X-Throttle-Match`: Rate limit identifier

    - `Retry-After`: Number of seconds to wait before retrying (when rate limited)


    When rate limits are exceeded, the API returns a 429 status code with a `Retry-After` header.


    ### Affected Endpoints:

    - `/api/2026-01-01/treatments`

    - `/api/2026-01-01/appointments`

    - `/api/2026-01-01/locations`

    - `/api/2026-01-01/disciplines`

    - `/api/2026-01-01/patients`

    - `/api/2026-01-01/staff_members`

    - `/api/2026-01-01/company`

    - `/api/2026-01-01/medical-record/medications`'
  version: '2026-01-01'
servers:
- url: https://jdpdocsdemo.jane.qa
  description: Partner playground clinic
security:
- OAuth2: []
tags:
- name: Appointments
paths:
  /api/2026-01-01/appointments/{appointment_id}:
    get:
      operationId: getAnAppointment
      summary: Get an Appointment
      description: Retrieve detailed appointment information using its unique identifier
      tags:
      - Appointments
      security:
      - OAuth2:
        - appointments:read
      parameters:
      - name: appointment_id
        in: path
        required: true
        description: The ID of the appointment
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: The appointment
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/appointment'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors_message_response'
        '404':
          description: The appointment was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors_message_response'
        '429':
          description: Rate limit exceeded - 100 requests per minute per endpoint per clinic
          headers:
            X-Throttle-Match:
              description: Rate limit identifier
              schema:
                type: string
              example: marketing_api/ip/clinic
            Retry-After:
              description: Number of seconds to wait before retrying
              schema:
                type: integer
              example: 60
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
  /api/2026-01-01/appointments:
    get:
      operationId: listAppointmentsVersioned
      summary: List Appointments
      description: 'List Appointments. This endpoint only returns one on one bookings. Excludes class bookings, group appointments, etc.


        Filtering:

        Filter records by field values using the format: field[operator]=value


        Available fields:

        - `public_id`: string

        - `start_at`: ISO 8601 datetime (e.g. 2025-01-01T12:00:00Z)

        - `end_at`: ISO 8601 datetime

        - `patient_id`: UUID String

        - `staff_member_id`: UUID String

        - `location_id`: UUID String

        - `treatment_id`: UUID String

        - `created_at`: ISO 8601 datetime

        - `updated_at`: ISO 8601 datetime


        Available operators:

        - `eq`: Equals

        - `gt`: Greater than

        - `gte`: Greater than or equal

        - `lt`: Less than

        - `lte`: Less than or equal


        Date-time filters (ex. `start_at`, `end_at`, `created_at`, `updated_at`) must:

        - Use [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time format

        - Be **precise to the second** (e.g. `2025-01-01T12:00:00Z`)


        Examples:

        ```

        /appointments?public_id[eq]=abc123

        /appointments?created_at[gte]=2025-01-01T00:00:00Z&created_at[lt]=2025-01-02T00:00:00Z

        ```

        '
      tags:
      - Appointments
      security:
      - OAuth2:
        - appointments:read
      parameters:
      - $ref: '#/components/parameters/page_cursor'
      - $ref: '#/components/parameters/page_limit'
      - name: sort
        in: query
        required: false
        description: 'Comma-separated list of fields to sort by. Prefix a field with ''-'' for descending order.


          Examples:

          - `sort=name,-created_at` sorts by `name` ascending, then `created_at` descending.

          - `sort=-updated_at` sorts by `updated_at` descending.


          Available fields:

          - `start_at`

          - `end_at`

          - `booked_at`

          - `created_at`

          - `updated_at`

          '
        schema:
          type: string
      - name: public_id
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `public_id`. Example: `public_id[eq]=123`'
        schema:
          $ref: '#/components/schemas/StringFilterSchema'
      - name: start_at
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `start_at` timestamp (ISO 8601). Example: `start_at[gte]=2025-01-01T00:00:00Z`'
        schema:
          $ref: '#/components/schemas/DateTimeFilterSchema'
      - name: end_at
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `end_at` timestamp (ISO 8601). Example: `end_at[lte]=2025-01-02T00:00:00Z`'
        schema:
          $ref: '#/components/schemas/DateTimeFilterSchema'
      - name: patient_id
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `patient_id`. Example: `patient_id[eq]=123`'
        schema:
          $ref: '#/components/schemas/IdFilterSchema'
      - name: staff_member_id
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `staff_member_id`. Example: `staff_member_id[eq]=123`'
        schema:
          $ref: '#/components/schemas/IdFilterSchema'
      - name: location_id
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `location_id`. Example: `location_id[eq]=123`'
        schema:
          $ref: '#/components/schemas/IdFilterSchema'
      - name: treatment_id
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `treatment_id`. Example: `treatment_id[eq]=123`'
        schema:
          $ref: '#/components/schemas/IdFilterSchema'
      - name: created_at
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `created_at` timestamp (ISO 8601). Example: `created_at[gte]=2025-01-01T00:00:00Z`'
        schema:
          $ref: '#/components/schemas/DateTimeFilterSchema'
      - name: updated_at
        in: query
        style: deepObject
        explode: true
        required: false
        description: 'Filter by `updated_at` timestamp (ISO 8601). Example: `updated_at[lt]=2025-01-02T00:00:00Z`'
        schema:
          $ref: '#/components/schemas/DateTimeFilterSchema'
      responses:
        '200':
          description: The appointments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/appointments_response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors_message_response'
        '401':
          description: Unauthorized
        '429':
          description: Rate limit exceeded - 100 requests per minute per endpoint per clinic
          headers:
            X-Throttle-Match:
              description: Rate limit identifier
              schema:
                type: string
              example: marketing_api/ip/clinic
            Retry-After:
              description: Number of seconds to wait before retrying
              schema:
                type: integer
              example: 60
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
components:
  schemas:
    IdFilterSchema:
      type: object
      properties:
        eq:
          type: string
          description: 'equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2 (maximum 100 values)'
    DateTimeFilterSchema:
      type: object
      properties:
        eq:
          type: string
          format: date-time
          description: 'equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2'
        ne:
          type: string
          format: date-time
          description: not equals
        gt:
          type: string
          format: date-time
          description: greater than
        gte:
          type: string
          format: date-time
          description: greater than or equal to
        lt:
          type: string
          format: date-time
          description: less than
        lte:
          type: string
          format: date-time
          description: less than or equal to
    appointment:
      $schema: https://json-schema.org/draft/2020-12/schema
      type: object
      required:
      - id
      properties:
        id:
          type: string
          format: uuid
        start_at:
          type: string
          format: date-time
        end_at:
          type: string
          format: date-time
        staff_member_id:
          type: string
          format: uuid
        patient_id:
          type: string
          format: uuid
        location_id:
          type: string
          format: uuid
        treatment_id:
          type: string
          format: uuid
        first_visit:
          type: boolean
        cancelled_at:
          type:
          - string
          - 'null'
          format: date-time
        cancelled_reason:
          type:
          - string
          - 'null'
          description: The reason the appointment was cancelled. Free-text reasons entered by staff are mapped to 'Other' to prevent exposure of potentially sensitive information; only predefined reasons are returned as-is.
        booked_at:
          type: string
          format: date-time
        no_show_at:
          type:
          - string
          - 'null'
          format: date-time
        arrived_at:
          type:
          - string
          - 'null'
          format: date-time
        archived_at:
          type:
          - string
          - 'null'
          format: date-time
        checked_in_at:
          type:
          - string
          - 'null'
          format: date-time
        state:
          type: string
          enum:
          - reserved
          - booked
          - arrived
          - no_show
          - cancelled
          - archived
          description: The current state of the appointment.
    StringFilterSchema:
      type: object
      properties:
        eq:
          type: string
          description: 'equals. Multiple equal values are comma-separated: ?field[eq]=value1,value2 (maximum 100 values)'
        ne:
          type: string
          description: not equals
        co:
          type: string
          description: 'contains. Performs partial match (case-insensitive for string fields). Example: ?field[co]=search_term'
        gt:
          type: string
          description: greater than
        gte:
          type: string
          description: greater than or equal to
        lt:
          type: string
          description: less than
        lte:
          type: string
          description: less than or equal to
        sw:
          type: string
          description: 'starts with. Performs case-insensitive partial match for words in a string that begin with search term. Example: ?field[sw]=search_term'
    errors:
      $schema: https://json-schema.org/draft/2020-12/schema
      $id: /components/responses/schemas/errors.json
      type: object
      required:
      - object
      - message
      title: Error
      description: Error response generated when an operations fails
      properties:
        object:
          type: string
          description: The string `error`
        code:
          type: string
          description: Indicates the granularity of the error
        message:
          type: string
          description: Indicates what the error is about
    appointments_response:
      $schema: https://json-schema.org/draft/2020-12/schema
      $id: /domains/appointment/schemas/appointments_response.json
      title: AppointmentsResponse
      description: Response to a request for multiple appointments
      type: object
      properties:
        items:
          description: The list of appointments. Empty if there are none.
          type: array
          items:
            $ref: '#/components/schemas/appointment'
        limit:
          description: The number of appointments to return
          type: integer
        links:
          description: The links to the current and next pages of appointments
          type: object
          properties:
            after:
              type:
              - string
              - 'null'
              description: URL for the next page of results. null if this is the last page.
              example: /api/2026-01-01/appointments?page[cursor]=eyJwYWdlIjozLCJzaXplIjo1fQ==&page[limit]=5
        hasNextPage:
          description: Whether there is a next page of appointments
          type: boolean
        cursor:
          description: The Base64 encoded cursor for the next page. null if this is the last page.
          type:
          - string
          - 'null'
          example: eyJwYWdlIjozLCJzaXplIjo1fQ==
    errors_message_response:
      $schema: https://json-schema.org/draft/2020-12/schema
      $id: /components/responses/schemas/errors_message_response.json
      type: object
      required:
      - errors
      title: ErrorMessages
      description: API Standard - Error response generated when an operations fails
      properties:
        errors:
          type: array
          items:
            type: object
            required:
            - message
            properties:
              id:
                type: string
                description: Optional error identifier for specific handling (e.g., PATIENT_CONVERSATION_EXISTS)
              path:
                type: string
                format: json-pointer
                description: JSON Pointer to the location of the error, per RFC 6901 (e.g., /data/attributes/name)
              message:
                type: string
  securitySchemes:
    OAuth2:
      type: oauth2
      description: 'OAuth2 authorization code flow with PKCE (Proof Key for Code Exchange) support.


        **PKCE Flow Required**: All integrations must use PKCE flow for authentication.


        **PKCE Benefits:**

        - Enhanced security against authorization code interception attacks

        - S256 code challenge method supported

        - Industry best practice for OAuth2 implementations


        **Implementation**: Use the authorization code flow with PKCE extension as defined in RFC 7636.

        '
      flows:
        authorizationCode:
          authorizationUrl: https://login.id.janeapp.com/realms/jane_partner_sandbox/protocol/openid-connect/auth?response_type=code&resource=https://jdpdocsdemo.jane.qa&prompt=consent
          tokenUrl: https://login.id.janeapp.com/realms/jane_partner_sandbox/protocol/openid-connect/token
          scopes:
            observations:read: Read observations
            observations:create: Create observations
            observations:update: Update observations
            care_plans:read: Read care plans
            care_plans:create: Create care plans
            care_plans:update: Update care plans
            patients:read: Read patient information
            locations:read: Read location information
            staff_members:read: Read staff member information
            appointments:read: Read appointment information
            companies:read: Read company information
            document_uploads:read: Read document uploads
            document_uploads:create: Create document uploads
            disciplines:read: Read discipline information
            treatments:read: Read treatment information
            conversations:read: Read conversation information
            conversations:write: Create and update conversations
            messages:read: Read message information
            messages:write: Create and update messages
            partner_extensions:create: Create partner extensions
            partner_extensions:delete: Delete partner extensions
            extensions:install: Install extensions
            extensions:uninstall: Uninstall extensions
            webhooks:read: List webhook subscriptions
            webhooks:create: Register a webhook subscription
            webhooks:update: Update a webhook subscription
            webhooks:delete: Deregister a webhook subscription
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT