Skip to main content

ghl_models/v2/
ad_manager.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/// `AdCampaignDTO` from the GoHighLevel OpenAPI spec.
14#[derive(Debug, Clone, Default, Serialize, Deserialize)]
15pub struct AdCampaignDTO {
16    #[serde(default, skip_serializing_if = "Option::is_none")]
17    pub id: Option<String>,
18    /// Campaign locale
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub locale: Option<LocaleDTO>,
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub name: Option<String>,
23    /// Allowed values: `DRAFT`, `SCHEDULED`, `PUBLISHED`, `PUBLISHING`, `FAILED`, `IN_REVIEW`,
24    /// `PAUSED`, `ARCHIVED`, `WITH_ISSUES`, `REJECTED`.
25    #[serde(
26        rename = "publishingStatus",
27        default,
28        skip_serializing_if = "Option::is_none"
29    )]
30    pub publishing_status: Option<String>,
31    /// Campaign audience targeting
32    /// Allowed values: `STANDARD_UPDATE`, `SINGLE_VIDEO`, `CAROUSEL`.
33    #[serde(rename = "mediaType", default, skip_serializing_if = "Option::is_none")]
34    pub media_type: Option<String>,
35    /// Campaign audience targeting
36    #[serde(default, skip_serializing_if = "Option::is_none")]
37    pub audience: Option<AudienceDTO>,
38    /// Bid unit cost
39    #[serde(rename = "unitCost", default, skip_serializing_if = "Option::is_none")]
40    pub unit_cost: Option<UnitCostDTO>,
41    #[serde(
42        rename = "campaignType",
43        default,
44        skip_serializing_if = "Option::is_none"
45    )]
46    pub campaign_type: Option<String>,
47    #[serde(
48        rename = "adCampaignGroupId",
49        default,
50        skip_serializing_if = "Option::is_none"
51    )]
52    pub ad_campaign_group_id: Option<String>,
53    #[serde(
54        rename = "adCampaignId",
55        default,
56        skip_serializing_if = "Option::is_none"
57    )]
58    pub ad_campaign_id: Option<String>,
59    #[serde(default, skip_serializing_if = "Vec::is_empty")]
60    pub ads: Vec<LinkedInAdDTO>,
61    /// LinkedIn API error message
62    #[serde(
63        rename = "linkedInError",
64        default,
65        skip_serializing_if = "Option::is_none"
66    )]
67    pub linked_in_error: Option<String>,
68    #[serde(default, skip_serializing_if = "Option::is_none")]
69    pub meta: Option<serde_json::Value>,
70}
71
72/// `AdCampaignGroupDataDTO` from the GoHighLevel OpenAPI spec.
73#[derive(Debug, Clone, Default, Serialize, Deserialize)]
74pub struct AdCampaignGroupDataDTO {
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub id: Option<String>,
77    /// Location ID
78    /// Required by the API.
79    #[serde(rename = "locationId")]
80    pub location_id: String,
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub budget: Option<LinkedInBudgetDTO>,
83    #[serde(rename = "adCampaigns", default, skip_serializing_if = "Vec::is_empty")]
84    pub ad_campaigns: Vec<AdCampaignDTO>,
85    /// Allowed values: `MAXIMUM_DELIVERY`, `COST_CAP`.
86    #[serde(
87        rename = "adBudgetOptimization",
88        default,
89        skip_serializing_if = "Option::is_none"
90    )]
91    pub ad_budget_optimization: Option<String>,
92    /// Allowed values: `LEAD_GENERATION`, `WEBSITE_VISIT`.
93    #[serde(
94        rename = "objectiveType",
95        default,
96        skip_serializing_if = "Option::is_none"
97    )]
98    pub objective_type: Option<String>,
99    #[serde(default, skip_serializing_if = "Option::is_none")]
100    pub name: Option<String>,
101    #[serde(
102        rename = "adCampaignGroupId",
103        default,
104        skip_serializing_if = "Option::is_none"
105    )]
106    pub ad_campaign_group_id: Option<String>,
107    /// Allowed values: `DRAFT`, `SCHEDULED`, `PUBLISHED`, `PUBLISHING`, `FAILED`, `IN_REVIEW`,
108    /// `PAUSED`, `ARCHIVED`, `WITH_ISSUES`, `REJECTED`.
109    #[serde(
110        rename = "publishingStatus",
111        default,
112        skip_serializing_if = "Option::is_none"
113    )]
114    pub publishing_status: Option<String>,
115    #[serde(
116        rename = "linkedInAdAccountId",
117        default,
118        skip_serializing_if = "Option::is_none"
119    )]
120    pub linked_in_ad_account_id: Option<String>,
121    #[serde(
122        rename = "unpublishedChanges",
123        default,
124        skip_serializing_if = "Option::is_none"
125    )]
126    pub unpublished_changes: Option<bool>,
127    #[serde(default, skip_serializing_if = "Option::is_none")]
128    pub meta: Option<serde_json::Value>,
129    #[serde(
130        rename = "linkedInError",
131        default,
132        skip_serializing_if = "Option::is_none"
133    )]
134    pub linked_in_error: Option<String>,
135}
136
137/// `AdScheduleTargetDTO` from the GoHighLevel OpenAPI spec.
138#[derive(Debug, Clone, Default, Serialize, Deserialize)]
139pub struct AdScheduleTargetDTO {
140    /// Minute mark the schedule starts at
141    /// Allowed values: `ZERO`, `FIFTEEN`, `THIRTY`, `FORTY_FIVE`.
142    /// Required by the API.
143    #[serde(rename = "startMinute")]
144    pub start_minute: String,
145    /// Minute mark the schedule ends at
146    /// Allowed values: `ZERO`, `FIFTEEN`, `THIRTY`, `FORTY_FIVE`.
147    /// Required by the API.
148    #[serde(rename = "endMinute")]
149    pub end_minute: String,
150    /// Day of the week for this schedule
151    /// Allowed values: `MONDAY`, `TUESDAY`, `WEDNESDAY`, `THURSDAY`, `FRIDAY`, `SATURDAY`,
152    /// `SUNDAY`.
153    /// Required by the API.
154    #[serde(rename = "dayOfWeek")]
155    pub day_of_week: String,
156    /// Start hour in 24h format (0-23)
157    /// Required by the API.
158    #[serde(rename = "startHour")]
159    pub start_hour: f64,
160    /// End hour in 24h format (0-23)
161    /// Required by the API.
162    #[serde(rename = "endHour")]
163    pub end_hour: f64,
164}
165
166/// `AudienceCustomAudienceItemDTO` from the GoHighLevel OpenAPI spec.
167#[derive(Debug, Clone, Default, Serialize, Deserialize)]
168pub struct AudienceCustomAudienceItemDTO {
169    /// Custom audience ID
170    /// Required by the API.
171    pub id: String,
172    /// Custom audience name
173    /// Required by the API.
174    pub name: String,
175}
176
177/// `AudienceDTO` from the GoHighLevel OpenAPI spec.
178#[derive(Debug, Clone, Default, Serialize, Deserialize)]
179pub struct AudienceDTO {
180    /// Geographic location targets
181    #[serde(default, skip_serializing_if = "Vec::is_empty")]
182    pub geo_locations: Vec<GeoLocationDTO>,
183    /// Target audience attribute selections
184    #[serde(
185        rename = "targetAudience",
186        default,
187        skip_serializing_if = "Option::is_none"
188    )]
189    pub target_audience: Option<TargetAudienceDTO>,
190}
191
192/// `AudienceDimensionDTO` from the GoHighLevel OpenAPI spec.
193#[derive(Debug, Clone, Default, Serialize, Deserialize)]
194pub struct AudienceDimensionDTO {
195    /// Include unknown age
196    #[serde(
197        rename = "isAgeUnknown",
198        default,
199        skip_serializing_if = "Option::is_none"
200    )]
201    pub is_age_unknown: Option<bool>,
202    /// Age range filters
203    #[serde(rename = "ageRanges", default, skip_serializing_if = "Vec::is_empty")]
204    pub age_ranges: Vec<String>,
205    /// Gender targets
206    #[serde(default, skip_serializing_if = "Vec::is_empty")]
207    pub genders: Vec<String>,
208    /// Parental status targets
209    #[serde(
210        rename = "parentalStatuses",
211        default,
212        skip_serializing_if = "Vec::is_empty"
213    )]
214    pub parental_statuses: Vec<String>,
215    /// Audience segment references used for targeting
216    #[serde(
217        rename = "audienceSegments",
218        default,
219        skip_serializing_if = "Option::is_none"
220    )]
221    pub audience_segments: Option<AudienceSegmentsDTO>,
222}
223
224/// `AudienceInterestDTO` from the GoHighLevel OpenAPI spec.
225#[derive(Debug, Clone, Default, Serialize, Deserialize)]
226pub struct AudienceInterestDTO {
227    /// Interest ID
228    /// Required by the API.
229    pub id: String,
230    /// Interest name
231    /// Required by the API.
232    pub name: String,
233    /// Interest category type (defaults to "interests" if omitted)
234    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
235    pub type_: Option<String>,
236}
237
238/// `AudienceLocaleDTO` from the GoHighLevel OpenAPI spec.
239#[derive(Debug, Clone, Default, Serialize, Deserialize)]
240pub struct AudienceLocaleDTO {
241    /// Locale display name
242    /// Required by the API.
243    pub name: String,
244    /// Facebook locale key
245    /// Required by the API.
246    pub key: f64,
247}
248
249/// `AudienceLocationDTO` from the GoHighLevel OpenAPI spec.
250#[derive(Debug, Clone, Default, Serialize, Deserialize)]
251pub struct AudienceLocationDTO {
252    /// Facebook location key
253    /// Required by the API.
254    pub key: String,
255    /// Location display name
256    /// Required by the API.
257    pub name: String,
258    /// Geographic location type
259    /// Allowed values: `country`, `city`, `region`, `country_group`, `geo_market`,
260    /// `large_geo_area`, `medium_geo_area`, `small_geo_area`, `subcity`, `neighborhood`, `zip`,
261    /// `address`.
262    /// Required by the API.
263    #[serde(rename = "type")]
264    pub type_: String,
265    /// Whether the location is included or excluded from targeting
266    /// Allowed values: `include`, `exclude`.
267    /// Required by the API.
268    #[serde(rename = "selectionType")]
269    pub selection_type: String,
270    /// Targeting radius around the location (for city/address types)
271    #[serde(default, skip_serializing_if = "Option::is_none")]
272    pub radius: Option<f64>,
273    /// Unit for the targeting radius
274    /// Allowed values: `km`, `mi`.
275    #[serde(
276        rename = "radiusUnit",
277        default,
278        skip_serializing_if = "Option::is_none"
279    )]
280    pub radius_unit: Option<String>,
281    /// Geometry data for address-based targeting
282    #[serde(default, skip_serializing_if = "Option::is_none")]
283    pub geometry: Option<AudienceLocationGeometry>,
284}
285
286/// `AudienceLocationGeometry` from the GoHighLevel OpenAPI spec.
287#[derive(Debug, Clone, Default, Serialize, Deserialize)]
288pub struct AudienceLocationGeometry {
289    /// Geographic coordinates
290    /// Required by the API.
291    pub location: serde_json::Value,
292    /// Geocoding result type
293    /// Required by the API.
294    pub location_type: String,
295}
296
297/// `AudiencePlacementsDTO` from the GoHighLevel OpenAPI spec.
298#[derive(Debug, Clone, Default, Serialize, Deserialize)]
299pub struct AudiencePlacementsDTO {
300    /// Facebook placement positions
301    #[serde(default, skip_serializing_if = "Vec::is_empty")]
302    pub facebook: Vec<String>,
303    /// Instagram placement positions
304    #[serde(default, skip_serializing_if = "Vec::is_empty")]
305    pub instagram: Vec<String>,
306    /// Messenger placement positions
307    #[serde(default, skip_serializing_if = "Vec::is_empty")]
308    pub messenger: Vec<String>,
309}
310
311/// `AudienceSegmentsDTO` from the GoHighLevel OpenAPI spec.
312#[derive(Debug, Clone, Default, Serialize, Deserialize)]
313pub struct AudienceSegmentsDTO {
314    /// Resource names of custom audience segments
315    #[serde(
316        rename = "customAudiences",
317        default,
318        skip_serializing_if = "Vec::is_empty"
319    )]
320    pub custom_audiences: Vec<String>,
321    /// Resource names of user lists (remarketing lists, customer match lists, etc.)
322    #[serde(rename = "userLists", default, skip_serializing_if = "Vec::is_empty")]
323    pub user_lists: Vec<String>,
324    /// Resource names of user interest segments (in-market or affinity audiences)
325    #[serde(
326        rename = "userInterests",
327        default,
328        skip_serializing_if = "Vec::is_empty"
329    )]
330    pub user_interests: Vec<String>,
331}
332
333/// `Budget` from the GoHighLevel OpenAPI spec.
334#[derive(Debug, Clone, Default, Serialize, Deserialize)]
335pub struct Budget {
336    /// Budget type
337    /// Allowed values: `DAILY`, `LIFETIME`.
338    /// Required by the API.
339    #[serde(rename = "budgetType")]
340    pub budget_type: String,
341    /// Budget amount
342    /// Required by the API.
343    pub amount: f64,
344    /// Schedule start date
345    #[serde(
346        rename = "scheduleStartDate",
347        default,
348        skip_serializing_if = "Option::is_none"
349    )]
350    pub schedule_start_date: Option<String>,
351    /// Schedule end date
352    #[serde(
353        rename = "scheduleEndDate",
354        default,
355        skip_serializing_if = "Option::is_none"
356    )]
357    pub schedule_end_date: Option<String>,
358}
359
360/// `CallAssetPayloadDTO` from the GoHighLevel OpenAPI spec.
361#[derive(Debug, Clone, Default, Serialize, Deserialize)]
362pub struct CallAssetPayloadDTO {
363    /// Phone number for call ads
364    /// Required by the API.
365    #[serde(rename = "phoneNumber")]
366    pub phone_number: String,
367    /// Two-letter ISO country code
368    /// Required by the API.
369    #[serde(rename = "countryCode")]
370    pub country_code: String,
371    /// Call conversion action resource name
372    #[serde(
373        rename = "callConversionAction",
374        default,
375        skip_serializing_if = "Option::is_none"
376    )]
377    pub call_conversion_action: Option<String>,
378    /// Ad schedule targets restricting when the call asset is shown
379    #[serde(
380        rename = "adScheduleTargets",
381        default,
382        skip_serializing_if = "Vec::is_empty"
383    )]
384    pub ad_schedule_targets: Vec<AdScheduleTargetDTO>,
385    /// Google Ads resource name for an existing call asset
386    #[serde(
387        rename = "resourceName",
388        default,
389        skip_serializing_if = "Option::is_none"
390    )]
391    pub resource_name: Option<String>,
392}
393
394/// `CampaignDTO` from the GoHighLevel OpenAPI spec.
395#[derive(Debug, Clone, Default, Serialize, Deserialize)]
396pub struct CampaignDTO {
397    /// Campaign identifier
398    #[serde(default, skip_serializing_if = "Option::is_none")]
399    pub id: Option<String>,
400    /// Campaign name
401    /// Required by the API.
402    pub name: String,
403    /// Location identifier
404    /// Required by the API.
405    #[serde(rename = "locationId")]
406    pub location_id: String,
407    /// Advertising channel
408    /// Allowed values: `SEARCH`, `DISCOVERY`, `DISPLAY`, `HOTEL`, `LOCAL`, `MULTI_CHANNEL`,
409    /// `PERFORMANCE_MAX`, `DEMAND_GEN`.
410    /// Required by the API.
411    #[serde(rename = "advertisingChannelType")]
412    pub advertising_channel_type: String,
413    /// Channel sub type
414    /// Allowed values: `DEMAND_GEN`.
415    #[serde(
416        rename = "advertisingChannelSubType",
417        default,
418        skip_serializing_if = "Option::is_none"
419    )]
420    pub advertising_channel_sub_type: Option<String>,
421    /// Goal type
422    /// Allowed values: `WEBSITE_TRAFFIC`, `LEAD`.
423    #[serde(rename = "goalType", default, skip_serializing_if = "Option::is_none")]
424    pub goal_type: Option<String>,
425    /// Campaign budget
426    #[serde(default, skip_serializing_if = "Option::is_none")]
427    pub budget: Option<GoogleBudgetDTO>,
428    /// Campaign audience targeting
429    #[serde(default, skip_serializing_if = "Option::is_none")]
430    pub audience: Option<GoogleCampaignAudienceDTO>,
431    /// Network settings
432    #[serde(
433        rename = "networkSettings",
434        default,
435        skip_serializing_if = "Option::is_none"
436    )]
437    pub network_settings: Option<GoogleNetworkSettingsDTO>,
438    /// Bidding strategy config
439    #[serde(
440        rename = "biddingStrategy",
441        default,
442        skip_serializing_if = "Option::is_none"
443    )]
444    pub bidding_strategy: Option<GoogleBiddingStrategyDTO>,
445    /// Campaign assets
446    #[serde(default, skip_serializing_if = "Option::is_none")]
447    pub assets: Option<GoogleAssetsDTO>,
448    /// EU political ads flag
449    #[serde(
450        rename = "isEuPoliticalAds",
451        default,
452        skip_serializing_if = "Option::is_none"
453    )]
454    pub is_eu_political_ads: Option<bool>,
455    /// Campaign ad groups
456    #[serde(rename = "adGroups", default, skip_serializing_if = "Vec::is_empty")]
457    pub ad_groups: Vec<GoogleAdGroupDTO>,
458    /// Campaign goal config
459    #[serde(
460        rename = "campaignGoal",
461        default,
462        skip_serializing_if = "Option::is_none"
463    )]
464    pub campaign_goal: Option<GoogleCampaignGoalDTO>,
465    /// Ad schedule rules
466    #[serde(rename = "adSchedule", default, skip_serializing_if = "Vec::is_empty")]
467    pub ad_schedule: Vec<GoogleAdScheduleDTO>,
468    /// Publishing status
469    /// Allowed values: `DRAFT`, `SCHEDULED`, `PUBLISHED`, `PUBLISHING`, `FAILED`, `IN_REVIEW`,
470    /// `PAUSED`, `ARCHIVED`, `WITH_ISSUES`, `REJECTED`.
471    #[serde(
472        rename = "publishingStatus",
473        default,
474        skip_serializing_if = "Option::is_none"
475    )]
476    pub publishing_status: Option<String>,
477    /// Google Ad account identifier
478    #[serde(
479        rename = "googleAdAccountId",
480        default,
481        skip_serializing_if = "Option::is_none"
482    )]
483    pub google_ad_account_id: Option<String>,
484    /// Whether the campaign has unpublished changes
485    #[serde(
486        rename = "unpublishedChanges",
487        default,
488        skip_serializing_if = "Option::is_none"
489    )]
490    pub unpublished_changes: Option<bool>,
491    /// Maximum CPC bid in micros
492    #[serde(
493        rename = "maximumCpc",
494        default,
495        skip_serializing_if = "Option::is_none"
496    )]
497    pub maximum_cpc: Option<f64>,
498    /// Google Ads campaign resource ID
499    #[serde(
500        rename = "googleCampaignId",
501        default,
502        skip_serializing_if = "Option::is_none"
503    )]
504    pub google_campaign_id: Option<String>,
505    /// Traffic source
506    #[serde(default, skip_serializing_if = "Option::is_none")]
507    pub source: Option<String>,
508    /// Advanced options
509    #[serde(
510        rename = "advancedOptions",
511        default,
512        skip_serializing_if = "Option::is_none"
513    )]
514    pub advanced_options: Option<serde_json::Value>,
515}
516
517/// `ConsentDTO` from the GoHighLevel OpenAPI spec.
518#[derive(Debug, Clone, Default, Serialize, Deserialize)]
519pub struct ConsentDTO {
520    /// Whether consent checkbox is required
521    /// Required by the API.
522    #[serde(rename = "checkRequired")]
523    pub check_required: bool,
524    /// Consent identifier
525    /// Required by the API.
526    pub id: f64,
527    /// Consent text
528    /// Required by the API.
529    pub consent: LocalizedStringDTO,
530}
531
532/// `ConversionValueSettings` from the GoHighLevel OpenAPI spec.
533#[derive(Debug, Clone, Default, Serialize, Deserialize)]
534pub struct ConversionValueSettings {
535    /// Default monetary value assigned to each conversion
536    /// Required by the API.
537    #[serde(rename = "defaultValue")]
538    pub default_value: f64,
539    /// ISO 4217 currency code for the default value
540    /// Required by the API.
541    #[serde(rename = "defaultCurrencyCode")]
542    pub default_currency_code: String,
543    /// When true, always uses the default value even if a transaction-specific value is
544    /// provided
545    /// Required by the API.
546    #[serde(rename = "alwaysUseDefaultValue")]
547    pub always_use_default_value: bool,
548}
549
550/// `CreateConversationFormDTO` from the GoHighLevel OpenAPI spec.
551#[derive(Debug, Clone, Default, Serialize, Deserialize)]
552pub struct CreateConversationFormDTO {
553    /// Location identifier
554    /// Required by the API.
555    #[serde(rename = "locationId")]
556    pub location_id: String,
557    /// Conversation form name
558    /// Required by the API.
559    pub name: String,
560    /// Welcome message text
561    /// Required by the API.
562    pub text: String,
563    /// Quick-reply questions shown in the welcome message of the conversation form
564    /// Required by the API.
565    #[serde(default, skip_serializing_if = "Vec::is_empty")]
566    pub questions: Vec<WelcomeMessageQuestion>,
567}
568
569/// `CreateGoogleIntegrationDTO` from the GoHighLevel OpenAPI spec.
570#[derive(Debug, Clone, Default, Serialize, Deserialize)]
571pub struct CreateGoogleIntegrationDTO {
572    /// Location identifier
573    /// Required by the API.
574    #[serde(rename = "locationId")]
575    pub location_id: String,
576    /// Ad account identifier
577    /// Required by the API.
578    #[serde(rename = "adAccountId")]
579    pub ad_account_id: String,
580    /// MCC identifier
581    /// Required by the API.
582    #[serde(rename = "mccId")]
583    pub mcc_id: String,
584}
585
586/// `CreateIntegrationDTO` from the GoHighLevel OpenAPI spec.
587#[derive(Debug, Clone, Default, Serialize, Deserialize)]
588pub struct CreateIntegrationDTO {
589    /// Location identifier
590    /// Required by the API.
591    #[serde(rename = "locationId")]
592    pub location_id: String,
593    /// Facebook page ID
594    /// Required by the API.
595    #[serde(rename = "pageId")]
596    pub page_id: String,
597    /// Ad account identifier
598    #[serde(
599        rename = "adAccountId",
600        default,
601        skip_serializing_if = "Option::is_none"
602    )]
603    pub ad_account_id: Option<String>,
604}
605
606/// `CreateLeadFormDTO` from the GoHighLevel OpenAPI spec.
607#[derive(Debug, Clone, Default, Serialize, Deserialize)]
608pub struct CreateLeadFormDTO {
609    /// Lead form type
610    /// Allowed values: `MORE_VOLUME`, `HIGHER_INTENT`.
611    /// Required by the API.
612    #[serde(rename = "type")]
613    pub type_: String,
614    /// Lead form name
615    /// Required by the API.
616    pub name: String,
617    /// Location identifier
618    /// Required by the API.
619    #[serde(rename = "locationId")]
620    pub location_id: String,
621    /// Greeting card config
622    #[serde(
623        rename = "greetingCard",
624        default,
625        skip_serializing_if = "Option::is_none"
626    )]
627    pub greeting_card: Option<GreetingCard>,
628    /// List of questions displayed on the lead form
629    /// Required by the API.
630    #[serde(default, skip_serializing_if = "Vec::is_empty")]
631    pub questions: Vec<FormQuestion>,
632    /// Question page headline
633    #[serde(
634        rename = "questionPageHeadline",
635        default,
636        skip_serializing_if = "Option::is_none"
637    )]
638    pub question_page_headline: Option<String>,
639    /// Privacy policy URL
640    /// Required by the API.
641    #[serde(rename = "privacyPolicyLink")]
642    pub privacy_policy_link: String,
643    /// Privacy policy text
644    #[serde(
645        rename = "privacyPolicyText",
646        default,
647        skip_serializing_if = "Option::is_none"
648    )]
649    pub privacy_policy_text: Option<String>,
650    /// Custom disclaimer config
651    #[serde(
652        rename = "customDisclaimer",
653        default,
654        skip_serializing_if = "Option::is_none"
655    )]
656    pub custom_disclaimer: Option<CustomDisclaimer>,
657    /// Thank you page config
658    /// Required by the API.
659    #[serde(rename = "thankYouPage")]
660    pub thank_you_page: ThankYouPage,
661}
662
663/// `CreateLinkedinIntegrationDTO` from the GoHighLevel OpenAPI spec.
664#[derive(Debug, Clone, Default, Serialize, Deserialize)]
665pub struct CreateLinkedinIntegrationDTO {
666    /// Location identifier
667    /// Required by the API.
668    #[serde(rename = "locationId")]
669    pub location_id: String,
670    /// Ad account identifier
671    /// Required by the API.
672    #[serde(rename = "adAccountId")]
673    pub ad_account_id: String,
674    /// Ad account name
675    /// Required by the API.
676    #[serde(rename = "adAccountName")]
677    pub ad_account_name: String,
678    /// Currency code
679    /// Required by the API.
680    #[serde(rename = "currencyCode")]
681    pub currency_code: String,
682    /// Organization identifier
683    /// Required by the API.
684    #[serde(rename = "organizationId")]
685    pub organization_id: String,
686}
687
688/// `CreateOfflineUserListJobDTO` from the GoHighLevel OpenAPI spec.
689#[derive(Debug, Clone, Default, Serialize, Deserialize)]
690pub struct CreateOfflineUserListJobDTO {
691    /// Location identifier
692    /// Required by the API.
693    #[serde(rename = "locationId")]
694    pub location_id: String,
695    /// Smart list IDs
696    #[serde(
697        rename = "smartListIds",
698        default,
699        skip_serializing_if = "Vec::is_empty"
700    )]
701    pub smart_list_ids: Vec<String>,
702    /// CSV file path
703    #[serde(rename = "csvPath", default, skip_serializing_if = "Option::is_none")]
704    pub csv_path: Option<String>,
705    /// User list identifier
706    #[serde(
707        rename = "userListId",
708        default,
709        skip_serializing_if = "Option::is_none"
710    )]
711    pub user_list_id: Option<String>,
712    /// Dynamic list flag
713    #[serde(rename = "isDynamic", default, skip_serializing_if = "Option::is_none")]
714    pub is_dynamic: Option<bool>,
715}
716
717/// `CreationLocaleDTO` from the GoHighLevel OpenAPI spec.
718#[derive(Debug, Clone, Default, Serialize, Deserialize)]
719pub struct CreationLocaleDTO {
720    /// Country code
721    /// Required by the API.
722    pub country: String,
723    /// Language code
724    /// Required by the API.
725    pub language: String,
726}
727
728/// `CustomDisclaimer` from the GoHighLevel OpenAPI spec.
729#[derive(Debug, Clone, Default, Serialize, Deserialize)]
730pub struct CustomDisclaimer {
731    /// Disclaimer title
732    /// Required by the API.
733    pub title: String,
734    /// Disclaimer body text
735    /// Required by the API.
736    pub body: String,
737    /// Consent checkboxes the user must agree to before submitting the form
738    #[serde(default, skip_serializing_if = "Vec::is_empty")]
739    pub checkboxes: Vec<CustomDisclaimerCheckbox>,
740}
741
742/// `CustomDisclaimerCheckbox` from the GoHighLevel OpenAPI spec.
743#[derive(Debug, Clone, Default, Serialize, Deserialize)]
744pub struct CustomDisclaimerCheckbox {
745    /// Checkbox required flag
746    /// Required by the API.
747    pub is_required: bool,
748    /// Checkbox text label
749    /// Required by the API.
750    pub text: String,
751    /// Checkbox unique key
752    /// Required by the API.
753    pub key: String,
754}
755
756/// `CustomQuestionFieldDTO` from the GoHighLevel OpenAPI spec.
757#[derive(Debug, Clone, Default, Serialize, Deserialize)]
758pub struct CustomQuestionFieldDTO {
759    /// Custom question text shown to the user
760    /// Required by the API.
761    #[serde(rename = "customQuestionText")]
762    pub custom_question_text: String,
763    /// Answer choices for the custom question
764    /// Required by the API.
765    #[serde(
766        rename = "singleChoiceAnswers",
767        default,
768        skip_serializing_if = "Vec::is_empty"
769    )]
770    pub single_choice_answers: Vec<String>,
771}
772
773/// `FacebookAudienceDTO` from the GoHighLevel OpenAPI spec.
774#[derive(Debug, Clone, Default, Serialize, Deserialize)]
775pub struct FacebookAudienceDTO {
776    /// Geographic locations to target or exclude
777    /// Required by the API.
778    #[serde(default, skip_serializing_if = "Vec::is_empty")]
779    pub geo_locations: Vec<AudienceLocationDTO>,
780    /// Language locales to target
781    #[serde(default, skip_serializing_if = "Vec::is_empty")]
782    pub locales: Vec<AudienceLocaleDTO>,
783    /// Ad placement positions per platform (only used when placementType is "manual")
784    #[serde(default, skip_serializing_if = "Option::is_none")]
785    pub placements: Option<AudiencePlacementsDTO>,
786    /// Placement strategy — "auto" lets Facebook choose, "manual" uses the placements config
787    /// Allowed values: `auto`, `manual`.
788    #[serde(
789        rename = "placementType",
790        default,
791        skip_serializing_if = "Option::is_none"
792    )]
793    pub placement_type: Option<String>,
794    /// Lookalike audiences to target
795    #[serde(default, skip_serializing_if = "Vec::is_empty")]
796    pub lookalike: Vec<AudienceCustomAudienceItemDTO>,
797    /// Retargeting custom audiences to target
798    #[serde(default, skip_serializing_if = "Vec::is_empty")]
799    pub retargeting: Vec<AudienceCustomAudienceItemDTO>,
800    /// Interest-based targeting criteria
801    #[serde(default, skip_serializing_if = "Vec::is_empty")]
802    pub interests: Vec<AudienceInterestDTO>,
803    /// Minimum age for targeting
804    #[serde(default, skip_serializing_if = "Option::is_none")]
805    pub age_min: Option<f64>,
806    /// Maximum age for targeting
807    #[serde(default, skip_serializing_if = "Option::is_none")]
808    pub age_max: Option<f64>,
809    /// Gender targeting (1 = male, 2 = female)
810    #[serde(default, skip_serializing_if = "Vec::is_empty")]
811    pub genders: Vec<f64>,
812}
813
814/// `FbSetDefaultPageBodyDTO` from the GoHighLevel OpenAPI spec.
815#[derive(Debug, Clone, Default, Serialize, Deserialize)]
816pub struct FbSetDefaultPageBodyDTO {
817    /// Facebook page identifier
818    /// Required by the API.
819    #[serde(rename = "pageId")]
820    pub page_id: String,
821}
822
823/// `FbUpdateAudienceBodyDTO` from the GoHighLevel OpenAPI spec.
824#[derive(Debug, Clone, Default, Serialize, Deserialize)]
825pub struct FbUpdateAudienceBodyDTO {
826    /// Location identifier
827    /// Required by the API.
828    #[serde(rename = "locationId")]
829    pub location_id: String,
830    /// Audience name
831    /// Required by the API.
832    pub name: String,
833    /// Audience description
834    /// Required by the API.
835    pub description: String,
836}
837
838/// `FlexibleRuleUserListDTO` from the GoHighLevel OpenAPI spec.
839#[derive(Debug, Clone, Default, Serialize, Deserialize)]
840pub struct FlexibleRuleUserListDTO {
841    /// Operator for combining inclusive operands
842    #[serde(
843        rename = "inclusiveRuleOperator",
844        default,
845        skip_serializing_if = "Option::is_none"
846    )]
847    pub inclusive_rule_operator: Option<String>,
848    /// Inclusive rule operands
849    /// Required by the API.
850    #[serde(
851        rename = "inclusiveOperands",
852        default,
853        skip_serializing_if = "Vec::is_empty"
854    )]
855    pub inclusive_operands: Vec<RuleOperandDTO>,
856    /// Exclusive rule operands
857    /// Required by the API.
858    #[serde(
859        rename = "exclusiveOperands",
860        default,
861        skip_serializing_if = "Vec::is_empty"
862    )]
863    pub exclusive_operands: Vec<RuleOperandDTO>,
864}
865
866/// `FormQuestion` from the GoHighLevel OpenAPI spec.
867#[derive(Debug, Clone, Default, Serialize, Deserialize)]
868pub struct FormQuestion {
869    /// Question label text shown to the user
870    #[serde(default, skip_serializing_if = "Option::is_none")]
871    pub label: Option<String>,
872    /// Question key
873    /// Required by the API.
874    pub key: String,
875    /// Question input type — use a prefilled type for standard fields or CUSTOM / SHORT_ANSWER
876    /// for freeform questions
877    /// Allowed values: `CUSTOM`, `CITY`, `COMPANY_NAME`, `COUNTRY`, `DATE_OF_BIRTH`, `EMAIL`,
878    /// `FIRST_NAME`, `FULL_NAME`, `GENDER`, `JOB_TITLE`, `LAST_NAME`, `MARITAL_STATUS`.
879    /// Required by the API.
880    #[serde(rename = "type")]
881    pub type_: String,
882    /// Answer options for multiple-choice questions (only applies to CUSTOM type)
883    #[serde(default, skip_serializing_if = "Vec::is_empty")]
884    pub options: Vec<FormQuestionOption>,
885}
886
887/// `FormQuestionOption` from the GoHighLevel OpenAPI spec.
888#[derive(Debug, Clone, Default, Serialize, Deserialize)]
889pub struct FormQuestionOption {
890    /// Option key
891    /// Required by the API.
892    pub key: String,
893    /// Option value
894    /// Required by the API.
895    pub value: String,
896}
897
898/// `GeoAddressComponentDTO` from the GoHighLevel OpenAPI spec.
899#[derive(Debug, Clone, Default, Serialize, Deserialize)]
900pub struct GeoAddressComponentDTO {
901    /// Full name of the address component
902    #[serde(default, skip_serializing_if = "Option::is_none")]
903    pub long_name: Option<String>,
904    /// Abbreviated name of the address component
905    #[serde(default, skip_serializing_if = "Option::is_none")]
906    pub short_name: Option<String>,
907    /// Address component types
908    #[serde(default, skip_serializing_if = "Vec::is_empty")]
909    pub types: Vec<String>,
910}
911
912/// `GeoGeometryDTO` from the GoHighLevel OpenAPI spec.
913#[derive(Debug, Clone, Default, Serialize, Deserialize)]
914pub struct GeoGeometryDTO {
915    /// Location coordinates
916    #[serde(default, skip_serializing_if = "Option::is_none")]
917    pub location: Option<GeoLatLngDTO>,
918    /// Location type (e.g. APPROXIMATE)
919    #[serde(default, skip_serializing_if = "Option::is_none")]
920    pub location_type: Option<String>,
921    /// Viewport bounding box
922    #[serde(default, skip_serializing_if = "Option::is_none")]
923    pub viewport: Option<GeoViewportDTO>,
924}
925
926/// `GeoLatLngDTO` from the GoHighLevel OpenAPI spec.
927#[derive(Debug, Clone, Default, Serialize, Deserialize)]
928pub struct GeoLatLngDTO {
929    /// Latitude
930    #[serde(default, skip_serializing_if = "Option::is_none")]
931    pub lat: Option<f64>,
932    /// Longitude
933    #[serde(default, skip_serializing_if = "Option::is_none")]
934    pub lng: Option<f64>,
935}
936
937/// `GeoLocationDTO` from the GoHighLevel OpenAPI spec.
938#[derive(Debug, Clone, Default, Serialize, Deserialize)]
939pub struct GeoLocationDTO {
940    /// Location display name
941    /// Required by the API.
942    pub name: String,
943    /// Location URN
944    /// Required by the API.
945    pub urn: String,
946    /// Facet URN
947    /// Required by the API.
948    #[serde(rename = "facetUrn")]
949    pub facet_urn: String,
950    /// Selection type
951    /// Allowed values: `include`, `exclude`.
952    /// Required by the API.
953    #[serde(rename = "selectionType")]
954    pub selection_type: String,
955}
956
957/// `GeoViewportDTO` from the GoHighLevel OpenAPI spec.
958#[derive(Debug, Clone, Default, Serialize, Deserialize)]
959pub struct GeoViewportDTO {
960    /// Northeast corner of the viewport
961    #[serde(default, skip_serializing_if = "Option::is_none")]
962    pub northeast: Option<GeoLatLngDTO>,
963    /// Southwest corner of the viewport
964    #[serde(default, skip_serializing_if = "Option::is_none")]
965    pub southwest: Option<GeoLatLngDTO>,
966}
967
968/// `GoogleAdContentDTO` from the GoHighLevel OpenAPI spec.
969#[derive(Debug, Clone, Default, Serialize, Deserialize)]
970pub struct GoogleAdContentDTO {
971    /// Ad identifier
972    #[serde(default, skip_serializing_if = "Option::is_none")]
973    pub id: Option<String>,
974    /// Ad name
975    #[serde(default, skip_serializing_if = "Option::is_none")]
976    pub name: Option<String>,
977    /// Media type
978    /// Allowed values: `IMAGE`, `VIDEO`, `CAROUSEL`.
979    #[serde(rename = "mediaType", default, skip_serializing_if = "Option::is_none")]
980    pub media_type: Option<String>,
981    /// Ad headlines
982    #[serde(default, skip_serializing_if = "Vec::is_empty")]
983    pub headlines: Vec<String>,
984    /// Long headlines
985    #[serde(
986        rename = "longHeadlines",
987        default,
988        skip_serializing_if = "Vec::is_empty"
989    )]
990    pub long_headlines: Vec<String>,
991    /// Ad descriptions
992    #[serde(default, skip_serializing_if = "Vec::is_empty")]
993    pub descriptions: Vec<String>,
994    /// Final URL
995    #[serde(rename = "finalUrl", default, skip_serializing_if = "Option::is_none")]
996    pub final_url: Option<String>,
997    /// Display path 1
998    #[serde(default, skip_serializing_if = "Option::is_none")]
999    pub path1: Option<String>,
1000    /// Display path 2
1001    #[serde(default, skip_serializing_if = "Option::is_none")]
1002    pub path2: Option<String>,
1003    /// Whether the ad is soft-deleted
1004    #[serde(rename = "isDeleted", default, skip_serializing_if = "Option::is_none")]
1005    pub is_deleted: Option<bool>,
1006    /// Ad-level error message from Google
1007    #[serde(rename = "adError", default, skip_serializing_if = "Option::is_none")]
1008    pub ad_error: Option<String>,
1009    /// Ad publishing status
1010    /// Allowed values: `DRAFT`, `SCHEDULED`, `PUBLISHED`, `PUBLISHING`, `FAILED`, `IN_REVIEW`,
1011    /// `PAUSED`, `ARCHIVED`, `WITH_ISSUES`, `REJECTED`.
1012    #[serde(
1013        rename = "publishingStatus",
1014        default,
1015        skip_serializing_if = "Option::is_none"
1016    )]
1017    pub publishing_status: Option<String>,
1018    /// Internal ad identifier
1019    #[serde(rename = "adId", default, skip_serializing_if = "Option::is_none")]
1020    pub ad_id: Option<String>,
1021    /// Ad campaign identifier
1022    #[serde(
1023        rename = "adCampaignId",
1024        default,
1025        skip_serializing_if = "Option::is_none"
1026    )]
1027    pub ad_campaign_id: Option<String>,
1028    /// Ad group identifier
1029    #[serde(rename = "adGroupId", default, skip_serializing_if = "Option::is_none")]
1030    pub ad_group_id: Option<String>,
1031    /// Google Ads ad resource ID
1032    #[serde(
1033        rename = "googleAdId",
1034        default,
1035        skip_serializing_if = "Option::is_none"
1036    )]
1037    pub google_ad_id: Option<String>,
1038    /// Ad media items
1039    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1040    pub media: Vec<GoogleMediaDTO>,
1041    /// Call to action label
1042    /// Allowed values: `AUTOMATED`, `LEARN_MORE`, `GET_QUOTE`, `APPLY_NOW`, `SIGN_UP`,
1043    /// `CONTACT_US`, `SUBSCRIBE`, `DOWNLOAD`, `BOOK_NOW`, `SHOP_NOW`, `BUY_NOW`, `DONATE_NOW`.
1044    #[serde(
1045        rename = "callToActionLabel",
1046        default,
1047        skip_serializing_if = "Option::is_none"
1048    )]
1049    pub call_to_action_label: Option<String>,
1050    /// Business name
1051    #[serde(
1052        rename = "businessName",
1053        default,
1054        skip_serializing_if = "Option::is_none"
1055    )]
1056    pub business_name: Option<String>,
1057    /// YouTube video links
1058    #[serde(
1059        rename = "youtubeVideoLinks",
1060        default,
1061        skip_serializing_if = "Vec::is_empty"
1062    )]
1063    pub youtube_video_links: Vec<GoogleYouTubeVideoLinkDTO>,
1064    /// Carousel cards
1065    #[serde(
1066        rename = "carouselCards",
1067        default,
1068        skip_serializing_if = "Vec::is_empty"
1069    )]
1070    pub carousel_cards: Vec<GoogleCarouselCardDTO>,
1071    /// Channel placements
1072    /// Allowed values: `GMAIL`, `YOUTUBE_IN_STREAM`, `YOUTUBE_SHORTS`, `YOUTUBE_IN_FEED`,
1073    /// `DISCOVER`, `DISPLAY`.
1074    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1075    pub placements: Vec<String>,
1076    /// Custom channels flag
1077    #[serde(
1078        rename = "customChannels",
1079        default,
1080        skip_serializing_if = "Option::is_none"
1081    )]
1082    pub custom_channels: Option<bool>,
1083}
1084
1085/// `GoogleAdGroupAudienceDTO` from the GoHighLevel OpenAPI spec.
1086#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1087pub struct GoogleAdGroupAudienceDTO {
1088    /// Geo-location targeting
1089    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1090    pub geo_locations: Vec<GoogleGeoLocationDTO>,
1091    /// Language/locale targeting
1092    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1093    pub locales: Vec<GoogleLocaleDTO>,
1094}
1095
1096/// `GoogleAdGroupDTO` from the GoHighLevel OpenAPI spec.
1097#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1098pub struct GoogleAdGroupDTO {
1099    /// Ad group identifier
1100    #[serde(default, skip_serializing_if = "Option::is_none")]
1101    pub id: Option<String>,
1102    /// Google ad group identifier
1103    #[serde(rename = "adGroupId", default, skip_serializing_if = "Option::is_none")]
1104    pub ad_group_id: Option<String>,
1105    /// Ad group name
1106    #[serde(default, skip_serializing_if = "Option::is_none")]
1107    pub name: Option<String>,
1108    /// Ad campaign identifier
1109    #[serde(
1110        rename = "adCampaignId",
1111        default,
1112        skip_serializing_if = "Option::is_none"
1113    )]
1114    pub ad_campaign_id: Option<String>,
1115    /// Ad content items
1116    #[serde(rename = "adContent", default, skip_serializing_if = "Vec::is_empty")]
1117    pub ad_content: Vec<GoogleAdContentDTO>,
1118    /// Keyword targeting
1119    #[serde(default, skip_serializing_if = "Option::is_none")]
1120    pub keywords: Option<GoogleKeywordsDTO>,
1121    /// Ad group publishing status
1122    /// Allowed values: `DRAFT`, `SCHEDULED`, `PUBLISHED`, `PUBLISHING`, `FAILED`, `IN_REVIEW`,
1123    /// `PAUSED`, `ARCHIVED`, `WITH_ISSUES`, `REJECTED`.
1124    #[serde(
1125        rename = "publishingStatus",
1126        default,
1127        skip_serializing_if = "Option::is_none"
1128    )]
1129    pub publishing_status: Option<String>,
1130    /// Ad group-level error from Google
1131    #[serde(
1132        rename = "adGroupError",
1133        default,
1134        skip_serializing_if = "Option::is_none"
1135    )]
1136    pub ad_group_error: Option<String>,
1137    /// Google Ads ad group resource ID
1138    #[serde(
1139        rename = "googleAdGroupId",
1140        default,
1141        skip_serializing_if = "Option::is_none"
1142    )]
1143    pub google_ad_group_id: Option<String>,
1144    /// Custom channels flag
1145    #[serde(
1146        rename = "customChannels",
1147        default,
1148        skip_serializing_if = "Option::is_none"
1149    )]
1150    pub custom_channels: Option<bool>,
1151    /// Selected channel placements
1152    /// Allowed values: `GMAIL`, `YOUTUBE_IN_STREAM`, `YOUTUBE_SHORTS`, `YOUTUBE_IN_FEED`,
1153    /// `DISCOVER`, `DISPLAY`.
1154    #[serde(
1155        rename = "selectedChannels",
1156        default,
1157        skip_serializing_if = "Vec::is_empty"
1158    )]
1159    pub selected_channels: Vec<String>,
1160    /// Google audience resource ID
1161    #[serde(
1162        rename = "googleAudienceId",
1163        default,
1164        skip_serializing_if = "Option::is_none"
1165    )]
1166    pub google_audience_id: Option<String>,
1167    /// Ad group audience targeting
1168    #[serde(default, skip_serializing_if = "Option::is_none")]
1169    pub audience: Option<GoogleAdGroupAudienceDTO>,
1170}
1171
1172/// `GoogleAdScheduleDTO` from the GoHighLevel OpenAPI spec.
1173#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1174pub struct GoogleAdScheduleDTO {
1175    /// Day of week
1176    /// Allowed values: `FRIDAY`, `MONDAY`, `SATURDAY`, `SUNDAY`, `THURSDAY`, `TUESDAY`,
1177    /// `UNKNOWN`, `UNSPECIFIED`, `WEDNESDAY`, `ALL_DAYS`, `MONDAY_TO_FRIDAY`,
1178    /// `SATURDAY_AND_SUNDAY`.
1179    /// Required by the API.
1180    #[serde(rename = "dayOfWeek")]
1181    pub day_of_week: String,
1182    /// Start time (HH:MM)
1183    /// Required by the API.
1184    #[serde(rename = "from")]
1185    pub from_: String,
1186    /// End time (HH:MM)
1187    /// Required by the API.
1188    pub to: String,
1189}
1190
1191/// `GoogleAssetImageDTO` from the GoHighLevel OpenAPI spec.
1192#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1193pub struct GoogleAssetImageDTO {
1194    /// Image URL
1195    /// Required by the API.
1196    pub url: String,
1197    /// Google Ads resource name
1198    #[serde(
1199        rename = "resourceName",
1200        default,
1201        skip_serializing_if = "Option::is_none"
1202    )]
1203    pub resource_name: Option<String>,
1204    /// Asset name
1205    #[serde(default, skip_serializing_if = "Option::is_none")]
1206    pub name: Option<String>,
1207    /// Error message if asset upload failed
1208    #[serde(default, skip_serializing_if = "Option::is_none")]
1209    pub error: Option<String>,
1210}
1211
1212/// `GoogleAssetsDTO` from the GoHighLevel OpenAPI spec.
1213#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1214pub struct GoogleAssetsDTO {
1215    /// Call extension asset resource names
1216    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1217    pub calls: Vec<String>,
1218    /// Sitelink asset resource names
1219    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1220    pub sitelinks: Vec<String>,
1221    /// Lead form asset resource name
1222    #[serde(rename = "leadForm", default, skip_serializing_if = "Option::is_none")]
1223    pub lead_form: Option<String>,
1224    /// Image assets
1225    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1226    pub images: Vec<GoogleAssetImageDTO>,
1227    /// Business logo asset
1228    #[serde(
1229        rename = "businessLogo",
1230        default,
1231        skip_serializing_if = "Option::is_none"
1232    )]
1233    pub business_logo: Option<GoogleAssetImageDTO>,
1234}
1235
1236/// `GoogleBiddingStrategyDTO` from the GoHighLevel OpenAPI spec.
1237#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1238pub struct GoogleBiddingStrategyDTO {
1239    /// Bidding strategy type
1240    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
1241    pub type_: Option<String>,
1242    /// Bid value in micros
1243    #[serde(default, skip_serializing_if = "Option::is_none")]
1244    pub value: Option<f64>,
1245}
1246
1247/// `GoogleBudgetDTO` from the GoHighLevel OpenAPI spec.
1248#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1249pub struct GoogleBudgetDTO {
1250    /// Budget type
1251    /// Allowed values: `DAILY`, `LIFETIME`.
1252    #[serde(
1253        rename = "budgetType",
1254        default,
1255        skip_serializing_if = "Option::is_none"
1256    )]
1257    pub budget_type: Option<String>,
1258    /// Budget amount in micros
1259    #[serde(default, skip_serializing_if = "Option::is_none")]
1260    pub amount: Option<f64>,
1261    /// Schedule start date
1262    #[serde(
1263        rename = "scheduleStartDate",
1264        default,
1265        skip_serializing_if = "Option::is_none"
1266    )]
1267    pub schedule_start_date: Option<String>,
1268    /// Schedule end date
1269    #[serde(
1270        rename = "scheduleEndDate",
1271        default,
1272        skip_serializing_if = "Option::is_none"
1273    )]
1274    pub schedule_end_date: Option<String>,
1275}
1276
1277/// `GoogleCampaignAudienceDTO` from the GoHighLevel OpenAPI spec.
1278#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1279pub struct GoogleCampaignAudienceDTO {
1280    /// Geo-location targeting
1281    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1282    pub geo_locations: Vec<GoogleGeoLocationDTO>,
1283    /// Language/locale targeting
1284    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1285    pub locales: Vec<GoogleLocaleDTO>,
1286    /// Gender targeting
1287    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1288    pub gender: Vec<GoogleDemographicTargetDTO>,
1289    /// Age range targeting
1290    #[serde(rename = "ageRange", default, skip_serializing_if = "Vec::is_empty")]
1291    pub age_range: Vec<GoogleDemographicTargetDTO>,
1292    /// Audience segment targeting
1293    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1294    pub segments: Vec<GoogleSegmentTargetDTO>,
1295    /// Interest-based targeting
1296    #[serde(
1297        rename = "targetInterests",
1298        default,
1299        skip_serializing_if = "Option::is_none"
1300    )]
1301    pub target_interests: Option<GoogleTargetInterestsDTO>,
1302}
1303
1304/// `GoogleCampaignGoalDTO` from the GoHighLevel OpenAPI spec.
1305#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1306pub struct GoogleCampaignGoalDTO {
1307    /// Campaign goal type
1308    /// Allowed values: `CONVERSIONS`, `CLICK`, `YOUTUBE_ENGAGEMENT`.
1309    /// Required by the API.
1310    #[serde(rename = "type")]
1311    pub type_: String,
1312    /// Goal value (e.g. conversion action resource name)
1313    #[serde(default, skip_serializing_if = "Option::is_none")]
1314    pub value: Option<String>,
1315    /// Whether this is a custom conversion goal
1316    #[serde(
1317        rename = "isCustomConversionGoal",
1318        default,
1319        skip_serializing_if = "Option::is_none"
1320    )]
1321    pub is_custom_conversion_goal: Option<bool>,
1322}
1323
1324/// `GoogleCarouselCardDTO` from the GoHighLevel OpenAPI spec.
1325#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1326pub struct GoogleCarouselCardDTO {
1327    /// Card headline
1328    #[serde(default, skip_serializing_if = "Option::is_none")]
1329    pub headline: Option<String>,
1330    /// Card final URL
1331    #[serde(rename = "finalUrl", default, skip_serializing_if = "Option::is_none")]
1332    pub final_url: Option<String>,
1333    /// Call to action label
1334    #[serde(
1335        rename = "callToActionLabel",
1336        default,
1337        skip_serializing_if = "Option::is_none"
1338    )]
1339    pub call_to_action_label: Option<String>,
1340    /// Card media items
1341    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1342    pub media: Vec<GoogleMediaDTO>,
1343}
1344
1345/// `GoogleDemographicTargetDTO` from the GoHighLevel OpenAPI spec.
1346#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1347pub struct GoogleDemographicTargetDTO {
1348    /// Demographic enum value
1349    /// Required by the API.
1350    #[serde(rename = "enum")]
1351    pub enum_: String,
1352    /// Whether this is a negative target
1353    /// Required by the API.
1354    pub negative: bool,
1355}
1356
1357/// `GoogleGeoLocationDTO` from the GoHighLevel OpenAPI spec.
1358#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1359pub struct GoogleGeoLocationDTO {
1360    /// Geo target constant resource name
1361    #[serde(default, skip_serializing_if = "Option::is_none")]
1362    pub key: Option<String>,
1363    /// Location identifier (place_id)
1364    #[serde(default, skip_serializing_if = "Option::is_none")]
1365    pub id: Option<String>,
1366    /// Location display name
1367    #[serde(default, skip_serializing_if = "Option::is_none")]
1368    pub name: Option<String>,
1369    /// Country name
1370    #[serde(default, skip_serializing_if = "Option::is_none")]
1371    pub country_name: Option<String>,
1372    /// Location type (city, region, country, address, etc.)
1373    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
1374    pub type_: Option<String>,
1375    /// Radius for proximity targeting
1376    #[serde(default, skip_serializing_if = "Option::is_none")]
1377    pub radius: Option<f64>,
1378    /// Radius unit
1379    /// Allowed values: `km`, `mi`.
1380    #[serde(
1381        rename = "radiusUnit",
1382        default,
1383        skip_serializing_if = "Option::is_none"
1384    )]
1385    pub radius_unit: Option<String>,
1386    /// Include or exclude this location
1387    /// Allowed values: `include`, `exclude`.
1388    #[serde(
1389        rename = "selectionType",
1390        default,
1391        skip_serializing_if = "Option::is_none"
1392    )]
1393    pub selection_type: Option<String>,
1394    /// Google Ads resource name
1395    #[serde(
1396        rename = "resourceName",
1397        default,
1398        skip_serializing_if = "Option::is_none"
1399    )]
1400    pub resource_name: Option<String>,
1401    /// Google place ID
1402    #[serde(default, skip_serializing_if = "Option::is_none")]
1403    pub place_id: Option<String>,
1404    /// Full formatted address string
1405    #[serde(default, skip_serializing_if = "Option::is_none")]
1406    pub formatted_address: Option<String>,
1407    /// Geometry data from Google Geocoding API
1408    #[serde(default, skip_serializing_if = "Option::is_none")]
1409    pub geometry: Option<GeoGeometryDTO>,
1410    /// Address components from Google Geocoding API
1411    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1412    pub address_components: Vec<GeoAddressComponentDTO>,
1413}
1414
1415/// `GoogleKeywordItemDTO` from the GoHighLevel OpenAPI spec.
1416#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1417pub struct GoogleKeywordItemDTO {
1418    /// Keyword text
1419    /// Required by the API.
1420    pub keyword: String,
1421    /// Match type (BROAD, PHRASE, EXACT)
1422    /// Required by the API.
1423    #[serde(rename = "matchType")]
1424    pub match_type: String,
1425}
1426
1427/// `GoogleKeywordsDTO` from the GoHighLevel OpenAPI spec.
1428#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1429pub struct GoogleKeywordsDTO {
1430    /// Positive keywords
1431    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1432    pub positives: Vec<GoogleKeywordItemDTO>,
1433    /// Negative keywords
1434    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1435    pub negatives: Vec<GoogleKeywordItemDTO>,
1436}
1437
1438/// `GoogleLocaleDTO` from the GoHighLevel OpenAPI spec.
1439#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1440pub struct GoogleLocaleDTO {
1441    /// Language display name
1442    #[serde(default, skip_serializing_if = "Option::is_none")]
1443    pub name: Option<String>,
1444    /// Language key
1445    #[serde(default, skip_serializing_if = "Option::is_none")]
1446    pub key: Option<String>,
1447    /// Language identifier
1448    #[serde(default, skip_serializing_if = "Option::is_none")]
1449    pub id: Option<String>,
1450    /// Language resource name
1451    #[serde(
1452        rename = "resourceName",
1453        default,
1454        skip_serializing_if = "Option::is_none"
1455    )]
1456    pub resource_name: Option<String>,
1457}
1458
1459/// `GoogleMediaDTO` from the GoHighLevel OpenAPI spec.
1460#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1461pub struct GoogleMediaDTO {
1462    /// Media type
1463    /// Allowed values: `IMAGE`.
1464    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
1465    pub type_: Option<String>,
1466    /// Media source URL
1467    #[serde(default, skip_serializing_if = "Option::is_none")]
1468    pub src: Option<String>,
1469    /// Is logo flag
1470    #[serde(rename = "isLogo", default, skip_serializing_if = "Option::is_none")]
1471    pub is_logo: Option<bool>,
1472    /// Error message if media failed
1473    #[serde(default, skip_serializing_if = "Option::is_none")]
1474    pub error: Option<String>,
1475    /// Public URL of the media
1476    #[serde(default, skip_serializing_if = "Option::is_none")]
1477    pub url: Option<String>,
1478    /// Image type classification
1479    #[serde(rename = "imageType", default, skip_serializing_if = "Option::is_none")]
1480    pub image_type: Option<String>,
1481}
1482
1483/// `GoogleNetworkSettingsDTO` from the GoHighLevel OpenAPI spec.
1484#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1485pub struct GoogleNetworkSettingsDTO {
1486    /// Target Google Search Network
1487    /// Required by the API.
1488    #[serde(rename = "targetSearchNetwork")]
1489    pub target_search_network: bool,
1490    /// Target Google Display Network
1491    /// Required by the API.
1492    #[serde(rename = "targetContentNetwork")]
1493    pub target_content_network: bool,
1494}
1495
1496/// `GoogleSegmentTargetDTO` from the GoHighLevel OpenAPI spec.
1497#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1498pub struct GoogleSegmentTargetDTO {
1499    /// Segment type
1500    /// Required by the API.
1501    #[serde(rename = "type")]
1502    pub type_: String,
1503    /// Segment identifier
1504    /// Required by the API.
1505    pub id: String,
1506}
1507
1508/// `GoogleTargetInterestsDTO` from the GoHighLevel OpenAPI spec.
1509#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1510pub struct GoogleTargetInterestsDTO {
1511    /// Affinity audience IDs
1512    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1513    pub affinity: Vec<String>,
1514    /// In-market audience IDs
1515    #[serde(rename = "inMarket", default, skip_serializing_if = "Vec::is_empty")]
1516    pub in_market: Vec<String>,
1517}
1518
1519/// `GoogleYouTubeVideoLinkDTO` from the GoHighLevel OpenAPI spec.
1520#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1521pub struct GoogleYouTubeVideoLinkDTO {
1522    /// YouTube video ID
1523    /// Required by the API.
1524    #[serde(rename = "youtubeVideoId")]
1525    pub youtube_video_id: String,
1526}
1527
1528/// `GreetingCard` from the GoHighLevel OpenAPI spec.
1529#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1530pub struct GreetingCard {
1531    /// Greeting card title
1532    /// Required by the API.
1533    pub title: String,
1534    /// Greeting card style
1535    /// Required by the API.
1536    pub style: String,
1537    /// Greeting card content
1538    /// Required by the API.
1539    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1540    pub content: Vec<String>,
1541}
1542
1543/// `HiddenFieldDTO` from the GoHighLevel OpenAPI spec.
1544#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1545pub struct HiddenFieldDTO {
1546    /// Field name
1547    /// Required by the API.
1548    pub name: String,
1549    /// Field value
1550    /// Required by the API.
1551    pub value: String,
1552}
1553
1554/// `KeywordSuggestionDTO` from the GoHighLevel OpenAPI spec.
1555#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1556pub struct KeywordSuggestionDTO {
1557    /// Target URL
1558    /// Required by the API.
1559    pub url: String,
1560    /// Language code
1561    #[serde(
1562        rename = "languageCode",
1563        default,
1564        skip_serializing_if = "Option::is_none"
1565    )]
1566    pub language_code: Option<String>,
1567    /// Target locations
1568    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1569    pub locations: Vec<String>,
1570    /// Seed keywords
1571    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1572    pub keywords: Vec<String>,
1573}
1574
1575/// `LeadFormAssetPayloadDTO` from the GoHighLevel OpenAPI spec.
1576#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1577pub struct LeadFormAssetPayloadDTO {
1578    /// Google Ads resource name for an existing lead form asset
1579    #[serde(
1580        rename = "resourceName",
1581        default,
1582        skip_serializing_if = "Option::is_none"
1583    )]
1584    pub resource_name: Option<String>,
1585    /// Lead form headline
1586    /// Required by the API.
1587    pub headline: String,
1588    /// Lead form description
1589    /// Required by the API.
1590    pub description: String,
1591    /// Business name shown on the form
1592    /// Required by the API.
1593    #[serde(rename = "businessName")]
1594    pub business_name: String,
1595    /// Privacy policy URL
1596    /// Required by the API.
1597    #[serde(rename = "privacyPolicyUrl")]
1598    pub privacy_policy_url: String,
1599    /// Form fields to collect user input
1600    /// Required by the API.
1601    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1602    pub fields: Vec<LeadFormFieldDTO>,
1603    /// Call to action button type
1604    /// Allowed values: `LEARN_MORE`, `GET_QUOTE`, `APPLY_NOW`, `SIGN_UP`, `CONTACT_US`,
1605    /// `SUBSCRIBE`, `DOWNLOAD`, `BOOK_NOW`, `GET_OFFER`, `REGISTER`, `GET_INFO`,
1606    /// `REQUEST_DEMO`.
1607    /// Required by the API.
1608    #[serde(rename = "callToActionType")]
1609    pub call_to_action_type: String,
1610    /// Description text for the CTA button
1611    #[serde(
1612        rename = "callToActionDescription",
1613        default,
1614        skip_serializing_if = "Option::is_none"
1615    )]
1616    pub call_to_action_description: Option<String>,
1617    /// Background image asset resource name
1618    #[serde(
1619        rename = "backgroundImageAsset",
1620        default,
1621        skip_serializing_if = "Option::is_none"
1622    )]
1623    pub background_image_asset: Option<String>,
1624    /// Desired lead intent level
1625    /// Allowed values: `LOW_INTENT`, `HIGH_INTENT`.
1626    #[serde(
1627        rename = "desiredIntent",
1628        default,
1629        skip_serializing_if = "Option::is_none"
1630    )]
1631    pub desired_intent: Option<String>,
1632    /// Custom question fields appended after standard fields
1633    #[serde(
1634        rename = "customQuestionFields",
1635        default,
1636        skip_serializing_if = "Vec::is_empty"
1637    )]
1638    pub custom_question_fields: Vec<CustomQuestionFieldDTO>,
1639    /// Headline shown after form submission
1640    #[serde(
1641        rename = "postSubmitHeadline",
1642        default,
1643        skip_serializing_if = "Option::is_none"
1644    )]
1645    pub post_submit_headline: Option<String>,
1646    /// Description shown after form submission
1647    #[serde(
1648        rename = "postSubmitDescription",
1649        default,
1650        skip_serializing_if = "Option::is_none"
1651    )]
1652    pub post_submit_description: Option<String>,
1653    /// Post-submit CTA button type
1654    /// Allowed values: `VISIT_SITE`, `DOWNLOAD`, `LEARN_MORE`, `SHOP_NOW`.
1655    #[serde(
1656        rename = "postSubmitCallToActionType",
1657        default,
1658        skip_serializing_if = "Option::is_none"
1659    )]
1660    pub post_submit_call_to_action_type: Option<String>,
1661    /// Final URL shown after form submission
1662    #[serde(rename = "finalUrls", default, skip_serializing_if = "Option::is_none")]
1663    pub final_urls: Option<String>,
1664}
1665
1666/// `LeadFormContentDTO` from the GoHighLevel OpenAPI spec.
1667#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1668pub struct LeadFormContentDTO {
1669    /// Form questions
1670    /// Required by the API.
1671    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1672    pub questions: Vec<LeadFormQuestionDTO>,
1673    /// Form description
1674    #[serde(default, skip_serializing_if = "Option::is_none")]
1675    pub description: Option<LocalizedStringDTO>,
1676    /// Form headline
1677    /// Required by the API.
1678    pub headline: LocalizedStringDTO,
1679    /// Post-submission info
1680    /// Required by the API.
1681    #[serde(rename = "postSubmissionInfo")]
1682    pub post_submission_info: PostSubmissionInfoDTO,
1683    /// Legal information
1684    /// Required by the API.
1685    #[serde(rename = "legalInfo")]
1686    pub legal_info: LegalInfoDTO,
1687}
1688
1689/// `LeadFormFieldDTO` from the GoHighLevel OpenAPI spec.
1690#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1691pub struct LeadFormFieldDTO {
1692    /// Field input type from Google Ads LeadFormFieldUserInputType
1693    /// Required by the API.
1694    #[serde(rename = "inputType")]
1695    pub input_type: String,
1696    /// Single-choice answer options for the field
1697    #[serde(
1698        rename = "singleChoiceAnswers",
1699        default,
1700        skip_serializing_if = "Vec::is_empty"
1701    )]
1702    pub single_choice_answers: Vec<String>,
1703}
1704
1705/// `LeadFormQuestionDTO` from the GoHighLevel OpenAPI spec.
1706#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1707pub struct LeadFormQuestionDTO {
1708    /// Question text
1709    /// Required by the API.
1710    pub question: LocalizedStringDTO,
1711    /// Question field name
1712    /// Required by the API.
1713    pub name: String,
1714    /// Question type details
1715    /// Required by the API.
1716    #[serde(rename = "questionDetails")]
1717    pub question_details: QuestionDetailsDTO,
1718    /// Predefined field identifier
1719    #[serde(
1720        rename = "predefinedField",
1721        default,
1722        skip_serializing_if = "Option::is_none"
1723    )]
1724    pub predefined_field: Option<String>,
1725}
1726
1727/// `LegalInfoDTO` from the GoHighLevel OpenAPI spec.
1728#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1729pub struct LegalInfoDTO {
1730    /// Consent entries
1731    /// Required by the API.
1732    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1733    pub consents: Vec<ConsentDTO>,
1734    /// Privacy policy URL
1735    /// Required by the API.
1736    #[serde(rename = "privacyPolicyUrl")]
1737    pub privacy_policy_url: String,
1738    /// Legal disclaimer text
1739    #[serde(
1740        rename = "legalDisclaimer",
1741        default,
1742        skip_serializing_if = "Option::is_none"
1743    )]
1744    pub legal_disclaimer: Option<LocalizedStringDTO>,
1745}
1746
1747/// `LinkedInAdDTO` from the GoHighLevel OpenAPI spec.
1748#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1749pub struct LinkedInAdDTO {
1750    #[serde(default, skip_serializing_if = "Option::is_none")]
1751    pub id: Option<String>,
1752    #[serde(default, skip_serializing_if = "Option::is_none")]
1753    pub name: Option<String>,
1754    #[serde(
1755        rename = "introductoryText",
1756        default,
1757        skip_serializing_if = "Option::is_none"
1758    )]
1759    pub introductory_text: Option<String>,
1760    #[serde(
1761        rename = "destinationUrl",
1762        default,
1763        skip_serializing_if = "Option::is_none"
1764    )]
1765    pub destination_url: Option<String>,
1766    #[serde(
1767        rename = "callToActionLabel",
1768        default,
1769        skip_serializing_if = "Option::is_none"
1770    )]
1771    pub call_to_action_label: Option<String>,
1772    #[serde(
1773        rename = "destinationFormId",
1774        default,
1775        skip_serializing_if = "Option::is_none"
1776    )]
1777    pub destination_form_id: Option<String>,
1778    #[serde(
1779        rename = "contentReferenceString",
1780        default,
1781        skip_serializing_if = "Option::is_none"
1782    )]
1783    pub content_reference_string: Option<String>,
1784    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1785    pub media: Vec<LinkedInMediaDTO>,
1786    #[serde(
1787        rename = "adCampaignId",
1788        default,
1789        skip_serializing_if = "Option::is_none"
1790    )]
1791    pub ad_campaign_id: Option<String>,
1792    #[serde(rename = "adId", default, skip_serializing_if = "Option::is_none")]
1793    pub ad_id: Option<String>,
1794    #[serde(default, skip_serializing_if = "Option::is_none")]
1795    pub headline: Option<String>,
1796    /// Allowed values: `DRAFT`, `SCHEDULED`, `PUBLISHED`, `PUBLISHING`, `FAILED`, `IN_REVIEW`,
1797    /// `PAUSED`, `ARCHIVED`, `WITH_ISSUES`, `REJECTED`.
1798    #[serde(
1799        rename = "publishingStatus",
1800        default,
1801        skip_serializing_if = "Option::is_none"
1802    )]
1803    pub publishing_status: Option<String>,
1804    #[serde(
1805        rename = "adCampaignGroupId",
1806        default,
1807        skip_serializing_if = "Option::is_none"
1808    )]
1809    pub ad_campaign_group_id: Option<String>,
1810    #[serde(default, skip_serializing_if = "Option::is_none")]
1811    pub description: Option<String>,
1812    #[serde(default, skip_serializing_if = "Option::is_none")]
1813    pub meta: Option<serde_json::Value>,
1814    /// LinkedIn API error message
1815    #[serde(
1816        rename = "linkedInError",
1817        default,
1818        skip_serializing_if = "Option::is_none"
1819    )]
1820    pub linked_in_error: Option<String>,
1821}
1822
1823/// `LinkedInBudgetDTO` from the GoHighLevel OpenAPI spec.
1824#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1825pub struct LinkedInBudgetDTO {
1826    /// Allowed values: `DAILY`, `LIFETIME`.
1827    #[serde(
1828        rename = "budgetType",
1829        default,
1830        skip_serializing_if = "Option::is_none"
1831    )]
1832    pub budget_type: Option<String>,
1833    #[serde(default, skip_serializing_if = "Option::is_none")]
1834    pub amount: Option<f64>,
1835    /// Schedule start date (ISO 8601)
1836    #[serde(
1837        rename = "scheduleStartDate",
1838        default,
1839        skip_serializing_if = "Option::is_none"
1840    )]
1841    pub schedule_start_date: Option<String>,
1842    /// Schedule end date (ISO 8601)
1843    #[serde(
1844        rename = "scheduleEndDate",
1845        default,
1846        skip_serializing_if = "Option::is_none"
1847    )]
1848    pub schedule_end_date: Option<String>,
1849}
1850
1851/// `LinkedInCreateLeadFormBodyDTO` from the GoHighLevel OpenAPI spec.
1852#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1853pub struct LinkedInCreateLeadFormBodyDTO {
1854    /// Form owner
1855    /// Required by the API.
1856    pub owner: SponsoredAccountOwnerDTO,
1857    /// Creation locale
1858    /// Required by the API.
1859    #[serde(rename = "creationLocale")]
1860    pub creation_locale: CreationLocaleDTO,
1861    /// Form name
1862    /// Required by the API.
1863    pub name: String,
1864    /// Form state
1865    /// Allowed values: `PUBLISHED`.
1866    /// Required by the API.
1867    pub state: String,
1868    /// Form content
1869    /// Required by the API.
1870    pub content: LeadFormContentDTO,
1871    /// Hidden fields
1872    #[serde(
1873        rename = "hiddenFields",
1874        default,
1875        skip_serializing_if = "Vec::is_empty"
1876    )]
1877    pub hidden_fields: Vec<HiddenFieldDTO>,
1878}
1879
1880/// `LinkedInMediaDTO` from the GoHighLevel OpenAPI spec.
1881#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1882pub struct LinkedInMediaDTO {
1883    /// Media type
1884    /// Allowed values: `video`, `image`.
1885    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
1886    pub type_: Option<String>,
1887    /// Media source URL
1888    #[serde(default, skip_serializing_if = "Option::is_none")]
1889    pub src: Option<String>,
1890    /// Video frame URLs
1891    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1892    pub frames: Vec<String>,
1893    /// Selected poster frame index
1894    #[serde(
1895        rename = "selectedPoster",
1896        default,
1897        skip_serializing_if = "Option::is_none"
1898    )]
1899    pub selected_poster: Option<f64>,
1900    /// Thumbnail URL
1901    #[serde(
1902        rename = "thumbnailUrl",
1903        default,
1904        skip_serializing_if = "Option::is_none"
1905    )]
1906    pub thumbnail_url: Option<String>,
1907    /// Media name
1908    #[serde(default, skip_serializing_if = "Option::is_none")]
1909    pub name: Option<String>,
1910    /// Media headline
1911    #[serde(default, skip_serializing_if = "Option::is_none")]
1912    pub headline: Option<String>,
1913    /// Click-through destination URL
1914    #[serde(
1915        rename = "destinationUrl",
1916        default,
1917        skip_serializing_if = "Option::is_none"
1918    )]
1919    pub destination_url: Option<String>,
1920    /// File size in bytes
1921    #[serde(
1922        rename = "fileSizeBytes",
1923        default,
1924        skip_serializing_if = "Option::is_none"
1925    )]
1926    pub file_size_bytes: Option<f64>,
1927}
1928
1929/// `LinkedInUpdateAdStatusBodyDTO` from the GoHighLevel OpenAPI spec.
1930#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1931pub struct LinkedInUpdateAdStatusBodyDTO {
1932    /// Update operation
1933    /// Allowed values: `PAUSED`, `ARCHIVED`, `RESUME`.
1934    /// Required by the API.
1935    #[serde(rename = "operationType")]
1936    pub operation_type: String,
1937    /// Ad object type
1938    /// Allowed values: `adGroup`, `adCampaign`, `ad`.
1939    /// Required by the API.
1940    #[serde(rename = "type")]
1941    pub type_: String,
1942}
1943
1944/// `LocaleDTO` from the GoHighLevel OpenAPI spec.
1945#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1946pub struct LocaleDTO {
1947    /// Country code
1948    /// Required by the API.
1949    pub country: String,
1950    /// Language code
1951    /// Required by the API.
1952    pub language: String,
1953}
1954
1955/// `LocalizedStringDTO` from the GoHighLevel OpenAPI spec.
1956#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1957pub struct LocalizedStringDTO {
1958    /// Locale-keyed string map
1959    /// Required by the API.
1960    pub localized: serde_json::Value,
1961}
1962
1963/// `LocationIdBodyDTO` from the GoHighLevel OpenAPI spec.
1964#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1965pub struct LocationIdBodyDTO {
1966    /// Location identifier
1967    /// Required by the API.
1968    #[serde(rename = "locationId")]
1969    pub location_id: String,
1970}
1971
1972/// `MediaDTO` from the GoHighLevel OpenAPI spec.
1973#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1974pub struct MediaDTO {
1975    /// Media source URL
1976    /// Required by the API.
1977    pub src: String,
1978    /// Thumbnail URL (required when type is video)
1979    #[serde(
1980        rename = "thumbnailUrl",
1981        default,
1982        skip_serializing_if = "Option::is_none"
1983    )]
1984    pub thumbnail_url: Option<String>,
1985    /// Selected poster index (required when type is video)
1986    #[serde(
1987        rename = "selectedPoster",
1988        default,
1989        skip_serializing_if = "Option::is_none"
1990    )]
1991    pub selected_poster: Option<f64>,
1992    /// Media content type
1993    /// Allowed values: `image`, `video`.
1994    /// Required by the API.
1995    #[serde(rename = "type")]
1996    pub type_: String,
1997    /// Media file name
1998    #[serde(default, skip_serializing_if = "Option::is_none")]
1999    pub name: Option<String>,
2000    /// Media headline
2001    #[serde(default, skip_serializing_if = "Option::is_none")]
2002    pub headline: Option<String>,
2003    /// Media description
2004    #[serde(default, skip_serializing_if = "Option::is_none")]
2005    pub description: Option<String>,
2006    /// Media destination link
2007    #[serde(default, skip_serializing_if = "Option::is_none")]
2008    pub link: Option<String>,
2009}
2010
2011/// `MemberDTO` from the GoHighLevel OpenAPI spec.
2012#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2013pub struct MemberDTO {
2014    /// Member type
2015    /// Allowed values: `KEYWORD`, `URL`, `APP`.
2016    /// Required by the API.
2017    #[serde(rename = "memberType")]
2018    pub member_type: String,
2019    /// Keyword value
2020    #[serde(default, skip_serializing_if = "Option::is_none")]
2021    pub keyword: Option<String>,
2022    /// URL value
2023    #[serde(default, skip_serializing_if = "Option::is_none")]
2024    pub url: Option<String>,
2025    /// App identifier
2026    #[serde(default, skip_serializing_if = "Option::is_none")]
2027    pub app: Option<String>,
2028}
2029
2030/// `MultipleChoiceOptionDTO` from the GoHighLevel OpenAPI spec.
2031#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2032pub struct MultipleChoiceOptionDTO {
2033    /// Option ID
2034    /// Required by the API.
2035    pub id: f64,
2036    /// Option text
2037    /// Required by the API.
2038    pub text: LocalizedStringDTO,
2039}
2040
2041/// `MultipleChoiceQuestionDetailsDTO` from the GoHighLevel OpenAPI spec.
2042#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2043pub struct MultipleChoiceQuestionDetailsDTO {
2044    /// Choice options
2045    /// Required by the API.
2046    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2047    pub options: Vec<MultipleChoiceOptionDTO>,
2048}
2049
2050/// `PostSubmissionCallToActionDTO` from the GoHighLevel OpenAPI spec.
2051#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2052pub struct PostSubmissionCallToActionDTO {
2053    /// Call to action target
2054    /// Required by the API.
2055    #[serde(rename = "callToActionTarget")]
2056    pub call_to_action_target: PostSubmissionCallToActionTargetDTO,
2057    /// Call to action label
2058    /// Allowed values: `VISIT_COMPANY_WEBSITE`, `DOWNLOAD_NOW`, `TRY_NOW`, `VIEW_NOW`,
2059    /// `LEARN_MORE`.
2060    /// Required by the API.
2061    #[serde(rename = "callToActionLabel")]
2062    pub call_to_action_label: String,
2063}
2064
2065/// `PostSubmissionCallToActionTargetDTO` from the GoHighLevel OpenAPI spec.
2066#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2067pub struct PostSubmissionCallToActionTargetDTO {
2068    /// Landing page URL
2069    /// Required by the API.
2070    #[serde(rename = "landingPageUrl")]
2071    pub landing_page_url: String,
2072}
2073
2074/// `PostSubmissionInfoDTO` from the GoHighLevel OpenAPI spec.
2075#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2076pub struct PostSubmissionInfoDTO {
2077    /// Thank-you message
2078    /// Required by the API.
2079    pub message: LocalizedStringDTO,
2080    /// Post-submission call to action
2081    /// Required by the API.
2082    #[serde(rename = "callToAction")]
2083    pub call_to_action: PostSubmissionCallToActionDTO,
2084}
2085
2086/// `PublishAdDTO` from the GoHighLevel OpenAPI spec.
2087#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2088pub struct PublishAdDTO {
2089    /// Location identifier
2090    /// Required by the API.
2091    #[serde(rename = "locationId")]
2092    pub location_id: String,
2093}
2094
2095/// `QuestionDetailsDTO` from the GoHighLevel OpenAPI spec.
2096#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2097pub struct QuestionDetailsDTO {
2098    /// Text question details (empty object for text questions)
2099    #[serde(
2100        rename = "textQuestionDetails",
2101        default,
2102        skip_serializing_if = "Option::is_none"
2103    )]
2104    pub text_question_details: Option<serde_json::Value>,
2105    /// Multiple choice question details
2106    #[serde(
2107        rename = "multipleChoiceQuestionDetails",
2108        default,
2109        skip_serializing_if = "Option::is_none"
2110    )]
2111    pub multiple_choice_question_details: Option<MultipleChoiceQuestionDetailsDTO>,
2112}
2113
2114/// `RuleBasedUserListDTO` from the GoHighLevel OpenAPI spec.
2115#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2116pub struct RuleBasedUserListDTO {
2117    /// Prepopulation status
2118    /// Allowed values: `REQUESTED`.
2119    #[serde(
2120        rename = "prepopulationStatus",
2121        default,
2122        skip_serializing_if = "Option::is_none"
2123    )]
2124    pub prepopulation_status: Option<String>,
2125    /// Flexible rule user list configuration
2126    /// Required by the API.
2127    #[serde(rename = "flexibleRuleUserList")]
2128    pub flexible_rule_user_list: FlexibleRuleUserListDTO,
2129}
2130
2131/// `RuleDTO` from the GoHighLevel OpenAPI spec.
2132#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2133pub struct RuleDTO {
2134    /// List of rule item groups
2135    /// Required by the API.
2136    #[serde(
2137        rename = "ruleItemGroups",
2138        default,
2139        skip_serializing_if = "Vec::is_empty"
2140    )]
2141    pub rule_item_groups: Vec<RuleItemGroupDTO>,
2142}
2143
2144/// `RuleItemDTO` from the GoHighLevel OpenAPI spec.
2145#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2146pub struct RuleItemDTO {
2147    /// Rule item name
2148    /// Allowed values: `url__`, `referrer__`.
2149    /// Required by the API.
2150    pub name: String,
2151    /// String rule item condition
2152    /// Required by the API.
2153    #[serde(rename = "stringRuleItem")]
2154    pub string_rule_item: StringRuleItemDTO,
2155}
2156
2157/// `RuleItemGroupDTO` from the GoHighLevel OpenAPI spec.
2158#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2159pub struct RuleItemGroupDTO {
2160    /// List of rule items
2161    /// Required by the API.
2162    #[serde(rename = "ruleItems", default, skip_serializing_if = "Vec::is_empty")]
2163    pub rule_items: Vec<RuleItemDTO>,
2164}
2165
2166/// `RuleOperandDTO` from the GoHighLevel OpenAPI spec.
2167#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2168pub struct RuleOperandDTO {
2169    /// Lookback window in days
2170    /// Required by the API.
2171    #[serde(rename = "lookbackWindowDays")]
2172    pub lookback_window_days: f64,
2173    /// Rule definition
2174    /// Required by the API.
2175    pub rule: RuleDTO,
2176}
2177
2178/// `SelectedAttributeDTO` from the GoHighLevel OpenAPI spec.
2179#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2180pub struct SelectedAttributeDTO {
2181    /// Targeting attribute URN
2182    /// Required by the API.
2183    pub urn: String,
2184    /// Display name
2185    /// Required by the API.
2186    pub name: String,
2187    /// Category name
2188    /// Required by the API.
2189    #[serde(rename = "categoryName")]
2190    pub category_name: String,
2191    /// Facet identifier
2192    /// Required by the API.
2193    pub facet: String,
2194}
2195
2196/// `SitelinkAssetPayloadDTO` from the GoHighLevel OpenAPI spec.
2197#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2198pub struct SitelinkAssetPayloadDTO {
2199    /// Google Ads resource name for an existing sitelink asset
2200    #[serde(
2201        rename = "resourceName",
2202        default,
2203        skip_serializing_if = "Option::is_none"
2204    )]
2205    pub resource_name: Option<String>,
2206    /// Sitelink display text
2207    /// Required by the API.
2208    #[serde(rename = "linkText")]
2209    pub link_text: String,
2210    /// Final landing page URL
2211    /// Required by the API.
2212    #[serde(rename = "finalUrls")]
2213    pub final_urls: String,
2214    /// First description line
2215    #[serde(default, skip_serializing_if = "Option::is_none")]
2216    pub description1: Option<String>,
2217    /// Second description line
2218    #[serde(default, skip_serializing_if = "Option::is_none")]
2219    pub description2: Option<String>,
2220    /// Start date for the sitelink (YYYY-MM-DD)
2221    #[serde(rename = "startDate", default, skip_serializing_if = "Option::is_none")]
2222    pub start_date: Option<String>,
2223    /// End date for the sitelink (YYYY-MM-DD)
2224    #[serde(rename = "endDate", default, skip_serializing_if = "Option::is_none")]
2225    pub end_date: Option<String>,
2226    /// Ad schedule targets restricting when the sitelink is shown
2227    #[serde(
2228        rename = "adScheduleTargets",
2229        default,
2230        skip_serializing_if = "Vec::is_empty"
2231    )]
2232    pub ad_schedule_targets: Vec<AdScheduleTargetDTO>,
2233}
2234
2235/// `SponsoredAccountOwnerDTO` from the GoHighLevel OpenAPI spec.
2236#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2237pub struct SponsoredAccountOwnerDTO {
2238    /// Sponsored account URN
2239    /// Required by the API.
2240    #[serde(rename = "sponsoredAccount")]
2241    pub sponsored_account: String,
2242}
2243
2244/// `StringRuleItemDTO` from the GoHighLevel OpenAPI spec.
2245#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2246pub struct StringRuleItemDTO {
2247    /// Rule operator
2248    /// Required by the API.
2249    pub operator: String,
2250    /// Rule value
2251    /// Required by the API.
2252    pub value: String,
2253}
2254
2255/// `TargetAudienceDTO` from the GoHighLevel OpenAPI spec.
2256#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2257pub struct TargetAudienceDTO {
2258    /// Included targeting attributes (groups of ANDed attributes, ORed together)
2259    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2260    pub include: Vec<Vec<SelectedAttributeDTO>>,
2261    /// Excluded targeting attributes
2262    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2263    pub exclude: Vec<Vec<SelectedAttributeDTO>>,
2264}
2265
2266/// `ThankYouPage` from the GoHighLevel OpenAPI spec.
2267#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2268pub struct ThankYouPage {
2269    /// Thank you page title
2270    /// Required by the API.
2271    pub title: String,
2272    /// Thank you page body
2273    /// Required by the API.
2274    pub body: String,
2275    /// Button text label
2276    /// Required by the API.
2277    #[serde(rename = "buttonText")]
2278    pub button_text: String,
2279    /// Button action type
2280    /// Required by the API.
2281    #[serde(rename = "buttonType")]
2282    pub button_type: String,
2283    /// Button destination link
2284    #[serde(
2285        rename = "buttonLink",
2286        default,
2287        skip_serializing_if = "Option::is_none"
2288    )]
2289    pub button_link: Option<String>,
2290    /// Business phone number
2291    #[serde(
2292        rename = "businessPhone",
2293        default,
2294        skip_serializing_if = "Option::is_none"
2295    )]
2296    pub business_phone: Option<String>,
2297    /// Phone country code
2298    #[serde(
2299        rename = "countryCode",
2300        default,
2301        skip_serializing_if = "Option::is_none"
2302    )]
2303    pub country_code: Option<String>,
2304}
2305
2306/// `UnitCostDTO` from the GoHighLevel OpenAPI spec.
2307#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2308pub struct UnitCostDTO {
2309    /// Bid amount in currency minor units
2310    /// Required by the API.
2311    pub amount: f64,
2312}
2313
2314/// `UpdateCustomAudienceBatchDTO` from the GoHighLevel OpenAPI spec.
2315#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2316pub struct UpdateCustomAudienceBatchDTO {
2317    /// Location identifier
2318    /// Required by the API.
2319    #[serde(rename = "locationId")]
2320    pub location_id: String,
2321    /// CSV file path
2322    #[serde(rename = "csvPath", default, skip_serializing_if = "Option::is_none")]
2323    pub csv_path: Option<String>,
2324    /// Batch operation type
2325    /// Required by the API.
2326    #[serde(rename = "operationType")]
2327    pub operation_type: String,
2328    /// Smartlist IDs array
2329    #[serde(
2330        rename = "smartlistIds",
2331        default,
2332        skip_serializing_if = "Vec::is_empty"
2333    )]
2334    pub smartlist_ids: Vec<String>,
2335    /// Dynamic audience flag
2336    #[serde(
2337        rename = "dynamicAudience",
2338        default,
2339        skip_serializing_if = "Option::is_none"
2340    )]
2341    pub dynamic_audience: Option<String>,
2342}
2343
2344/// `UpdateCustomAudienceDTO` from the GoHighLevel OpenAPI spec.
2345#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2346pub struct UpdateCustomAudienceDTO {
2347    /// Location identifier
2348    /// Required by the API.
2349    #[serde(rename = "locationId")]
2350    pub location_id: String,
2351    /// Contact identifier
2352    /// Required by the API.
2353    #[serde(rename = "contactId")]
2354    pub contact_id: String,
2355    /// Facebook ad account ID
2356    #[serde(
2357        rename = "fbAdAccountId",
2358        default,
2359        skip_serializing_if = "Option::is_none"
2360    )]
2361    pub fb_ad_account_id: Option<String>,
2362}
2363
2364/// `UpsertAdDTO` from the GoHighLevel OpenAPI spec.
2365#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2366pub struct UpsertAdDTO {
2367    /// Ad identifier
2368    #[serde(default, skip_serializing_if = "Option::is_none")]
2369    pub id: Option<String>,
2370    /// Location identifier
2371    /// Required by the API.
2372    #[serde(rename = "locationId")]
2373    pub location_id: String,
2374    /// Ad name
2375    #[serde(default, skip_serializing_if = "Option::is_none")]
2376    pub name: Option<String>,
2377    /// Ad primary text
2378    #[serde(
2379        rename = "primaryText",
2380        default,
2381        skip_serializing_if = "Option::is_none"
2382    )]
2383    pub primary_text: Option<String>,
2384    /// Ad headline text
2385    #[serde(default, skip_serializing_if = "Option::is_none")]
2386    pub headline: Option<String>,
2387    /// Ad description text
2388    #[serde(default, skip_serializing_if = "Option::is_none")]
2389    pub description: Option<String>,
2390    /// Ad image URL
2391    #[serde(rename = "imageUrl", default, skip_serializing_if = "Option::is_none")]
2392    pub image_url: Option<String>,
2393    /// Ad media type
2394    /// Allowed values: `SINGLE`, `CAROUSEL`.
2395    #[serde(rename = "mediaType", default, skip_serializing_if = "Option::is_none")]
2396    pub media_type: Option<String>,
2397    /// Media items (images or videos) attached to the ad creative
2398    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2399    pub media: Vec<MediaDTO>,
2400    /// Enable multi-advertiser ads
2401    #[serde(
2402        rename = "multiAdvertiserAds",
2403        default,
2404        skip_serializing_if = "Option::is_none"
2405    )]
2406    pub multi_advertiser_ads: Option<bool>,
2407    /// Parent campaign ID
2408    /// Required by the API.
2409    #[serde(rename = "campaignId")]
2410    pub campaign_id: String,
2411    /// Parent ad set ID
2412    /// Required by the API.
2413    #[serde(rename = "adsetId")]
2414    pub adset_id: String,
2415    /// Call to action type
2416    #[serde(default, skip_serializing_if = "Option::is_none")]
2417    pub cta: Option<String>,
2418    /// Conversation form ID
2419    #[serde(
2420        rename = "conversationFormId",
2421        default,
2422        skip_serializing_if = "Option::is_none"
2423    )]
2424    pub conversation_form_id: Option<String>,
2425    /// Destination link URL
2426    #[serde(
2427        rename = "destinationLink",
2428        default,
2429        skip_serializing_if = "Option::is_none"
2430    )]
2431    pub destination_link: Option<String>,
2432    /// Destination form ID
2433    #[serde(
2434        rename = "destinationFormId",
2435        default,
2436        skip_serializing_if = "Option::is_none"
2437    )]
2438    pub destination_form_id: Option<String>,
2439}
2440
2441/// `UpsertAdsetDTO` from the GoHighLevel OpenAPI spec.
2442#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2443pub struct UpsertAdsetDTO {
2444    /// Ad set identifier
2445    #[serde(default, skip_serializing_if = "Option::is_none")]
2446    pub id: Option<String>,
2447    /// Location identifier
2448    /// Required by the API.
2449    #[serde(rename = "locationId")]
2450    pub location_id: String,
2451    /// Ad set name
2452    #[serde(default, skip_serializing_if = "Option::is_none")]
2453    pub name: Option<String>,
2454    /// Facebook page ID
2455    #[serde(rename = "pageId", default, skip_serializing_if = "Option::is_none")]
2456    pub page_id: Option<String>,
2457    /// Instagram actor ID
2458    #[serde(
2459        rename = "instagramActorId",
2460        default,
2461        skip_serializing_if = "Option::is_none"
2462    )]
2463    pub instagram_actor_id: Option<String>,
2464    /// Messaging platforms
2465    /// Allowed values: `WHATSAPP`, `MESSENGER`, `INSTAGRAM_DIRECT`.
2466    #[serde(
2467        rename = "messagingPlatforms",
2468        default,
2469        skip_serializing_if = "Option::is_none"
2470    )]
2471    pub messaging_platforms: Option<String>,
2472    /// WhatsApp phone number
2473    #[serde(
2474        rename = "whatsappNumber",
2475        default,
2476        skip_serializing_if = "Option::is_none"
2477    )]
2478    pub whatsapp_number: Option<String>,
2479    /// Targeting audience configuration including geo-locations, locales, placements, and
2480    /// custom audiences
2481    #[serde(default, skip_serializing_if = "Option::is_none")]
2482    pub audience: Option<FacebookAudienceDTO>,
2483    /// Ad set budget config
2484    #[serde(default, skip_serializing_if = "Option::is_none")]
2485    pub budget: Option<Budget>,
2486    /// Conversion location
2487    #[serde(
2488        rename = "conversionLocation",
2489        default,
2490        skip_serializing_if = "Option::is_none"
2491    )]
2492    pub conversion_location: Option<String>,
2493    /// Custom event type
2494    #[serde(
2495        rename = "customEventType",
2496        default,
2497        skip_serializing_if = "Option::is_none"
2498    )]
2499    pub custom_event_type: Option<String>,
2500    /// Conversion pixel ID
2501    #[serde(rename = "pixelId", default, skip_serializing_if = "Option::is_none")]
2502    pub pixel_id: Option<String>,
2503    /// Parent campaign ID
2504    /// Required by the API.
2505    #[serde(rename = "campaignId")]
2506    pub campaign_id: String,
2507}
2508
2509/// `UpsertAssetsDTO` from the GoHighLevel OpenAPI spec.
2510#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2511pub struct UpsertAssetsDTO {
2512    /// Location identifier
2513    /// Required by the API.
2514    #[serde(rename = "locationId")]
2515    pub location_id: String,
2516    /// Asset type to create or update
2517    /// Allowed values: `CALL`, `SITELINK`, `LEAD_FORM`.
2518    /// Required by the API.
2519    #[serde(rename = "type")]
2520    pub type_: String,
2521    /// Asset payload — shape depends on the type field: CallAssetPayload (CALL),
2522    /// SitelinkAssetPayload (SITELINK), or LeadFormAssetPayload (LEAD_FORM)
2523    /// Multiple possible shapes in the spec; raw JSON.
2524    /// Required by the API.
2525    pub payload: serde_json::Value,
2526}
2527
2528/// `UpsertAudienceDTO` from the GoHighLevel OpenAPI spec.
2529#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2530pub struct UpsertAudienceDTO {
2531    /// Location identifier
2532    /// Required by the API.
2533    #[serde(rename = "locationId")]
2534    pub location_id: String,
2535    /// Audience resource name
2536    #[serde(
2537        rename = "resourceName",
2538        default,
2539        skip_serializing_if = "Option::is_none"
2540    )]
2541    pub resource_name: Option<String>,
2542    /// Audience name
2543    /// Required by the API.
2544    pub name: String,
2545    /// Audience dimensions
2546    #[serde(default, skip_serializing_if = "Option::is_none")]
2547    pub dimensions: Option<AudienceDimensionDTO>,
2548    /// Exclusion dimensions
2549    #[serde(
2550        rename = "exclusionDimension",
2551        default,
2552        skip_serializing_if = "Option::is_none"
2553    )]
2554    pub exclusion_dimension: Option<AudienceDimensionDTO>,
2555}
2556
2557/// `UpsertCampaignDTO` from the GoHighLevel OpenAPI spec.
2558#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2559pub struct UpsertCampaignDTO {
2560    /// Campaign identifier
2561    #[serde(default, skip_serializing_if = "Option::is_none")]
2562    pub id: Option<String>,
2563    /// Location identifier
2564    /// Required by the API.
2565    #[serde(rename = "locationId")]
2566    pub location_id: String,
2567    /// Campaign name
2568    #[serde(default, skip_serializing_if = "Option::is_none")]
2569    pub name: Option<String>,
2570    /// Campaign objective
2571    /// Allowed values: `OUTCOME_LEADS`, `OUTCOME_TRAFFIC`, `OUTCOME_ENGAGEMENT`,
2572    /// `OUTCOME_SALES`.
2573    #[serde(default, skip_serializing_if = "Option::is_none")]
2574    pub objective: Option<String>,
2575    /// Special ad categories
2576    /// Allowed values: `EMPLOYMENT`, `CREDIT`, `FINANCIAL_PRODUCTS_SERVICES`, `HOUSING`,
2577    /// `ISSUES_ELECTIONS_POLITICS`, `ONLINE_GAMBLING_AND_GAMING`, `NONE`.
2578    #[serde(
2579        rename = "specialAdCategories",
2580        default,
2581        skip_serializing_if = "Option::is_none"
2582    )]
2583    pub special_ad_categories: Option<String>,
2584    /// Campaign data source
2585    #[serde(default, skip_serializing_if = "Option::is_none")]
2586    pub source: Option<String>,
2587}
2588
2589/// `UpsertConversionDTO` from the GoHighLevel OpenAPI spec.
2590#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2591pub struct UpsertConversionDTO {
2592    /// Location identifier
2593    /// Required by the API.
2594    #[serde(rename = "locationId")]
2595    pub location_id: String,
2596    /// Conversion identifier
2597    #[serde(
2598        rename = "conversionId",
2599        default,
2600        skip_serializing_if = "Option::is_none"
2601    )]
2602    pub conversion_id: Option<String>,
2603    /// Conversion name
2604    /// Required by the API.
2605    pub name: String,
2606    /// Conversion type
2607    /// Allowed values: `UPLOAD_CLICKS`, `UPLOAD_CALLS`, `WEBPAGE`, `LEAD_FORM_SUBMIT`.
2608    /// Required by the API.
2609    #[serde(rename = "type")]
2610    pub type_: String,
2611    /// Conversion category
2612    /// Required by the API.
2613    pub category: String,
2614    /// Value settings that control how monetary value is attributed to conversions
2615    /// Required by the API.
2616    #[serde(rename = "valueSettings")]
2617    pub value_settings: ConversionValueSettings,
2618    /// How conversions are counted per interaction
2619    /// Allowed values: `ONE_PER_CLICK`, `MANY_PER_CLICK`.
2620    /// Required by the API.
2621    #[serde(rename = "countingType")]
2622    pub counting_type: String,
2623    /// Attribution model used to credit conversions
2624    /// Allowed values: `GOOGLE_SEARCH_ATTRIBUTION_DATA_DRIVEN`, `GOOGLE_ADS_LAST_CLICK`.
2625    /// Required by the API.
2626    #[serde(rename = "attributionModel")]
2627    pub attribution_model: String,
2628    /// Click-through conversion window in days
2629    /// Required by the API.
2630    #[serde(rename = "clickThroughWindow")]
2631    pub click_through_window: f64,
2632}
2633
2634/// `UpsertConversionPixelDTO` from the GoHighLevel OpenAPI spec.
2635#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2636pub struct UpsertConversionPixelDTO {
2637    /// Location identifier
2638    /// Required by the API.
2639    #[serde(rename = "locationId")]
2640    pub location_id: String,
2641    /// Conversion pixel ID
2642    #[serde(
2643        rename = "conversionPixelId",
2644        default,
2645        skip_serializing_if = "Option::is_none"
2646    )]
2647    pub conversion_pixel_id: Option<String>,
2648    /// Pixel name
2649    #[serde(default, skip_serializing_if = "Option::is_none")]
2650    pub name: Option<String>,
2651    /// Instagram user ID
2652    #[serde(rename = "igUserId", default, skip_serializing_if = "Option::is_none")]
2653    pub ig_user_id: Option<String>,
2654    /// Pixel event type
2655    /// Required by the API.
2656    #[serde(rename = "type")]
2657    pub type_: String,
2658}
2659
2660/// `UpsertSegmentDTO` from the GoHighLevel OpenAPI spec.
2661#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2662pub struct UpsertSegmentDTO {
2663    /// Segment name
2664    /// Required by the API.
2665    pub name: String,
2666    /// Segment description
2667    #[serde(default, skip_serializing_if = "Option::is_none")]
2668    pub description: Option<String>,
2669    /// Segment members — keywords, URLs, or apps that define the custom segment
2670    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2671    pub members: Vec<MemberDTO>,
2672    /// Segment status
2673    #[serde(default, skip_serializing_if = "Option::is_none")]
2674    pub status: Option<String>,
2675    /// Segment type
2676    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
2677    pub type_: Option<String>,
2678    /// Segment identifier
2679    #[serde(default, skip_serializing_if = "Option::is_none")]
2680    pub id: Option<String>,
2681    /// Membership status
2682    #[serde(
2683        rename = "membershipStatus",
2684        default,
2685        skip_serializing_if = "Option::is_none"
2686    )]
2687    pub membership_status: Option<String>,
2688    /// Rule-based user list config
2689    #[serde(
2690        rename = "ruleBasedUserList",
2691        default,
2692        skip_serializing_if = "Option::is_none"
2693    )]
2694    pub rule_based_user_list: Option<RuleBasedUserListDTO>,
2695    /// Membership life span
2696    #[serde(
2697        rename = "membershipLifeSpan",
2698        default,
2699        skip_serializing_if = "Option::is_none"
2700    )]
2701    pub membership_life_span: Option<f64>,
2702    /// Seed user list IDs
2703    #[serde(
2704        rename = "seedUserListIds",
2705        default,
2706        skip_serializing_if = "Vec::is_empty"
2707    )]
2708    pub seed_user_list_ids: Vec<String>,
2709    /// Country codes
2710    #[serde(
2711        rename = "countryCodes",
2712        default,
2713        skip_serializing_if = "Vec::is_empty"
2714    )]
2715    pub country_codes: Vec<String>,
2716    /// Expansion level
2717    /// Allowed values: `BALANCED`, `BROAD`, `NARROW`.
2718    #[serde(
2719        rename = "expansionLevel",
2720        default,
2721        skip_serializing_if = "Option::is_none"
2722    )]
2723    pub expansion_level: Option<String>,
2724}
2725
2726/// `WelcomeMessageQuestion` from the GoHighLevel OpenAPI spec.
2727#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2728pub struct WelcomeMessageQuestion {
2729    /// Question title text
2730    /// Required by the API.
2731    pub question: String,
2732    /// Auto-response message
2733    #[serde(default, skip_serializing_if = "Option::is_none")]
2734    pub response: Option<String>,
2735}