Open Dental Appointments API

CONFIRMED. Scheduling, slots, and WebSched.

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/opendental-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

opendental-appointments-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Open Dental Accounts & Ledger Appointments API
  description: 'REST API for Open Dental dental practice management software. The web service is hosted at Open Dental headquarters and lets approved third-party applications read and write practice data on behalf of Open Dental customers. Requests authenticate with a per-application Developer Key and a per-customer Customer Key, sent together in a single header as "Authorization: ODFHIR {DeveloperKey}/{CustomerKey}". The full published specification documents 130+ resource groups; this document models a representative, load-bearing subset. The paths under Patients, Appointments, Providers, ProcedureLogs (Procedures), Claims, and Payments are grounded in the published per-resource reference pages and are marked CONFIRMED below. The remaining resource groups (Accounts/Ledger, Fees & Fee Schedules, Recalls, Documents, Medications & Prescriptions, Referrals, Sheets) follow Open Dental''s standard REST CRUD convention and are marked MODELED - verify exact paths and fields against the live spec before use. A separate local API Service (talks to the on-premises Open Dental program without routing through Open Dental servers) and a FHIR interface also exist and are out of scope for this document.'
  version: v1
  contact:
    name: Open Dental Software Vendor Relations
    url: https://www.opendental.com/site/apispecification.html
    email: vendor.relations@opendental.com
  license:
    name: Open Dental (proprietary; source viewable under Open Dental license)
    url: https://www.opendental.com/site/sourcecode.html
servers:
- url: https://api.opendental.com/api/v1
  description: Open Dental cloud-hosted API service (headquarters)
security:
- odfhirAuth: []
tags:
- name: Appointments
  description: CONFIRMED. Scheduling, slots, and WebSched.
paths:
  /appointments/{AptNum}:
    get:
      tags:
      - Appointments
      summary: Get a single appointment
      description: CONFIRMED.
      parameters:
      - $ref: '#/components/parameters/AptNum'
      responses:
        '200':
          $ref: '#/components/responses/Ok'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      tags:
      - Appointments
      summary: Update an appointment
      description: CONFIRMED.
      parameters:
      - $ref: '#/components/parameters/AptNum'
      requestBody:
        $ref: '#/components/requestBodies/Generic'
      responses:
        '200':
          $ref: '#/components/responses/Ok'
        '400':
          $ref: '#/components/responses/BadRequest'
  /appointments:
    get:
      tags:
      - Appointments
      summary: List appointments
      description: CONFIRMED. Retrieves multiple appointments with optional filters.
      parameters:
      - name: PatNum
        in: query
        schema:
          type: integer
      - name: AptStatus
        in: query
        schema:
          type: string
      - name: ClinicNum
        in: query
        schema:
          type: integer
      - name: ProvNum
        in: query
        schema:
          type: integer
      - name: dateStart
        in: query
        schema:
          type: string
          format: date
      - name: dateEnd
        in: query
        schema:
          type: string
          format: date
      - $ref: '#/components/parameters/Offset'
      responses:
        '200':
          $ref: '#/components/responses/Ok'
    post:
      tags:
      - Appointments
      summary: Create an appointment
      description: CONFIRMED.
      requestBody:
        $ref: '#/components/requestBodies/Generic'
      responses:
        '201':
          $ref: '#/components/responses/Created'
        '400':
          $ref: '#/components/responses/BadRequest'
  /appointments/ASAP:
    get:
      tags:
      - Appointments
      summary: List ASAP appointments
      description: CONFIRMED.
      responses:
        '200':
          $ref: '#/components/responses/Ok'
  /appointments/Slots:
    get:
      tags:
      - Appointments
      summary: Find available appointment slots
      description: CONFIRMED.
      parameters:
      - name: date
        in: query
        schema:
          type: string
          format: date
      - name: ProvNum
        in: query
        schema:
          type: integer
      - name: lengthMinutes
        in: query
        schema:
          type: integer
      responses:
        '200':
          $ref: '#/components/responses/Ok'
  /appointments/SlotsWebSched:
    get:
      tags:
      - Appointments
      summary: Find WebSched available slots
      description: CONFIRMED.
      responses:
        '200':
          $ref: '#/components/responses/Ok'
  /appointments/WebSched:
    get:
      tags:
      - Appointments
      summary: List WebSched appointments
      description: CONFIRMED.
      responses:
        '200':
          $ref: '#/components/responses/Ok'
    post:
      tags:
      - Appointments
      summary: Create a WebSched appointment
      description: CONFIRMED.
      requestBody:
        $ref: '#/components/requestBodies/Generic'
      responses:
        '201':
          $ref: '#/components/responses/Created'
  /appointments/Planned:
    post:
      tags:
      - Appointments
      summary: Create a planned appointment
      description: CONFIRMED.
      requestBody:
        $ref: '#/components/requestBodies/Generic'
      responses:
        '201':
          $ref: '#/components/responses/Created'
  /appointments/SchedulePlanned:
    post:
      tags:
      - Appointments
      summary: Schedule an existing planned appointment
      description: CONFIRMED.
      requestBody:
        $ref: '#/components/requestBodies/Generic'
      responses:
        '201':
          $ref: '#/components/responses/Created'
  /appointments/{AptNum}/Break:
    put:
      tags:
      - Appointments
      summary: Break an appointment
      description: CONFIRMED. Marks an appointment as broken.
      parameters:
      - $ref: '#/components/parameters/AptNum'
      responses:
        '200':
          $ref: '#/components/responses/Ok'
  /appointments/{AptNum}/Note:
    put:
      tags:
      - Appointments
      summary: Append to appointment note
      description: CONFIRMED.
      parameters:
      - $ref: '#/components/parameters/AptNum'
      requestBody:
        $ref: '#/components/requestBodies/Generic'
      responses:
        '200':
          $ref: '#/components/responses/Ok'
  /appointments/{AptNum}/Confirm:
    put:
      tags:
      - Appointments
      summary: Update confirmation status
      description: CONFIRMED.
      parameters:
      - $ref: '#/components/parameters/AptNum'
      requestBody:
        $ref: '#/components/requestBodies/Generic'
      responses:
        '200':
          $ref: '#/components/responses/Ok'
components:
  responses:
    Created:
      description: Created. Typically returns a Location header and the created object.
      content:
        application/json:
          schema:
            type: object
            additionalProperties: true
    BadRequest:
      description: Bad request - invalid or missing fields.
    NotFound:
      description: The requested resource was not found.
    Ok:
      description: Success. Returns one item or an array of items.
      content:
        application/json:
          schema:
            oneOf:
            - type: object
              additionalProperties: true
            - type: array
              items:
                type: object
                additionalProperties: true
  parameters:
    Offset:
      name: Offset
      in: query
      required: false
      description: Number of records to skip for pagination.
      schema:
        type: integer
        default: 0
    AptNum:
      name: AptNum
      in: path
      required: true
      description: Primary key of the appointment.
      schema:
        type: integer
  requestBodies:
    Generic:
      description: Resource fields as a JSON object. See the per-resource reference page on opendental.com/site/apispecification.html for exact field names.
      required: true
      content:
        application/json:
          schema:
            type: object
            additionalProperties: true
  securitySchemes:
    odfhirAuth:
      type: apiKey
      in: header
      name: Authorization
      description: Send "ODFHIR {DeveloperKey}/{CustomerKey}" - the per-application Developer Key issued by Open Dental Vendor Relations combined with the per-customer Customer Key. Some endpoints also accept HTTP Basic auth with the Developer Key as username and the Customer Key as password.