# NewAppointmentInput

input type

Create-input for an Appointment. The tenant is derived SERVER-SIDE; logicalFacilityId is tenant-scoped + ACTIVE; every resourceId in-tenant + ACTIVE + at the SAME LF; the purpose arms: service ⇒ variantId REQUIRED (the service-type walk), pickup ⇒ orderId REQUIRED + variantId FORBIDDEN; a named orderId must be a non-doomed-class in-tenant Order; the customer ref arms gate like the Order block. The create gates: startAt ≥ now + appointment.lead_time_minutes AND ≤ now + appointment.max_advance_days (VALIDATION/INVALID naming the key).

## Fields

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `caption` | [String](/types/#scalars) | no | Optional: when omitted the per-type default applies — the purpose + LF coordinate ('service appointment at <LF caption>'); when supplied it must be non-blank. |
| `logicalFacilityId` | [ID](/types/#scalars) `ID!` | yes | The parent LogicalFacility (the booking site) — tenant-scoped + ACTIVE. Immutable after birth. |
| `purpose` | [AppointmentPurpose](/types/AppointmentPurpose/) `AppointmentPurpose!` | yes | IMMUTABLE at birth. |
| `variantId` | [ID](/types/#scalars) | no | REQUIRED on service (a service-type variant); FORBIDDEN on pickup. |
| `orderId` | [ID](/types/#scalars) | no | REQUIRED on pickup; optional on service (the sold-together pattern). |
| `resourceIds` | [ID](/types/#scalars) `[ID!]!` | yes | The resources to book (1..8, distinct). |
| `startAt` | [String](/types/#scalars) `String!` | yes | The UTC start instant. |
| `durationMinutes` | [Int](/types/#scalars) `Int!` | yes | 1..1440. |
| `customer` | [OrderCustomerInput](/types/OrderCustomerInput/) | no | Optional — the Order customer-capture grammar verbatim. |

## Used by

- [createAppointment](/reference/appointment/createAppointment/)
