Skip to main content

ghl_models/v3/
calendars.rs

1// @generated by xtask/generate_models.py — do not edit by hand.
2// Source: https://github.com/GoHighLevel/highlevel-api-docs
3// Doc comments are HighLevel's own field descriptions, reflowed verbatim, so
4// they aren't held to rustdoc's markdown conventions.
5#![allow(
6    missing_docs,
7    clippy::doc_lazy_continuation,
8    clippy::doc_overindented_list_items
9)]
10
11use serde::{Deserialize, Serialize};
12
13/// `AllGroupsSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
14#[derive(Debug, Clone, Default, Serialize, Deserialize)]
15pub struct AllGroupsSuccessfulResponseDTO {
16    #[serde(default, skip_serializing_if = "Vec::is_empty")]
17    pub groups: Vec<GroupDTO>,
18}
19
20/// `AppointmentCreateSchema` from the GoHighLevel OpenAPI spec.
21#[derive(Debug, Clone, Default, Serialize, Deserialize)]
22pub struct AppointmentCreateSchema {
23    /// Title
24    #[serde(default, skip_serializing_if = "Option::is_none")]
25    pub title: Option<String>,
26    /// Meeting location type. - If `address` is provided in the request body, the
27    /// `meetingLocationType` defaults to **custom**.
28    /// Allowed values: `custom`, `zoom`, `gmeet`, `phone`, `address`, `ms_teams`, `google`.
29    #[serde(
30        rename = "meetingLocationType",
31        default,
32        skip_serializing_if = "Option::is_none"
33    )]
34    pub meeting_location_type: Option<String>,
35    /// The unique identifier for the meeting location. - This value can be found in
36    /// `calendar.locationConfigurations`or `calendar.teamMembers[].locationConfigurations`
37    #[serde(
38        rename = "meetingLocationId",
39        default,
40        skip_serializing_if = "Option::is_none"
41    )]
42    pub meeting_location_id: Option<String>,
43    /// Flag to override location config - **false** - If only `meetingLocationId` is provided -
44    /// **true** - If only `meetingLocationType` is provided
45    #[serde(
46        rename = "overrideLocationConfig",
47        default,
48        skip_serializing_if = "Option::is_none"
49    )]
50    pub override_location_config: Option<bool>,
51    /// Allowed values: `new`, `confirmed`, `cancelled`, `showed`, `noshow`, `invalid`,
52    /// `completed`, `active`.
53    #[serde(
54        rename = "appointmentStatus",
55        default,
56        skip_serializing_if = "Option::is_none"
57    )]
58    pub appointment_status: Option<String>,
59    /// Assigned User Id
60    #[serde(
61        rename = "assignedUserId",
62        default,
63        skip_serializing_if = "Option::is_none"
64    )]
65    pub assigned_user_id: Option<String>,
66    /// Appointment Description
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub description: Option<String>,
69    /// Appointment Address
70    #[serde(default, skip_serializing_if = "Option::is_none")]
71    pub address: Option<String>,
72    /// If set to true, the minimum scheduling notice and date range would be ignored
73    #[serde(
74        rename = "ignoreDateRange",
75        default,
76        skip_serializing_if = "Option::is_none"
77    )]
78    pub ignore_date_range: Option<bool>,
79    /// If set to false, the automations will not run. Defaults to true
80    #[serde(rename = "toNotify", default, skip_serializing_if = "Option::is_none")]
81    pub to_notify: Option<bool>,
82    /// If true the time slot validation would be avoided for any appointment creation (even the
83    /// ignoreDateRange)
84    #[serde(
85        rename = "ignoreFreeSlotValidation",
86        default,
87        skip_serializing_if = "Option::is_none"
88    )]
89    pub ignore_free_slot_validation: Option<bool>,
90    /// RRULE as per the iCalendar (RFC 5545) specification for recurring events. DTSTART is not
91    /// required, instance ids are calculated on the basis of startTime of the event. The rrule
92    /// only be applied if ignoreFreeSlotValidation is true.
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub rrule: Option<String>,
95    /// Calendar Id
96    /// Required by the API.
97    #[serde(rename = "calendarId")]
98    pub calendar_id: String,
99    /// Location Id
100    /// Required by the API.
101    #[serde(rename = "locationId")]
102    pub location_id: String,
103    /// Contact Id
104    /// Required by the API.
105    #[serde(rename = "contactId")]
106    pub contact_id: String,
107    /// Start Time
108    /// Required by the API.
109    #[serde(rename = "startTime")]
110    pub start_time: String,
111    /// End Time
112    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
113    pub end_time: Option<String>,
114}
115
116/// `AppointmentEditSchema` from the GoHighLevel OpenAPI spec.
117#[derive(Debug, Clone, Default, Serialize, Deserialize)]
118pub struct AppointmentEditSchema {
119    /// Title
120    #[serde(default, skip_serializing_if = "Option::is_none")]
121    pub title: Option<String>,
122    /// Meeting location type. - If `address` is provided in the request body, the
123    /// `meetingLocationType` defaults to **custom**.
124    /// Allowed values: `custom`, `zoom`, `gmeet`, `phone`, `address`, `ms_teams`, `google`.
125    #[serde(
126        rename = "meetingLocationType",
127        default,
128        skip_serializing_if = "Option::is_none"
129    )]
130    pub meeting_location_type: Option<String>,
131    /// The unique identifier for the meeting location. - This value can be found in
132    /// `calendar.locationConfigurations`or `calendar.teamMembers[].locationConfigurations`
133    #[serde(
134        rename = "meetingLocationId",
135        default,
136        skip_serializing_if = "Option::is_none"
137    )]
138    pub meeting_location_id: Option<String>,
139    /// Flag to override location config - **false** - If only `meetingLocationId` is provided -
140    /// **true** - If only `meetingLocationType` is provided
141    #[serde(
142        rename = "overrideLocationConfig",
143        default,
144        skip_serializing_if = "Option::is_none"
145    )]
146    pub override_location_config: Option<bool>,
147    /// Allowed values: `new`, `confirmed`, `cancelled`, `showed`, `noshow`, `invalid`,
148    /// `completed`, `active`.
149    #[serde(
150        rename = "appointmentStatus",
151        default,
152        skip_serializing_if = "Option::is_none"
153    )]
154    pub appointment_status: Option<String>,
155    /// Assigned User Id
156    #[serde(
157        rename = "assignedUserId",
158        default,
159        skip_serializing_if = "Option::is_none"
160    )]
161    pub assigned_user_id: Option<String>,
162    /// Appointment Description
163    #[serde(default, skip_serializing_if = "Option::is_none")]
164    pub description: Option<String>,
165    /// Appointment Address
166    #[serde(default, skip_serializing_if = "Option::is_none")]
167    pub address: Option<String>,
168    /// If set to true, the minimum scheduling notice and date range would be ignored
169    #[serde(
170        rename = "ignoreDateRange",
171        default,
172        skip_serializing_if = "Option::is_none"
173    )]
174    pub ignore_date_range: Option<bool>,
175    /// If set to false, the automations will not run. Defaults to true
176    #[serde(rename = "toNotify", default, skip_serializing_if = "Option::is_none")]
177    pub to_notify: Option<bool>,
178    /// If true the time slot validation would be avoided for any appointment creation (even the
179    /// ignoreDateRange)
180    #[serde(
181        rename = "ignoreFreeSlotValidation",
182        default,
183        skip_serializing_if = "Option::is_none"
184    )]
185    pub ignore_free_slot_validation: Option<bool>,
186    /// RRULE as per the iCalendar (RFC 5545) specification for recurring events. DTSTART is not
187    /// required, instance ids are calculated on the basis of startTime of the event. The rrule
188    /// only be applied if ignoreFreeSlotValidation is true.
189    #[serde(default, skip_serializing_if = "Option::is_none")]
190    pub rrule: Option<String>,
191    /// Calendar Id
192    #[serde(
193        rename = "calendarId",
194        default,
195        skip_serializing_if = "Option::is_none"
196    )]
197    pub calendar_id: Option<String>,
198    /// Start Time
199    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
200    pub start_time: Option<String>,
201    /// End Time
202    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
203    pub end_time: Option<String>,
204}
205
206/// `AppointmentSchemaResponse` from the GoHighLevel OpenAPI spec.
207#[derive(Debug, Clone, Default, Serialize, Deserialize)]
208pub struct AppointmentSchemaResponse {
209    /// Calendar Id
210    /// Required by the API.
211    #[serde(rename = "calendarId")]
212    pub calendar_id: String,
213    /// Location Id
214    /// Required by the API.
215    #[serde(rename = "locationId")]
216    pub location_id: String,
217    /// Contact Id
218    /// Required by the API.
219    #[serde(rename = "contactId")]
220    pub contact_id: String,
221    /// Start Time
222    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
223    pub start_time: Option<String>,
224    /// End Time
225    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
226    pub end_time: Option<String>,
227    /// Title
228    #[serde(default, skip_serializing_if = "Option::is_none")]
229    pub title: Option<String>,
230    /// Meeting Location Type
231    #[serde(
232        rename = "meetingLocationType",
233        default,
234        skip_serializing_if = "Option::is_none"
235    )]
236    pub meeting_location_type: Option<String>,
237    /// Allowed values: `new`, `confirmed`, `cancelled`, `showed`, `noshow`, `invalid`,
238    /// `active`, `completed`.
239    #[serde(
240        rename = "appointmentStatus",
241        default,
242        skip_serializing_if = "Option::is_none"
243    )]
244    pub appointment_status: Option<String>,
245    /// Assigned User Id
246    #[serde(
247        rename = "assignedUserId",
248        default,
249        skip_serializing_if = "Option::is_none"
250    )]
251    pub assigned_user_id: Option<String>,
252    /// Appointment Address
253    #[serde(default, skip_serializing_if = "Option::is_none")]
254    pub address: Option<String>,
255    /// true if the event is recurring otherwise false
256    #[serde(
257        rename = "isRecurring",
258        default,
259        skip_serializing_if = "Option::is_none"
260    )]
261    pub is_recurring: Option<bool>,
262    /// RRULE as per the iCalendar (RFC 5545) specification for recurring events
263    #[serde(default, skip_serializing_if = "Option::is_none")]
264    pub rrule: Option<String>,
265    /// Date Added
266    /// Required by the API.
267    #[serde(rename = "dateAdded")]
268    pub date_added: String,
269    /// Date Updated
270    /// Required by the API.
271    #[serde(rename = "dateUpdated")]
272    pub date_updated: String,
273    /// Id
274    /// Required by the API.
275    pub id: String,
276}
277
278/// `Availability` from the GoHighLevel OpenAPI spec.
279#[derive(Debug, Clone, Default, Serialize, Deserialize)]
280pub struct Availability {
281    /// Formulate the date string in the format of `<YYYY-MM-DD in local
282    /// timezone>T00:00:00.000Z`.
283    /// Required by the API.
284    pub date: String,
285    /// Required by the API.
286    #[serde(default, skip_serializing_if = "Vec::is_empty")]
287    pub hours: Vec<Hour>,
288    #[serde(default, skip_serializing_if = "Option::is_none")]
289    pub deleted: Option<bool>,
290}
291
292/// `BlockSlotCreateRequestDTO` from the GoHighLevel OpenAPI spec.
293#[derive(Debug, Clone, Default, Serialize, Deserialize)]
294pub struct BlockSlotCreateRequestDTO {
295    /// Title
296    #[serde(default, skip_serializing_if = "Option::is_none")]
297    pub title: Option<String>,
298    /// Either calendarId or assignedUserId can be set, not both.
299    /// Required by the API.
300    #[serde(rename = "calendarId")]
301    pub calendar_id: String,
302    /// Either calendarId or assignedUserId can be set, not both.
303    #[serde(
304        rename = "assignedUserId",
305        default,
306        skip_serializing_if = "Option::is_none"
307    )]
308    pub assigned_user_id: Option<String>,
309    /// Location Id
310    /// Required by the API.
311    #[serde(rename = "locationId")]
312    pub location_id: String,
313    /// Start Time
314    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
315    pub start_time: Option<String>,
316    /// End Time
317    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
318    pub end_time: Option<String>,
319}
320
321/// `BlockSlotEditRequestDTO` from the GoHighLevel OpenAPI spec.
322#[derive(Debug, Clone, Default, Serialize, Deserialize)]
323pub struct BlockSlotEditRequestDTO {
324    /// Title
325    #[serde(default, skip_serializing_if = "Option::is_none")]
326    pub title: Option<String>,
327    /// Either calendarId or assignedUserId can be set, not both.
328    /// Required by the API.
329    #[serde(rename = "calendarId")]
330    pub calendar_id: String,
331    /// Either calendarId or assignedUserId can be set, not both.
332    #[serde(
333        rename = "assignedUserId",
334        default,
335        skip_serializing_if = "Option::is_none"
336    )]
337    pub assigned_user_id: Option<String>,
338    /// Location Id
339    /// Required by the API.
340    #[serde(rename = "locationId")]
341    pub location_id: String,
342    /// Start Time
343    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
344    pub start_time: Option<String>,
345    /// End Time
346    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
347    pub end_time: Option<String>,
348}
349
350/// `BlockedSlotSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
351#[derive(Debug, Clone, Default, Serialize, Deserialize)]
352pub struct BlockedSlotSuccessfulResponseDto {
353    /// Id
354    /// Required by the API.
355    pub id: String,
356    /// Location Id
357    /// Required by the API.
358    #[serde(rename = "locationId")]
359    pub location_id: String,
360    /// Title
361    /// Required by the API.
362    pub title: String,
363    /// Start Time
364    /// Required by the API.
365    #[serde(rename = "startTime")]
366    pub start_time: serde_json::Value,
367    /// End Time
368    /// Required by the API.
369    #[serde(rename = "endTime")]
370    pub end_time: serde_json::Value,
371    /// Calendar id
372    #[serde(
373        rename = "calendarId",
374        default,
375        skip_serializing_if = "Option::is_none"
376    )]
377    pub calendar_id: Option<String>,
378    /// Assigned User Id
379    #[serde(
380        rename = "assignedUserId",
381        default,
382        skip_serializing_if = "Option::is_none"
383    )]
384    pub assigned_user_id: Option<String>,
385}
386
387/// `CalendarByIdSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
388#[derive(Debug, Clone, Default, Serialize, Deserialize)]
389pub struct CalendarByIdSuccessfulResponseDTO {
390    /// Required by the API.
391    pub calendar: CalendarDTO,
392}
393
394/// `CalendarCreateDTO` from the GoHighLevel OpenAPI spec.
395#[derive(Debug, Clone, Default, Serialize, Deserialize)]
396pub struct CalendarCreateDTO {
397    /// Should the created calendar be active or draft
398    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
399    pub is_active: Option<bool>,
400    /// 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead.
401    #[serde(default, skip_serializing_if = "Vec::is_empty")]
402    pub notifications: Vec<CalendarNotification>,
403    /// Required by the API.
404    #[serde(rename = "locationId")]
405    pub location_id: String,
406    /// Group Id
407    #[serde(rename = "groupId", default, skip_serializing_if = "Option::is_none")]
408    pub group_id: Option<String>,
409    /// Team members are required for calendars of type: Round Robin, Collective, Class,
410    /// Service. Personal calendar must have exactly one team member.
411    #[serde(rename = "teamMembers", default, skip_serializing_if = "Vec::is_empty")]
412    pub team_members: Vec<TeamMember>,
413    /// Allowed values: `RoundRobin_OptimizeForAvailability`,
414    /// `RoundRobin_OptimizeForEqualDistribution`.
415    #[serde(rename = "eventType", default, skip_serializing_if = "Option::is_none")]
416    pub event_type: Option<String>,
417    /// Required by the API.
418    pub name: String,
419    #[serde(default, skip_serializing_if = "Option::is_none")]
420    pub description: Option<String>,
421    #[serde(default, skip_serializing_if = "Option::is_none")]
422    pub slug: Option<String>,
423    #[serde(
424        rename = "widgetSlug",
425        default,
426        skip_serializing_if = "Option::is_none"
427    )]
428    pub widget_slug: Option<String>,
429    /// Allowed values: `round_robin`, `event`, `class_booking`, `collective`,
430    /// `service_booking`, `personal`.
431    #[serde(
432        rename = "calendarType",
433        default,
434        skip_serializing_if = "Option::is_none"
435    )]
436    pub calendar_type: Option<String>,
437    /// Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout.
438    /// Allowed values: `default`, `classic`.
439    #[serde(
440        rename = "widgetType",
441        default,
442        skip_serializing_if = "Option::is_none"
443    )]
444    pub widget_type: Option<String>,
445    #[serde(
446        rename = "eventTitle",
447        default,
448        skip_serializing_if = "Option::is_none"
449    )]
450    pub event_title: Option<String>,
451    #[serde(
452        rename = "eventColor",
453        default,
454        skip_serializing_if = "Option::is_none"
455    )]
456    pub event_color: Option<String>,
457    /// 🚨 Deprecated! Use `locationConfigurations.location` or
458    /// `teamMembers[].locationConfigurations.location` instead.
459    #[serde(
460        rename = "meetingLocation",
461        default,
462        skip_serializing_if = "Option::is_none"
463    )]
464    pub meeting_location: Option<String>,
465    /// Meeting location configuration for event calendar
466    #[serde(
467        rename = "locationConfigurations",
468        default,
469        skip_serializing_if = "Vec::is_empty"
470    )]
471    pub location_configurations: Vec<LocationConfiguration>,
472    /// This controls the duration of the meeting
473    #[serde(
474        rename = "slotDuration",
475        default,
476        skip_serializing_if = "Option::is_none"
477    )]
478    pub slot_duration: Option<f64>,
479    /// Unit for slot duration.
480    /// Allowed values: `mins`, `hours`.
481    #[serde(
482        rename = "slotDurationUnit",
483        default,
484        skip_serializing_if = "Option::is_none"
485    )]
486    pub slot_duration_unit: Option<String>,
487    /// Slot interval reflects the amount of time the between booking slots that will be shown
488    /// in the calendar.
489    #[serde(
490        rename = "slotInterval",
491        default,
492        skip_serializing_if = "Option::is_none"
493    )]
494    pub slot_interval: Option<f64>,
495    /// Unit for slot interval.
496    /// Allowed values: `mins`, `hours`.
497    #[serde(
498        rename = "slotIntervalUnit",
499        default,
500        skip_serializing_if = "Option::is_none"
501    )]
502    pub slot_interval_unit: Option<String>,
503    /// Slot-Buffer is additional time that can be added after an appointment, allowing for
504    /// extra time to wrap up
505    #[serde(
506        rename = "slotBuffer",
507        default,
508        skip_serializing_if = "Option::is_none"
509    )]
510    pub slot_buffer: Option<f64>,
511    /// Unit for slot buffer.
512    /// Allowed values: `mins`, `hours`.
513    #[serde(
514        rename = "slotBufferUnit",
515        default,
516        skip_serializing_if = "Option::is_none"
517    )]
518    pub slot_buffer_unit: Option<String>,
519    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
520    /// extra time to get ready
521    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
522    pub pre_buffer: Option<f64>,
523    /// Unit for pre-buffer.
524    /// Allowed values: `mins`, `hours`.
525    #[serde(
526        rename = "preBufferUnit",
527        default,
528        skip_serializing_if = "Option::is_none"
529    )]
530    pub pre_buffer_unit: Option<String>,
531    /// Maximum bookings per slot (per user). Maximum seats per slot in case of Class Booking
532    /// Calendar.
533    #[serde(
534        rename = "appoinmentPerSlot",
535        default,
536        skip_serializing_if = "Option::is_none"
537    )]
538    pub appoinment_per_slot: Option<f64>,
539    /// Number of appointments that can be booked for a given day
540    #[serde(
541        rename = "appoinmentPerDay",
542        default,
543        skip_serializing_if = "Option::is_none"
544    )]
545    pub appoinment_per_day: Option<f64>,
546    /// Minimum scheduling notice for events
547    #[serde(
548        rename = "allowBookingAfter",
549        default,
550        skip_serializing_if = "Option::is_none"
551    )]
552    pub allow_booking_after: Option<f64>,
553    /// Unit for minimum scheduling notice
554    /// Allowed values: `hours`, `days`, `weeks`, `months`, `mins`.
555    #[serde(
556        rename = "allowBookingAfterUnit",
557        default,
558        skip_serializing_if = "Option::is_none"
559    )]
560    pub allow_booking_after_unit: Option<String>,
561    /// Minimum number of days/weeks/months for which to allow booking events
562    #[serde(
563        rename = "allowBookingFor",
564        default,
565        skip_serializing_if = "Option::is_none"
566    )]
567    pub allow_booking_for: Option<f64>,
568    /// Unit for controlling the duration for which booking would be allowed for
569    /// Allowed values: `days`, `weeks`, `months`.
570    #[serde(
571        rename = "allowBookingForUnit",
572        default,
573        skip_serializing_if = "Option::is_none"
574    )]
575    pub allow_booking_for_unit: Option<String>,
576    /// While we will support this property for backward compatibility, it is recommended to use
577    /// 'Availability' APIs instead.
578    #[serde(rename = "openHours", default, skip_serializing_if = "Vec::is_empty")]
579    pub open_hours: Vec<OpenHour>,
580    /// Enable recurring appointments for the calendars. Please note that only one member should
581    /// be added in the calendar to enable this
582    #[serde(
583        rename = "enableRecurring",
584        default,
585        skip_serializing_if = "Option::is_none"
586    )]
587    pub enable_recurring: Option<bool>,
588    #[serde(default, skip_serializing_if = "Option::is_none")]
589    pub recurring: Option<Recurring>,
590    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
591    pub form_id: Option<String>,
592    #[serde(
593        rename = "stickyContact",
594        default,
595        skip_serializing_if = "Option::is_none"
596    )]
597    pub sticky_contact: Option<bool>,
598    #[serde(
599        rename = "isLivePaymentMode",
600        default,
601        skip_serializing_if = "Option::is_none"
602    )]
603    pub is_live_payment_mode: Option<bool>,
604    #[serde(
605        rename = "autoConfirm",
606        default,
607        skip_serializing_if = "Option::is_none"
608    )]
609    pub auto_confirm: Option<bool>,
610    #[serde(
611        rename = "shouldSendAlertEmailsToAssignedMember",
612        default,
613        skip_serializing_if = "Option::is_none"
614    )]
615    pub should_send_alert_emails_to_assigned_member: Option<bool>,
616    #[serde(
617        rename = "alertEmail",
618        default,
619        skip_serializing_if = "Option::is_none"
620    )]
621    pub alert_email: Option<String>,
622    #[serde(
623        rename = "googleInvitationEmails",
624        default,
625        skip_serializing_if = "Option::is_none"
626    )]
627    pub google_invitation_emails: Option<bool>,
628    #[serde(
629        rename = "allowReschedule",
630        default,
631        skip_serializing_if = "Option::is_none"
632    )]
633    pub allow_reschedule: Option<bool>,
634    #[serde(
635        rename = "allowCancellation",
636        default,
637        skip_serializing_if = "Option::is_none"
638    )]
639    pub allow_cancellation: Option<bool>,
640    #[serde(
641        rename = "shouldAssignContactToTeamMember",
642        default,
643        skip_serializing_if = "Option::is_none"
644    )]
645    pub should_assign_contact_to_team_member: Option<bool>,
646    #[serde(
647        rename = "shouldSkipAssigningContactForExisting",
648        default,
649        skip_serializing_if = "Option::is_none"
650    )]
651    pub should_skip_assigning_contact_for_existing: Option<bool>,
652    #[serde(default, skip_serializing_if = "Option::is_none")]
653    pub notes: Option<String>,
654    #[serde(rename = "pixelId", default, skip_serializing_if = "Option::is_none")]
655    pub pixel_id: Option<String>,
656    /// Allowed values: `RedirectURL`, `ThankYouMessage`.
657    #[serde(
658        rename = "formSubmitType",
659        default,
660        skip_serializing_if = "Option::is_none"
661    )]
662    pub form_submit_type: Option<String>,
663    #[serde(
664        rename = "formSubmitRedirectURL",
665        default,
666        skip_serializing_if = "Option::is_none"
667    )]
668    pub form_submit_redirect_url: Option<String>,
669    #[serde(
670        rename = "formSubmitThanksMessage",
671        default,
672        skip_serializing_if = "Option::is_none"
673    )]
674    pub form_submit_thanks_message: Option<String>,
675    /// While we will support this property for backward compatibility, it is not required
676    /// anymore.
677    /// Allowed values: `0`, `1`.
678    #[serde(
679        rename = "availabilityType",
680        default,
681        skip_serializing_if = "Option::is_none"
682    )]
683    pub availability_type: Option<String>,
684    /// While we will support this property for backward compatibility, it is recommended to use
685    /// 'Availability' APIs instead.
686    #[serde(default, skip_serializing_if = "Vec::is_empty")]
687    pub availabilities: Vec<Availability>,
688    /// Allowed values: `count_only`, `collect_detail`.
689    #[serde(rename = "guestType", default, skip_serializing_if = "Option::is_none")]
690    pub guest_type: Option<String>,
691    #[serde(
692        rename = "consentLabel",
693        default,
694        skip_serializing_if = "Option::is_none"
695    )]
696    pub consent_label: Option<String>,
697    #[serde(
698        rename = "calendarCoverImage",
699        default,
700        skip_serializing_if = "Option::is_none"
701    )]
702    pub calendar_cover_image: Option<String>,
703    /// Look Busy Configuration
704    #[serde(
705        rename = "lookBusyConfig",
706        default,
707        skip_serializing_if = "Option::is_none"
708    )]
709    pub look_busy_config: Option<LookBusyConfiguration>,
710}
711
712/// `CalendarDTO` from the GoHighLevel OpenAPI spec.
713#[derive(Debug, Clone, Default, Serialize, Deserialize)]
714pub struct CalendarDTO {
715    /// Should the created calendar be active or draft
716    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
717    pub is_active: Option<bool>,
718    /// 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead.
719    #[serde(default, skip_serializing_if = "Vec::is_empty")]
720    pub notifications: Vec<CalendarNotification>,
721    /// Required by the API.
722    #[serde(rename = "locationId")]
723    pub location_id: String,
724    /// Group Id
725    #[serde(rename = "groupId", default, skip_serializing_if = "Option::is_none")]
726    pub group_id: Option<String>,
727    /// Team members are for calendars of type: Round Robin, Collective, Class, Service.
728    /// Personal calendar must have exactly one team member.
729    #[serde(rename = "teamMembers", default, skip_serializing_if = "Vec::is_empty")]
730    pub team_members: Vec<TeamMemberResponse>,
731    /// Allowed values: `RoundRobin_OptimizeForAvailability`,
732    /// `RoundRobin_OptimizeForEqualDistribution`.
733    #[serde(rename = "eventType", default, skip_serializing_if = "Option::is_none")]
734    pub event_type: Option<String>,
735    /// Required by the API.
736    pub name: String,
737    #[serde(default, skip_serializing_if = "Option::is_none")]
738    pub description: Option<String>,
739    #[serde(default, skip_serializing_if = "Option::is_none")]
740    pub slug: Option<String>,
741    #[serde(
742        rename = "widgetSlug",
743        default,
744        skip_serializing_if = "Option::is_none"
745    )]
746    pub widget_slug: Option<String>,
747    /// Allowed values: `round_robin`, `event`, `class_booking`, `collective`,
748    /// `service_booking`, `personal`.
749    #[serde(
750        rename = "calendarType",
751        default,
752        skip_serializing_if = "Option::is_none"
753    )]
754    pub calendar_type: Option<String>,
755    /// Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout.
756    /// Allowed values: `default`, `classic`.
757    #[serde(
758        rename = "widgetType",
759        default,
760        skip_serializing_if = "Option::is_none"
761    )]
762    pub widget_type: Option<String>,
763    #[serde(
764        rename = "eventTitle",
765        default,
766        skip_serializing_if = "Option::is_none"
767    )]
768    pub event_title: Option<String>,
769    #[serde(
770        rename = "eventColor",
771        default,
772        skip_serializing_if = "Option::is_none"
773    )]
774    pub event_color: Option<String>,
775    /// 🚨 Deprecated! Use `locationConfigurations.location` or
776    /// `teamMembers[].locationConfigurations.location` instead.
777    #[serde(
778        rename = "meetingLocation",
779        default,
780        skip_serializing_if = "Option::is_none"
781    )]
782    pub meeting_location: Option<String>,
783    /// Meeting location configuration for event calendar
784    #[serde(
785        rename = "locationConfigurations",
786        default,
787        skip_serializing_if = "Vec::is_empty"
788    )]
789    pub location_configurations: Vec<LocationConfigurationResponse>,
790    /// This controls the duration of the meeting
791    #[serde(
792        rename = "slotDuration",
793        default,
794        skip_serializing_if = "Option::is_none"
795    )]
796    pub slot_duration: Option<f64>,
797    /// Unit for slot duration.
798    /// Allowed values: `mins`, `hours`.
799    #[serde(
800        rename = "slotDurationUnit",
801        default,
802        skip_serializing_if = "Option::is_none"
803    )]
804    pub slot_duration_unit: Option<String>,
805    /// Slot interval reflects the amount of time the between booking slots that will be shown
806    /// in the calendar.
807    #[serde(
808        rename = "slotInterval",
809        default,
810        skip_serializing_if = "Option::is_none"
811    )]
812    pub slot_interval: Option<f64>,
813    /// Unit for slot interval.
814    /// Allowed values: `mins`, `hours`.
815    #[serde(
816        rename = "slotIntervalUnit",
817        default,
818        skip_serializing_if = "Option::is_none"
819    )]
820    pub slot_interval_unit: Option<String>,
821    /// Slot-Buffer is additional time that can be added after an appointment, allowing for
822    /// extra time to wrap up
823    #[serde(
824        rename = "slotBuffer",
825        default,
826        skip_serializing_if = "Option::is_none"
827    )]
828    pub slot_buffer: Option<f64>,
829    /// Unit for slot buffer.
830    /// Allowed values: `mins`, `hours`.
831    #[serde(
832        rename = "slotBufferUnit",
833        default,
834        skip_serializing_if = "Option::is_none"
835    )]
836    pub slot_buffer_unit: Option<String>,
837    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
838    /// extra time to get ready
839    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
840    pub pre_buffer: Option<f64>,
841    /// Unit for pre-buffer.
842    /// Allowed values: `mins`, `hours`.
843    #[serde(
844        rename = "preBufferUnit",
845        default,
846        skip_serializing_if = "Option::is_none"
847    )]
848    pub pre_buffer_unit: Option<String>,
849    /// Maximum bookings per slot (per user). Maximum seats per slot in case of Class Booking
850    /// Calendar.
851    #[serde(
852        rename = "appoinmentPerSlot",
853        default,
854        skip_serializing_if = "Option::is_none"
855    )]
856    pub appoinment_per_slot: Option<f64>,
857    /// Number of appointments that can be booked for a given day
858    #[serde(
859        rename = "appoinmentPerDay",
860        default,
861        skip_serializing_if = "Option::is_none"
862    )]
863    pub appoinment_per_day: Option<f64>,
864    /// Minimum scheduling notice for events
865    #[serde(
866        rename = "allowBookingAfter",
867        default,
868        skip_serializing_if = "Option::is_none"
869    )]
870    pub allow_booking_after: Option<f64>,
871    /// Unit for minimum scheduling notice
872    /// Allowed values: `hours`, `days`, `weeks`, `months`, `mins`.
873    #[serde(
874        rename = "allowBookingAfterUnit",
875        default,
876        skip_serializing_if = "Option::is_none"
877    )]
878    pub allow_booking_after_unit: Option<String>,
879    /// Minimum number of days/weeks/months for which to allow booking events
880    #[serde(
881        rename = "allowBookingFor",
882        default,
883        skip_serializing_if = "Option::is_none"
884    )]
885    pub allow_booking_for: Option<f64>,
886    /// Unit for controlling the duration for which booking would be allowed for
887    /// Allowed values: `days`, `weeks`, `months`.
888    #[serde(
889        rename = "allowBookingForUnit",
890        default,
891        skip_serializing_if = "Option::is_none"
892    )]
893    pub allow_booking_for_unit: Option<String>,
894    /// While we will support this property for backward compatibility, it is recommended to use
895    /// 'Availability' APIs instead.
896    #[serde(rename = "openHours", default, skip_serializing_if = "Vec::is_empty")]
897    pub open_hours: Vec<OpenHour>,
898    /// Enable recurring appointments for the calendars. Please note that only one member should
899    /// be added in the calendar to enable this
900    #[serde(
901        rename = "enableRecurring",
902        default,
903        skip_serializing_if = "Option::is_none"
904    )]
905    pub enable_recurring: Option<bool>,
906    #[serde(default, skip_serializing_if = "Option::is_none")]
907    pub recurring: Option<Recurring>,
908    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
909    pub form_id: Option<String>,
910    #[serde(
911        rename = "stickyContact",
912        default,
913        skip_serializing_if = "Option::is_none"
914    )]
915    pub sticky_contact: Option<bool>,
916    #[serde(
917        rename = "isLivePaymentMode",
918        default,
919        skip_serializing_if = "Option::is_none"
920    )]
921    pub is_live_payment_mode: Option<bool>,
922    #[serde(
923        rename = "autoConfirm",
924        default,
925        skip_serializing_if = "Option::is_none"
926    )]
927    pub auto_confirm: Option<bool>,
928    #[serde(
929        rename = "shouldSendAlertEmailsToAssignedMember",
930        default,
931        skip_serializing_if = "Option::is_none"
932    )]
933    pub should_send_alert_emails_to_assigned_member: Option<bool>,
934    #[serde(
935        rename = "alertEmail",
936        default,
937        skip_serializing_if = "Option::is_none"
938    )]
939    pub alert_email: Option<String>,
940    #[serde(
941        rename = "googleInvitationEmails",
942        default,
943        skip_serializing_if = "Option::is_none"
944    )]
945    pub google_invitation_emails: Option<bool>,
946    #[serde(
947        rename = "allowReschedule",
948        default,
949        skip_serializing_if = "Option::is_none"
950    )]
951    pub allow_reschedule: Option<bool>,
952    #[serde(
953        rename = "allowCancellation",
954        default,
955        skip_serializing_if = "Option::is_none"
956    )]
957    pub allow_cancellation: Option<bool>,
958    #[serde(
959        rename = "shouldAssignContactToTeamMember",
960        default,
961        skip_serializing_if = "Option::is_none"
962    )]
963    pub should_assign_contact_to_team_member: Option<bool>,
964    #[serde(
965        rename = "shouldSkipAssigningContactForExisting",
966        default,
967        skip_serializing_if = "Option::is_none"
968    )]
969    pub should_skip_assigning_contact_for_existing: Option<bool>,
970    #[serde(default, skip_serializing_if = "Option::is_none")]
971    pub notes: Option<String>,
972    #[serde(rename = "pixelId", default, skip_serializing_if = "Option::is_none")]
973    pub pixel_id: Option<String>,
974    /// Allowed values: `RedirectURL`, `ThankYouMessage`.
975    #[serde(
976        rename = "formSubmitType",
977        default,
978        skip_serializing_if = "Option::is_none"
979    )]
980    pub form_submit_type: Option<String>,
981    #[serde(
982        rename = "formSubmitRedirectURL",
983        default,
984        skip_serializing_if = "Option::is_none"
985    )]
986    pub form_submit_redirect_url: Option<String>,
987    #[serde(
988        rename = "formSubmitThanksMessage",
989        default,
990        skip_serializing_if = "Option::is_none"
991    )]
992    pub form_submit_thanks_message: Option<String>,
993    /// While we will support this property for backward compatibility, it is not required
994    /// anymore.
995    /// Allowed values: `0`, `1`.
996    #[serde(
997        rename = "availabilityType",
998        default,
999        skip_serializing_if = "Option::is_none"
1000    )]
1001    pub availability_type: Option<String>,
1002    /// While we will support this property for backward compatibility, it is recommended to use
1003    /// 'Availability' APIs instead.
1004    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1005    pub availabilities: Vec<Availability>,
1006    /// Allowed values: `count_only`, `collect_detail`.
1007    #[serde(rename = "guestType", default, skip_serializing_if = "Option::is_none")]
1008    pub guest_type: Option<String>,
1009    #[serde(
1010        rename = "consentLabel",
1011        default,
1012        skip_serializing_if = "Option::is_none"
1013    )]
1014    pub consent_label: Option<String>,
1015    #[serde(
1016        rename = "calendarCoverImage",
1017        default,
1018        skip_serializing_if = "Option::is_none"
1019    )]
1020    pub calendar_cover_image: Option<String>,
1021    /// Look Busy Configuration
1022    #[serde(
1023        rename = "lookBusyConfig",
1024        default,
1025        skip_serializing_if = "Option::is_none"
1026    )]
1027    pub look_busy_config: Option<LookBusyConfiguration>,
1028    /// Required by the API.
1029    pub id: String,
1030}
1031
1032/// `CalendarDeleteSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
1033#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1034pub struct CalendarDeleteSuccessfulResponseDTO {
1035    /// Success
1036    /// Required by the API.
1037    pub success: bool,
1038}
1039
1040/// `CalendarEventDTO` from the GoHighLevel OpenAPI spec.
1041#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1042pub struct CalendarEventDTO {
1043    /// Event Id or Instance id for a recurring event
1044    /// Required by the API.
1045    pub id: String,
1046    /// Calendar Event address
1047    #[serde(default, skip_serializing_if = "Option::is_none")]
1048    pub address: Option<String>,
1049    /// Calendar Event title
1050    /// Required by the API.
1051    pub title: String,
1052    /// Calendar ID
1053    /// Required by the API.
1054    #[serde(rename = "calendarId")]
1055    pub calendar_id: String,
1056    /// Location ID
1057    /// Required by the API.
1058    #[serde(rename = "locationId")]
1059    pub location_id: String,
1060    /// Contact ID
1061    /// Required by the API.
1062    #[serde(rename = "contactId")]
1063    pub contact_id: String,
1064    /// Group ID
1065    /// Required by the API.
1066    #[serde(rename = "groupId")]
1067    pub group_id: String,
1068    /// Appointment Status
1069    /// Required by the API.
1070    #[serde(rename = "appointmentStatus")]
1071    pub appointment_status: String,
1072    /// AssignedUser - the primary owner of an appointment
1073    /// Required by the API.
1074    #[serde(rename = "assignedUserId")]
1075    pub assigned_user_id: String,
1076    /// Users - the secondary owners of an appointment.
1077    /// Required by the API.
1078    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1079    pub users: Vec<String>,
1080    /// Notes
1081    #[serde(default, skip_serializing_if = "Option::is_none")]
1082    pub notes: Option<String>,
1083    /// Description
1084    #[serde(default, skip_serializing_if = "Option::is_none")]
1085    pub description: Option<String>,
1086    /// true if the event is recurring otherwise false
1087    #[serde(
1088        rename = "isRecurring",
1089        default,
1090        skip_serializing_if = "Option::is_none"
1091    )]
1092    pub is_recurring: Option<bool>,
1093    /// RRULE as per the iCalendar (RFC 5545) specification for recurring events. DTSTART is not
1094    /// required, instance ids are calculated on the basis of startTime of the event.
1095    #[serde(default, skip_serializing_if = "Option::is_none")]
1096    pub rrule: Option<String>,
1097    /// Tells if a calendar event has been deleted
1098    #[serde(default, skip_serializing_if = "Option::is_none")]
1099    pub deleted: Option<bool>,
1100    /// Start Time
1101    /// Required by the API.
1102    #[serde(rename = "startTime")]
1103    pub start_time: serde_json::Value,
1104    /// End Time
1105    /// Required by the API.
1106    #[serde(rename = "endTime")]
1107    pub end_time: serde_json::Value,
1108    /// Date Added
1109    /// Required by the API.
1110    #[serde(rename = "dateAdded")]
1111    pub date_added: serde_json::Value,
1112    /// Date Updated
1113    /// Required by the API.
1114    #[serde(rename = "dateUpdated")]
1115    pub date_updated: serde_json::Value,
1116    /// Ids of associated resources rooms and/or equipments
1117    #[serde(
1118        rename = "assignedResources",
1119        default,
1120        skip_serializing_if = "Vec::is_empty"
1121    )]
1122    pub assigned_resources: Vec<String>,
1123    /// Appointment booked by metadata
1124    #[serde(rename = "createdBy", default, skip_serializing_if = "Option::is_none")]
1125    pub created_by: Option<CreatedOrUpdatedBy>,
1126    /// Master event id for a recurring instance
1127    #[serde(
1128        rename = "masterEventId",
1129        default,
1130        skip_serializing_if = "Option::is_none"
1131    )]
1132    pub master_event_id: Option<String>,
1133}
1134
1135/// `CalendarNotification` from the GoHighLevel OpenAPI spec.
1136#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1137pub struct CalendarNotification {
1138    /// Calendar Notification
1139    /// Allowed values: `email`.
1140    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
1141    pub type_: Option<String>,
1142    /// Required by the API.
1143    #[serde(rename = "shouldSendToContact")]
1144    pub should_send_to_contact: bool,
1145    /// Required by the API.
1146    #[serde(rename = "shouldSendToGuest")]
1147    pub should_send_to_guest: bool,
1148    /// Required by the API.
1149    #[serde(rename = "shouldSendToUser")]
1150    pub should_send_to_user: bool,
1151    /// Required by the API.
1152    #[serde(rename = "shouldSendToSelectedUsers")]
1153    pub should_send_to_selected_users: bool,
1154    /// Comma separated emails
1155    /// Required by the API.
1156    #[serde(rename = "selectedUsers")]
1157    pub selected_users: String,
1158}
1159
1160/// `CalendarNotificationDeleteResponseDTO` from the GoHighLevel OpenAPI spec.
1161#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1162pub struct CalendarNotificationDeleteResponseDTO {
1163    /// Result of delete/update operation
1164    /// Required by the API.
1165    pub message: String,
1166}
1167
1168/// `CalendarNotificationResponseDTO` from the GoHighLevel OpenAPI spec.
1169#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1170pub struct CalendarNotificationResponseDTO {
1171    /// Notification ID
1172    #[serde(rename = "_id", default, skip_serializing_if = "Option::is_none")]
1173    pub id: Option<String>,
1174    /// Allowed values: `contact`, `guest`, `assignedUser`, `emails`, `phoneNumbers`,
1175    /// `business`.
1176    #[serde(
1177        rename = "receiverType",
1178        default,
1179        skip_serializing_if = "Option::is_none"
1180    )]
1181    pub receiver_type: Option<String>,
1182    #[serde(
1183        rename = "additionalEmailIds",
1184        default,
1185        skip_serializing_if = "Vec::is_empty"
1186    )]
1187    pub additional_email_ids: Vec<String>,
1188    #[serde(
1189        rename = "additionalPhoneNumbers",
1190        default,
1191        skip_serializing_if = "Vec::is_empty"
1192    )]
1193    pub additional_phone_numbers: Vec<String>,
1194    /// Allowed values: `email`, `inApp`, `sms`, `whatsapp`.
1195    #[serde(default, skip_serializing_if = "Option::is_none")]
1196    pub channel: Option<String>,
1197    /// Allowed values: `booked`, `confirmation`, `cancellation`, `reminder`, `followup`,
1198    /// `reschedule`.
1199    #[serde(
1200        rename = "notificationType",
1201        default,
1202        skip_serializing_if = "Option::is_none"
1203    )]
1204    pub notification_type: Option<String>,
1205    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
1206    pub is_active: Option<bool>,
1207    #[serde(
1208        rename = "additionalWhatsappNumbers",
1209        default,
1210        skip_serializing_if = "Vec::is_empty"
1211    )]
1212    pub additional_whatsapp_numbers: Vec<String>,
1213    #[serde(
1214        rename = "templateId",
1215        default,
1216        skip_serializing_if = "Option::is_none"
1217    )]
1218    pub template_id: Option<String>,
1219    #[serde(default, skip_serializing_if = "Option::is_none")]
1220    pub body: Option<String>,
1221    #[serde(default, skip_serializing_if = "Option::is_none")]
1222    pub subject: Option<String>,
1223    #[serde(rename = "afterTime", default, skip_serializing_if = "Vec::is_empty")]
1224    pub after_time: Vec<SchedulesDTO>,
1225    #[serde(rename = "beforeTime", default, skip_serializing_if = "Vec::is_empty")]
1226    pub before_time: Vec<SchedulesDTO>,
1227    #[serde(
1228        rename = "selectedUsers",
1229        default,
1230        skip_serializing_if = "Vec::is_empty"
1231    )]
1232    pub selected_users: Vec<String>,
1233    #[serde(default, skip_serializing_if = "Option::is_none")]
1234    pub deleted: Option<bool>,
1235}
1236
1237/// `CalendarResourceByIdResponseDTO` from the GoHighLevel OpenAPI spec.
1238#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1239pub struct CalendarResourceByIdResponseDTO {
1240    /// Location ID of the resource
1241    /// Required by the API.
1242    #[serde(rename = "locationId")]
1243    pub location_id: String,
1244    /// Name of the resource
1245    /// Required by the API.
1246    pub name: String,
1247    /// Allowed values: `equipments`, `rooms`.
1248    /// Required by the API.
1249    #[serde(rename = "resourceType")]
1250    pub resource_type: String,
1251    /// Whether the resource is active
1252    /// Required by the API.
1253    #[serde(rename = "isActive")]
1254    pub is_active: bool,
1255    /// Description of the resource
1256    #[serde(default, skip_serializing_if = "Option::is_none")]
1257    pub description: Option<String>,
1258    /// Quantity of the resource
1259    #[serde(default, skip_serializing_if = "Option::is_none")]
1260    pub quantity: Option<f64>,
1261    /// Indicates if the resource is out of service
1262    #[serde(
1263        rename = "outOfService",
1264        default,
1265        skip_serializing_if = "Option::is_none"
1266    )]
1267    pub out_of_service: Option<f64>,
1268    /// Capacity of the resource
1269    #[serde(default, skip_serializing_if = "Option::is_none")]
1270    pub capacity: Option<f64>,
1271    /// Calendar IDs
1272    /// Required by the API.
1273    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
1274    pub calendar_ids: Vec<String>,
1275}
1276
1277/// `CalendarResourceResponseDTO` from the GoHighLevel OpenAPI spec.
1278#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1279pub struct CalendarResourceResponseDTO {
1280    /// Location ID of the resource
1281    /// Required by the API.
1282    #[serde(rename = "locationId")]
1283    pub location_id: String,
1284    /// Name of the resource
1285    /// Required by the API.
1286    pub name: String,
1287    /// Allowed values: `equipments`, `rooms`.
1288    /// Required by the API.
1289    #[serde(rename = "resourceType")]
1290    pub resource_type: String,
1291    /// Whether the resource is active
1292    /// Required by the API.
1293    #[serde(rename = "isActive")]
1294    pub is_active: bool,
1295    /// Description of the resource
1296    #[serde(default, skip_serializing_if = "Option::is_none")]
1297    pub description: Option<String>,
1298    /// Quantity of the resource
1299    #[serde(default, skip_serializing_if = "Option::is_none")]
1300    pub quantity: Option<f64>,
1301    /// Indicates if the resource is out of service
1302    #[serde(
1303        rename = "outOfService",
1304        default,
1305        skip_serializing_if = "Option::is_none"
1306    )]
1307    pub out_of_service: Option<f64>,
1308    /// Capacity of the resource
1309    #[serde(default, skip_serializing_if = "Option::is_none")]
1310    pub capacity: Option<f64>,
1311}
1312
1313/// `CalendarUpdateDTO` from the GoHighLevel OpenAPI spec.
1314#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1315pub struct CalendarUpdateDTO {
1316    /// 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead.
1317    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1318    pub notifications: Vec<CalendarNotification>,
1319    /// Group Id
1320    #[serde(rename = "groupId", default, skip_serializing_if = "Option::is_none")]
1321    pub group_id: Option<String>,
1322    /// Team members are required for calendars of type: Round Robin, Collective, Class,
1323    /// Service. Personal calendar must have exactly one team member.
1324    #[serde(rename = "teamMembers", default, skip_serializing_if = "Vec::is_empty")]
1325    pub team_members: Vec<TeamMember>,
1326    /// Allowed values: `RoundRobin_OptimizeForAvailability`,
1327    /// `RoundRobin_OptimizeForEqualDistribution`.
1328    #[serde(rename = "eventType", default, skip_serializing_if = "Option::is_none")]
1329    pub event_type: Option<String>,
1330    #[serde(default, skip_serializing_if = "Option::is_none")]
1331    pub name: Option<String>,
1332    #[serde(default, skip_serializing_if = "Option::is_none")]
1333    pub description: Option<String>,
1334    #[serde(default, skip_serializing_if = "Option::is_none")]
1335    pub slug: Option<String>,
1336    #[serde(
1337        rename = "widgetSlug",
1338        default,
1339        skip_serializing_if = "Option::is_none"
1340    )]
1341    pub widget_slug: Option<String>,
1342    /// Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout.
1343    /// Allowed values: `default`, `classic`.
1344    #[serde(
1345        rename = "widgetType",
1346        default,
1347        skip_serializing_if = "Option::is_none"
1348    )]
1349    pub widget_type: Option<String>,
1350    #[serde(
1351        rename = "eventTitle",
1352        default,
1353        skip_serializing_if = "Option::is_none"
1354    )]
1355    pub event_title: Option<String>,
1356    #[serde(
1357        rename = "eventColor",
1358        default,
1359        skip_serializing_if = "Option::is_none"
1360    )]
1361    pub event_color: Option<String>,
1362    /// Meeting location configuration for event calendar
1363    #[serde(
1364        rename = "locationConfigurations",
1365        default,
1366        skip_serializing_if = "Vec::is_empty"
1367    )]
1368    pub location_configurations: Vec<LocationConfiguration>,
1369    /// 🚨 Deprecated! Use `locationConfigurations.location` or
1370    /// `teamMembers[].locationConfigurations.location` instead.
1371    #[serde(
1372        rename = "meetingLocation",
1373        default,
1374        skip_serializing_if = "Option::is_none"
1375    )]
1376    pub meeting_location: Option<String>,
1377    /// This controls the duration of the meeting
1378    #[serde(
1379        rename = "slotDuration",
1380        default,
1381        skip_serializing_if = "Option::is_none"
1382    )]
1383    pub slot_duration: Option<f64>,
1384    /// Unit for slot duration.
1385    /// Allowed values: `mins`, `hours`.
1386    #[serde(
1387        rename = "slotDurationUnit",
1388        default,
1389        skip_serializing_if = "Option::is_none"
1390    )]
1391    pub slot_duration_unit: Option<String>,
1392    /// Unit for pre-buffer.
1393    /// Allowed values: `mins`, `hours`.
1394    #[serde(
1395        rename = "preBufferUnit",
1396        default,
1397        skip_serializing_if = "Option::is_none"
1398    )]
1399    pub pre_buffer_unit: Option<String>,
1400    /// Slot interval reflects the amount of time the between booking slots that will be shown
1401    /// in the calendar.
1402    #[serde(
1403        rename = "slotInterval",
1404        default,
1405        skip_serializing_if = "Option::is_none"
1406    )]
1407    pub slot_interval: Option<f64>,
1408    /// Unit for slot interval.
1409    /// Allowed values: `mins`, `hours`.
1410    #[serde(
1411        rename = "slotIntervalUnit",
1412        default,
1413        skip_serializing_if = "Option::is_none"
1414    )]
1415    pub slot_interval_unit: Option<String>,
1416    /// Slot-Buffer is additional time that can be added after an appointment, allowing for
1417    /// extra time to wrap up
1418    #[serde(
1419        rename = "slotBuffer",
1420        default,
1421        skip_serializing_if = "Option::is_none"
1422    )]
1423    pub slot_buffer: Option<f64>,
1424    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
1425    /// extra time to get ready
1426    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
1427    pub pre_buffer: Option<f64>,
1428    #[serde(
1429        rename = "appoinmentPerSlot",
1430        default,
1431        skip_serializing_if = "Option::is_none"
1432    )]
1433    pub appoinment_per_slot: Option<f64>,
1434    /// Number of appointments that can be booked for a given day
1435    #[serde(
1436        rename = "appoinmentPerDay",
1437        default,
1438        skip_serializing_if = "Option::is_none"
1439    )]
1440    pub appoinment_per_day: Option<f64>,
1441    /// Minimum scheduling notice for events
1442    #[serde(
1443        rename = "allowBookingAfter",
1444        default,
1445        skip_serializing_if = "Option::is_none"
1446    )]
1447    pub allow_booking_after: Option<f64>,
1448    /// Unit for minimum scheduling notice
1449    /// Allowed values: `hours`, `days`, `weeks`, `months`, `mins`.
1450    #[serde(
1451        rename = "allowBookingAfterUnit",
1452        default,
1453        skip_serializing_if = "Option::is_none"
1454    )]
1455    pub allow_booking_after_unit: Option<String>,
1456    /// Minimum number of days/weeks/months for which to allow booking events
1457    #[serde(
1458        rename = "allowBookingFor",
1459        default,
1460        skip_serializing_if = "Option::is_none"
1461    )]
1462    pub allow_booking_for: Option<f64>,
1463    /// Unit for controlling the duration for which booking would be allowed for
1464    /// Allowed values: `days`, `weeks`, `months`.
1465    #[serde(
1466        rename = "allowBookingForUnit",
1467        default,
1468        skip_serializing_if = "Option::is_none"
1469    )]
1470    pub allow_booking_for_unit: Option<String>,
1471    /// While we will support this property for backward compatibility, it is recommended to use
1472    /// 'Availability' APIs instead.
1473    #[serde(rename = "openHours", default, skip_serializing_if = "Vec::is_empty")]
1474    pub open_hours: Vec<OpenHour>,
1475    /// Enable recurring appointments for the calendars. Please note that only one member should
1476    /// be added in the calendar to enable this
1477    #[serde(
1478        rename = "enableRecurring",
1479        default,
1480        skip_serializing_if = "Option::is_none"
1481    )]
1482    pub enable_recurring: Option<bool>,
1483    #[serde(default, skip_serializing_if = "Option::is_none")]
1484    pub recurring: Option<Recurring>,
1485    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
1486    pub form_id: Option<String>,
1487    #[serde(
1488        rename = "stickyContact",
1489        default,
1490        skip_serializing_if = "Option::is_none"
1491    )]
1492    pub sticky_contact: Option<bool>,
1493    #[serde(
1494        rename = "isLivePaymentMode",
1495        default,
1496        skip_serializing_if = "Option::is_none"
1497    )]
1498    pub is_live_payment_mode: Option<bool>,
1499    #[serde(
1500        rename = "autoConfirm",
1501        default,
1502        skip_serializing_if = "Option::is_none"
1503    )]
1504    pub auto_confirm: Option<bool>,
1505    #[serde(
1506        rename = "shouldSendAlertEmailsToAssignedMember",
1507        default,
1508        skip_serializing_if = "Option::is_none"
1509    )]
1510    pub should_send_alert_emails_to_assigned_member: Option<bool>,
1511    #[serde(
1512        rename = "alertEmail",
1513        default,
1514        skip_serializing_if = "Option::is_none"
1515    )]
1516    pub alert_email: Option<String>,
1517    #[serde(
1518        rename = "googleInvitationEmails",
1519        default,
1520        skip_serializing_if = "Option::is_none"
1521    )]
1522    pub google_invitation_emails: Option<bool>,
1523    #[serde(
1524        rename = "allowReschedule",
1525        default,
1526        skip_serializing_if = "Option::is_none"
1527    )]
1528    pub allow_reschedule: Option<bool>,
1529    #[serde(
1530        rename = "allowCancellation",
1531        default,
1532        skip_serializing_if = "Option::is_none"
1533    )]
1534    pub allow_cancellation: Option<bool>,
1535    #[serde(
1536        rename = "shouldAssignContactToTeamMember",
1537        default,
1538        skip_serializing_if = "Option::is_none"
1539    )]
1540    pub should_assign_contact_to_team_member: Option<bool>,
1541    #[serde(
1542        rename = "shouldSkipAssigningContactForExisting",
1543        default,
1544        skip_serializing_if = "Option::is_none"
1545    )]
1546    pub should_skip_assigning_contact_for_existing: Option<bool>,
1547    #[serde(default, skip_serializing_if = "Option::is_none")]
1548    pub notes: Option<String>,
1549    #[serde(rename = "pixelId", default, skip_serializing_if = "Option::is_none")]
1550    pub pixel_id: Option<String>,
1551    /// Allowed values: `RedirectURL`, `ThankYouMessage`.
1552    #[serde(
1553        rename = "formSubmitType",
1554        default,
1555        skip_serializing_if = "Option::is_none"
1556    )]
1557    pub form_submit_type: Option<String>,
1558    #[serde(
1559        rename = "formSubmitRedirectURL",
1560        default,
1561        skip_serializing_if = "Option::is_none"
1562    )]
1563    pub form_submit_redirect_url: Option<String>,
1564    #[serde(
1565        rename = "formSubmitThanksMessage",
1566        default,
1567        skip_serializing_if = "Option::is_none"
1568    )]
1569    pub form_submit_thanks_message: Option<String>,
1570    /// While we will support this property for backward compatibility, it is not required
1571    /// anymore.
1572    /// Allowed values: `0`, `1`.
1573    #[serde(
1574        rename = "availabilityType",
1575        default,
1576        skip_serializing_if = "Option::is_none"
1577    )]
1578    pub availability_type: Option<String>,
1579    /// While we will support this property for backward compatibility, it is recommended to use
1580    /// 'Availability' APIs instead.
1581    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1582    pub availabilities: Vec<UpdateAvailability>,
1583    /// Allowed values: `count_only`, `collect_detail`.
1584    #[serde(rename = "guestType", default, skip_serializing_if = "Option::is_none")]
1585    pub guest_type: Option<String>,
1586    #[serde(
1587        rename = "consentLabel",
1588        default,
1589        skip_serializing_if = "Option::is_none"
1590    )]
1591    pub consent_label: Option<String>,
1592    #[serde(
1593        rename = "calendarCoverImage",
1594        default,
1595        skip_serializing_if = "Option::is_none"
1596    )]
1597    pub calendar_cover_image: Option<String>,
1598    /// Look Busy Configuration
1599    #[serde(
1600        rename = "lookBusyConfig",
1601        default,
1602        skip_serializing_if = "Option::is_none"
1603    )]
1604    pub look_busy_config: Option<LookBusyConfiguration>,
1605    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
1606    pub is_active: Option<bool>,
1607}
1608
1609/// `CalendarsGetSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
1610#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1611pub struct CalendarsGetSuccessfulResponseDTO {
1612    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1613    pub calendars: Vec<CalendarDTO>,
1614}
1615
1616/// `CreateBookingServiceDTO` from the GoHighLevel OpenAPI spec.
1617#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1618pub struct CreateBookingServiceDTO {
1619    /// Service ID
1620    /// Required by the API.
1621    pub id: String,
1622    /// Staff ID
1623    #[serde(rename = "staffId", default, skip_serializing_if = "Option::is_none")]
1624    pub staff_id: Option<String>,
1625    /// Position
1626    #[serde(default, skip_serializing_if = "Option::is_none")]
1627    pub position: Option<f64>,
1628    /// Add-ons
1629    #[serde(rename = "addOns", default, skip_serializing_if = "Vec::is_empty")]
1630    pub add_ons: Vec<ServiceAddOnDTO>,
1631}
1632
1633/// `CreateCalendarNotificationDTO` from the GoHighLevel OpenAPI spec.
1634#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1635pub struct CreateCalendarNotificationDTO {
1636    /// notification recipient type
1637    /// Allowed values: `contact`, `guest`, `assignedUser`, `emails`, `phoneNumbers`,
1638    /// `business`.
1639    /// Required by the API.
1640    #[serde(rename = "receiverType")]
1641    pub receiver_type: String,
1642    /// Notification channel
1643    /// Allowed values: `email`, `inApp`, `sms`, `whatsapp`.
1644    /// Required by the API.
1645    pub channel: String,
1646    /// Notification type
1647    /// Allowed values: `booked`, `confirmation`, `cancellation`, `reminder`, `followup`,
1648    /// `reschedule`.
1649    /// Required by the API.
1650    #[serde(rename = "notificationType")]
1651    pub notification_type: String,
1652    /// Is the notification active
1653    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
1654    pub is_active: Option<bool>,
1655    /// Template ID for email notification. Not necessary for in-App notification
1656    #[serde(
1657        rename = "templateId",
1658        default,
1659        skip_serializing_if = "Option::is_none"
1660    )]
1661    pub template_id: Option<String>,
1662    /// Body for email notification. Not necessary for in-App notification
1663    #[serde(default, skip_serializing_if = "Option::is_none")]
1664    pub body: Option<String>,
1665    /// Subject for email notification. Not necessary for in-App notification
1666    #[serde(default, skip_serializing_if = "Option::is_none")]
1667    pub subject: Option<String>,
1668    /// Specifies the time after which the follow-up notification should be sent. This is not
1669    /// required for other notification types.
1670    #[serde(rename = "afterTime", default, skip_serializing_if = "Vec::is_empty")]
1671    pub after_time: Vec<SchedulesDTO>,
1672    /// Specifies the time before which the reminder notification should be sent. This is not
1673    /// required for other notification types.
1674    #[serde(rename = "beforeTime", default, skip_serializing_if = "Vec::is_empty")]
1675    pub before_time: Vec<SchedulesDTO>,
1676    /// Additional email addresses to receive notifications.
1677    #[serde(
1678        rename = "additionalEmailIds",
1679        default,
1680        skip_serializing_if = "Vec::is_empty"
1681    )]
1682    pub additional_email_ids: Vec<String>,
1683    /// Additional phone numbers to receive notifications.
1684    #[serde(
1685        rename = "additionalPhoneNumbers",
1686        default,
1687        skip_serializing_if = "Vec::is_empty"
1688    )]
1689    pub additional_phone_numbers: Vec<String>,
1690    /// Selected users for in-App and business email notifications. Supports user IDs and
1691    /// special keyword "sub_account_admin"
1692    #[serde(
1693        rename = "selectedUsers",
1694        default,
1695        skip_serializing_if = "Vec::is_empty"
1696    )]
1697    pub selected_users: Vec<String>,
1698    /// from address for email notification
1699    #[serde(
1700        rename = "fromAddress",
1701        default,
1702        skip_serializing_if = "Option::is_none"
1703    )]
1704    pub from_address: Option<String>,
1705    /// from name for email/sms notification
1706    #[serde(rename = "fromName", default, skip_serializing_if = "Option::is_none")]
1707    pub from_name: Option<String>,
1708    /// from number for sms notification
1709    #[serde(
1710        rename = "fromNumber",
1711        default,
1712        skip_serializing_if = "Option::is_none"
1713    )]
1714    pub from_number: Option<String>,
1715}
1716
1717/// `CreateCalendarResourceDTO` from the GoHighLevel OpenAPI spec.
1718#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1719pub struct CreateCalendarResourceDTO {
1720    /// Required by the API.
1721    #[serde(rename = "locationId")]
1722    pub location_id: String,
1723    /// Required by the API.
1724    pub name: String,
1725    /// Required by the API.
1726    pub description: String,
1727    /// Quantity of the equipment.
1728    /// Required by the API.
1729    pub quantity: f64,
1730    /// Quantity of the out of service equipment.
1731    /// Required by the API.
1732    #[serde(rename = "outOfService")]
1733    pub out_of_service: f64,
1734    /// Capacity of the room.
1735    /// Required by the API.
1736    pub capacity: f64,
1737    /// Service calendar IDs to be mapped with the resource. One equipment can only be mapped
1738    /// with one service calendar. One room can be mapped with multiple service calendars.
1739    /// Required by the API.
1740    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
1741    pub calendar_ids: Vec<String>,
1742}
1743
1744/// `CreateEventCalendarScheduleDTO` from the GoHighLevel OpenAPI spec.
1745#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1746pub struct CreateEventCalendarScheduleDTO {
1747    /// Schedule rules defining when the schedule is active
1748    /// Required by the API.
1749    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1750    pub rules: Vec<ScheduleRuleDTO>,
1751    /// Timezone for the schedule (IANA timezone identifier)
1752    /// Required by the API.
1753    pub timezone: String,
1754}
1755
1756/// `CreateOrUpdateServiceBookingResponseDTO` from the GoHighLevel OpenAPI spec.
1757#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1758pub struct CreateOrUpdateServiceBookingResponseDTO {
1759    /// Booking ID
1760    /// Required by the API.
1761    #[serde(rename = "bookingId")]
1762    pub booking_id: String,
1763    /// Location ID
1764    /// Required by the API.
1765    #[serde(rename = "locationId")]
1766    pub location_id: String,
1767    /// Contact ID
1768    /// Required by the API.
1769    #[serde(rename = "contactId")]
1770    pub contact_id: String,
1771    /// Service Location ID
1772    /// Required by the API.
1773    #[serde(rename = "serviceLocationId")]
1774    pub service_location_id: String,
1775    /// Service Booking Title
1776    /// Required by the API.
1777    pub title: String,
1778    /// Start Time
1779    /// Required by the API.
1780    #[serde(rename = "startTime")]
1781    pub start_time: String,
1782    /// End Time
1783    /// Required by the API.
1784    #[serde(rename = "endTime")]
1785    pub end_time: String,
1786    /// Services
1787    /// Required by the API.
1788    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1789    pub services: Vec<ServiceDTO>,
1790    /// Timezone
1791    /// Required by the API.
1792    pub timezone: String,
1793    /// Status
1794    /// Required by the API.
1795    pub status: String,
1796    /// Tells if the booking is deleted
1797    /// Required by the API.
1798    pub deleted: bool,
1799    /// Date Added
1800    /// Required by the API.
1801    #[serde(rename = "dateAdded")]
1802    pub date_added: String,
1803    /// Date Updated
1804    /// Required by the API.
1805    #[serde(rename = "dateUpdated")]
1806    pub date_updated: String,
1807    /// Booking booked by metadata
1808    /// Required by the API.
1809    #[serde(rename = "createdBy")]
1810    pub created_by: CreatedOrUpdatedBy,
1811    /// Meeting Location (If service location is an ask the booker, then the meeting location is
1812    /// used for the booking)
1813    #[serde(
1814        rename = "meetingLocation",
1815        default,
1816        skip_serializing_if = "Option::is_none"
1817    )]
1818    pub meeting_location: Option<String>,
1819    /// Optional informative or warning messages (e.g. meeting location ignored for
1820    /// non-ask-booker locations)
1821    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1822    pub messages: Vec<Vec<serde_json::Value>>,
1823}
1824
1825/// `CreatePublicServiceBookingDTO` from the GoHighLevel OpenAPI spec.
1826#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1827pub struct CreatePublicServiceBookingDTO {
1828    /// Location ID
1829    /// Required by the API.
1830    #[serde(rename = "locationId")]
1831    pub location_id: String,
1832    /// Contact ID
1833    /// Required by the API.
1834    #[serde(rename = "contactId")]
1835    pub contact_id: String,
1836    /// Start Time
1837    /// Required by the API.
1838    #[serde(rename = "startTime")]
1839    pub start_time: String,
1840    /// End Time
1841    /// Required by the API.
1842    #[serde(rename = "endTime")]
1843    pub end_time: String,
1844    /// Timezone
1845    /// Required by the API.
1846    pub timezone: String,
1847    /// Services
1848    /// Required by the API.
1849    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1850    pub services: Vec<CreateBookingServiceDTO>,
1851    /// Service Location ID (If not provided, then the default service location will be used)
1852    #[serde(
1853        rename = "serviceLocationId",
1854        default,
1855        skip_serializing_if = "Option::is_none"
1856    )]
1857    pub service_location_id: Option<String>,
1858    /// Meeting Location (If service location is an ask the booker, then the meeting location is
1859    /// required)
1860    #[serde(
1861        rename = "meetingLocation",
1862        default,
1863        skip_serializing_if = "Option::is_none"
1864    )]
1865    pub meeting_location: Option<String>,
1866    /// Service Booking Title
1867    #[serde(default, skip_serializing_if = "Option::is_none")]
1868    pub title: Option<String>,
1869    /// Status. (If not provided, the status configured in Service Global Settings will be
1870    /// used.)
1871    /// Allowed values: `confirmed`, `new`.
1872    #[serde(default, skip_serializing_if = "Option::is_none")]
1873    pub status: Option<String>,
1874}
1875
1876/// `CreateScheduleDTO` from the GoHighLevel OpenAPI spec.
1877#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1878pub struct CreateScheduleDTO {
1879    /// Schedule rules defining when the schedule is active
1880    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1881    pub rules: Vec<ScheduleRuleDTO>,
1882    /// Timezone for the schedule (IANA timezone identifier)
1883    /// Required by the API.
1884    pub timezone: String,
1885    /// Location ID where this schedule applies
1886    /// Required by the API.
1887    #[serde(rename = "locationId")]
1888    pub location_id: String,
1889    /// Human-readable name for the schedule
1890    /// Required by the API.
1891    pub name: String,
1892    /// User ID associated with the schedule
1893    /// Required by the API.
1894    #[serde(rename = "userId")]
1895    pub user_id: String,
1896    /// Calendar IDs associated with the schedule
1897    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
1898    pub calendar_ids: Vec<String>,
1899}
1900
1901/// `CreateServiceDTO` from the GoHighLevel OpenAPI spec.
1902#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1903pub struct CreateServiceDTO {
1904    /// Location ID
1905    /// Required by the API.
1906    #[serde(rename = "locationId")]
1907    pub location_id: String,
1908    /// Service name
1909    /// Required by the API.
1910    pub name: String,
1911    /// Unique URL-friendly identifier
1912    /// Required by the API.
1913    pub slug: String,
1914    /// Assigned staff members (at least one required)
1915    /// Required by the API.
1916    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1917    pub staff: Vec<StaffDTO>,
1918    /// Service description
1919    #[serde(default, skip_serializing_if = "Option::is_none")]
1920    pub description: Option<String>,
1921    /// Service event color (hex)
1922    #[serde(
1923        rename = "eventColor",
1924        default,
1925        skip_serializing_if = "Option::is_none"
1926    )]
1927    pub event_color: Option<String>,
1928    /// Service cover image URL
1929    #[serde(
1930        rename = "coverImage",
1931        default,
1932        skip_serializing_if = "Option::is_none"
1933    )]
1934    pub cover_image: Option<String>,
1935    /// Service category ID (uses default category if not provided)
1936    #[serde(
1937        rename = "serviceCategoryId",
1938        default,
1939        skip_serializing_if = "Option::is_none"
1940    )]
1941    pub service_category_id: Option<String>,
1942    /// Payment details (default amount is 0, currency configured in Service Global Settings is
1943    /// used.)
1944    #[serde(default, skip_serializing_if = "Option::is_none")]
1945    pub payment: Option<PaymentDTO>,
1946    /// This controls the duration of the appointment
1947    #[serde(
1948        rename = "serviceDuration",
1949        default,
1950        skip_serializing_if = "Option::is_none"
1951    )]
1952    pub service_duration: Option<f64>,
1953    /// Duration unit
1954    /// Allowed values: `mins`, `hours`.
1955    #[serde(
1956        rename = "serviceDurationUnit",
1957        default,
1958        skip_serializing_if = "Option::is_none"
1959    )]
1960    pub service_duration_unit: Option<String>,
1961    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
1962    /// extra time to get ready
1963    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
1964    pub pre_buffer: Option<f64>,
1965    /// Pre-buffer unit
1966    /// Allowed values: `mins`, `hours`.
1967    #[serde(
1968        rename = "preBufferUnit",
1969        default,
1970        skip_serializing_if = "Option::is_none"
1971    )]
1972    pub pre_buffer_unit: Option<String>,
1973    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
1974    /// time to wrap up
1975    #[serde(
1976        rename = "postBuffer",
1977        default,
1978        skip_serializing_if = "Option::is_none"
1979    )]
1980    pub post_buffer: Option<f64>,
1981    /// Post-buffer unit
1982    /// Allowed values: `mins`, `hours`.
1983    #[serde(
1984        rename = "postBufferUnit",
1985        default,
1986        skip_serializing_if = "Option::is_none"
1987    )]
1988    pub post_buffer_unit: Option<String>,
1989    /// Whether service is private (not shown publicly)
1990    #[serde(rename = "isPrivate", default, skip_serializing_if = "Option::is_none")]
1991    pub is_private: Option<bool>,
1992    /// Custom form ID (will be used to display the custom form on the booking page, if only one
1993    /// service is selected)
1994    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
1995    pub form_id: Option<String>,
1996    /// Service variations (pass empty array for no variations)
1997    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1998    pub variations: Vec<CreateServiceVariationDTO>,
1999}
2000
2001/// `CreateServiceLocationDTO` from the GoHighLevel OpenAPI spec.
2002#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2003pub struct CreateServiceLocationDTO {
2004    /// Location ID
2005    /// Required by the API.
2006    #[serde(rename = "locationId")]
2007    pub location_id: String,
2008    /// Location name
2009    /// Required by the API.
2010    pub name: String,
2011    /// URL-friendly slug identifier
2012    /// Required by the API.
2013    pub slug: String,
2014    /// Phone number
2015    #[serde(default, skip_serializing_if = "Option::is_none")]
2016    pub phone: Option<String>,
2017    /// Use a full street address when locationType is offline. Use a user-facing label when
2018    /// locationType is ask_booker.
2019    #[serde(default, skip_serializing_if = "Option::is_none")]
2020    pub address: Option<String>,
2021    /// URL of the cover image for this service location
2022    #[serde(
2023        rename = "coverImage",
2024        default,
2025        skip_serializing_if = "Option::is_none"
2026    )]
2027    pub cover_image: Option<String>,
2028    /// Location type
2029    /// Allowed values: `offline`, `ask_booker`.
2030    #[serde(
2031        rename = "locationType",
2032        default,
2033        skip_serializing_if = "Option::is_none"
2034    )]
2035    pub location_type: Option<String>,
2036}
2037
2038/// `CreateServiceVariationDTO` from the GoHighLevel OpenAPI spec.
2039#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2040pub struct CreateServiceVariationDTO {
2041    /// This controls the duration of the appointment
2042    #[serde(
2043        rename = "serviceDuration",
2044        default,
2045        skip_serializing_if = "Option::is_none"
2046    )]
2047    pub service_duration: Option<f64>,
2048    /// Duration unit
2049    /// Allowed values: `mins`, `hours`.
2050    #[serde(
2051        rename = "serviceDurationUnit",
2052        default,
2053        skip_serializing_if = "Option::is_none"
2054    )]
2055    pub service_duration_unit: Option<String>,
2056    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
2057    /// extra time to get ready
2058    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
2059    pub pre_buffer: Option<f64>,
2060    /// Pre-buffer unit
2061    /// Allowed values: `mins`, `hours`.
2062    #[serde(
2063        rename = "preBufferUnit",
2064        default,
2065        skip_serializing_if = "Option::is_none"
2066    )]
2067    pub pre_buffer_unit: Option<String>,
2068    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
2069    /// time to wrap up
2070    #[serde(
2071        rename = "postBuffer",
2072        default,
2073        skip_serializing_if = "Option::is_none"
2074    )]
2075    pub post_buffer: Option<f64>,
2076    /// Post-buffer unit
2077    /// Allowed values: `mins`, `hours`.
2078    #[serde(
2079        rename = "postBufferUnit",
2080        default,
2081        skip_serializing_if = "Option::is_none"
2082    )]
2083    pub post_buffer_unit: Option<String>,
2084    /// Payment details
2085    #[serde(default, skip_serializing_if = "Option::is_none")]
2086    pub payment: Option<PaymentDTO>,
2087    /// Variation name
2088    /// Required by the API.
2089    pub name: String,
2090}
2091
2092/// `CreatedOrUpdatedBy` from the GoHighLevel OpenAPI spec.
2093#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2094pub struct CreatedOrUpdatedBy {
2095    /// The ID of the user who created or updated the appointment
2096    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
2097    pub user_id: Option<String>,
2098    /// The source of the appointment
2099    /// Required by the API.
2100    pub source: String,
2101}
2102
2103/// `DeleteAppointmentSchema` from the GoHighLevel OpenAPI spec.
2104#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2105pub struct DeleteAppointmentSchema {
2106    /// The spec defines no fields for this schema.
2107    #[serde(flatten)]
2108    pub extra: serde_json::Map<String, serde_json::Value>,
2109}
2110
2111/// `DeleteEventSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
2112#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2113pub struct DeleteEventSuccessfulResponseDto {
2114    #[serde(default, skip_serializing_if = "Option::is_none")]
2115    pub succeeded: Option<bool>,
2116}
2117
2118/// `DeleteNoteSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
2119#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2120pub struct DeleteNoteSuccessfulResponseDto {
2121    #[serde(default, skip_serializing_if = "Option::is_none")]
2122    pub success: Option<bool>,
2123}
2124
2125/// `DeleteServiceBookingResponseDTO` from the GoHighLevel OpenAPI spec.
2126#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2127pub struct DeleteServiceBookingResponseDTO {
2128    /// Indicates if the deletion was successful
2129    /// Required by the API.
2130    pub success: bool,
2131    /// Response message
2132    /// Required by the API.
2133    pub message: String,
2134}
2135
2136/// `DeleteServiceLocationResponseDTO` from the GoHighLevel OpenAPI spec.
2137#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2138pub struct DeleteServiceLocationResponseDTO {
2139    /// Success
2140    /// Required by the API.
2141    pub success: bool,
2142    /// Success message
2143    #[serde(default, skip_serializing_if = "Option::is_none")]
2144    pub message: Option<String>,
2145}
2146
2147/// `DeleteServiceResponseDTO` from the GoHighLevel OpenAPI spec.
2148#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2149pub struct DeleteServiceResponseDTO {
2150    /// Success
2151    /// Required by the API.
2152    pub success: bool,
2153    /// Success message
2154    #[serde(default, skip_serializing_if = "Option::is_none")]
2155    pub message: Option<String>,
2156}
2157
2158/// `EventCalendarScheduleResponseDTO` from the GoHighLevel OpenAPI spec.
2159#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2160pub struct EventCalendarScheduleResponseDTO {
2161    /// Timezone for the schedule (IANA timezone identifier)
2162    /// Required by the API.
2163    pub timezone: String,
2164    /// Schedule rules defining when the schedule is active
2165    /// Required by the API.
2166    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2167    pub rules: Vec<ScheduleRuleDTO>,
2168    /// Calendar ID associated with the schedule
2169    /// Required by the API.
2170    #[serde(rename = "calendarId")]
2171    pub calendar_id: String,
2172    /// Information about who created the schedule
2173    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
2174    pub date_added: Option<String>,
2175    /// Information about who last updated the schedule
2176    #[serde(
2177        rename = "dateUpdated",
2178        default,
2179        skip_serializing_if = "Option::is_none"
2180    )]
2181    pub date_updated: Option<String>,
2182}
2183
2184/// `EventCalendarScheduleWrapperDTO` from the GoHighLevel OpenAPI spec.
2185#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2186pub struct EventCalendarScheduleWrapperDTO {
2187    /// The event calendar schedule
2188    /// Required by the API.
2189    pub schedule: EventCalendarScheduleResponseDTO,
2190}
2191
2192/// `GetAllSchedulesResponseDTO` from the GoHighLevel OpenAPI spec.
2193#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2194pub struct GetAllSchedulesResponseDTO {
2195    /// Array of schedules
2196    /// Required by the API.
2197    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2198    pub schedules: Vec<ScheduleObjectResponseDTO>,
2199}
2200
2201/// `GetCalendarEventSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
2202#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2203pub struct GetCalendarEventSuccessfulResponseDTO {
2204    #[serde(default, skip_serializing_if = "Option::is_none")]
2205    pub event: Option<CalendarEventDTO>,
2206}
2207
2208/// `GetCalendarEventsSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
2209#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2210pub struct GetCalendarEventsSuccessfulResponseDTO {
2211    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2212    pub events: Vec<CalendarEventDTO>,
2213}
2214
2215/// `GetCreateUpdateNoteSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
2216#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2217pub struct GetCreateUpdateNoteSuccessfulResponseDto {
2218    #[serde(default, skip_serializing_if = "Option::is_none")]
2219    pub note: Option<GetNoteSchema>,
2220}
2221
2222/// `GetNoteSchema` from the GoHighLevel OpenAPI spec.
2223#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2224pub struct GetNoteSchema {
2225    #[serde(default, skip_serializing_if = "Option::is_none")]
2226    pub id: Option<String>,
2227    #[serde(default, skip_serializing_if = "Option::is_none")]
2228    pub body: Option<String>,
2229    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
2230    pub user_id: Option<String>,
2231    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
2232    pub date_added: Option<String>,
2233    #[serde(rename = "contactId", default, skip_serializing_if = "Option::is_none")]
2234    pub contact_id: Option<String>,
2235    #[serde(rename = "createdBy", default, skip_serializing_if = "Option::is_none")]
2236    pub created_by: Option<NoteCreatedBySchema>,
2237}
2238
2239/// `GetNotesListSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
2240#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2241pub struct GetNotesListSuccessfulResponseDto {
2242    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2243    pub notes: Vec<GetNoteSchema>,
2244    #[serde(rename = "hasMore", default, skip_serializing_if = "Option::is_none")]
2245    pub has_more: Option<bool>,
2246}
2247
2248/// `GroupCreateDTO` from the GoHighLevel OpenAPI spec.
2249#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2250pub struct GroupCreateDTO {
2251    /// Required by the API.
2252    #[serde(rename = "locationId")]
2253    pub location_id: String,
2254    /// Required by the API.
2255    pub name: String,
2256    /// Required by the API.
2257    pub description: String,
2258    /// Required by the API.
2259    pub slug: String,
2260    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
2261    pub is_active: Option<bool>,
2262}
2263
2264/// `GroupCreateSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
2265#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2266pub struct GroupCreateSuccessfulResponseDTO {
2267    #[serde(default, skip_serializing_if = "Option::is_none")]
2268    pub group: Option<GroupDTO>,
2269}
2270
2271/// `GroupDTO` from the GoHighLevel OpenAPI spec.
2272#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2273pub struct GroupDTO {
2274    /// Required by the API.
2275    #[serde(rename = "locationId")]
2276    pub location_id: String,
2277    /// Required by the API.
2278    pub name: String,
2279    /// Required by the API.
2280    pub description: String,
2281    /// Required by the API.
2282    pub slug: String,
2283    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
2284    pub is_active: Option<bool>,
2285    #[serde(default, skip_serializing_if = "Option::is_none")]
2286    pub id: Option<String>,
2287}
2288
2289/// `GroupStatusUpdateParams` from the GoHighLevel OpenAPI spec.
2290#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2291pub struct GroupStatusUpdateParams {
2292    /// Is Active?
2293    /// Required by the API.
2294    #[serde(rename = "isActive")]
2295    pub is_active: bool,
2296}
2297
2298/// `GroupSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
2299#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2300pub struct GroupSuccessfulResponseDTO {
2301    /// Success
2302    #[serde(default, skip_serializing_if = "Option::is_none")]
2303    pub success: Option<bool>,
2304}
2305
2306/// `GroupUpdateDTO` from the GoHighLevel OpenAPI spec.
2307#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2308pub struct GroupUpdateDTO {
2309    /// Required by the API.
2310    pub name: String,
2311    /// Required by the API.
2312    pub description: String,
2313    /// Required by the API.
2314    pub slug: String,
2315}
2316
2317/// `Hour` from the GoHighLevel OpenAPI spec.
2318#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2319pub struct Hour {
2320    /// Required by the API.
2321    #[serde(rename = "openHour")]
2322    pub open_hour: f64,
2323    /// Required by the API.
2324    #[serde(rename = "openMinute")]
2325    pub open_minute: f64,
2326    /// Required by the API.
2327    #[serde(rename = "closeHour")]
2328    pub close_hour: f64,
2329    /// Required by the API.
2330    #[serde(rename = "closeMinute")]
2331    pub close_minute: f64,
2332}
2333
2334/// `LocationConfiguration` from the GoHighLevel OpenAPI spec.
2335#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2336pub struct LocationConfiguration {
2337    /// Type of meeting location. zoom_conference/google_conference/ms_teams_conference is not
2338    /// supported in event calendar type
2339    /// Allowed values: `custom`, `zoom_conference`, `google_conference`, `inbound_call`,
2340    /// `outbound_call`, `physical`, `booker`, `ms_teams_conference`.
2341    /// Required by the API.
2342    pub kind: String,
2343    /// Address for meeting location. Not applicable on "zoom_conference", "google_conference"
2344    /// and "ms_teams_conference" kind
2345    #[serde(default, skip_serializing_if = "Option::is_none")]
2346    pub location: Option<String>,
2347}
2348
2349/// `LocationConfigurationResponse` from the GoHighLevel OpenAPI spec.
2350#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2351pub struct LocationConfigurationResponse {
2352    /// Type of meeting location. zoom_conference/google_conference/ms_teams_conference is not
2353    /// supported in event calendar type
2354    /// Allowed values: `custom`, `zoom_conference`, `google_conference`, `inbound_call`,
2355    /// `outbound_call`, `physical`, `booker`, `ms_teams_conference`.
2356    /// Required by the API.
2357    pub kind: String,
2358    /// Address for meeting location. Not applicable on "zoom_conference", "google_conference"
2359    /// and "ms_teams_conference" kind
2360    #[serde(default, skip_serializing_if = "Option::is_none")]
2361    pub location: Option<String>,
2362    /// Unique ID used to select a specific meeting location
2363    #[serde(rename = "meetingId", default, skip_serializing_if = "Option::is_none")]
2364    pub meeting_id: Option<String>,
2365}
2366
2367/// `LookBusyConfiguration` from the GoHighLevel OpenAPI spec.
2368#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2369pub struct LookBusyConfiguration {
2370    /// Apply Look Busy
2371    /// Required by the API.
2372    pub enabled: bool,
2373    /// Percentage of slots that will be hidden
2374    /// Required by the API.
2375    #[serde(rename = "LookBusyPercentage")]
2376    pub look_busy_percentage: f64,
2377}
2378
2379/// `NoteCreatedBySchema` from the GoHighLevel OpenAPI spec.
2380#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2381pub struct NoteCreatedBySchema {
2382    #[serde(default, skip_serializing_if = "Option::is_none")]
2383    pub id: Option<String>,
2384    #[serde(default, skip_serializing_if = "Option::is_none")]
2385    pub name: Option<String>,
2386}
2387
2388/// `NotesDTO` from the GoHighLevel OpenAPI spec.
2389#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2390pub struct NotesDTO {
2391    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
2392    pub user_id: Option<String>,
2393    /// Note body
2394    /// Required by the API.
2395    pub body: String,
2396}
2397
2398/// `OpenHour` from the GoHighLevel OpenAPI spec.
2399#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2400pub struct OpenHour {
2401    /// Required by the API.
2402    #[serde(
2403        rename = "daysOfTheWeek",
2404        default,
2405        skip_serializing_if = "Vec::is_empty"
2406    )]
2407    pub days_of_the_week: Vec<f64>,
2408    /// Required by the API.
2409    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2410    pub hours: Vec<Hour>,
2411}
2412
2413/// `PaymentDTO` from the GoHighLevel OpenAPI spec.
2414#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2415pub struct PaymentDTO {
2416    /// Service price
2417    #[serde(default, skip_serializing_if = "Option::is_none")]
2418    pub amount: Option<f64>,
2419    /// Deposit amount or percentage value
2420    #[serde(default, skip_serializing_if = "Option::is_none")]
2421    pub deposit: Option<f64>,
2422    /// Deposit type
2423    /// Allowed values: `percentage`, `amount`.
2424    #[serde(
2425        rename = "depositType",
2426        default,
2427        skip_serializing_if = "Option::is_none"
2428    )]
2429    pub deposit_type: Option<String>,
2430}
2431
2432/// `Recurring` from the GoHighLevel OpenAPI spec.
2433#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2434pub struct Recurring {
2435    /// Allowed values: `DAILY`, `WEEKLY`, `MONTHLY`.
2436    #[serde(default, skip_serializing_if = "Option::is_none")]
2437    pub freq: Option<String>,
2438    /// Number of recurrences
2439    #[serde(default, skip_serializing_if = "Option::is_none")]
2440    pub count: Option<f64>,
2441    /// This setting contols what to do incase a recurring slot is unavailable
2442    /// Allowed values: `skip`, `continue`, `book_next`.
2443    #[serde(
2444        rename = "bookingOption",
2445        default,
2446        skip_serializing_if = "Option::is_none"
2447    )]
2448    pub booking_option: Option<String>,
2449    /// This setting contols what to do incase a recurring slot is unavailable
2450    /// Allowed values: `confirmed`, `new`.
2451    #[serde(
2452        rename = "bookingOverlapDefaultStatus",
2453        default,
2454        skip_serializing_if = "Option::is_none"
2455    )]
2456    pub booking_overlap_default_status: Option<String>,
2457}
2458
2459/// `ResourceDeleteResponseDTO` from the GoHighLevel OpenAPI spec.
2460#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2461pub struct ResourceDeleteResponseDTO {
2462    /// Success
2463    #[serde(default, skip_serializing_if = "Option::is_none")]
2464    pub success: Option<bool>,
2465}
2466
2467/// `ScheduleIntervalDTO` from the GoHighLevel OpenAPI spec.
2468#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2469pub struct ScheduleIntervalDTO {
2470    /// Start time in HH:MM format (24-hour format)
2471    /// Required by the API.
2472    #[serde(rename = "from")]
2473    pub from_: String,
2474    /// End time in HH:MM format (24-hour format)
2475    /// Required by the API.
2476    pub to: String,
2477}
2478
2479/// `ScheduleObjectResponseDTO` from the GoHighLevel OpenAPI spec.
2480#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2481pub struct ScheduleObjectResponseDTO {
2482    /// Unique identifier for the schedule
2483    /// Required by the API.
2484    pub id: String,
2485    /// Human-readable name for the schedule
2486    /// Required by the API.
2487    pub name: String,
2488    /// Location ID where this schedule applies
2489    /// Required by the API.
2490    #[serde(rename = "locationId")]
2491    pub location_id: String,
2492    /// Schedule rules defining when the schedule is active
2493    /// Required by the API.
2494    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2495    pub rules: Vec<ScheduleRuleDTO>,
2496    /// Timezone for the schedule (IANA timezone identifier)
2497    /// Required by the API.
2498    pub timezone: String,
2499    /// ISO date string when the schedule was created
2500    /// Required by the API.
2501    #[serde(rename = "dateAdded")]
2502    pub date_added: String,
2503    /// ISO date string when the schedule was last updated
2504    /// Required by the API.
2505    #[serde(rename = "dateUpdated")]
2506    pub date_updated: String,
2507    /// User ID associated with the schedule
2508    /// Required by the API.
2509    #[serde(rename = "userId")]
2510    pub user_id: String,
2511    /// Calendar IDs associated with the schedule
2512    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
2513    pub calendar_ids: Vec<String>,
2514    /// Whether the schedule has been deleted
2515    /// Required by the API.
2516    pub deleted: bool,
2517}
2518
2519/// `ScheduleResponseDTO` from the GoHighLevel OpenAPI spec.
2520#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2521pub struct ScheduleResponseDTO {
2522    /// Schedule
2523    /// Required by the API.
2524    pub schedule: ScheduleObjectResponseDTO,
2525}
2526
2527/// `ScheduleRuleDTO` from the GoHighLevel OpenAPI spec.
2528#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2529pub struct ScheduleRuleDTO {
2530    /// Type of schedule rule - weekday (recurring) or date (specific date)
2531    /// Allowed values: `wday`, `date`.
2532    /// Required by the API.
2533    #[serde(rename = "type")]
2534    pub type_: String,
2535    /// Time intervals for the rule (e.g., 9 AM to 5 PM)
2536    /// Required by the API.
2537    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2538    pub intervals: Vec<ScheduleIntervalDTO>,
2539    /// Specific date in YYYY-MM-DD format (only for date-type rules)
2540    #[serde(default, skip_serializing_if = "Option::is_none")]
2541    pub date: Option<String>,
2542    /// Day of week (only for weekday-type rules)
2543    /// Allowed values: `sunday`, `monday`, `tuesday`, `wednesday`, `thursday`, `friday`,
2544    /// `saturday`.
2545    #[serde(default, skip_serializing_if = "Option::is_none")]
2546    pub day: Option<String>,
2547}
2548
2549/// `SchedulesDTO` from the GoHighLevel OpenAPI spec.
2550#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2551pub struct SchedulesDTO {
2552    #[serde(
2553        rename = "timeOffset",
2554        default,
2555        skip_serializing_if = "Option::is_none"
2556    )]
2557    pub time_offset: Option<f64>,
2558    #[serde(default, skip_serializing_if = "Option::is_none")]
2559    pub unit: Option<String>,
2560}
2561
2562/// `ServiceAddOnDTO` from the GoHighLevel OpenAPI spec.
2563#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2564pub struct ServiceAddOnDTO {
2565    /// Add-on ID
2566    /// Required by the API.
2567    pub id: String,
2568    /// Add-on quantity
2569    #[serde(default, skip_serializing_if = "Option::is_none")]
2570    pub quantity: Option<f64>,
2571    /// Add-on duration (in minutes)
2572    #[serde(default, skip_serializing_if = "Option::is_none")]
2573    pub duration: Option<f64>,
2574}
2575
2576/// `ServiceAddOnResponseDTO` from the GoHighLevel OpenAPI spec.
2577#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2578pub struct ServiceAddOnResponseDTO {
2579    /// Add-on ID
2580    /// Required by the API.
2581    pub id: String,
2582    /// Add-on quantity
2583    #[serde(default, skip_serializing_if = "Option::is_none")]
2584    pub quantity: Option<f64>,
2585}
2586
2587/// `ServiceBookingQueryDTO` from the GoHighLevel OpenAPI spec.
2588#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2589pub struct ServiceBookingQueryDTO {
2590    /// If true the time slot validation would be avoided for any booking creation/update (even
2591    /// the skipSchedulingNotice)
2592    #[serde(
2593        rename = "overrideAvailability",
2594        default,
2595        skip_serializing_if = "Option::is_none"
2596    )]
2597    pub override_availability: Option<bool>,
2598    /// If set to true, the minimum scheduling notice and date range would be ignored
2599    #[serde(
2600        rename = "skipSchedulingNotice",
2601        default,
2602        skip_serializing_if = "Option::is_none"
2603    )]
2604    pub skip_scheduling_notice: Option<bool>,
2605}
2606
2607/// `ServiceBookingResponseDTO` from the GoHighLevel OpenAPI spec.
2608#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2609pub struct ServiceBookingResponseDTO {
2610    /// Booking ID
2611    /// Required by the API.
2612    #[serde(rename = "bookingId")]
2613    pub booking_id: String,
2614    /// Location ID
2615    /// Required by the API.
2616    #[serde(rename = "locationId")]
2617    pub location_id: String,
2618    /// Contact ID
2619    /// Required by the API.
2620    #[serde(rename = "contactId")]
2621    pub contact_id: String,
2622    /// Service Location ID
2623    /// Required by the API.
2624    #[serde(rename = "serviceLocationId")]
2625    pub service_location_id: String,
2626    /// Service Booking Title
2627    /// Required by the API.
2628    pub title: String,
2629    /// Start Time
2630    /// Required by the API.
2631    #[serde(rename = "startTime")]
2632    pub start_time: String,
2633    /// End Time
2634    /// Required by the API.
2635    #[serde(rename = "endTime")]
2636    pub end_time: String,
2637    /// Services
2638    /// Required by the API.
2639    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2640    pub services: Vec<ServiceDTO>,
2641    /// Timezone
2642    /// Required by the API.
2643    pub timezone: String,
2644    /// Status
2645    /// Required by the API.
2646    pub status: String,
2647    /// Tells if the booking is deleted
2648    /// Required by the API.
2649    pub deleted: bool,
2650    /// Date Added
2651    /// Required by the API.
2652    #[serde(rename = "dateAdded")]
2653    pub date_added: String,
2654    /// Date Updated
2655    /// Required by the API.
2656    #[serde(rename = "dateUpdated")]
2657    pub date_updated: String,
2658    /// Booking booked by metadata
2659    /// Required by the API.
2660    #[serde(rename = "createdBy")]
2661    pub created_by: CreatedOrUpdatedBy,
2662    /// Meeting Location (If service location is an ask the booker, then the meeting location is
2663    /// used for the booking)
2664    #[serde(
2665        rename = "meetingLocation",
2666        default,
2667        skip_serializing_if = "Option::is_none"
2668    )]
2669    pub meeting_location: Option<String>,
2670}
2671
2672/// `ServiceBookingsListResponseDTO` from the GoHighLevel OpenAPI spec.
2673#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2674pub struct ServiceBookingsListResponseDTO {
2675    /// Service Bookings
2676    /// Required by the API.
2677    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2678    pub bookings: Vec<ServiceBookingResponseDTO>,
2679}
2680
2681/// `ServiceDTO` from the GoHighLevel OpenAPI spec.
2682#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2683pub struct ServiceDTO {
2684    /// Service ID
2685    /// Required by the API.
2686    pub id: String,
2687    /// Service Category ID
2688    /// Required by the API.
2689    #[serde(rename = "serviceCategoryId")]
2690    pub service_category_id: String,
2691    /// Service Staff ID
2692    /// Required by the API.
2693    #[serde(rename = "serviceStaffId")]
2694    pub service_staff_id: String,
2695    /// Service Start Time
2696    /// Required by the API.
2697    #[serde(rename = "serviceStartTime")]
2698    pub service_start_time: String,
2699    /// Service End Time
2700    /// Required by the API.
2701    #[serde(rename = "serviceEndTime")]
2702    pub service_end_time: String,
2703    /// Service Resources
2704    #[serde(
2705        rename = "serviceResources",
2706        default,
2707        skip_serializing_if = "Vec::is_empty"
2708    )]
2709    pub service_resources: Vec<ServiceResourceDTO>,
2710    /// Service Add-ons
2711    #[serde(
2712        rename = "serviceAddOns",
2713        default,
2714        skip_serializing_if = "Vec::is_empty"
2715    )]
2716    pub service_add_ons: Vec<ServiceAddOnResponseDTO>,
2717}
2718
2719/// `ServiceLocationListResponseDTO` from the GoHighLevel OpenAPI spec.
2720#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2721pub struct ServiceLocationListResponseDTO {
2722    /// List of service locations
2723    /// Required by the API.
2724    #[serde(
2725        rename = "serviceLocations",
2726        default,
2727        skip_serializing_if = "Vec::is_empty"
2728    )]
2729    pub service_locations: Vec<ServiceLocationResponseDTO>,
2730}
2731
2732/// `ServiceLocationResponseDTO` from the GoHighLevel OpenAPI spec.
2733#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2734pub struct ServiceLocationResponseDTO {
2735    /// Service Location ID
2736    /// Required by the API.
2737    pub id: String,
2738    /// Location ID
2739    /// Required by the API.
2740    #[serde(rename = "locationId")]
2741    pub location_id: String,
2742    /// Location name
2743    /// Required by the API.
2744    pub name: String,
2745    /// Unique URL-friendly identifier for the service location
2746    /// Required by the API.
2747    pub slug: String,
2748    /// Whether location is active
2749    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
2750    pub is_active: Option<bool>,
2751    /// Whether location is private (not shown publicly)
2752    #[serde(rename = "isPrivate", default, skip_serializing_if = "Option::is_none")]
2753    pub is_private: Option<bool>,
2754    /// URL of the cover image displayed for this location
2755    #[serde(
2756        rename = "coverImage",
2757        default,
2758        skip_serializing_if = "Option::is_none"
2759    )]
2760    pub cover_image: Option<String>,
2761    /// Location type
2762    /// Allowed values: `offline`, `ask_booker`.
2763    #[serde(
2764        rename = "locationType",
2765        default,
2766        skip_serializing_if = "Option::is_none"
2767    )]
2768    pub location_type: Option<String>,
2769    /// Use a full street address when locationType is offline. Use a user-facing label when
2770    /// locationType is ask_booker.
2771    #[serde(default, skip_serializing_if = "Option::is_none")]
2772    pub address: Option<String>,
2773    /// Contact phone number for the service location
2774    #[serde(default, skip_serializing_if = "Option::is_none")]
2775    pub phone: Option<String>,
2776}
2777
2778/// `ServiceResourceDTO` from the GoHighLevel OpenAPI spec.
2779#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2780pub struct ServiceResourceDTO {
2781    /// Resource ID
2782    /// Required by the API.
2783    pub id: String,
2784}
2785
2786/// `ServiceResponseDTO` from the GoHighLevel OpenAPI spec.
2787#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2788pub struct ServiceResponseDTO {
2789    /// Service ID
2790    /// Required by the API.
2791    pub id: String,
2792    /// Location ID
2793    /// Required by the API.
2794    #[serde(rename = "locationId")]
2795    pub location_id: String,
2796    /// Service name
2797    /// Required by the API.
2798    pub name: String,
2799    /// Service description
2800    #[serde(default, skip_serializing_if = "Option::is_none")]
2801    pub description: Option<String>,
2802    /// Unique URL-friendly identifier
2803    #[serde(default, skip_serializing_if = "Option::is_none")]
2804    pub slug: Option<String>,
2805    /// Service event color (hex)
2806    #[serde(
2807        rename = "eventColor",
2808        default,
2809        skip_serializing_if = "Option::is_none"
2810    )]
2811    pub event_color: Option<String>,
2812    /// Service cover image URL
2813    #[serde(
2814        rename = "coverImage",
2815        default,
2816        skip_serializing_if = "Option::is_none"
2817    )]
2818    pub cover_image: Option<String>,
2819    /// Service category ID
2820    #[serde(
2821        rename = "serviceCategoryId",
2822        default,
2823        skip_serializing_if = "Option::is_none"
2824    )]
2825    pub service_category_id: Option<String>,
2826    /// Payment details
2827    #[serde(default, skip_serializing_if = "Option::is_none")]
2828    pub payment: Option<PaymentDTO>,
2829    /// This controls the duration of the appointment
2830    #[serde(
2831        rename = "serviceDuration",
2832        default,
2833        skip_serializing_if = "Option::is_none"
2834    )]
2835    pub service_duration: Option<f64>,
2836    /// Duration unit
2837    /// Allowed values: `mins`, `hours`.
2838    #[serde(
2839        rename = "serviceDurationUnit",
2840        default,
2841        skip_serializing_if = "Option::is_none"
2842    )]
2843    pub service_duration_unit: Option<String>,
2844    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
2845    /// extra time to get ready
2846    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
2847    pub pre_buffer: Option<f64>,
2848    /// Pre-buffer unit
2849    /// Allowed values: `mins`, `hours`.
2850    #[serde(
2851        rename = "preBufferUnit",
2852        default,
2853        skip_serializing_if = "Option::is_none"
2854    )]
2855    pub pre_buffer_unit: Option<String>,
2856    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
2857    /// time to wrap up
2858    #[serde(
2859        rename = "postBuffer",
2860        default,
2861        skip_serializing_if = "Option::is_none"
2862    )]
2863    pub post_buffer: Option<f64>,
2864    /// Post-buffer unit
2865    /// Allowed values: `mins`, `hours`.
2866    #[serde(
2867        rename = "postBufferUnit",
2868        default,
2869        skip_serializing_if = "Option::is_none"
2870    )]
2871    pub post_buffer_unit: Option<String>,
2872    /// Whether service is private (not shown publicly)
2873    #[serde(rename = "isPrivate", default, skip_serializing_if = "Option::is_none")]
2874    pub is_private: Option<bool>,
2875    /// Custom form ID (will be used to display the custom form on the booking page, if only one
2876    /// service is selected)
2877    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
2878    pub form_id: Option<String>,
2879    /// Service variations
2880    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2881    pub variations: Vec<ServiceVariationDTO>,
2882    /// Assigned staff members
2883    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2884    pub staff: Vec<StaffDTO>,
2885}
2886
2887/// `ServiceResponseWrapperDTO` from the GoHighLevel OpenAPI spec.
2888#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2889pub struct ServiceResponseWrapperDTO {
2890    /// Service details
2891    /// Required by the API.
2892    pub service: ServiceResponseDTO,
2893}
2894
2895/// `ServiceVariationDTO` from the GoHighLevel OpenAPI spec.
2896#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2897pub struct ServiceVariationDTO {
2898    /// Variation ID
2899    /// Required by the API.
2900    pub id: String,
2901    /// Variation name
2902    /// Required by the API.
2903    pub name: String,
2904    /// This controls the duration of the appointment
2905    #[serde(
2906        rename = "serviceDuration",
2907        default,
2908        skip_serializing_if = "Option::is_none"
2909    )]
2910    pub service_duration: Option<f64>,
2911    /// Duration unit
2912    /// Allowed values: `mins`, `hours`.
2913    #[serde(
2914        rename = "serviceDurationUnit",
2915        default,
2916        skip_serializing_if = "Option::is_none"
2917    )]
2918    pub service_duration_unit: Option<String>,
2919    /// Payment details
2920    #[serde(default, skip_serializing_if = "Option::is_none")]
2921    pub payment: Option<PaymentDTO>,
2922    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
2923    /// extra time to get ready
2924    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
2925    pub pre_buffer: Option<f64>,
2926    /// Pre-buffer unit
2927    /// Allowed values: `mins`, `hours`.
2928    #[serde(
2929        rename = "preBufferUnit",
2930        default,
2931        skip_serializing_if = "Option::is_none"
2932    )]
2933    pub pre_buffer_unit: Option<String>,
2934    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
2935    /// time to wrap up
2936    #[serde(
2937        rename = "postBuffer",
2938        default,
2939        skip_serializing_if = "Option::is_none"
2940    )]
2941    pub post_buffer: Option<f64>,
2942    /// Post-buffer unit
2943    /// Allowed values: `mins`, `hours`.
2944    #[serde(
2945        rename = "postBufferUnit",
2946        default,
2947        skip_serializing_if = "Option::is_none"
2948    )]
2949    pub post_buffer_unit: Option<String>,
2950}
2951
2952/// `ServicesListResponseDTO` from the GoHighLevel OpenAPI spec.
2953#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2954pub struct ServicesListResponseDTO {
2955    /// List of services
2956    /// Required by the API.
2957    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2958    pub services: Vec<ServiceResponseDTO>,
2959}
2960
2961/// `SlotsSchema` from the GoHighLevel OpenAPI spec.
2962#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2963pub struct SlotsSchema {
2964    /// Required by the API.
2965    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2966    pub slots: Vec<String>,
2967}
2968
2969/// `StaffDTO` from the GoHighLevel OpenAPI spec.
2970#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2971pub struct StaffDTO {
2972    /// Staff ID
2973    /// Required by the API.
2974    pub id: String,
2975}
2976
2977/// `TeamMember` from the GoHighLevel OpenAPI spec.
2978#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2979pub struct TeamMember {
2980    /// Required by the API.
2981    #[serde(rename = "userId")]
2982    pub user_id: String,
2983    /// Allowed values: `0`, `0.5`, `1`.
2984    #[serde(default, skip_serializing_if = "Option::is_none")]
2985    pub priority: Option<String>,
2986    /// 🚨 Deprecated! Use `locationConfigurations.kind` instead.
2987    /// Allowed values: `custom`, `zoom`, `gmeet`, `phone`, `address`, `teams`, `booker`.
2988    #[serde(
2989        rename = "meetingLocationType",
2990        default,
2991        skip_serializing_if = "Option::is_none"
2992    )]
2993    pub meeting_location_type: Option<String>,
2994    /// 🚨 Deprecated! Use `locationConfigurations.location` instead.
2995    #[serde(
2996        rename = "meetingLocation",
2997        default,
2998        skip_serializing_if = "Option::is_none"
2999    )]
3000    pub meeting_location: Option<String>,
3001    /// Marks a user as primary. This property is required in case of collective booking
3002    /// calendars. Only one user can be primary.
3003    #[serde(rename = "isPrimary", default, skip_serializing_if = "Option::is_none")]
3004    pub is_primary: Option<bool>,
3005    /// Meeting location configuration for event calendar. - *Multiple locations are allowed
3006    /// only when one team member is selected.* - *For **Class booking** and **Collective**
3007    /// calendars, only one location configuration is allowed for each team member.*
3008    #[serde(
3009        rename = "locationConfigurations",
3010        default,
3011        skip_serializing_if = "Vec::is_empty"
3012    )]
3013    pub location_configurations: Vec<LocationConfiguration>,
3014}
3015
3016/// `TeamMemberResponse` from the GoHighLevel OpenAPI spec.
3017#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3018pub struct TeamMemberResponse {
3019    /// Required by the API.
3020    #[serde(rename = "userId")]
3021    pub user_id: String,
3022    /// Allowed values: `0`, `0.5`, `1`.
3023    #[serde(default, skip_serializing_if = "Option::is_none")]
3024    pub priority: Option<String>,
3025    /// 🚨 Deprecated! Use `locationConfigurations.kind` instead.
3026    /// Allowed values: `custom`, `zoom`, `gmeet`, `phone`, `address`, `teams`, `booker`.
3027    #[serde(
3028        rename = "meetingLocationType",
3029        default,
3030        skip_serializing_if = "Option::is_none"
3031    )]
3032    pub meeting_location_type: Option<String>,
3033    /// 🚨 Deprecated! Use `locationConfigurations.location` instead.
3034    #[serde(
3035        rename = "meetingLocation",
3036        default,
3037        skip_serializing_if = "Option::is_none"
3038    )]
3039    pub meeting_location: Option<String>,
3040    /// Marks a user as primary. This property is required in case of collective booking
3041    /// calendars. Only one user can be primary.
3042    #[serde(rename = "isPrimary", default, skip_serializing_if = "Option::is_none")]
3043    pub is_primary: Option<bool>,
3044    /// Meeting location configurations
3045    #[serde(
3046        rename = "locationConfigurations",
3047        default,
3048        skip_serializing_if = "Vec::is_empty"
3049    )]
3050    pub location_configurations: Vec<LocationConfigurationResponse>,
3051}
3052
3053/// `UpdateAvailability` from the GoHighLevel OpenAPI spec.
3054#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3055pub struct UpdateAvailability {
3056    /// Formulate the date string in the format of `<YYYY-MM-DD in local
3057    /// timezone>T00:00:00.000Z`.
3058    /// Required by the API.
3059    pub date: String,
3060    /// Required by the API.
3061    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3062    pub hours: Vec<Hour>,
3063    #[serde(default, skip_serializing_if = "Option::is_none")]
3064    pub deleted: Option<bool>,
3065    /// The ID of the custom availability object. It is required while updating or deleting the
3066    /// existing custom date availability
3067    #[serde(default, skip_serializing_if = "Option::is_none")]
3068    pub id: Option<String>,
3069}
3070
3071/// `UpdateCalendarNotificationsDTO` from the GoHighLevel OpenAPI spec.
3072#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3073pub struct UpdateCalendarNotificationsDTO {
3074    /// Notification recipient type
3075    /// Allowed values: `contact`, `guest`, `assignedUser`, `emails`, `phoneNumbers`,
3076    /// `business`.
3077    #[serde(
3078        rename = "receiverType",
3079        default,
3080        skip_serializing_if = "Option::is_none"
3081    )]
3082    pub receiver_type: Option<String>,
3083    /// Additional email addresses to receive notifications.
3084    #[serde(
3085        rename = "additionalEmailIds",
3086        default,
3087        skip_serializing_if = "Vec::is_empty"
3088    )]
3089    pub additional_email_ids: Vec<String>,
3090    /// Additional phone numbers to receive notifications.
3091    #[serde(
3092        rename = "additionalPhoneNumbers",
3093        default,
3094        skip_serializing_if = "Vec::is_empty"
3095    )]
3096    pub additional_phone_numbers: Vec<String>,
3097    /// Selected users for in-App and business email notifications. Supports user IDs and
3098    /// special keyword "sub_account_admin"
3099    #[serde(
3100        rename = "selectedUsers",
3101        default,
3102        skip_serializing_if = "Vec::is_empty"
3103    )]
3104    pub selected_users: Vec<String>,
3105    /// Notification channel
3106    /// Allowed values: `email`, `inApp`, `sms`, `whatsapp`.
3107    #[serde(default, skip_serializing_if = "Option::is_none")]
3108    pub channel: Option<String>,
3109    /// Notification type
3110    /// Allowed values: `booked`, `confirmation`, `cancellation`, `reminder`, `followup`,
3111    /// `reschedule`.
3112    #[serde(
3113        rename = "notificationType",
3114        default,
3115        skip_serializing_if = "Option::is_none"
3116    )]
3117    pub notification_type: Option<String>,
3118    /// Is the notification active
3119    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
3120    pub is_active: Option<bool>,
3121    /// Marks the notification as deleted (soft delete)
3122    #[serde(default, skip_serializing_if = "Option::is_none")]
3123    pub deleted: Option<bool>,
3124    /// Template ID for email notification
3125    #[serde(
3126        rename = "templateId",
3127        default,
3128        skip_serializing_if = "Option::is_none"
3129    )]
3130    pub template_id: Option<String>,
3131    /// Body for email notification. Not necessary for in-App notification
3132    #[serde(default, skip_serializing_if = "Option::is_none")]
3133    pub body: Option<String>,
3134    /// Subject for email notification. Not necessary for in-App notification
3135    #[serde(default, skip_serializing_if = "Option::is_none")]
3136    pub subject: Option<String>,
3137    /// Specifies the time after which the follow-up notification should be sent. This is not
3138    /// required for other notification types.
3139    #[serde(rename = "afterTime", default, skip_serializing_if = "Vec::is_empty")]
3140    pub after_time: Vec<SchedulesDTO>,
3141    /// Specifies the time before which the reminder notification should be sent. This is not
3142    /// required for other notification types.
3143    #[serde(rename = "beforeTime", default, skip_serializing_if = "Vec::is_empty")]
3144    pub before_time: Vec<SchedulesDTO>,
3145    /// From address for email notification
3146    #[serde(
3147        rename = "fromAddress",
3148        default,
3149        skip_serializing_if = "Option::is_none"
3150    )]
3151    pub from_address: Option<String>,
3152    /// from number for sms notification
3153    #[serde(
3154        rename = "fromNumber",
3155        default,
3156        skip_serializing_if = "Option::is_none"
3157    )]
3158    pub from_number: Option<String>,
3159    /// From name for email/sms notification
3160    #[serde(rename = "fromName", default, skip_serializing_if = "Option::is_none")]
3161    pub from_name: Option<String>,
3162}
3163
3164/// `UpdateCalendarResourceDTO` from the GoHighLevel OpenAPI spec.
3165#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3166pub struct UpdateCalendarResourceDTO {
3167    #[serde(
3168        rename = "locationId",
3169        default,
3170        skip_serializing_if = "Option::is_none"
3171    )]
3172    pub location_id: Option<String>,
3173    #[serde(default, skip_serializing_if = "Option::is_none")]
3174    pub name: Option<String>,
3175    #[serde(default, skip_serializing_if = "Option::is_none")]
3176    pub description: Option<String>,
3177    /// Quantity of the equipment.
3178    #[serde(default, skip_serializing_if = "Option::is_none")]
3179    pub quantity: Option<f64>,
3180    /// Quantity of the out of service equipment.
3181    #[serde(
3182        rename = "outOfService",
3183        default,
3184        skip_serializing_if = "Option::is_none"
3185    )]
3186    pub out_of_service: Option<f64>,
3187    /// Capacity of the room.
3188    #[serde(default, skip_serializing_if = "Option::is_none")]
3189    pub capacity: Option<f64>,
3190    /// Service calendar IDs to be mapped with the resource. One equipment can only be mapped
3191    /// with one service calendar. One room can be mapped with multiple service calendars.
3192    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
3193    pub calendar_ids: Vec<String>,
3194    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
3195    pub is_active: Option<bool>,
3196}
3197
3198/// `UpdateEventCalendarScheduleDTO` from the GoHighLevel OpenAPI spec.
3199#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3200pub struct UpdateEventCalendarScheduleDTO {
3201    /// Updated schedule rules defining when the schedule is active
3202    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3203    pub rules: Vec<ScheduleRuleDTO>,
3204    /// Updated timezone for the schedule (IANA timezone identifier)
3205    #[serde(default, skip_serializing_if = "Option::is_none")]
3206    pub timezone: Option<String>,
3207}
3208
3209/// `UpdateScheduleDTO` from the GoHighLevel OpenAPI spec.
3210#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3211pub struct UpdateScheduleDTO {
3212    /// Human-readable name for the schedule
3213    #[serde(default, skip_serializing_if = "Option::is_none")]
3214    pub name: Option<String>,
3215    /// Updated schedule rules defining when the schedule is active
3216    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3217    pub rules: Vec<ScheduleRuleDTO>,
3218    /// Updated timezone for the schedule (IANA timezone identifier)
3219    #[serde(default, skip_serializing_if = "Option::is_none")]
3220    pub timezone: Option<String>,
3221}
3222
3223/// `UpdateServiceBookingDTO` from the GoHighLevel OpenAPI spec.
3224#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3225pub struct UpdateServiceBookingDTO {
3226    /// Service Location ID
3227    #[serde(
3228        rename = "serviceLocationId",
3229        default,
3230        skip_serializing_if = "Option::is_none"
3231    )]
3232    pub service_location_id: Option<String>,
3233    /// Meeting Location (If service location is an ask the booker, then the meeting location is
3234    /// required)
3235    #[serde(
3236        rename = "meetingLocation",
3237        default,
3238        skip_serializing_if = "Option::is_none"
3239    )]
3240    pub meeting_location: Option<String>,
3241    /// Title
3242    #[serde(default, skip_serializing_if = "Option::is_none")]
3243    pub title: Option<String>,
3244    /// Status
3245    /// Allowed values: `confirmed`, `cancelled`, `invalid`, `new`, `showed`, `no_show`.
3246    #[serde(default, skip_serializing_if = "Option::is_none")]
3247    pub status: Option<String>,
3248    /// Start Time
3249    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
3250    pub start_time: Option<String>,
3251    /// End Time
3252    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
3253    pub end_time: Option<String>,
3254    /// Timezone
3255    #[serde(default, skip_serializing_if = "Option::is_none")]
3256    pub timezone: Option<String>,
3257    /// If provided, services sent in the request will replace the existing services in the
3258    /// booking.
3259    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3260    pub services: Vec<CreateBookingServiceDTO>,
3261}
3262
3263/// `UpdateServiceDTO` from the GoHighLevel OpenAPI spec.
3264#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3265pub struct UpdateServiceDTO {
3266    /// Service name
3267    #[serde(default, skip_serializing_if = "Option::is_none")]
3268    pub name: Option<String>,
3269    /// Service description
3270    #[serde(default, skip_serializing_if = "Option::is_none")]
3271    pub description: Option<String>,
3272    /// Unique URL-friendly identifier
3273    #[serde(default, skip_serializing_if = "Option::is_none")]
3274    pub slug: Option<String>,
3275    /// Service event color (hex)
3276    #[serde(
3277        rename = "eventColor",
3278        default,
3279        skip_serializing_if = "Option::is_none"
3280    )]
3281    pub event_color: Option<String>,
3282    /// Service cover image URL
3283    #[serde(
3284        rename = "coverImage",
3285        default,
3286        skip_serializing_if = "Option::is_none"
3287    )]
3288    pub cover_image: Option<String>,
3289    /// Service category ID
3290    #[serde(
3291        rename = "serviceCategoryId",
3292        default,
3293        skip_serializing_if = "Option::is_none"
3294    )]
3295    pub service_category_id: Option<String>,
3296    /// Payment details (currency configured in Service Global Settings is used.)
3297    #[serde(default, skip_serializing_if = "Option::is_none")]
3298    pub payment: Option<PaymentDTO>,
3299    /// This controls the duration of the appointment
3300    #[serde(
3301        rename = "serviceDuration",
3302        default,
3303        skip_serializing_if = "Option::is_none"
3304    )]
3305    pub service_duration: Option<f64>,
3306    /// Duration unit
3307    /// Allowed values: `mins`, `hours`.
3308    #[serde(
3309        rename = "serviceDurationUnit",
3310        default,
3311        skip_serializing_if = "Option::is_none"
3312    )]
3313    pub service_duration_unit: Option<String>,
3314    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
3315    /// extra time to get ready
3316    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
3317    pub pre_buffer: Option<f64>,
3318    /// Pre-buffer unit
3319    /// Allowed values: `mins`, `hours`.
3320    #[serde(
3321        rename = "preBufferUnit",
3322        default,
3323        skip_serializing_if = "Option::is_none"
3324    )]
3325    pub pre_buffer_unit: Option<String>,
3326    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
3327    /// time to wrap up
3328    #[serde(
3329        rename = "postBuffer",
3330        default,
3331        skip_serializing_if = "Option::is_none"
3332    )]
3333    pub post_buffer: Option<f64>,
3334    /// Post-buffer unit
3335    /// Allowed values: `mins`, `hours`.
3336    #[serde(
3337        rename = "postBufferUnit",
3338        default,
3339        skip_serializing_if = "Option::is_none"
3340    )]
3341    pub post_buffer_unit: Option<String>,
3342    /// Whether service is private (not shown publicly)
3343    #[serde(rename = "isPrivate", default, skip_serializing_if = "Option::is_none")]
3344    pub is_private: Option<bool>,
3345    /// Custom form ID (will be used to display the custom form on the booking page, if only one
3346    /// service is selected)
3347    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
3348    pub form_id: Option<String>,
3349    /// Assigned staff members
3350    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3351    pub staff: Vec<StaffDTO>,
3352    /// Service variations (an empty array removes all variations). Include an id to update an
3353    /// existing variation; omit the id to create a new one.
3354    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3355    pub variations: Vec<UpdateServiceVariationDTO>,
3356}
3357
3358/// `UpdateServiceLocationDTO` from the GoHighLevel OpenAPI spec.
3359#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3360pub struct UpdateServiceLocationDTO {
3361    /// Location name
3362    #[serde(default, skip_serializing_if = "Option::is_none")]
3363    pub name: Option<String>,
3364    /// Updated URL-friendly slug identifier
3365    #[serde(default, skip_serializing_if = "Option::is_none")]
3366    pub slug: Option<String>,
3367    /// Updated contact phone number
3368    #[serde(default, skip_serializing_if = "Option::is_none")]
3369    pub phone: Option<String>,
3370    /// Use a full street address when locationType is offline. Use a user-facing label when
3371    /// locationType is ask_booker.
3372    #[serde(default, skip_serializing_if = "Option::is_none")]
3373    pub address: Option<String>,
3374    /// Updated URL of the cover image
3375    #[serde(
3376        rename = "coverImage",
3377        default,
3378        skip_serializing_if = "Option::is_none"
3379    )]
3380    pub cover_image: Option<String>,
3381    /// Location type
3382    /// Allowed values: `offline`, `ask_booker`.
3383    #[serde(
3384        rename = "locationType",
3385        default,
3386        skip_serializing_if = "Option::is_none"
3387    )]
3388    pub location_type: Option<String>,
3389}
3390
3391/// `UpdateServiceVariationDTO` from the GoHighLevel OpenAPI spec.
3392#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3393pub struct UpdateServiceVariationDTO {
3394    /// This controls the duration of the appointment
3395    #[serde(
3396        rename = "serviceDuration",
3397        default,
3398        skip_serializing_if = "Option::is_none"
3399    )]
3400    pub service_duration: Option<f64>,
3401    /// Duration unit
3402    /// Allowed values: `mins`, `hours`.
3403    #[serde(
3404        rename = "serviceDurationUnit",
3405        default,
3406        skip_serializing_if = "Option::is_none"
3407    )]
3408    pub service_duration_unit: Option<String>,
3409    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
3410    /// extra time to get ready
3411    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
3412    pub pre_buffer: Option<f64>,
3413    /// Pre-buffer unit
3414    /// Allowed values: `mins`, `hours`.
3415    #[serde(
3416        rename = "preBufferUnit",
3417        default,
3418        skip_serializing_if = "Option::is_none"
3419    )]
3420    pub pre_buffer_unit: Option<String>,
3421    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
3422    /// time to wrap up
3423    #[serde(
3424        rename = "postBuffer",
3425        default,
3426        skip_serializing_if = "Option::is_none"
3427    )]
3428    pub post_buffer: Option<f64>,
3429    /// Post-buffer unit
3430    /// Allowed values: `mins`, `hours`.
3431    #[serde(
3432        rename = "postBufferUnit",
3433        default,
3434        skip_serializing_if = "Option::is_none"
3435    )]
3436    pub post_buffer_unit: Option<String>,
3437    /// Payment details
3438    #[serde(default, skip_serializing_if = "Option::is_none")]
3439    pub payment: Option<PaymentDTO>,
3440    /// Variation ID
3441    #[serde(default, skip_serializing_if = "Option::is_none")]
3442    pub id: Option<String>,
3443    /// Variation name
3444    #[serde(default, skip_serializing_if = "Option::is_none")]
3445    pub name: Option<String>,
3446}
3447
3448/// `ValidateGroupSlugPostBody` from the GoHighLevel OpenAPI spec.
3449#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3450pub struct ValidateGroupSlugPostBody {
3451    /// Location Id
3452    /// Required by the API.
3453    #[serde(rename = "locationId")]
3454    pub location_id: String,
3455    /// Slug
3456    /// Required by the API.
3457    pub slug: String,
3458}
3459
3460/// `ValidateGroupSlugSuccessResponseDTO` from the GoHighLevel OpenAPI spec.
3461#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3462pub struct ValidateGroupSlugSuccessResponseDTO {
3463    /// Required by the API.
3464    pub available: bool,
3465}