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

# Create appointment

`POST /api/appointments/`

Create a new appointment.

## Request body

- CreateAppointmentRequest — Typed payload for manual appointment creation.
  - `patient_id` string, uuid, required — Patient UUID
  - `operator_id` string, uuid, required — Operator UUID
  - `appointment_type_code` string, required — Appointment type code
  - `appointment_datetime` string, date-time, required — Appointment datetime (ISO)
  - `status` string, nullable — Appointment status
  - `location` string, nullable — Location type (online/in_person)
  - `expert_in_person` boolean, nullable — Whether the expert must be physically in person
  - `availability_id` string, uuid, nullable — Availability UUID
  - `clinic_location_id` string, uuid, nullable — Clinic location UUID (in-person)
  - `room_id` string, uuid, nullable — Room UUID (in-person)
  - `room_availability_id` string, uuid, nullable — Room availability UUID for in-person appointments
  - `meeting_link` string, nullable — Meeting link
  - `payment_status` string, nullable — Payment status
  - `payment_datetime` string, date-time, nullable — Payment completion datetime (admin-only)
  - `patient_cost` number, nullable — Patient cost (EUR)
  - `operator_cost` number, nullable — Operator cost (EUR)
  - `is_tax_deductible` boolean, nullable — Tax deductible flag
  - `payment_method` string, nullable — Payment method
  - `notes` string, nullable — Notes
  - `is_free_appointment` boolean, nullable — Admin-only flag to create a free PSI/NUTRI appointment

## Response `201`

Successful Response

- AppointmentResponse — Appointment response model.
  - `id` string, required — Appointment UUID
  - `appointment_datetime` string, date-time, required — Appointment date and time
  - `duration_seconds` integer, required — Duration in seconds
  - `status` string, required — Appointment status
  - `appointment_type_code` string, required — Appointment type code
  - `operator_id` string, required — Operator UUID
  - `operator_first_name` string, required — Operator first name
  - `operator_last_name` string, required — Operator last name
  - `operator_email` string, nullable — Operator email
  - `operator_profession` string, nullable — Operator profession
  - `joint_operator_first_name` string, nullable — First name of the other expert, set only on a joint appointment merged into a single item
  - `joint_operator_last_name` string, nullable — Last name of the other expert, set only on a joint appointment merged into a single item
  - `joint_partially_paid` boolean — True when a joint appointment has one side paid and the other still to pay
  - `location` string, required — Appointment location (online/in_person)
  - `clinic_location_id` string, nullable — Clinic location UUID (null for online appointments)
  - `clinic_location` ClinicLocationResponse — Clinic location response model.
    - `id` string, required — Clinic location UUID
    - `name` string, required — Clinic location name
    - `address` string, nullable — Clinic location address
    - `city_id` integer, nullable — City ID
    - `city` CityInfo — City information model.
      - `id` integer, required — City ID
      - `name` string, required — City name
      - `province_code` string, nullable — Province code
    - `is_active` boolean, required — Whether the clinic location is active
  - `meeting_link` string, nullable — Meeting link if available
  - `meeting_link_status` string, required — Meeting link status: available, pending_consent, not_created, pending_consent_and_not_created, phone_call
  - `patient_cost` number, required — Patient cost in EUR
  - `payment_status` string, nullable — Payment status
  - `payment_completed_at` string, date-time, nullable — Payment completion timestamp
  - `payment_method` string, nullable — Payment method
  - `paid_with_coupon` boolean — True when payment succeeded using a coupon
  - `receipt_file_path` string, nullable — Receipt file path in storage, if available
  - `created_at` string, date-time, required — Appointment creation timestamp

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/corabea/apis/corabea-api.md) · [All operations](https://skmtc.dev/corabea/apis/corabea-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/corabea/corabea-api/revisions/13c1bce1bdc4/schema)
