Skip to main content

ghl_models/v2/
opportunities.rs

1//! `opportunities` data models for GoHighLevel API V2 (25 types).
2//!
3//! Generated from HighLevel's official OpenAPI spec for the
4//! **Opportunities** module. Every endpoint that uses these types, with its
5//! parameters, required scopes and enum values, is documented in the
6//! [`opportunities` API reference](https://github.com/Shahroz/ghl-rs/blob/main/docs/api/opportunities.md).
7//!
8//! Enable with `features = ["opportunities"]`.
9// @generated by xtask/generate_models.py — do not edit by hand.
10// Source: https://github.com/GoHighLevel/highlevel-api-docs
11// Doc comments are HighLevel's own field descriptions, reflowed verbatim, so
12// they aren't held to rustdoc's markdown conventions.
13#![allow(
14    missing_docs,
15    clippy::doc_lazy_continuation,
16    clippy::doc_overindented_list_items
17)]
18
19use serde::{Deserialize, Serialize};
20
21/// `AdditionalDetailsDTO` from the GoHighLevel OpenAPI spec.
22#[derive(Debug, Clone, Default, Serialize, Deserialize)]
23pub struct AdditionalDetailsDTO {
24    /// Required by the API.
25    pub notes: bool,
26    /// Required by the API.
27    pub tasks: bool,
28    /// Required by the API.
29    #[serde(rename = "calendarEvents")]
30    pub calendar_events: bool,
31    /// Required by the API.
32    #[serde(rename = "unReadConversations")]
33    pub un_read_conversations: bool,
34}
35
36/// `CreateAddFollowersSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
37#[derive(Debug, Clone, Default, Serialize, Deserialize)]
38pub struct CreateAddFollowersSuccessfulResponseDto {
39    #[serde(default, skip_serializing_if = "Vec::is_empty")]
40    pub followers: Vec<String>,
41    #[serde(
42        rename = "followersAdded",
43        default,
44        skip_serializing_if = "Vec::is_empty"
45    )]
46    pub followers_added: Vec<String>,
47}
48
49/// `CreateDto` from the GoHighLevel OpenAPI spec.
50#[derive(Debug, Clone, Default, Serialize, Deserialize)]
51pub struct CreateDto {
52    /// pipeline Id
53    /// Required by the API.
54    #[serde(rename = "pipelineId")]
55    pub pipeline_id: String,
56    /// Required by the API.
57    #[serde(rename = "locationId")]
58    pub location_id: String,
59    /// Required by the API.
60    pub name: String,
61    #[serde(
62        rename = "pipelineStageId",
63        default,
64        skip_serializing_if = "Option::is_none"
65    )]
66    pub pipeline_stage_id: Option<String>,
67    /// Allowed values: `open`, `won`, `lost`, `abandoned`, `all`.
68    /// Required by the API.
69    pub status: String,
70    /// Required by the API.
71    #[serde(rename = "contactId")]
72    pub contact_id: String,
73    #[serde(
74        rename = "monetaryValue",
75        default,
76        skip_serializing_if = "Option::is_none"
77    )]
78    pub monetary_value: Option<f64>,
79    #[serde(
80        rename = "assignedTo",
81        default,
82        skip_serializing_if = "Option::is_none"
83    )]
84    pub assigned_to: Option<String>,
85    /// Add custom fields to opportunities.
86    /// Multiple possible shapes in the spec; raw JSON.
87    #[serde(
88        rename = "customFields",
89        default,
90        skip_serializing_if = "Vec::is_empty"
91    )]
92    pub custom_fields: Vec<serde_json::Value>,
93}
94
95/// `CustomFieldResponseSchema` from the GoHighLevel OpenAPI spec.
96#[derive(Debug, Clone, Default, Serialize, Deserialize)]
97pub struct CustomFieldResponseSchema {
98    /// Required by the API.
99    /// (Optional here so responses that omit it still parse.)
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub id: Option<String>,
102    /// The value of the custom field
103    /// Multiple possible shapes in the spec; raw JSON.
104    /// Required by the API.
105    /// (Optional here so responses that omit it still parse.)
106    #[serde(
107        rename = "fieldValue",
108        default,
109        skip_serializing_if = "Option::is_none"
110    )]
111    pub field_value: Option<serde_json::Value>,
112}
113
114/// `DeleteFollowersSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
115#[derive(Debug, Clone, Default, Serialize, Deserialize)]
116pub struct DeleteFollowersSuccessfulResponseDto {
117    #[serde(default, skip_serializing_if = "Vec::is_empty")]
118    pub followers: Vec<String>,
119    #[serde(
120        rename = "followersRemoved",
121        default,
122        skip_serializing_if = "Vec::is_empty"
123    )]
124    pub followers_removed: Vec<String>,
125}
126
127/// `DeleteUpdateOpportunitySuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
128#[derive(Debug, Clone, Default, Serialize, Deserialize)]
129pub struct DeleteUpdateOpportunitySuccessfulResponseDto {
130    #[serde(default, skip_serializing_if = "Option::is_none")]
131    pub succeded: Option<bool>,
132}
133
134/// `FollowersDTO` from the GoHighLevel OpenAPI spec.
135#[derive(Debug, Clone, Default, Serialize, Deserialize)]
136pub struct FollowersDTO {
137    /// Required by the API.
138    #[serde(default, skip_serializing_if = "Vec::is_empty")]
139    pub followers: Vec<String>,
140}
141
142/// `GetPipelinesSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
143#[derive(Debug, Clone, Default, Serialize, Deserialize)]
144pub struct GetPipelinesSuccessfulResponseDto {
145    #[serde(default, skip_serializing_if = "Vec::is_empty")]
146    pub pipelines: Vec<PipelinesResponseSchema>,
147}
148
149/// `GetPostOpportunitySuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
150#[derive(Debug, Clone, Default, Serialize, Deserialize)]
151pub struct GetPostOpportunitySuccessfulResponseDto {
152    #[serde(default, skip_serializing_if = "Option::is_none")]
153    pub opportunity: Option<SearchOpportunitiesResponseSchema>,
154}
155
156/// `LostReasonResponseSchema` from the GoHighLevel OpenAPI spec.
157#[derive(Debug, Clone, Default, Serialize, Deserialize)]
158pub struct LostReasonResponseSchema {
159    /// lost reason id
160    #[serde(default, skip_serializing_if = "Option::is_none")]
161    pub id: Option<String>,
162    /// lost reason name
163    #[serde(default, skip_serializing_if = "Option::is_none")]
164    pub name: Option<String>,
165    /// location id
166    #[serde(
167        rename = "locationId",
168        default,
169        skip_serializing_if = "Option::is_none"
170    )]
171    pub location_id: Option<String>,
172    /// updated at
173    /// Format: date-time (ISO-8601 string).
174    #[serde(rename = "updatedAt", default, skip_serializing_if = "Option::is_none")]
175    pub updated_at: Option<String>,
176    /// created at
177    /// Format: date-time (ISO-8601 string).
178    #[serde(rename = "createdAt", default, skip_serializing_if = "Option::is_none")]
179    pub created_at: Option<String>,
180}
181
182/// `LostReasonsResponseSchema` from the GoHighLevel OpenAPI spec.
183#[derive(Debug, Clone, Default, Serialize, Deserialize)]
184pub struct LostReasonsResponseSchema {
185    #[serde(rename = "lostReasons", default, skip_serializing_if = "Vec::is_empty")]
186    pub lost_reasons: Vec<LostReasonResponseSchema>,
187    #[serde(default, skip_serializing_if = "Option::is_none")]
188    pub total: Option<f64>,
189}
190
191/// `OpportunitySearchBodyDTO` from the GoHighLevel OpenAPI spec.
192#[derive(Debug, Clone, Default, Serialize, Deserialize)]
193pub struct OpportunitySearchBodyDTO {
194    /// Location Id
195    /// Required by the API.
196    #[serde(rename = "locationId")]
197    pub location_id: String,
198    /// Required by the API.
199    pub query: String,
200    /// Required by the API.
201    pub limit: f64,
202    /// Required by the API.
203    pub page: f64,
204    /// Required by the API.
205    #[serde(rename = "searchAfter", default, skip_serializing_if = "Vec::is_empty")]
206    pub search_after: Vec<String>,
207    /// Required by the API.
208    #[serde(rename = "additionalDetails")]
209    pub additional_details: AdditionalDetailsDTO,
210}
211
212/// `PipelinesResponseSchema` from the GoHighLevel OpenAPI spec.
213#[derive(Debug, Clone, Default, Serialize, Deserialize)]
214pub struct PipelinesResponseSchema {
215    #[serde(default, skip_serializing_if = "Option::is_none")]
216    pub id: Option<String>,
217    #[serde(default, skip_serializing_if = "Option::is_none")]
218    pub name: Option<String>,
219    #[serde(default, skip_serializing_if = "Vec::is_empty")]
220    pub stages: Vec<Vec<serde_json::Value>>,
221    #[serde(
222        rename = "showInFunnel",
223        default,
224        skip_serializing_if = "Option::is_none"
225    )]
226    pub show_in_funnel: Option<bool>,
227    #[serde(
228        rename = "showInPieChart",
229        default,
230        skip_serializing_if = "Option::is_none"
231    )]
232    pub show_in_pie_chart: Option<bool>,
233    #[serde(
234        rename = "locationId",
235        default,
236        skip_serializing_if = "Option::is_none"
237    )]
238    pub location_id: Option<String>,
239    /// How pipeline/stage colors are rendered
240    /// Allowed values: `dot`, `bg-tint`, `none`.
241    #[serde(
242        rename = "colorRenderMode",
243        default,
244        skip_serializing_if = "Option::is_none"
245    )]
246    pub color_render_mode: Option<String>,
247}
248
249/// `PostSearchSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
250#[derive(Debug, Clone, Default, Serialize, Deserialize)]
251pub struct PostSearchSuccessfulResponseDto {
252    #[serde(default, skip_serializing_if = "Vec::is_empty")]
253    pub opportunities: Vec<SearchOpportunitiesResponseSchema>,
254    /// Required by the API.
255    /// (Optional here so responses that omit it still parse.)
256    #[serde(default, skip_serializing_if = "Option::is_none")]
257    pub total: Option<f64>,
258    #[serde(default, skip_serializing_if = "Option::is_none")]
259    pub aggregations: Option<serde_json::Value>,
260}
261
262/// `SearchMetaResponseSchema` from the GoHighLevel OpenAPI spec.
263#[derive(Debug, Clone, Default, Serialize, Deserialize)]
264pub struct SearchMetaResponseSchema {
265    #[serde(default, skip_serializing_if = "Option::is_none")]
266    pub total: Option<f64>,
267    #[serde(
268        rename = "nextPageUrl",
269        default,
270        skip_serializing_if = "Option::is_none"
271    )]
272    pub next_page_url: Option<String>,
273    #[serde(
274        rename = "startAfterId",
275        default,
276        skip_serializing_if = "Option::is_none"
277    )]
278    pub start_after_id: Option<String>,
279    #[serde(
280        rename = "startAfter",
281        default,
282        skip_serializing_if = "Option::is_none"
283    )]
284    pub start_after: Option<f64>,
285    #[serde(
286        rename = "currentPage",
287        default,
288        skip_serializing_if = "Option::is_none"
289    )]
290    pub current_page: Option<f64>,
291    #[serde(rename = "nextPage", default, skip_serializing_if = "Option::is_none")]
292    pub next_page: Option<f64>,
293    #[serde(rename = "prevPage", default, skip_serializing_if = "Option::is_none")]
294    pub prev_page: Option<f64>,
295}
296
297/// `SearchOpportunitiesContactResponseSchema` from the GoHighLevel OpenAPI spec.
298#[derive(Debug, Clone, Default, Serialize, Deserialize)]
299pub struct SearchOpportunitiesContactResponseSchema {
300    #[serde(default, skip_serializing_if = "Option::is_none")]
301    pub id: Option<String>,
302    #[serde(default, skip_serializing_if = "Option::is_none")]
303    pub name: Option<String>,
304    #[serde(
305        rename = "companyName",
306        default,
307        skip_serializing_if = "Option::is_none"
308    )]
309    pub company_name: Option<String>,
310    #[serde(default, skip_serializing_if = "Option::is_none")]
311    pub email: Option<String>,
312    #[serde(default, skip_serializing_if = "Option::is_none")]
313    pub phone: Option<String>,
314    #[serde(default, skip_serializing_if = "Vec::is_empty")]
315    pub tags: Vec<String>,
316}
317
318/// `SearchOpportunitiesResponseSchema` from the GoHighLevel OpenAPI spec.
319#[derive(Debug, Clone, Default, Serialize, Deserialize)]
320pub struct SearchOpportunitiesResponseSchema {
321    #[serde(default, skip_serializing_if = "Option::is_none")]
322    pub id: Option<String>,
323    #[serde(default, skip_serializing_if = "Option::is_none")]
324    pub name: Option<String>,
325    #[serde(
326        rename = "monetaryValue",
327        default,
328        skip_serializing_if = "Option::is_none"
329    )]
330    pub monetary_value: Option<f64>,
331    #[serde(
332        rename = "pipelineId",
333        default,
334        skip_serializing_if = "Option::is_none"
335    )]
336    pub pipeline_id: Option<String>,
337    #[serde(
338        rename = "pipelineStageId",
339        default,
340        skip_serializing_if = "Option::is_none"
341    )]
342    pub pipeline_stage_id: Option<String>,
343    #[serde(
344        rename = "assignedTo",
345        default,
346        skip_serializing_if = "Option::is_none"
347    )]
348    pub assigned_to: Option<String>,
349    #[serde(default, skip_serializing_if = "Option::is_none")]
350    pub status: Option<String>,
351    #[serde(default, skip_serializing_if = "Option::is_none")]
352    pub source: Option<String>,
353    #[serde(
354        rename = "lastStatusChangeAt",
355        default,
356        skip_serializing_if = "Option::is_none"
357    )]
358    pub last_status_change_at: Option<String>,
359    #[serde(
360        rename = "lastStageChangeAt",
361        default,
362        skip_serializing_if = "Option::is_none"
363    )]
364    pub last_stage_change_at: Option<String>,
365    #[serde(
366        rename = "lastActionDate",
367        default,
368        skip_serializing_if = "Option::is_none"
369    )]
370    pub last_action_date: Option<String>,
371    #[serde(
372        rename = "indexVersion",
373        default,
374        skip_serializing_if = "Option::is_none"
375    )]
376    pub index_version: Option<String>,
377    #[serde(rename = "createdAt", default, skip_serializing_if = "Option::is_none")]
378    pub created_at: Option<String>,
379    #[serde(rename = "updatedAt", default, skip_serializing_if = "Option::is_none")]
380    pub updated_at: Option<String>,
381    #[serde(rename = "contactId", default, skip_serializing_if = "Option::is_none")]
382    pub contact_id: Option<String>,
383    #[serde(
384        rename = "locationId",
385        default,
386        skip_serializing_if = "Option::is_none"
387    )]
388    pub location_id: Option<String>,
389    #[serde(default, skip_serializing_if = "Option::is_none")]
390    pub contact: Option<SearchOpportunitiesContactResponseSchema>,
391    #[serde(default, skip_serializing_if = "Vec::is_empty")]
392    pub notes: Vec<Vec<serde_json::Value>>,
393    #[serde(default, skip_serializing_if = "Vec::is_empty")]
394    pub tasks: Vec<Vec<serde_json::Value>>,
395    #[serde(
396        rename = "calendarEvents",
397        default,
398        skip_serializing_if = "Vec::is_empty"
399    )]
400    pub calendar_events: Vec<Vec<serde_json::Value>>,
401    #[serde(
402        rename = "lostReasonId",
403        default,
404        skip_serializing_if = "Option::is_none"
405    )]
406    pub lost_reason_id: Option<String>,
407    #[serde(
408        rename = "customFields",
409        default,
410        skip_serializing_if = "Vec::is_empty"
411    )]
412    pub custom_fields: Vec<CustomFieldResponseSchema>,
413    #[serde(default, skip_serializing_if = "Vec::is_empty")]
414    pub followers: Vec<Vec<serde_json::Value>>,
415    #[serde(
416        rename = "externalObjectId",
417        default,
418        skip_serializing_if = "Option::is_none"
419    )]
420    pub external_object_id: Option<String>,
421}
422
423/// `SearchSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
424#[derive(Debug, Clone, Default, Serialize, Deserialize)]
425pub struct SearchSuccessfulResponseDto {
426    #[serde(default, skip_serializing_if = "Vec::is_empty")]
427    pub opportunities: Vec<SearchOpportunitiesResponseSchema>,
428    #[serde(default, skip_serializing_if = "Option::is_none")]
429    pub meta: Option<SearchMetaResponseSchema>,
430    #[serde(default, skip_serializing_if = "Option::is_none")]
431    pub aggregations: Option<serde_json::Value>,
432}
433
434/// `UpdateOpportunityDto` from the GoHighLevel OpenAPI spec.
435#[derive(Debug, Clone, Default, Serialize, Deserialize)]
436pub struct UpdateOpportunityDto {
437    /// pipeline Id
438    #[serde(
439        rename = "pipelineId",
440        default,
441        skip_serializing_if = "Option::is_none"
442    )]
443    pub pipeline_id: Option<String>,
444    #[serde(default, skip_serializing_if = "Option::is_none")]
445    pub name: Option<String>,
446    #[serde(
447        rename = "pipelineStageId",
448        default,
449        skip_serializing_if = "Option::is_none"
450    )]
451    pub pipeline_stage_id: Option<String>,
452    /// Allowed values: `open`, `won`, `lost`, `abandoned`, `all`.
453    #[serde(default, skip_serializing_if = "Option::is_none")]
454    pub status: Option<String>,
455    #[serde(
456        rename = "monetaryValue",
457        default,
458        skip_serializing_if = "Option::is_none"
459    )]
460    pub monetary_value: Option<f64>,
461    #[serde(
462        rename = "assignedTo",
463        default,
464        skip_serializing_if = "Option::is_none"
465    )]
466    pub assigned_to: Option<String>,
467    /// Update custom fields to opportunities.
468    /// Multiple possible shapes in the spec; raw JSON.
469    #[serde(
470        rename = "customFields",
471        default,
472        skip_serializing_if = "Vec::is_empty"
473    )]
474    pub custom_fields: Vec<serde_json::Value>,
475}
476
477/// `UpdateStatusDto` from the GoHighLevel OpenAPI spec.
478#[derive(Debug, Clone, Default, Serialize, Deserialize)]
479pub struct UpdateStatusDto {
480    /// Allowed values: `open`, `won`, `lost`, `abandoned`, `all`.
481    /// Required by the API.
482    pub status: String,
483    /// lost reason Id
484    #[serde(
485        rename = "lostReasonId",
486        default,
487        skip_serializing_if = "Option::is_none"
488    )]
489    pub lost_reason_id: Option<String>,
490}
491
492/// `UpsertOpportunityDto` from the GoHighLevel OpenAPI spec.
493#[derive(Debug, Clone, Default, Serialize, Deserialize)]
494pub struct UpsertOpportunityDto {
495    /// opportunityId
496    #[serde(default, skip_serializing_if = "Option::is_none")]
497    pub id: Option<String>,
498    /// pipeline Id
499    /// Required by the API.
500    #[serde(rename = "pipelineId")]
501    pub pipeline_id: String,
502    /// locationId
503    /// Required by the API.
504    #[serde(rename = "locationId")]
505    pub location_id: String,
506    /// contactId
507    /// Required by the API.
508    #[serde(default, skip_serializing_if = "Vec::is_empty")]
509    pub followers: Vec<String>,
510    /// isRemoveAllFollowers
511    /// Required by the API.
512    #[serde(rename = "isRemoveAllFollowers")]
513    pub is_remove_all_followers: bool,
514    /// followers action type
515    /// Allowed values: `add`, `remove`.
516    /// Required by the API.
517    #[serde(rename = "followersActionType")]
518    pub followers_action_type: String,
519    /// name
520    #[serde(default, skip_serializing_if = "Option::is_none")]
521    pub name: Option<String>,
522    /// Allowed values: `open`, `won`, `lost`, `abandoned`, `all`.
523    #[serde(default, skip_serializing_if = "Option::is_none")]
524    pub status: Option<String>,
525    #[serde(
526        rename = "pipelineStageId",
527        default,
528        skip_serializing_if = "Option::is_none"
529    )]
530    pub pipeline_stage_id: Option<String>,
531    #[serde(
532        rename = "monetaryValue",
533        default,
534        skip_serializing_if = "Option::is_none"
535    )]
536    pub monetary_value: Option<serde_json::Value>,
537    #[serde(
538        rename = "assignedTo",
539        default,
540        skip_serializing_if = "Option::is_none"
541    )]
542    pub assigned_to: Option<String>,
543    /// lost reason Id
544    #[serde(
545        rename = "lostReasonId",
546        default,
547        skip_serializing_if = "Option::is_none"
548    )]
549    pub lost_reason_id: Option<String>,
550}
551
552/// `UpsertOpportunitySuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
553#[derive(Debug, Clone, Default, Serialize, Deserialize)]
554pub struct UpsertOpportunitySuccessfulResponseDto {
555    /// Updated / New Opportunity
556    /// Required by the API.
557    /// (Optional here so responses that omit it still parse.)
558    #[serde(default, skip_serializing_if = "Option::is_none")]
559    pub opportunity: Option<serde_json::Value>,
560    /// Required by the API.
561    /// (Optional here so responses that omit it still parse.)
562    #[serde(default, skip_serializing_if = "Option::is_none")]
563    pub new: Option<bool>,
564}
565
566/// `customFieldsInputArraySchema` from the GoHighLevel OpenAPI spec.
567#[derive(Debug, Clone, Default, Serialize, Deserialize)]
568pub struct CustomFieldsInputArraySchema {
569    /// Required by the API.
570    pub id: String,
571    #[serde(default, skip_serializing_if = "Option::is_none")]
572    pub key: Option<String>,
573    #[serde(default, skip_serializing_if = "Vec::is_empty")]
574    pub field_value: Vec<String>,
575}
576
577/// `customFieldsInputObjectSchema` from the GoHighLevel OpenAPI spec.
578#[derive(Debug, Clone, Default, Serialize, Deserialize)]
579pub struct CustomFieldsInputObjectSchema {
580    /// Required by the API.
581    pub id: String,
582    #[serde(default, skip_serializing_if = "Option::is_none")]
583    pub key: Option<String>,
584    #[serde(default, skip_serializing_if = "Option::is_none")]
585    pub field_value: Option<serde_json::Value>,
586}
587
588/// `customFieldsInputStringSchema` from the GoHighLevel OpenAPI spec.
589#[derive(Debug, Clone, Default, Serialize, Deserialize)]
590pub struct CustomFieldsInputStringSchema {
591    /// Pass either `id` or `key` of custom field
592    #[serde(default, skip_serializing_if = "Option::is_none")]
593    pub id: Option<String>,
594    /// Pass either `id` or `key` of custom field
595    #[serde(default, skip_serializing_if = "Option::is_none")]
596    pub key: Option<String>,
597    #[serde(default, skip_serializing_if = "Option::is_none")]
598    pub field_value: Option<String>,
599}