Skip to main content

data_for_seo/api/serp/google/
finance.rs

1use crate::entity::{
2    SerpApiGoogleFinanceExploreTaskAdvanced, SerpApiGoogleFinanceExploreTaskHtml,
3    SerpApiGoogleFinanceMarketsTaskAdvanced, SerpApiGoogleFinanceMarketsTaskHtml,
4    SerpApiGoogleFinanceQuoteTaskAdvanced, SerpApiGoogleFinanceTickerSearchTaskAdvanced,
5};
6use crate::{DataForSeoApiResponse, SerpApiGoogle, SerpApiTaskReadyResult};
7use serde::{Deserialize, Serialize};
8use serde_json::Value;
9
10/// Google Finance SERP endpoints (Explore, Ticker Search, Markets, Quote).
11/// <https://docs.dataforseo.com/v3/serp/google/finance/overview/>
12impl SerpApiGoogle<'_> {
13    // --- Explore -----------------------------------------------------------
14
15    /// <https://docs.dataforseo.com/v3/serp/google/finance_explore/task_post/>
16    pub async fn finance_explore_task_post(
17        &self,
18        data: Vec<SerpApiGoogleFinanceExploreTaskPostRequest>,
19    ) -> DataForSeoApiResponse<Value> {
20        self.client
21            .http_post("/v3/serp/google/finance_explore/task_post", &data)
22            .await
23    }
24    /// <https://docs.dataforseo.com/v3/serp/google/finance_explore/tasks_ready/>
25    pub async fn finance_explore_tasks_ready(
26        &self,
27    ) -> DataForSeoApiResponse<SerpApiTaskReadyResult> {
28        self.client
29            .serp()
30            .task_ready_se("google/finance_explore")
31            .await
32    }
33    /// <https://docs.dataforseo.com/v3/serp/google/finance_explore/task_get/advanced/>
34    pub async fn finance_explore_task_get_advanced(
35        &self,
36        id: &str,
37    ) -> DataForSeoApiResponse<SerpApiGoogleFinanceExploreTaskAdvanced> {
38        self.client
39            .http_get(format!("/v3/serp/google/finance_explore/task_get/advanced/{id}").as_str())
40            .await
41    }
42    /// <https://docs.dataforseo.com/v3/serp/google/finance_explore/task_get/html/>
43    pub async fn finance_explore_task_get_html(
44        &self,
45        id: &str,
46    ) -> DataForSeoApiResponse<SerpApiGoogleFinanceExploreTaskHtml> {
47        self.client
48            .http_get(format!("/v3/serp/google/finance_explore/task_get/html/{id}").as_str())
49            .await
50    }
51    /// <https://docs.dataforseo.com/v3/serp/google/finance_explore/live/advanced/>
52    pub async fn finance_explore_live_advanced(
53        &self,
54        data: Vec<SerpApiGoogleFinanceExploreTaskPostRequest>,
55    ) -> DataForSeoApiResponse<SerpApiGoogleFinanceExploreTaskAdvanced> {
56        self.client
57            .http_post("/v3/serp/google/finance_explore/live/advanced", &data)
58            .await
59    }
60
61    // --- Ticker Search -----------------------------------------------------
62
63    /// <https://docs.dataforseo.com/v3/serp/google/finance_ticker_search/task_post/>
64    pub async fn finance_ticker_search_task_post(
65        &self,
66        data: Vec<SerpApiGoogleFinanceTickerSearchTaskPostRequest>,
67    ) -> DataForSeoApiResponse<Value> {
68        self.client
69            .http_post("/v3/serp/google/finance_ticker_search/task_post", &data)
70            .await
71    }
72    /// <https://docs.dataforseo.com/v3/serp/google/finance_ticker_search/tasks_ready/>
73    pub async fn finance_ticker_search_tasks_ready(
74        &self,
75    ) -> DataForSeoApiResponse<SerpApiTaskReadyResult> {
76        self.client
77            .serp()
78            .task_ready_se("google/finance_ticker_search")
79            .await
80    }
81    /// <https://docs.dataforseo.com/v3/serp/google/finance_ticker_search/task_get/advanced/>
82    pub async fn finance_ticker_search_task_get_advanced(
83        &self,
84        id: &str,
85    ) -> DataForSeoApiResponse<SerpApiGoogleFinanceTickerSearchTaskAdvanced> {
86        self.client
87            .http_get(
88                format!("/v3/serp/google/finance_ticker_search/task_get/advanced/{id}").as_str(),
89            )
90            .await
91    }
92    /// <https://docs.dataforseo.com/v3/serp/google/finance_ticker_search/live/advanced/>
93    pub async fn finance_ticker_search_live_advanced(
94        &self,
95        data: Vec<SerpApiGoogleFinanceTickerSearchTaskPostRequest>,
96    ) -> DataForSeoApiResponse<SerpApiGoogleFinanceTickerSearchTaskAdvanced> {
97        self.client
98            .http_post("/v3/serp/google/finance_ticker_search/live/advanced", &data)
99            .await
100    }
101
102    // --- Markets -----------------------------------------------------------
103
104    /// <https://docs.dataforseo.com/v3/serp/google/finance_markets/task_post/>
105    pub async fn finance_markets_task_post(
106        &self,
107        data: Vec<SerpApiGoogleFinanceMarketsTaskPostRequest>,
108    ) -> DataForSeoApiResponse<Value> {
109        self.client
110            .http_post("/v3/serp/google/finance_markets/task_post", &data)
111            .await
112    }
113    /// <https://docs.dataforseo.com/v3/serp/google/finance_markets/tasks_ready/>
114    pub async fn finance_markets_tasks_ready(
115        &self,
116    ) -> DataForSeoApiResponse<SerpApiTaskReadyResult> {
117        self.client
118            .serp()
119            .task_ready_se("google/finance_markets")
120            .await
121    }
122    /// <https://docs.dataforseo.com/v3/serp/google/finance_markets/task_get/advanced/>
123    pub async fn finance_markets_task_get_advanced(
124        &self,
125        id: &str,
126    ) -> DataForSeoApiResponse<SerpApiGoogleFinanceMarketsTaskAdvanced> {
127        self.client
128            .http_get(format!("/v3/serp/google/finance_markets/task_get/advanced/{id}").as_str())
129            .await
130    }
131    /// <https://docs.dataforseo.com/v3/serp/google/finance_markets/task_get/html/>
132    pub async fn finance_markets_task_get_html(
133        &self,
134        id: &str,
135    ) -> DataForSeoApiResponse<SerpApiGoogleFinanceMarketsTaskHtml> {
136        self.client
137            .http_get(format!("/v3/serp/google/finance_markets/task_get/html/{id}").as_str())
138            .await
139    }
140
141    // --- Quote -------------------------------------------------------------
142
143    /// <https://docs.dataforseo.com/v3/serp/google/finance_quote/task_post/>
144    pub async fn finance_quote_task_post(
145        &self,
146        data: Vec<SerpApiGoogleFinanceQuoteTaskPostRequest>,
147    ) -> DataForSeoApiResponse<Value> {
148        self.client
149            .http_post("/v3/serp/google/finance_quote/task_post", &data)
150            .await
151    }
152    /// <https://docs.dataforseo.com/v3/serp/google/finance_quote/tasks_ready/>
153    pub async fn finance_quote_tasks_ready(&self) -> DataForSeoApiResponse<SerpApiTaskReadyResult> {
154        self.client
155            .serp()
156            .task_ready_se("google/finance_quote")
157            .await
158    }
159    /// <https://docs.dataforseo.com/v3/serp/google/finance_quote/task_get/advanced/>
160    pub async fn finance_quote_task_get_advanced(
161        &self,
162        id: &str,
163    ) -> DataForSeoApiResponse<SerpApiGoogleFinanceQuoteTaskAdvanced> {
164        self.client
165            .http_get(format!("/v3/serp/google/finance_quote/task_get/advanced/{id}").as_str())
166            .await
167    }
168}
169
170/// Request body for Google Finance Explore task_post / live.
171/// See <https://docs.dataforseo.com/v3/serp/google/finance_explore/task_post/>.
172#[derive(Debug, Default, Serialize, Deserialize, Clone)]
173pub struct SerpApiGoogleFinanceExploreTaskPostRequest {
174    /// Full location name (e.g. "London,England,United Kingdom").
175    #[serde(skip_serializing_if = "Option::is_none")]
176    pub location_name: Option<String>,
177    /// DataForSEO location code the search was run for.
178    pub location_code: i32,
179    /// Full language name of the search.
180    #[serde(skip_serializing_if = "Option::is_none")]
181    pub language_name: Option<String>,
182    /// Language code the search was run for.
183    pub language_code: String,
184    /// Device.
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub device: Option<String>,
187    /// Os.
188    #[serde(skip_serializing_if = "Option::is_none")]
189    pub os: Option<String>,
190    /// Task execution priority: 1 (normal) or 2 (high).
191    #[serde(skip_serializing_if = "Option::is_none")]
192    pub priority: Option<i32>,
193    /// News type.
194    #[serde(skip_serializing_if = "Option::is_none")]
195    pub news_type: Option<String>,
196    /// User-defined identifier echoed back on the result.
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub tag: Option<String>,
199    /// URL of the postback.
200    #[serde(skip_serializing_if = "Option::is_none")]
201    pub postback_url: Option<String>,
202    /// Postback data.
203    #[serde(skip_serializing_if = "Option::is_none")]
204    pub postback_data: Option<String>,
205    /// URL of the pingback.
206    #[serde(skip_serializing_if = "Option::is_none")]
207    pub pingback_url: Option<String>,
208}
209
210impl SerpApiGoogleFinanceExploreTaskPostRequest {
211    /// Creates a request with the required language and location codes.
212    pub fn new(language_code: String, location_code: i32) -> Self {
213        SerpApiGoogleFinanceExploreTaskPostRequest {
214            language_code,
215            location_code,
216            ..SerpApiGoogleFinanceExploreTaskPostRequest::default()
217        }
218    }
219}
220
221/// Request body for Google Finance Ticker Search task_post / live.
222/// See <https://docs.dataforseo.com/v3/serp/google/finance_ticker_search/task_post/>.
223#[derive(Debug, Default, Serialize, Deserialize, Clone)]
224pub struct SerpApiGoogleFinanceTickerSearchTaskPostRequest {
225    /// Search term the result was returned for.
226    pub keyword: String,
227    /// Full location name (e.g. "London,England,United Kingdom").
228    #[serde(skip_serializing_if = "Option::is_none")]
229    pub location_name: Option<String>,
230    /// DataForSEO location code the search was run for.
231    pub location_code: i32,
232    /// Full language name of the search.
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub language_name: Option<String>,
235    /// Language code the search was run for.
236    pub language_code: String,
237    /// Category of the entity.
238    #[serde(skip_serializing_if = "Option::is_none")]
239    pub category: Option<String>,
240    /// Task execution priority: 1 (normal) or 2 (high).
241    #[serde(skip_serializing_if = "Option::is_none")]
242    pub priority: Option<i32>,
243    /// User-defined identifier echoed back on the result.
244    #[serde(skip_serializing_if = "Option::is_none")]
245    pub tag: Option<String>,
246    /// URL of the postback.
247    #[serde(skip_serializing_if = "Option::is_none")]
248    pub postback_url: Option<String>,
249    /// Postback data.
250    #[serde(skip_serializing_if = "Option::is_none")]
251    pub postback_data: Option<String>,
252    /// URL of the pingback.
253    #[serde(skip_serializing_if = "Option::is_none")]
254    pub pingback_url: Option<String>,
255}
256
257impl SerpApiGoogleFinanceTickerSearchTaskPostRequest {
258    /// Creates a request with the required language and location codes.
259    /// Set `keyword` (company / instrument name) before sending.
260    pub fn new(language_code: String, location_code: i32) -> Self {
261        SerpApiGoogleFinanceTickerSearchTaskPostRequest {
262            language_code,
263            location_code,
264            ..SerpApiGoogleFinanceTickerSearchTaskPostRequest::default()
265        }
266    }
267}
268
269/// Request body for Google Finance Markets task_post.
270/// See <https://docs.dataforseo.com/v3/serp/google/finance_markets/task_post/>.
271#[derive(Debug, Default, Serialize, Deserialize, Clone)]
272pub struct SerpApiGoogleFinanceMarketsTaskPostRequest {
273    /// Full location name (e.g. "London,England,United Kingdom").
274    #[serde(skip_serializing_if = "Option::is_none")]
275    pub location_name: Option<String>,
276    /// DataForSEO location code the search was run for.
277    pub location_code: i32,
278    /// Full language name of the search.
279    #[serde(skip_serializing_if = "Option::is_none")]
280    pub language_name: Option<String>,
281    /// Language code the search was run for.
282    pub language_code: String,
283    /// Device.
284    #[serde(skip_serializing_if = "Option::is_none")]
285    pub device: Option<String>,
286    /// Os.
287    #[serde(skip_serializing_if = "Option::is_none")]
288    pub os: Option<String>,
289    /// Market type.
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub market_type: Option<String>,
292    /// Task execution priority: 1 (normal) or 2 (high).
293    #[serde(skip_serializing_if = "Option::is_none")]
294    pub priority: Option<i32>,
295    /// User-defined identifier echoed back on the result.
296    #[serde(skip_serializing_if = "Option::is_none")]
297    pub tag: Option<String>,
298    /// URL of the postback.
299    #[serde(skip_serializing_if = "Option::is_none")]
300    pub postback_url: Option<String>,
301    /// Postback data.
302    #[serde(skip_serializing_if = "Option::is_none")]
303    pub postback_data: Option<String>,
304    /// URL of the pingback.
305    #[serde(skip_serializing_if = "Option::is_none")]
306    pub pingback_url: Option<String>,
307}
308
309impl SerpApiGoogleFinanceMarketsTaskPostRequest {
310    /// Creates a request with the required language and location codes.
311    pub fn new(language_code: String, location_code: i32) -> Self {
312        SerpApiGoogleFinanceMarketsTaskPostRequest {
313            language_code,
314            location_code,
315            ..SerpApiGoogleFinanceMarketsTaskPostRequest::default()
316        }
317    }
318}
319
320/// Request body for Google Finance Quote task_post.
321/// See <https://docs.dataforseo.com/v3/serp/google/finance_quote/task_post/>.
322#[derive(Debug, Default, Serialize, Deserialize, Clone)]
323pub struct SerpApiGoogleFinanceQuoteTaskPostRequest {
324    /// Search term the result was returned for.
325    pub keyword: String,
326    /// Full location name (e.g. "London,England,United Kingdom").
327    #[serde(skip_serializing_if = "Option::is_none")]
328    pub location_name: Option<String>,
329    /// DataForSEO location code the search was run for.
330    pub location_code: i32,
331    /// Full language name of the search.
332    #[serde(skip_serializing_if = "Option::is_none")]
333    pub language_name: Option<String>,
334    /// Language code the search was run for.
335    pub language_code: String,
336    /// Device.
337    #[serde(skip_serializing_if = "Option::is_none")]
338    pub device: Option<String>,
339    /// Os.
340    #[serde(skip_serializing_if = "Option::is_none")]
341    pub os: Option<String>,
342    /// Window.
343    #[serde(skip_serializing_if = "Option::is_none")]
344    pub window: Option<String>,
345    /// Task execution priority: 1 (normal) or 2 (high).
346    #[serde(skip_serializing_if = "Option::is_none")]
347    pub priority: Option<i32>,
348    /// User-defined identifier echoed back on the result.
349    #[serde(skip_serializing_if = "Option::is_none")]
350    pub tag: Option<String>,
351    /// URL of the postback.
352    #[serde(skip_serializing_if = "Option::is_none")]
353    pub postback_url: Option<String>,
354    /// Postback data.
355    #[serde(skip_serializing_if = "Option::is_none")]
356    pub postback_data: Option<String>,
357    /// URL of the pingback.
358    #[serde(skip_serializing_if = "Option::is_none")]
359    pub pingback_url: Option<String>,
360}
361
362impl SerpApiGoogleFinanceQuoteTaskPostRequest {
363    /// Creates a request with the required language and location codes.
364    /// Set `keyword` (ticker / stock symbol) before sending.
365    pub fn new(language_code: String, location_code: i32) -> Self {
366        SerpApiGoogleFinanceQuoteTaskPostRequest {
367            language_code,
368            location_code,
369            ..SerpApiGoogleFinanceQuoteTaskPostRequest::default()
370        }
371    }
372}