---
title: "Create an appointment"
method: POST
path: "/appointments"
tags: ["Appointments"]
---

# Create an appointment

`POST /appointments`

## Request

- Base URL: `https://simpledock.ai/api/v1`
- URL: `https://simpledock.ai/api/v1/appointments`
- Auth: HTTP bearer

Book a dock appointment. `startTime` must be a start time listAvailability offers for that type and date, which accounts for start-time spacing, minimum notice, hours, buffers, door rules, and capacity. Any other time returns 409, as does a slot that has filled since you checked. A start time in the past returns 400, and an inactive appointment type is rejected. API bookings are always CONFIRMED, even at locations that require approval.

## Request body

- CreateAppointment
  - `locationId` string, required
  - `appointmentTypeId` string, required
  - `startTime` string, date-time, required
  - `companyName` string, required
  - `contactEmail` string, email, required
  - `contactName` string
  - `contactPhone` string
  - `driverName` string
  - `driverPhone` string
  - `trailerNumber` string
  - `poReference` string
  - `notes` string
  - `driverNotes` string
  - `doorId` string: Optional explicit door
  - `customFields` object

## Response `201`

Created

- object
  - `data` Appointment, required
    - `id` string, required
    - `status` 'PENDING' | 'CONFIRMED' | 'CANCELLED' | 'COMPLETED' | 'NO_SHOW', required
    - `locationId` string, required
    - `startTime` string, date-time, required
    - `endTime` string, date-time, required
    - `companyName` string, required
    - `contactEmail` string, required
    - `contactName` string, nullable
    - `contactPhone` string, nullable
    - `driverName` string, nullable
    - `driverPhone` string, nullable
    - `trailerNumber` string, nullable
    - `poReference` string, nullable
    - `notes` string, nullable
    - `driverNotes` string, nullable
    - `customFields` object, nullable, required
    - `arrivalStatus` string, nullable
    - `estimatedDelay` integer, nullable
    - `approvedAt` string, date-time, nullable
    - `rejectedAt` string, date-time, nullable
    - `cancelledAt` string, date-time, nullable
    - `checkedInAt` string, date-time, nullable: When dock staff marked the truck arrived.
    - `completedAt` string, date-time, nullable: When the appointment was marked completed (the truck left).
    - `rejectionReason` string, nullable
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `door` object, required
      - `id` string, required
      - `name` string, required
    - `appointmentType` AppointmentTypeSummary, required
      - `id` string
      - `name` string
      - `loadType` string
      - `direction` string
      - `durationMinutes` integer

## Other responses

- `400`: Invalid request
- `401`: Unauthorized — missing, invalid, or expired key
- `402`: Payment required — a Pro feature or a Free plan limit
- `403`: Forbidden — key is missing the required scope
- `404`: Location or type not found
- `409`: No availability / conflict
- `429`: Rate limited — slow down and retry after Retry-After

---

[API](https://skmtc.dev/simpledock/apis/simpledock-api.md) · [All operations](https://skmtc.dev/simpledock/apis/simpledock-api/llms.txt) · [OpenAPI document](https://skmtc.dev/simpledock/apis/simpledock-api/revisions/d6e8fedfc000?raw)
