---
title: "CRM create scheduled appointment"
method: POST
path: "/api/appointments/crm/create-scheduled"
tags: ["appointments"]
---

# CRM create scheduled appointment

`POST /api/appointments/crm/create-scheduled`

Create a scheduled appointment from CRM and optionally start immediate Stripe charge when the appointment is within 48 hours.

## Request body

- CrmCreateScheduledAppointmentRequest — Legacy CRM payload for operator-created scheduled appointments.
  - `patient_id` string, uuid, required — Patient UUID
  - `operator_id` string, uuid, nullable — Operator UUID; required for admin callers, taken from the request scope otherwise
  - `appointment_datetime` string, date-time, required — Appointment datetime (ISO)
  - `operator_profession` string, nullable — Operator profession hint
  - `is_free_appointment` boolean, nullable — Admin-only free appointment flag
  - `location_type` string, nullable — Location type (online/presenza/in_person)
  - `expert_in_person` boolean, nullable — Whether the expert must be physically in person
  - `room_availability_id` string, uuid, nullable — Room availability UUID for in-person appointments
  - `room_id` string, uuid, nullable — Room UUID for in-person appointments
  - `clinic_location_id` string, uuid, nullable — Clinic location UUID for in-person appointments

## Response `200`

Successful Response

- CrmCreateScheduledAppointmentResponse — Response model for CRM scheduled appointment creation.
  - `success` boolean, required — Whether the operation completed successfully
  - `message` string, required — Human-readable result message
  - `code` string, nullable — Stable application error/result code
  - `appointment_id` string, nullable — Created appointment UUID, if available
  - `joint_appointment_ids` string[] — Both appointment UUIDs when the created appointment is a joint one
  - `has_active_coupon` boolean — Whether the patient has an active coupon for the appointment
  - `conflicting_appointment` ConflictingAppointmentResponse — Patient appointment details returned when the selected datetime is already occupied.
    - `id` string, required — Appointment UUID
    - `appointment_datetime` string, date-time, nullable — Appointment datetime
    - `appointment_type_code` string, nullable — Appointment type code
    - `operator_name` string, nullable — Operator full name
    - `location` string, nullable — Appointment location
    - `status` string, nullable — Appointment status
  - `overlapping_availabilities` AvailabilityConflictResponse[] — List of overlapping availabilities when the selected slot is not available
    - `id` string, required — Availability UUID
    - `slot_datetime` string, date-time, nullable — Availability start datetime
    - `duration_minutes` integer, required — Availability duration in minutes
    - `status` string, nullable — Availability status
    - `appointment_id` string, nullable — Linked appointment UUID, if any
    - `patient_name` string, nullable — Patient full name when the slot is blocked or linked to an appointment
    - `is_blocked` boolean — Whether the availability is temporarily blocked
    - `blocked_until` string, date-time, nullable — Block expiration datetime, if any
    - `location_type` string, nullable — Availability location type
    - `expert_in_person` boolean — Whether the expert must be physically in person for this slot
    - `clinic_location_id` string, nullable — Clinic location UUID
    - `room_availability_id` string, nullable — Room availability UUID

## 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)
