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    pub id: String,
100    /// The value of the custom field
101    /// Multiple possible shapes in the spec; raw JSON.
102    /// Required by the API.
103    #[serde(rename = "fieldValue")]
104    pub field_value: serde_json::Value,
105}
106
107/// `DeleteFollowersSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
108#[derive(Debug, Clone, Default, Serialize, Deserialize)]
109pub struct DeleteFollowersSuccessfulResponseDto {
110    #[serde(default, skip_serializing_if = "Vec::is_empty")]
111    pub followers: Vec<String>,
112    #[serde(
113        rename = "followersRemoved",
114        default,
115        skip_serializing_if = "Vec::is_empty"
116    )]
117    pub followers_removed: Vec<String>,
118}
119
120/// `DeleteUpdateOpportunitySuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
121#[derive(Debug, Clone, Default, Serialize, Deserialize)]
122pub struct DeleteUpdateOpportunitySuccessfulResponseDto {
123    #[serde(default, skip_serializing_if = "Option::is_none")]
124    pub succeded: Option<bool>,
125}
126
127/// `FollowersDTO` from the GoHighLevel OpenAPI spec.
128#[derive(Debug, Clone, Default, Serialize, Deserialize)]
129pub struct FollowersDTO {
130    /// Required by the API.
131    #[serde(default, skip_serializing_if = "Vec::is_empty")]
132    pub followers: Vec<String>,
133}
134
135/// `GetPipelinesSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
136#[derive(Debug, Clone, Default, Serialize, Deserialize)]
137pub struct GetPipelinesSuccessfulResponseDto {
138    #[serde(default, skip_serializing_if = "Vec::is_empty")]
139    pub pipelines: Vec<PipelinesResponseSchema>,
140}
141
142/// `GetPostOpportunitySuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
143#[derive(Debug, Clone, Default, Serialize, Deserialize)]
144pub struct GetPostOpportunitySuccessfulResponseDto {
145    #[serde(default, skip_serializing_if = "Option::is_none")]
146    pub opportunity: Option<SearchOpportunitiesResponseSchema>,
147}
148
149/// `LostReasonResponseSchema` from the GoHighLevel OpenAPI spec.
150#[derive(Debug, Clone, Default, Serialize, Deserialize)]
151pub struct LostReasonResponseSchema {
152    /// lost reason id
153    #[serde(default, skip_serializing_if = "Option::is_none")]
154    pub id: Option<String>,
155    /// lost reason name
156    #[serde(default, skip_serializing_if = "Option::is_none")]
157    pub name: Option<String>,
158    /// location id
159    #[serde(
160        rename = "locationId",
161        default,
162        skip_serializing_if = "Option::is_none"
163    )]
164    pub location_id: Option<String>,
165    /// updated at
166    /// Format: date-time (ISO-8601 string).
167    #[serde(rename = "updatedAt", default, skip_serializing_if = "Option::is_none")]
168    pub updated_at: Option<String>,
169    /// created at
170    /// Format: date-time (ISO-8601 string).
171    #[serde(rename = "createdAt", default, skip_serializing_if = "Option::is_none")]
172    pub created_at: Option<String>,
173}
174
175/// `LostReasonsResponseSchema` from the GoHighLevel OpenAPI spec.
176#[derive(Debug, Clone, Default, Serialize, Deserialize)]
177pub struct LostReasonsResponseSchema {
178    #[serde(rename = "lostReasons", default, skip_serializing_if = "Vec::is_empty")]
179    pub lost_reasons: Vec<LostReasonResponseSchema>,
180    #[serde(default, skip_serializing_if = "Option::is_none")]
181    pub total: Option<f64>,
182}
183
184/// `OpportunitySearchBodyDTO` from the GoHighLevel OpenAPI spec.
185#[derive(Debug, Clone, Default, Serialize, Deserialize)]
186pub struct OpportunitySearchBodyDTO {
187    /// Location Id
188    /// Required by the API.
189    #[serde(rename = "locationId")]
190    pub location_id: String,
191    /// Required by the API.
192    pub query: String,
193    /// Required by the API.
194    pub limit: f64,
195    /// Required by the API.
196    pub page: f64,
197    /// Required by the API.
198    #[serde(rename = "searchAfter", default, skip_serializing_if = "Vec::is_empty")]
199    pub search_after: Vec<String>,
200    /// Required by the API.
201    #[serde(rename = "additionalDetails")]
202    pub additional_details: AdditionalDetailsDTO,
203}
204
205/// `PipelinesResponseSchema` from the GoHighLevel OpenAPI spec.
206#[derive(Debug, Clone, Default, Serialize, Deserialize)]
207pub struct PipelinesResponseSchema {
208    #[serde(default, skip_serializing_if = "Option::is_none")]
209    pub id: Option<String>,
210    #[serde(default, skip_serializing_if = "Option::is_none")]
211    pub name: Option<String>,
212    #[serde(default, skip_serializing_if = "Vec::is_empty")]
213    pub stages: Vec<Vec<serde_json::Value>>,
214    #[serde(
215        rename = "showInFunnel",
216        default,
217        skip_serializing_if = "Option::is_none"
218    )]
219    pub show_in_funnel: Option<bool>,
220    #[serde(
221        rename = "showInPieChart",
222        default,
223        skip_serializing_if = "Option::is_none"
224    )]
225    pub show_in_pie_chart: Option<bool>,
226    #[serde(
227        rename = "locationId",
228        default,
229        skip_serializing_if = "Option::is_none"
230    )]
231    pub location_id: Option<String>,
232    /// How pipeline/stage colors are rendered
233    /// Allowed values: `dot`, `bg-tint`, `none`.
234    #[serde(
235        rename = "colorRenderMode",
236        default,
237        skip_serializing_if = "Option::is_none"
238    )]
239    pub color_render_mode: Option<String>,
240}
241
242/// `PostSearchSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
243#[derive(Debug, Clone, Default, Serialize, Deserialize)]
244pub struct PostSearchSuccessfulResponseDto {
245    #[serde(default, skip_serializing_if = "Vec::is_empty")]
246    pub opportunities: Vec<SearchOpportunitiesResponseSchema>,
247    /// Required by the API.
248    pub total: f64,
249    #[serde(default, skip_serializing_if = "Option::is_none")]
250    pub aggregations: Option<serde_json::Value>,
251}
252
253/// `SearchMetaResponseSchema` from the GoHighLevel OpenAPI spec.
254#[derive(Debug, Clone, Default, Serialize, Deserialize)]
255pub struct SearchMetaResponseSchema {
256    #[serde(default, skip_serializing_if = "Option::is_none")]
257    pub total: Option<f64>,
258    #[serde(
259        rename = "nextPageUrl",
260        default,
261        skip_serializing_if = "Option::is_none"
262    )]
263    pub next_page_url: Option<String>,
264    #[serde(
265        rename = "startAfterId",
266        default,
267        skip_serializing_if = "Option::is_none"
268    )]
269    pub start_after_id: Option<String>,
270    #[serde(
271        rename = "startAfter",
272        default,
273        skip_serializing_if = "Option::is_none"
274    )]
275    pub start_after: Option<f64>,
276    #[serde(
277        rename = "currentPage",
278        default,
279        skip_serializing_if = "Option::is_none"
280    )]
281    pub current_page: Option<f64>,
282    #[serde(rename = "nextPage", default, skip_serializing_if = "Option::is_none")]
283    pub next_page: Option<f64>,
284    #[serde(rename = "prevPage", default, skip_serializing_if = "Option::is_none")]
285    pub prev_page: Option<f64>,
286}
287
288/// `SearchOpportunitiesContactResponseSchema` from the GoHighLevel OpenAPI spec.
289#[derive(Debug, Clone, Default, Serialize, Deserialize)]
290pub struct SearchOpportunitiesContactResponseSchema {
291    #[serde(default, skip_serializing_if = "Option::is_none")]
292    pub id: Option<String>,
293    #[serde(default, skip_serializing_if = "Option::is_none")]
294    pub name: Option<String>,
295    #[serde(
296        rename = "companyName",
297        default,
298        skip_serializing_if = "Option::is_none"
299    )]
300    pub company_name: Option<String>,
301    #[serde(default, skip_serializing_if = "Option::is_none")]
302    pub email: Option<String>,
303    #[serde(default, skip_serializing_if = "Option::is_none")]
304    pub phone: Option<String>,
305    #[serde(default, skip_serializing_if = "Vec::is_empty")]
306    pub tags: Vec<String>,
307}
308
309/// `SearchOpportunitiesResponseSchema` from the GoHighLevel OpenAPI spec.
310#[derive(Debug, Clone, Default, Serialize, Deserialize)]
311pub struct SearchOpportunitiesResponseSchema {
312    #[serde(default, skip_serializing_if = "Option::is_none")]
313    pub id: Option<String>,
314    #[serde(default, skip_serializing_if = "Option::is_none")]
315    pub name: Option<String>,
316    #[serde(
317        rename = "monetaryValue",
318        default,
319        skip_serializing_if = "Option::is_none"
320    )]
321    pub monetary_value: Option<f64>,
322    #[serde(
323        rename = "pipelineId",
324        default,
325        skip_serializing_if = "Option::is_none"
326    )]
327    pub pipeline_id: Option<String>,
328    #[serde(
329        rename = "pipelineStageId",
330        default,
331        skip_serializing_if = "Option::is_none"
332    )]
333    pub pipeline_stage_id: Option<String>,
334    #[serde(
335        rename = "assignedTo",
336        default,
337        skip_serializing_if = "Option::is_none"
338    )]
339    pub assigned_to: Option<String>,
340    #[serde(default, skip_serializing_if = "Option::is_none")]
341    pub status: Option<String>,
342    #[serde(default, skip_serializing_if = "Option::is_none")]
343    pub source: Option<String>,
344    #[serde(
345        rename = "lastStatusChangeAt",
346        default,
347        skip_serializing_if = "Option::is_none"
348    )]
349    pub last_status_change_at: Option<String>,
350    #[serde(
351        rename = "lastStageChangeAt",
352        default,
353        skip_serializing_if = "Option::is_none"
354    )]
355    pub last_stage_change_at: Option<String>,
356    #[serde(
357        rename = "lastActionDate",
358        default,
359        skip_serializing_if = "Option::is_none"
360    )]
361    pub last_action_date: Option<String>,
362    #[serde(
363        rename = "indexVersion",
364        default,
365        skip_serializing_if = "Option::is_none"
366    )]
367    pub index_version: Option<String>,
368    #[serde(rename = "createdAt", default, skip_serializing_if = "Option::is_none")]
369    pub created_at: Option<String>,
370    #[serde(rename = "updatedAt", default, skip_serializing_if = "Option::is_none")]
371    pub updated_at: Option<String>,
372    #[serde(rename = "contactId", default, skip_serializing_if = "Option::is_none")]
373    pub contact_id: Option<String>,
374    #[serde(
375        rename = "locationId",
376        default,
377        skip_serializing_if = "Option::is_none"
378    )]
379    pub location_id: Option<String>,
380    #[serde(default, skip_serializing_if = "Option::is_none")]
381    pub contact: Option<SearchOpportunitiesContactResponseSchema>,
382    #[serde(default, skip_serializing_if = "Vec::is_empty")]
383    pub notes: Vec<Vec<serde_json::Value>>,
384    #[serde(default, skip_serializing_if = "Vec::is_empty")]
385    pub tasks: Vec<Vec<serde_json::Value>>,
386    #[serde(
387        rename = "calendarEvents",
388        default,
389        skip_serializing_if = "Vec::is_empty"
390    )]
391    pub calendar_events: Vec<Vec<serde_json::Value>>,
392    #[serde(
393        rename = "lostReasonId",
394        default,
395        skip_serializing_if = "Option::is_none"
396    )]
397    pub lost_reason_id: Option<String>,
398    #[serde(
399        rename = "customFields",
400        default,
401        skip_serializing_if = "Vec::is_empty"
402    )]
403    pub custom_fields: Vec<CustomFieldResponseSchema>,
404    #[serde(default, skip_serializing_if = "Vec::is_empty")]
405    pub followers: Vec<Vec<serde_json::Value>>,
406    #[serde(
407        rename = "externalObjectId",
408        default,
409        skip_serializing_if = "Option::is_none"
410    )]
411    pub external_object_id: Option<String>,
412}
413
414/// `SearchSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
415#[derive(Debug, Clone, Default, Serialize, Deserialize)]
416pub struct SearchSuccessfulResponseDto {
417    #[serde(default, skip_serializing_if = "Vec::is_empty")]
418    pub opportunities: Vec<SearchOpportunitiesResponseSchema>,
419    #[serde(default, skip_serializing_if = "Option::is_none")]
420    pub meta: Option<SearchMetaResponseSchema>,
421    #[serde(default, skip_serializing_if = "Option::is_none")]
422    pub aggregations: Option<serde_json::Value>,
423}
424
425/// `UpdateOpportunityDto` from the GoHighLevel OpenAPI spec.
426#[derive(Debug, Clone, Default, Serialize, Deserialize)]
427pub struct UpdateOpportunityDto {
428    /// pipeline Id
429    #[serde(
430        rename = "pipelineId",
431        default,
432        skip_serializing_if = "Option::is_none"
433    )]
434    pub pipeline_id: Option<String>,
435    #[serde(default, skip_serializing_if = "Option::is_none")]
436    pub name: Option<String>,
437    #[serde(
438        rename = "pipelineStageId",
439        default,
440        skip_serializing_if = "Option::is_none"
441    )]
442    pub pipeline_stage_id: Option<String>,
443    /// Allowed values: `open`, `won`, `lost`, `abandoned`, `all`.
444    #[serde(default, skip_serializing_if = "Option::is_none")]
445    pub status: Option<String>,
446    #[serde(
447        rename = "monetaryValue",
448        default,
449        skip_serializing_if = "Option::is_none"
450    )]
451    pub monetary_value: Option<f64>,
452    #[serde(
453        rename = "assignedTo",
454        default,
455        skip_serializing_if = "Option::is_none"
456    )]
457    pub assigned_to: Option<String>,
458    /// Update custom fields to opportunities.
459    /// Multiple possible shapes in the spec; raw JSON.
460    #[serde(
461        rename = "customFields",
462        default,
463        skip_serializing_if = "Vec::is_empty"
464    )]
465    pub custom_fields: Vec<serde_json::Value>,
466}
467
468/// `UpdateStatusDto` from the GoHighLevel OpenAPI spec.
469#[derive(Debug, Clone, Default, Serialize, Deserialize)]
470pub struct UpdateStatusDto {
471    /// Allowed values: `open`, `won`, `lost`, `abandoned`, `all`.
472    /// Required by the API.
473    pub status: String,
474    /// lost reason Id
475    #[serde(
476        rename = "lostReasonId",
477        default,
478        skip_serializing_if = "Option::is_none"
479    )]
480    pub lost_reason_id: Option<String>,
481}
482
483/// `UpsertOpportunityDto` from the GoHighLevel OpenAPI spec.
484#[derive(Debug, Clone, Default, Serialize, Deserialize)]
485pub struct UpsertOpportunityDto {
486    /// opportunityId
487    #[serde(default, skip_serializing_if = "Option::is_none")]
488    pub id: Option<String>,
489    /// pipeline Id
490    /// Required by the API.
491    #[serde(rename = "pipelineId")]
492    pub pipeline_id: String,
493    /// locationId
494    /// Required by the API.
495    #[serde(rename = "locationId")]
496    pub location_id: String,
497    /// contactId
498    /// Required by the API.
499    #[serde(default, skip_serializing_if = "Vec::is_empty")]
500    pub followers: Vec<String>,
501    /// isRemoveAllFollowers
502    /// Required by the API.
503    #[serde(rename = "isRemoveAllFollowers")]
504    pub is_remove_all_followers: bool,
505    /// followers action type
506    /// Allowed values: `add`, `remove`.
507    /// Required by the API.
508    #[serde(rename = "followersActionType")]
509    pub followers_action_type: String,
510    /// name
511    #[serde(default, skip_serializing_if = "Option::is_none")]
512    pub name: Option<String>,
513    /// Allowed values: `open`, `won`, `lost`, `abandoned`, `all`.
514    #[serde(default, skip_serializing_if = "Option::is_none")]
515    pub status: Option<String>,
516    #[serde(
517        rename = "pipelineStageId",
518        default,
519        skip_serializing_if = "Option::is_none"
520    )]
521    pub pipeline_stage_id: Option<String>,
522    #[serde(
523        rename = "monetaryValue",
524        default,
525        skip_serializing_if = "Option::is_none"
526    )]
527    pub monetary_value: Option<serde_json::Value>,
528    #[serde(
529        rename = "assignedTo",
530        default,
531        skip_serializing_if = "Option::is_none"
532    )]
533    pub assigned_to: Option<String>,
534    /// lost reason Id
535    #[serde(
536        rename = "lostReasonId",
537        default,
538        skip_serializing_if = "Option::is_none"
539    )]
540    pub lost_reason_id: Option<String>,
541}
542
543/// `UpsertOpportunitySuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
544#[derive(Debug, Clone, Default, Serialize, Deserialize)]
545pub struct UpsertOpportunitySuccessfulResponseDto {
546    /// Updated / New Opportunity
547    /// Required by the API.
548    pub opportunity: serde_json::Value,
549    /// Required by the API.
550    pub new: bool,
551}
552
553/// `customFieldsInputArraySchema` from the GoHighLevel OpenAPI spec.
554#[derive(Debug, Clone, Default, Serialize, Deserialize)]
555pub struct CustomFieldsInputArraySchema {
556    /// Required by the API.
557    pub id: String,
558    #[serde(default, skip_serializing_if = "Option::is_none")]
559    pub key: Option<String>,
560    #[serde(default, skip_serializing_if = "Vec::is_empty")]
561    pub field_value: Vec<String>,
562}
563
564/// `customFieldsInputObjectSchema` from the GoHighLevel OpenAPI spec.
565#[derive(Debug, Clone, Default, Serialize, Deserialize)]
566pub struct CustomFieldsInputObjectSchema {
567    /// Required by the API.
568    pub id: String,
569    #[serde(default, skip_serializing_if = "Option::is_none")]
570    pub key: Option<String>,
571    #[serde(default, skip_serializing_if = "Option::is_none")]
572    pub field_value: Option<serde_json::Value>,
573}
574
575/// `customFieldsInputStringSchema` from the GoHighLevel OpenAPI spec.
576#[derive(Debug, Clone, Default, Serialize, Deserialize)]
577pub struct CustomFieldsInputStringSchema {
578    /// Pass either `id` or `key` of custom field
579    #[serde(default, skip_serializing_if = "Option::is_none")]
580    pub id: Option<String>,
581    /// Pass either `id` or `key` of custom field
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<String>,
586}