data_for_seo/api/dataforseo_labs/
amazon.rs1use crate::entity::{
5 DataForSeoLabsAmazonProductCompetitorItem, DataForSeoLabsAmazonProductKeywordIntersectionItem,
6 DataForSeoLabsAmazonProductRankOverviewItem, DataForSeoLabsAmazonRankedKeywordItem,
7 DataForSeoLabsAmazonRelatedKeywordItem, DataForSeoLabsAmazonSearchVolumeItem,
8 DataForSeoLabsResult,
9};
10use crate::{DataForSeoApiResponse, DataForSeoClient};
11use serde::{Deserialize, Serialize};
12use serde_json::Value;
13use std::collections::HashMap;
14
15pub struct DataForSeoLabsApiAmazon<'a> {
17 pub(crate) client: &'a DataForSeoClient,
18}
19
20impl DataForSeoLabsApiAmazon<'_> {
21 pub async fn bulk_search_volume(
24 &self,
25 data: Vec<DataForSeoLabsAmazonBulkSearchVolumeRequest>,
26 ) -> DataForSeoApiResponse<DataForSeoLabsResult<DataForSeoLabsAmazonSearchVolumeItem>> {
27 self.client
28 .http_post("/v3/dataforseo_labs/amazon/bulk_search_volume/live", &data)
29 .await
30 }
31
32 pub async fn related_keywords(
35 &self,
36 data: Vec<DataForSeoLabsAmazonRelatedKeywordsRequest>,
37 ) -> DataForSeoApiResponse<DataForSeoLabsResult<DataForSeoLabsAmazonRelatedKeywordItem>> {
38 self.client
39 .http_post("/v3/dataforseo_labs/amazon/related_keywords/live", &data)
40 .await
41 }
42
43 pub async fn ranked_keywords(
46 &self,
47 data: Vec<DataForSeoLabsAmazonRankedKeywordsRequest>,
48 ) -> DataForSeoApiResponse<DataForSeoLabsResult<DataForSeoLabsAmazonRankedKeywordItem>> {
49 self.client
50 .http_post("/v3/dataforseo_labs/amazon/ranked_keywords/live", &data)
51 .await
52 }
53
54 pub async fn product_rank_overview(
57 &self,
58 data: Vec<DataForSeoLabsAmazonProductRankOverviewRequest>,
59 ) -> DataForSeoApiResponse<DataForSeoLabsResult<DataForSeoLabsAmazonProductRankOverviewItem>>
60 {
61 self.client
62 .http_post(
63 "/v3/dataforseo_labs/amazon/product_rank_overview/live",
64 &data,
65 )
66 .await
67 }
68
69 pub async fn product_competitors(
72 &self,
73 data: Vec<DataForSeoLabsAmazonProductCompetitorsRequest>,
74 ) -> DataForSeoApiResponse<DataForSeoLabsResult<DataForSeoLabsAmazonProductCompetitorItem>>
75 {
76 self.client
77 .http_post("/v3/dataforseo_labs/amazon/product_competitors/live", &data)
78 .await
79 }
80
81 pub async fn product_keyword_intersections(
84 &self,
85 data: Vec<DataForSeoLabsAmazonProductKeywordIntersectionsRequest>,
86 ) -> DataForSeoApiResponse<
87 DataForSeoLabsResult<DataForSeoLabsAmazonProductKeywordIntersectionItem>,
88 > {
89 self.client
90 .http_post(
91 "/v3/dataforseo_labs/amazon/product_keyword_intersections/live",
92 &data,
93 )
94 .await
95 }
96}
97
98#[derive(Debug, Default, Serialize, Deserialize, Clone)]
101pub struct DataForSeoLabsAmazonBulkSearchVolumeRequest {
102 pub keywords: Vec<String>,
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub location_name: Option<String>,
107 #[serde(skip_serializing_if = "Option::is_none")]
109 pub location_code: Option<i32>,
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub language_name: Option<String>,
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub language_code: Option<String>,
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub tag: Option<String>,
119}
120
121impl DataForSeoLabsAmazonBulkSearchVolumeRequest {
122 pub fn new(keywords: Vec<String>) -> DataForSeoLabsAmazonBulkSearchVolumeRequest {
124 DataForSeoLabsAmazonBulkSearchVolumeRequest {
125 keywords,
126 ..Default::default()
127 }
128 }
129}
130
131#[derive(Debug, Default, Serialize, Deserialize, Clone)]
134pub struct DataForSeoLabsAmazonRelatedKeywordsRequest {
135 pub keyword: String,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub location_name: Option<String>,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub location_code: Option<i32>,
143 #[serde(skip_serializing_if = "Option::is_none")]
145 pub language_name: Option<String>,
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub language_code: Option<String>,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub depth: Option<i64>,
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub include_seed_keyword: Option<bool>,
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub ignore_synonyms: Option<bool>,
158 #[serde(skip_serializing_if = "Option::is_none")]
160 pub limit: Option<i32>,
161 #[serde(skip_serializing_if = "Option::is_none")]
163 pub offset: Option<i32>,
164 #[serde(skip_serializing_if = "Option::is_none")]
166 pub tag: Option<String>,
167}
168
169impl DataForSeoLabsAmazonRelatedKeywordsRequest {
170 pub fn new(keyword: &str) -> DataForSeoLabsAmazonRelatedKeywordsRequest {
172 DataForSeoLabsAmazonRelatedKeywordsRequest {
173 keyword: keyword.to_string(),
174 ..Default::default()
175 }
176 }
177}
178
179#[derive(Debug, Default, Serialize, Deserialize, Clone)]
182pub struct DataForSeoLabsAmazonRankedKeywordsRequest {
183 pub asin: String,
185 #[serde(skip_serializing_if = "Option::is_none")]
187 pub location_name: Option<String>,
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub location_code: Option<i32>,
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub language_name: Option<String>,
194 #[serde(skip_serializing_if = "Option::is_none")]
196 pub language_code: Option<String>,
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub ignore_synonyms: Option<bool>,
200 #[serde(skip_serializing_if = "Option::is_none")]
202 pub filters: Option<Vec<Value>>,
203 #[serde(skip_serializing_if = "Option::is_none")]
205 pub order_by: Option<Vec<String>>,
206 #[serde(skip_serializing_if = "Option::is_none")]
208 pub limit: Option<i32>,
209 #[serde(skip_serializing_if = "Option::is_none")]
211 pub offset: Option<i32>,
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub tag: Option<String>,
215}
216
217impl DataForSeoLabsAmazonRankedKeywordsRequest {
218 pub fn new(asin: &str) -> DataForSeoLabsAmazonRankedKeywordsRequest {
220 DataForSeoLabsAmazonRankedKeywordsRequest {
221 asin: asin.to_string(),
222 ..Default::default()
223 }
224 }
225}
226
227#[derive(Debug, Default, Serialize, Deserialize, Clone)]
230pub struct DataForSeoLabsAmazonProductRankOverviewRequest {
231 pub asin: String,
233 #[serde(skip_serializing_if = "Option::is_none")]
235 pub location_name: Option<String>,
236 #[serde(skip_serializing_if = "Option::is_none")]
238 pub location_code: Option<i32>,
239 #[serde(skip_serializing_if = "Option::is_none")]
241 pub language_name: Option<String>,
242 #[serde(skip_serializing_if = "Option::is_none")]
244 pub language_code: Option<String>,
245 #[serde(skip_serializing_if = "Option::is_none")]
247 pub tag: Option<String>,
248}
249
250impl DataForSeoLabsAmazonProductRankOverviewRequest {
251 pub fn new(asin: &str) -> DataForSeoLabsAmazonProductRankOverviewRequest {
253 DataForSeoLabsAmazonProductRankOverviewRequest {
254 asin: asin.to_string(),
255 ..Default::default()
256 }
257 }
258}
259
260#[derive(Debug, Default, Serialize, Deserialize, Clone)]
263pub struct DataForSeoLabsAmazonProductCompetitorsRequest {
264 pub asin: String,
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub location_name: Option<String>,
269 #[serde(skip_serializing_if = "Option::is_none")]
271 pub location_code: Option<i32>,
272 #[serde(skip_serializing_if = "Option::is_none")]
274 pub language_name: Option<String>,
275 #[serde(skip_serializing_if = "Option::is_none")]
277 pub language_code: Option<String>,
278 #[serde(skip_serializing_if = "Option::is_none")]
280 pub filters: Option<Vec<Value>>,
281 #[serde(skip_serializing_if = "Option::is_none")]
283 pub order_by: Option<Vec<String>>,
284 #[serde(skip_serializing_if = "Option::is_none")]
286 pub limit: Option<i32>,
287 #[serde(skip_serializing_if = "Option::is_none")]
289 pub offset: Option<i32>,
290 #[serde(skip_serializing_if = "Option::is_none")]
292 pub tag: Option<String>,
293}
294
295impl DataForSeoLabsAmazonProductCompetitorsRequest {
296 pub fn new(asin: &str) -> DataForSeoLabsAmazonProductCompetitorsRequest {
298 DataForSeoLabsAmazonProductCompetitorsRequest {
299 asin: asin.to_string(),
300 ..Default::default()
301 }
302 }
303}
304
305#[derive(Debug, Default, Serialize, Deserialize, Clone)]
308pub struct DataForSeoLabsAmazonProductKeywordIntersectionsRequest {
309 pub asins: HashMap<String, String>,
311 #[serde(skip_serializing_if = "Option::is_none")]
313 pub location_name: Option<String>,
314 #[serde(skip_serializing_if = "Option::is_none")]
316 pub location_code: Option<i32>,
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub language_name: Option<String>,
320 #[serde(skip_serializing_if = "Option::is_none")]
322 pub language_code: Option<String>,
323 #[serde(skip_serializing_if = "Option::is_none")]
325 pub intersection_mode: Option<String>,
326 #[serde(skip_serializing_if = "Option::is_none")]
328 pub filters: Option<Vec<Value>>,
329 #[serde(skip_serializing_if = "Option::is_none")]
331 pub order_by: Option<Vec<String>>,
332 #[serde(skip_serializing_if = "Option::is_none")]
334 pub limit: Option<i32>,
335 #[serde(skip_serializing_if = "Option::is_none")]
337 pub offset: Option<i32>,
338 #[serde(skip_serializing_if = "Option::is_none")]
340 pub tag: Option<String>,
341}
342
343impl DataForSeoLabsAmazonProductKeywordIntersectionsRequest {
344 pub fn new(
346 asins: HashMap<String, String>,
347 ) -> DataForSeoLabsAmazonProductKeywordIntersectionsRequest {
348 DataForSeoLabsAmazonProductKeywordIntersectionsRequest {
349 asins,
350 ..Default::default()
351 }
352 }
353}