Jane Appointments API
The Appointments API from Jane — 2 operation(s) for appointments.
The Appointments API from Jane — 2 operation(s) for appointments.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/jane-app-appointments-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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