Skip to main content

data_for_seo/api/dataforseo_labs/
mod.rs

1//! DataForSEO Labs API — keyword, domain and market analytics.
2//! See <https://docs.dataforseo.com/v3/dataforseo_labs/overview/>.
3
4mod amazon;
5mod apple;
6mod google;
7
8pub use amazon::*;
9pub use apple::*;
10pub use google::*;
11
12use crate::entity::{
13    DataForSeoLabsCategory, DataForSeoLabsIdListItem, DataForSeoLabsLocation, DataForSeoLabsStatus,
14};
15use crate::{DataForSeoApiResponse, DataForSeoClient};
16use serde::{Deserialize, Serialize};
17
18/// Entry point for the DataForSEO Labs API domain.
19pub struct DataForSeoLabsApi<'a> {
20    client: &'a DataForSeoClient,
21}
22
23impl DataForSeoClient {
24    /// Returns the DataForSEO Labs API.
25    /// See <https://docs.dataforseo.com/v3/dataforseo_labs/overview/>.
26    pub fn dataforseo_labs(&self) -> DataForSeoLabsApi<'_> {
27        DataForSeoLabsApi { client: self }
28    }
29}
30
31impl<'a> DataForSeoLabsApi<'a> {
32    /// Google Labs endpoints (keyword research, competitors, app data, ...).
33    /// See <https://docs.dataforseo.com/v3/dataforseo_labs/google/>.
34    pub fn google(&self) -> DataForSeoLabsApiGoogle<'a> {
35        DataForSeoLabsApiGoogle {
36            client: self.client,
37        }
38    }
39
40    /// Amazon Labs endpoints (product keywords and competitors).
41    /// See <https://docs.dataforseo.com/v3/dataforseo_labs/amazon/>.
42    pub fn amazon(&self) -> DataForSeoLabsApiAmazon<'a> {
43        DataForSeoLabsApiAmazon {
44            client: self.client,
45        }
46    }
47
48    /// Apple App Store Labs endpoints.
49    /// See <https://docs.dataforseo.com/v3/dataforseo_labs/apple/>.
50    pub fn apple(&self) -> DataForSeoLabsApiApple<'a> {
51        DataForSeoLabsApiApple {
52            client: self.client,
53        }
54    }
55
56    /// Lists ids of previously posted Labs tasks.
57    /// See <https://docs.dataforseo.com/v3/dataforseo_labs/id_list/>.
58    pub async fn id_list(
59        &self,
60        data: Vec<DataForSeoLabsIdListRequest>,
61    ) -> DataForSeoApiResponse<DataForSeoLabsIdListItem> {
62        self.client
63            .http_post("/v3/dataforseo_labs/id_list", &data)
64            .await
65    }
66
67    /// Lists locations and the languages available for each.
68    /// See <https://docs.dataforseo.com/v3/dataforseo_labs/locations_and_languages/>.
69    pub async fn locations_and_languages(&self) -> DataForSeoApiResponse<DataForSeoLabsLocation> {
70        self.client
71            .http_get("/v3/dataforseo_labs/locations_and_languages")
72            .await
73    }
74
75    /// Lists the product categories used across Labs endpoints.
76    /// See <https://docs.dataforseo.com/v3/dataforseo_labs/categories/>.
77    pub async fn categories(&self) -> DataForSeoApiResponse<DataForSeoLabsCategory> {
78        self.client.http_get("/v3/dataforseo_labs/categories").await
79    }
80
81    /// Returns Labs API availability and rate-limit information.
82    /// See <https://docs.dataforseo.com/v3/dataforseo_labs/status/>.
83    pub async fn status(&self) -> DataForSeoApiResponse<DataForSeoLabsStatus> {
84        self.client.http_get("/v3/dataforseo_labs/status").await
85    }
86}
87
88/// Request body for the `id_list` endpoint.
89/// See <https://docs.dataforseo.com/v3/dataforseo_labs/id_list/>.
90#[derive(Debug, Default, Serialize, Deserialize, Clone)]
91pub struct DataForSeoLabsIdListRequest {
92    /// Start of the time window (UTC).
93    pub datetime_from: String,
94    /// End of the time window (UTC).
95    pub datetime_to: String,
96    /// Maximum number of returned items (default 100, max 1000).
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub limit: Option<i32>,
99    /// Offset into the result set, for pagination.
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub offset: Option<i32>,
102    /// Sort order of the returned ids: `"asc"` or `"desc"`.
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub sort: Option<String>,
105    /// Whether to include each task's original POST metadata.
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub include_metadata: Option<bool>,
108}
109
110impl DataForSeoLabsIdListRequest {
111    /// Creates a request over the inclusive `[datetime_from, datetime_to]` window (UTC).
112    pub fn new(datetime_from: &str, datetime_to: &str) -> DataForSeoLabsIdListRequest {
113        DataForSeoLabsIdListRequest {
114            datetime_from: datetime_from.to_string(),
115            datetime_to: datetime_to.to_string(),
116            ..Default::default()
117        }
118    }
119}