Skip to main content

data_for_seo/api/backlinks/
mod.rs

1use crate::entity::{
2    BacklinksApiAnchor, BacklinksApiBacklinks, BacklinksApiBulkBacklinks,
3    BacklinksApiBulkNewLostBacklinks, BacklinksApiBulkNewLostReferringDomains,
4    BacklinksApiBulkPagesSummary, BacklinksApiBulkRanks, BacklinksApiBulkReferringDomains,
5    BacklinksApiBulkSpamScore, BacklinksApiCompetitors, BacklinksApiDomainIntersection,
6    BacklinksApiDomainPages, BacklinksApiDomainPagesSummary, BacklinksApiError,
7    BacklinksApiHistory, BacklinksApiIdListItem, BacklinksApiIndex, BacklinksApiPageIntersection,
8    BacklinksApiReferringDomains, BacklinksApiReferringNetworks, BacklinksApiSummary,
9    BacklinksApiTimeseriesNewLostSummary, BacklinksApiTimeseriesSummary,
10};
11use crate::{DataForSeoApiResponse, DataForSeoClient};
12use serde::{Deserialize, Serialize};
13use serde_json::Value;
14
15/// Client for the DataForSEO Backlinks API.
16/// See <https://docs.dataforseo.com/v3/backlinks/overview/>.
17pub struct BacklinksApi<'a> {
18    client: &'a DataForSeoClient,
19}
20
21impl DataForSeoClient {
22    /// Returns the Backlinks API client.
23    pub fn backlinks(&self) -> BacklinksApi<'_> {
24        BacklinksApi { client: self }
25    }
26}
27
28impl BacklinksApi<'_> {
29    /// Total volume of the DataForSEO backlinks database.
30    /// See <https://docs.dataforseo.com/v3/backlinks/index/>.
31    pub async fn index(&self) -> DataForSeoApiResponse<BacklinksApiIndex> {
32        self.client.http_get("/v3/backlinks/index").await
33    }
34
35    /// Filterable fields available across Backlinks endpoints.
36    /// See <https://docs.dataforseo.com/v3/backlinks/filters/>.
37    pub async fn available_filters(&self) -> DataForSeoApiResponse<Value> {
38        self.client
39            .http_get("/v3/backlinks/available_filters")
40            .await
41    }
42
43    /// Aggregated backlink metrics for a target.
44    /// See <https://docs.dataforseo.com/v3/backlinks/summary/live/>.
45    pub async fn summary(
46        &self,
47        data: Vec<BacklinksApiSummaryPost>,
48    ) -> DataForSeoApiResponse<BacklinksApiSummary> {
49        self.client
50            .http_post("/v3/backlinks/summary/live", &data)
51            .await
52    }
53
54    /// Historical backlink metrics for a target.
55    /// See <https://docs.dataforseo.com/v3/backlinks/history/live/>.
56    pub async fn history(
57        &self,
58        data: Vec<BacklinksApiHistoryPost>,
59    ) -> DataForSeoApiResponse<BacklinksApiHistory> {
60        self.client
61            .http_post("/v3/backlinks/history/live", &data)
62            .await
63    }
64
65    /// List of backlinks pointing to a target.
66    /// See <https://docs.dataforseo.com/v3/backlinks/backlinks/live/>.
67    pub async fn backlinks(
68        &self,
69        data: Vec<BacklinksApiBacklinksPost>,
70    ) -> DataForSeoApiResponse<BacklinksApiBacklinks> {
71        self.client
72            .http_post("/v3/backlinks/backlinks/live", &data)
73            .await
74    }
75
76    /// Anchor texts referring to a target.
77    /// See <https://docs.dataforseo.com/v3/backlinks/anchors/live/>.
78    pub async fn anchor(
79        &self,
80        data: Vec<BacklinksApiAnchorPost>,
81    ) -> DataForSeoApiResponse<BacklinksApiAnchor> {
82        self.client
83            .http_post("/v3/backlinks/anchors/live", &data)
84            .await
85    }
86
87    /// Pages of a domain that have backlinks.
88    /// See <https://docs.dataforseo.com/v3/backlinks/domain_pages/live/>.
89    pub async fn domain_pages(
90        &self,
91        data: Vec<BacklinksApiDomainPagesPost>,
92    ) -> DataForSeoApiResponse<BacklinksApiDomainPages> {
93        self.client
94            .http_post("/v3/backlinks/domain_pages/live", &data)
95            .await
96    }
97
98    /// Backlink summary per page of a domain.
99    /// See <https://docs.dataforseo.com/v3/backlinks/domain_pages_summary/live/>.
100    pub async fn domain_pages_summary(
101        &self,
102        data: Vec<BacklinksApiDomainPagesSummaryPost>,
103    ) -> DataForSeoApiResponse<BacklinksApiDomainPagesSummary> {
104        self.client
105            .http_post("/v3/backlinks/domain_pages_summary/live", &data)
106            .await
107    }
108
109    /// Domains linking to a target.
110    /// See <https://docs.dataforseo.com/v3/backlinks/referring_domains/live/>.
111    pub async fn referring_domains(
112        &self,
113        data: Vec<BacklinksApiReferringDomainsPost>,
114    ) -> DataForSeoApiResponse<BacklinksApiReferringDomains> {
115        self.client
116            .http_post("/v3/backlinks/referring_domains/live", &data)
117            .await
118    }
119
120    /// IP addresses or subnets linking to a target.
121    /// See <https://docs.dataforseo.com/v3/backlinks/referring_networks/live/>.
122    pub async fn referring_networks(
123        &self,
124        data: Vec<BacklinksApiReferringNetworksPost>,
125    ) -> DataForSeoApiResponse<BacklinksApiReferringNetworks> {
126        self.client
127            .http_post("/v3/backlinks/referring_networks/live", &data)
128            .await
129    }
130
131    /// Domains sharing backlinks with a target.
132    /// See <https://docs.dataforseo.com/v3/backlinks/competitors/live/>.
133    pub async fn competitors(
134        &self,
135        data: Vec<BacklinksApiCompetitorsPost>,
136    ) -> DataForSeoApiResponse<BacklinksApiCompetitors> {
137        self.client
138            .http_post("/v3/backlinks/competitors/live", &data)
139            .await
140    }
141
142    /// Domains linking to several targets at once.
143    /// See <https://docs.dataforseo.com/v3/backlinks/domain_intersection/live/>.
144    pub async fn domain_intersection(
145        &self,
146        data: Vec<BacklinksApiDomainIntersectionPost>,
147    ) -> DataForSeoApiResponse<BacklinksApiDomainIntersection> {
148        self.client
149            .http_post("/v3/backlinks/domain_intersection/live", &data)
150            .await
151    }
152
153    /// Pages linking to several targets at once.
154    /// See <https://docs.dataforseo.com/v3/backlinks/page_intersection/live/>.
155    pub async fn page_intersection(
156        &self,
157        data: Vec<BacklinksApiPageIntersectionPost>,
158    ) -> DataForSeoApiResponse<BacklinksApiPageIntersection> {
159        self.client
160            .http_post("/v3/backlinks/page_intersection/live", &data)
161            .await
162    }
163
164    /// Backlink metrics grouped over time.
165    /// See <https://docs.dataforseo.com/v3/backlinks/timeseries_summary/live/>.
166    pub async fn timeseries_summary(
167        &self,
168        data: Vec<BacklinksApiTimeseriesSummaryPost>,
169    ) -> DataForSeoApiResponse<BacklinksApiTimeseriesSummary> {
170        self.client
171            .http_post("/v3/backlinks/timeseries_summary/live", &data)
172            .await
173    }
174
175    /// New and lost backlink/referring-domain counts grouped over time.
176    /// See <https://docs.dataforseo.com/v3/backlinks/timeseries_new_lost_summary/live/>.
177    pub async fn timeseries_new_lost_summary(
178        &self,
179        data: Vec<BacklinksApiTimeseriesNewLostSummaryPost>,
180    ) -> DataForSeoApiResponse<BacklinksApiTimeseriesNewLostSummary> {
181        self.client
182            .http_post("/v3/backlinks/timeseries_new_lost_summary/live", &data)
183            .await
184    }
185
186    /// Rank for up to 1000 targets.
187    /// See <https://docs.dataforseo.com/v3/backlinks/bulk_ranks/live/>.
188    pub async fn bulk_ranks(
189        &self,
190        data: Vec<BacklinksApiBulkRanksPost>,
191    ) -> DataForSeoApiResponse<BacklinksApiBulkRanks> {
192        self.client
193            .http_post("/v3/backlinks/bulk_ranks/live", &data)
194            .await
195    }
196
197    /// Backlink counts for up to 1000 targets.
198    /// See <https://docs.dataforseo.com/v3/backlinks/bulk_backlinks/live/>.
199    pub async fn bulk_backlinks(
200        &self,
201        data: Vec<BacklinksApiBulkBacklinksPost>,
202    ) -> DataForSeoApiResponse<BacklinksApiBulkBacklinks> {
203        self.client
204            .http_post("/v3/backlinks/bulk_backlinks/live", &data)
205            .await
206    }
207
208    /// Spam score for up to 1000 targets.
209    /// See <https://docs.dataforseo.com/v3/backlinks/bulk_spam_score/live/>.
210    pub async fn bulk_spam_score(
211        &self,
212        data: Vec<BacklinksApiBulkSpamScorePost>,
213    ) -> DataForSeoApiResponse<BacklinksApiBulkSpamScore> {
214        self.client
215            .http_post("/v3/backlinks/bulk_spam_score/live", &data)
216            .await
217    }
218
219    /// New and lost backlink counts for up to 1000 targets.
220    /// See <https://docs.dataforseo.com/v3/backlinks/bulk_new_lost_backlinks/live/>.
221    pub async fn bulk_new_lost_backlinks(
222        &self,
223        data: Vec<BacklinksApiBulkNewLostBacklinksPost>,
224    ) -> DataForSeoApiResponse<BacklinksApiBulkNewLostBacklinks> {
225        self.client
226            .http_post("/v3/backlinks/bulk_new_lost_backlinks/live", &data)
227            .await
228    }
229
230    /// New and lost referring-domain counts for up to 1000 targets.
231    /// See <https://docs.dataforseo.com/v3/backlinks/bulk_new_lost_referring_domains/live/>.
232    pub async fn bulk_new_lost_referring_domains(
233        &self,
234        data: Vec<BacklinksApiBulkNewLostReferringDomainsPost>,
235    ) -> DataForSeoApiResponse<BacklinksApiBulkNewLostReferringDomains> {
236        self.client
237            .http_post("/v3/backlinks/bulk_new_lost_referring_domains/live", &data)
238            .await
239    }
240
241    /// Referring-domain counts for up to 1000 targets.
242    /// See <https://docs.dataforseo.com/v3/backlinks/bulk_referring_domains/live/>.
243    pub async fn bulk_referring_domains(
244        &self,
245        data: Vec<BacklinksApiBulkReferringDomainsPost>,
246    ) -> DataForSeoApiResponse<BacklinksApiBulkReferringDomains> {
247        self.client
248            .http_post("/v3/backlinks/bulk_referring_domains/live", &data)
249            .await
250    }
251
252    /// Backlink summary for up to 1000 pages.
253    /// See <https://docs.dataforseo.com/v3/backlinks/bulk_pages_summary/live/>.
254    pub async fn bulk_pages_summary(
255        &self,
256        data: Vec<BacklinksApiBulkPagesSummaryPost>,
257    ) -> DataForSeoApiResponse<BacklinksApiBulkPagesSummary> {
258        self.client
259            .http_post("/v3/backlinks/bulk_pages_summary/live", &data)
260            .await
261    }
262
263    /// Errors of Backlinks tasks made in the past 7 days.
264    /// See <https://docs.dataforseo.com/v3/backlinks/errors/>.
265    pub async fn errors(
266        &self,
267        data: Vec<BacklinksApiErrorsPost>,
268    ) -> DataForSeoApiResponse<BacklinksApiError> {
269        self.client.http_post("/v3/backlinks/errors", &data).await
270    }
271
272    /// List of Backlinks task ids within a datetime range.
273    /// See <https://docs.dataforseo.com/v3/backlinks/id_list/>.
274    pub async fn id_list(
275        &self,
276        data: Vec<BacklinksApiIdListPost>,
277    ) -> DataForSeoApiResponse<BacklinksApiIdListItem> {
278        self.client.http_post("/v3/backlinks/id_list", &data).await
279    }
280}
281
282/// Request for the Summary endpoint.
283#[derive(Debug, Default, Serialize, Deserialize, Clone)]
284pub struct BacklinksApiSummaryPost {
285    /// Target the metrics refer to (domain, subdomain, or webpage).
286    pub target: String,
287    /// Whether to include the target's subdomains in the search.
288    #[serde(skip_serializing_if = "Option::is_none")]
289    pub include_subdomains: Option<bool>,
290    /// Whether to include indirect (redirect/canonical) links.
291    #[serde(skip_serializing_if = "Option::is_none")]
292    pub include_indirect_links: Option<bool>,
293    /// Whether to exclude backlinks from the target's own subdomains.
294    #[serde(skip_serializing_if = "Option::is_none")]
295    pub exclude_internal_backlinks: Option<bool>,
296    /// Maximum number of elements within internal arrays.
297    #[serde(skip_serializing_if = "Option::is_none")]
298    pub internal_list_limit: Option<i32>,
299    /// Which backlinks to include: `all`, `live`, or `lost`.
300    #[serde(skip_serializing_if = "Option::is_none")]
301    pub backlinks_status_type: Option<String>,
302    /// Filter applied to the underlying backlinks by any backlink field.
303    #[serde(skip_serializing_if = "Option::is_none")]
304    pub backlinks_filters: Option<Vec<Value>>,
305    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
306    #[serde(skip_serializing_if = "Option::is_none")]
307    pub rank_scale: Option<String>,
308    /// User-defined task identifier (max 255 characters).
309    #[serde(skip_serializing_if = "Option::is_none")]
310    pub tag: Option<String>,
311}
312
313impl BacklinksApiSummaryPost {
314    /// Builds a request for the given target (domain, subdomain, or webpage).
315    pub fn new(target: &str) -> BacklinksApiSummaryPost {
316        BacklinksApiSummaryPost {
317            target: target.to_string(),
318            ..Default::default()
319        }
320    }
321}
322
323/// Request for the History endpoint.
324#[derive(Debug, Default, Serialize, Deserialize, Clone)]
325pub struct BacklinksApiHistoryPost {
326    /// Target the metrics refer to (domain, subdomain, or webpage).
327    pub target: String,
328    /// Start date of the range (`yyyy-mm-dd`).
329    #[serde(skip_serializing_if = "Option::is_none")]
330    pub date_from: Option<String>,
331    /// End date of the range (`yyyy-mm-dd`).
332    #[serde(skip_serializing_if = "Option::is_none")]
333    pub date_to: Option<String>,
334    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
335    #[serde(skip_serializing_if = "Option::is_none")]
336    pub rank_scale: Option<String>,
337    /// User-defined task identifier (max 255 characters).
338    #[serde(skip_serializing_if = "Option::is_none")]
339    pub tag: Option<String>,
340}
341
342impl BacklinksApiHistoryPost {
343    /// Builds a request for the given target.
344    pub fn new(target: &str) -> BacklinksApiHistoryPost {
345        BacklinksApiHistoryPost {
346            target: target.to_string(),
347            ..Default::default()
348        }
349    }
350}
351
352/// Request for the Backlinks endpoint.
353#[derive(Debug, Default, Serialize, Deserialize, Clone)]
354pub struct BacklinksApiBacklinksPost {
355    /// Target the metrics refer to (domain, subdomain, or webpage).
356    pub target: String,
357    /// Grouping mode: `as_is`, `one_per_domain`, or `one_per_anchor`.
358    #[serde(skip_serializing_if = "Option::is_none")]
359    pub mode: Option<String>,
360    /// Custom grouping definition with `field` and `value`.
361    #[serde(skip_serializing_if = "Option::is_none")]
362    pub custom_mode: Option<Value>,
363    /// Result filtering conditions (max 8).
364    #[serde(skip_serializing_if = "Option::is_none")]
365    pub filters: Option<Vec<Value>>,
366    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
367    #[serde(skip_serializing_if = "Option::is_none")]
368    pub order_by: Option<Vec<String>>,
369    /// Offset into the result set for pagination.
370    #[serde(skip_serializing_if = "Option::is_none")]
371    pub offset: Option<i32>,
372    /// Pagination token for retrieving results beyond the offset limit.
373    #[serde(skip_serializing_if = "Option::is_none")]
374    pub search_after_token: Option<String>,
375    /// Maximum number of returned elements.
376    #[serde(skip_serializing_if = "Option::is_none")]
377    pub limit: Option<i32>,
378    /// Which backlinks to include: `all`, `live`, or `lost`.
379    #[serde(skip_serializing_if = "Option::is_none")]
380    pub backlinks_status_type: Option<String>,
381    /// Whether to include the target's subdomains in the search.
382    #[serde(skip_serializing_if = "Option::is_none")]
383    pub include_subdomains: Option<bool>,
384    /// Whether to include indirect (redirect/canonical) links.
385    #[serde(skip_serializing_if = "Option::is_none")]
386    pub include_indirect_links: Option<bool>,
387    /// Whether to exclude backlinks from the target's own subdomains.
388    #[serde(skip_serializing_if = "Option::is_none")]
389    pub exclude_internal_backlinks: Option<bool>,
390    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
391    #[serde(skip_serializing_if = "Option::is_none")]
392    pub rank_scale: Option<String>,
393    /// User-defined task identifier (max 255 characters).
394    #[serde(skip_serializing_if = "Option::is_none")]
395    pub tag: Option<String>,
396}
397
398impl BacklinksApiBacklinksPost {
399    /// Builds a request for the given target.
400    pub fn new(target: &str) -> BacklinksApiBacklinksPost {
401        BacklinksApiBacklinksPost {
402            target: target.to_string(),
403            ..Default::default()
404        }
405    }
406}
407
408/// Request for the Anchors endpoint.
409#[derive(Debug, Default, Serialize, Deserialize, Clone)]
410pub struct BacklinksApiAnchorPost {
411    /// Target the metrics refer to (domain, subdomain, or webpage).
412    pub target: String,
413    /// Maximum number of returned elements.
414    #[serde(skip_serializing_if = "Option::is_none")]
415    pub limit: Option<i32>,
416    /// Offset into the result set for pagination.
417    #[serde(skip_serializing_if = "Option::is_none")]
418    pub offset: Option<i32>,
419    /// Maximum number of elements within internal arrays.
420    #[serde(skip_serializing_if = "Option::is_none")]
421    pub internal_list_limit: Option<i32>,
422    /// Which backlinks to include: `all`, `live`, or `lost`.
423    #[serde(skip_serializing_if = "Option::is_none")]
424    pub backlinks_status_type: Option<String>,
425    /// Result filtering conditions (max 8).
426    #[serde(skip_serializing_if = "Option::is_none")]
427    pub filters: Option<Vec<Value>>,
428    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
429    #[serde(skip_serializing_if = "Option::is_none")]
430    pub order_by: Option<Vec<String>>,
431    /// Filter applied to the underlying backlinks by any backlink field.
432    #[serde(skip_serializing_if = "Option::is_none")]
433    pub backlinks_filters: Option<Vec<Value>>,
434    /// Whether to include the target's subdomains in the search.
435    #[serde(skip_serializing_if = "Option::is_none")]
436    pub include_subdomains: Option<bool>,
437    /// Whether to include indirect (redirect/canonical) links.
438    #[serde(skip_serializing_if = "Option::is_none")]
439    pub include_indirect_links: Option<bool>,
440    /// Whether to exclude backlinks from the target's own subdomains.
441    #[serde(skip_serializing_if = "Option::is_none")]
442    pub exclude_internal_backlinks: Option<bool>,
443    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
444    #[serde(skip_serializing_if = "Option::is_none")]
445    pub rank_scale: Option<String>,
446    /// User-defined task identifier (max 255 characters).
447    #[serde(skip_serializing_if = "Option::is_none")]
448    pub tag: Option<String>,
449}
450
451impl BacklinksApiAnchorPost {
452    /// Builds a request for the given target.
453    pub fn new(target: &str) -> BacklinksApiAnchorPost {
454        BacklinksApiAnchorPost {
455            target: target.to_string(),
456            ..Default::default()
457        }
458    }
459}
460
461/// Request for the Domain Pages endpoint.
462#[derive(Debug, Default, Serialize, Deserialize, Clone)]
463pub struct BacklinksApiDomainPagesPost {
464    /// Target the metrics refer to (domain, subdomain, or webpage).
465    pub target: String,
466    /// Maximum number of returned elements.
467    #[serde(skip_serializing_if = "Option::is_none")]
468    pub limit: Option<i32>,
469    /// Offset into the result set for pagination.
470    #[serde(skip_serializing_if = "Option::is_none")]
471    pub offset: Option<i32>,
472    /// Maximum number of elements within internal arrays.
473    #[serde(skip_serializing_if = "Option::is_none")]
474    pub internal_list_limit: Option<i32>,
475    /// Which backlinks to include: `all`, `live`, or `lost`.
476    #[serde(skip_serializing_if = "Option::is_none")]
477    pub backlinks_status_type: Option<String>,
478    /// Result filtering conditions (max 8).
479    #[serde(skip_serializing_if = "Option::is_none")]
480    pub filters: Option<Vec<Value>>,
481    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
482    #[serde(skip_serializing_if = "Option::is_none")]
483    pub order_by: Option<Vec<String>>,
484    /// Filter applied to the underlying backlinks by any backlink field.
485    #[serde(skip_serializing_if = "Option::is_none")]
486    pub backlinks_filters: Option<Vec<Value>>,
487    /// Whether to include the target's subdomains in the search.
488    #[serde(skip_serializing_if = "Option::is_none")]
489    pub include_subdomains: Option<bool>,
490    /// Whether to exclude backlinks from the target's own subdomains.
491    #[serde(skip_serializing_if = "Option::is_none")]
492    pub exclude_internal_backlinks: Option<bool>,
493    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
494    #[serde(skip_serializing_if = "Option::is_none")]
495    pub rank_scale: Option<String>,
496    /// User-defined task identifier (max 255 characters).
497    #[serde(skip_serializing_if = "Option::is_none")]
498    pub tag: Option<String>,
499}
500
501impl BacklinksApiDomainPagesPost {
502    /// Builds a request for the given target (domain or subdomain).
503    pub fn new(target: &str) -> BacklinksApiDomainPagesPost {
504        BacklinksApiDomainPagesPost {
505            target: target.to_string(),
506            ..Default::default()
507        }
508    }
509}
510
511/// Request for the Domain Pages Summary endpoint.
512#[derive(Debug, Default, Serialize, Deserialize, Clone)]
513pub struct BacklinksApiDomainPagesSummaryPost {
514    /// Target the metrics refer to (domain, subdomain, or webpage).
515    pub target: String,
516    /// Maximum number of returned elements.
517    #[serde(skip_serializing_if = "Option::is_none")]
518    pub limit: Option<i32>,
519    /// Offset into the result set for pagination.
520    #[serde(skip_serializing_if = "Option::is_none")]
521    pub offset: Option<i32>,
522    /// Maximum number of elements within internal arrays.
523    #[serde(skip_serializing_if = "Option::is_none")]
524    pub internal_list_limit: Option<i32>,
525    /// Which backlinks to include: `all`, `live`, or `lost`.
526    #[serde(skip_serializing_if = "Option::is_none")]
527    pub backlinks_status_type: Option<String>,
528    /// Result filtering conditions (max 8).
529    #[serde(skip_serializing_if = "Option::is_none")]
530    pub filters: Option<Vec<Value>>,
531    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
532    #[serde(skip_serializing_if = "Option::is_none")]
533    pub order_by: Option<Vec<String>>,
534    /// Filter applied to the underlying backlinks by any backlink field.
535    #[serde(skip_serializing_if = "Option::is_none")]
536    pub backlinks_filters: Option<Vec<Value>>,
537    /// Whether to include the target's subdomains in the search.
538    #[serde(skip_serializing_if = "Option::is_none")]
539    pub include_subdomains: Option<bool>,
540    /// Whether to include indirect (redirect/canonical) links.
541    #[serde(skip_serializing_if = "Option::is_none")]
542    pub include_indirect_links: Option<bool>,
543    /// Whether to exclude backlinks from the target's own subdomains.
544    #[serde(skip_serializing_if = "Option::is_none")]
545    pub exclude_internal_backlinks: Option<bool>,
546    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
547    #[serde(skip_serializing_if = "Option::is_none")]
548    pub rank_scale: Option<String>,
549    /// User-defined task identifier (max 255 characters).
550    #[serde(skip_serializing_if = "Option::is_none")]
551    pub tag: Option<String>,
552}
553
554impl BacklinksApiDomainPagesSummaryPost {
555    /// Builds a request for the given target (domain or subdomain).
556    pub fn new(target: &str) -> BacklinksApiDomainPagesSummaryPost {
557        BacklinksApiDomainPagesSummaryPost {
558            target: target.to_string(),
559            ..Default::default()
560        }
561    }
562}
563
564/// Request for the Referring Domains endpoint.
565#[derive(Debug, Default, Serialize, Deserialize, Clone)]
566pub struct BacklinksApiReferringDomainsPost {
567    /// Target the metrics refer to (domain, subdomain, or webpage).
568    pub target: String,
569    /// Maximum number of returned elements.
570    #[serde(skip_serializing_if = "Option::is_none")]
571    pub limit: Option<i32>,
572    /// Offset into the result set for pagination.
573    #[serde(skip_serializing_if = "Option::is_none")]
574    pub offset: Option<i32>,
575    /// Maximum number of elements within internal arrays.
576    #[serde(skip_serializing_if = "Option::is_none")]
577    pub internal_list_limit: Option<i32>,
578    /// Which backlinks to include: `all`, `live`, or `lost`.
579    #[serde(skip_serializing_if = "Option::is_none")]
580    pub backlinks_status_type: Option<String>,
581    /// Result filtering conditions (max 8).
582    #[serde(skip_serializing_if = "Option::is_none")]
583    pub filters: Option<Vec<Value>>,
584    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
585    #[serde(skip_serializing_if = "Option::is_none")]
586    pub order_by: Option<Vec<String>>,
587    /// Filter applied to the underlying backlinks by any backlink field.
588    #[serde(skip_serializing_if = "Option::is_none")]
589    pub backlinks_filters: Option<Vec<Value>>,
590    /// Whether to include the target's subdomains in the search.
591    #[serde(skip_serializing_if = "Option::is_none")]
592    pub include_subdomains: Option<bool>,
593    /// Whether to include indirect (redirect/canonical) links.
594    #[serde(skip_serializing_if = "Option::is_none")]
595    pub include_indirect_links: Option<bool>,
596    /// Whether to exclude backlinks from the target's own subdomains.
597    #[serde(skip_serializing_if = "Option::is_none")]
598    pub exclude_internal_backlinks: Option<bool>,
599    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
600    #[serde(skip_serializing_if = "Option::is_none")]
601    pub rank_scale: Option<String>,
602    /// User-defined task identifier (max 255 characters).
603    #[serde(skip_serializing_if = "Option::is_none")]
604    pub tag: Option<String>,
605}
606
607impl BacklinksApiReferringDomainsPost {
608    /// Builds a request for the given target.
609    pub fn new(target: &str) -> BacklinksApiReferringDomainsPost {
610        BacklinksApiReferringDomainsPost {
611            target: target.to_string(),
612            ..Default::default()
613        }
614    }
615}
616
617/// Request for the Referring Networks endpoint.
618#[derive(Debug, Default, Serialize, Deserialize, Clone)]
619pub struct BacklinksApiReferringNetworksPost {
620    /// Target the metrics refer to (domain, subdomain, or webpage).
621    pub target: String,
622    /// Type of network address to group by: `ip` or `subnet`.
623    #[serde(skip_serializing_if = "Option::is_none")]
624    pub network_address_type: Option<String>,
625    /// Maximum number of returned elements.
626    #[serde(skip_serializing_if = "Option::is_none")]
627    pub limit: Option<i32>,
628    /// Offset into the result set for pagination.
629    #[serde(skip_serializing_if = "Option::is_none")]
630    pub offset: Option<i32>,
631    /// Maximum number of elements within internal arrays.
632    #[serde(skip_serializing_if = "Option::is_none")]
633    pub internal_list_limit: Option<i32>,
634    /// Which backlinks to include: `all`, `live`, or `lost`.
635    #[serde(skip_serializing_if = "Option::is_none")]
636    pub backlinks_status_type: Option<String>,
637    /// Result filtering conditions (max 8).
638    #[serde(skip_serializing_if = "Option::is_none")]
639    pub filters: Option<Vec<Value>>,
640    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
641    #[serde(skip_serializing_if = "Option::is_none")]
642    pub order_by: Option<Vec<String>>,
643    /// Filter applied to the underlying backlinks by any backlink field.
644    #[serde(skip_serializing_if = "Option::is_none")]
645    pub backlinks_filters: Option<Vec<Value>>,
646    /// Whether to include the target's subdomains in the search.
647    #[serde(skip_serializing_if = "Option::is_none")]
648    pub include_subdomains: Option<bool>,
649    /// Whether to include indirect (redirect/canonical) links.
650    #[serde(skip_serializing_if = "Option::is_none")]
651    pub include_indirect_links: Option<bool>,
652    /// Whether to exclude backlinks from the target's own subdomains.
653    #[serde(skip_serializing_if = "Option::is_none")]
654    pub exclude_internal_backlinks: Option<bool>,
655    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
656    #[serde(skip_serializing_if = "Option::is_none")]
657    pub rank_scale: Option<String>,
658    /// User-defined task identifier (max 255 characters).
659    #[serde(skip_serializing_if = "Option::is_none")]
660    pub tag: Option<String>,
661}
662
663impl BacklinksApiReferringNetworksPost {
664    /// Builds a request for the given target.
665    pub fn new(target: &str) -> BacklinksApiReferringNetworksPost {
666        BacklinksApiReferringNetworksPost {
667            target: target.to_string(),
668            ..Default::default()
669        }
670    }
671}
672
673/// Request for the Competitors endpoint.
674#[derive(Debug, Default, Serialize, Deserialize, Clone)]
675pub struct BacklinksApiCompetitorsPost {
676    /// Target the metrics refer to (domain, subdomain, or webpage).
677    pub target: String,
678    /// Maximum number of returned elements.
679    #[serde(skip_serializing_if = "Option::is_none")]
680    pub limit: Option<i32>,
681    /// Offset into the result set for pagination.
682    #[serde(skip_serializing_if = "Option::is_none")]
683    pub offset: Option<i32>,
684    /// Result filtering conditions (max 8).
685    #[serde(skip_serializing_if = "Option::is_none")]
686    pub filters: Option<Vec<Value>>,
687    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
688    #[serde(skip_serializing_if = "Option::is_none")]
689    pub order_by: Option<Vec<String>>,
690    /// Whether to consider only the main domain.
691    #[serde(skip_serializing_if = "Option::is_none")]
692    pub main_domain: Option<bool>,
693    /// Whether to omit very large domains (e.g. google.com).
694    #[serde(skip_serializing_if = "Option::is_none")]
695    pub exclude_large_domains: Option<bool>,
696    /// Whether to exclude backlinks from the target's own subdomains.
697    #[serde(skip_serializing_if = "Option::is_none")]
698    pub exclude_internal_backlinks: Option<bool>,
699    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
700    #[serde(skip_serializing_if = "Option::is_none")]
701    pub rank_scale: Option<String>,
702    /// User-defined task identifier (max 255 characters).
703    #[serde(skip_serializing_if = "Option::is_none")]
704    pub tag: Option<String>,
705}
706
707impl BacklinksApiCompetitorsPost {
708    /// Builds a request for the given target.
709    pub fn new(target: &str) -> BacklinksApiCompetitorsPost {
710        BacklinksApiCompetitorsPost {
711            target: target.to_string(),
712            ..Default::default()
713        }
714    }
715}
716
717/// Request for the Domain Intersection endpoint.
718#[derive(Debug, Default, Serialize, Deserialize, Clone)]
719pub struct BacklinksApiDomainIntersectionPost {
720    /// Targets to analyze (domains, subdomains, or webpages).
721    pub targets: Value,
722    /// Targets to exclude from the results (max 10).
723    #[serde(skip_serializing_if = "Option::is_none")]
724    pub exclude_targets: Option<Vec<String>>,
725    /// Result filtering conditions (max 8).
726    #[serde(skip_serializing_if = "Option::is_none")]
727    pub filters: Option<Vec<Value>>,
728    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
729    #[serde(skip_serializing_if = "Option::is_none")]
730    pub order_by: Option<Vec<String>>,
731    /// Offset into the result set for pagination.
732    #[serde(skip_serializing_if = "Option::is_none")]
733    pub offset: Option<i32>,
734    /// Maximum number of returned elements.
735    #[serde(skip_serializing_if = "Option::is_none")]
736    pub limit: Option<i32>,
737    /// Maximum number of elements within internal arrays.
738    #[serde(skip_serializing_if = "Option::is_none")]
739    pub internal_list_limit: Option<i32>,
740    /// Which backlinks to include: `all`, `live`, or `lost`.
741    #[serde(skip_serializing_if = "Option::is_none")]
742    pub backlinks_status_type: Option<String>,
743    /// Filter applied to the underlying backlinks by any backlink field.
744    #[serde(skip_serializing_if = "Option::is_none")]
745    pub backlinks_filters: Option<Vec<Value>>,
746    /// Whether to include the target's subdomains in the search.
747    #[serde(skip_serializing_if = "Option::is_none")]
748    pub include_subdomains: Option<bool>,
749    /// Whether to include indirect (redirect/canonical) links.
750    #[serde(skip_serializing_if = "Option::is_none")]
751    pub include_indirect_links: Option<bool>,
752    /// Whether to exclude backlinks from the target's own subdomains.
753    #[serde(skip_serializing_if = "Option::is_none")]
754    pub exclude_internal_backlinks: Option<bool>,
755    /// Intersection mode: `all` or `partial`.
756    #[serde(skip_serializing_if = "Option::is_none")]
757    pub intersection_mode: Option<String>,
758    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
759    #[serde(skip_serializing_if = "Option::is_none")]
760    pub rank_scale: Option<String>,
761    /// User-defined task identifier (max 255 characters).
762    #[serde(skip_serializing_if = "Option::is_none")]
763    pub tag: Option<String>,
764}
765
766impl BacklinksApiDomainIntersectionPost {
767    /// Builds a request from a `targets` object keyed by id (e.g. `{"1": "domain.com"}`).
768    pub fn new(targets: Value) -> BacklinksApiDomainIntersectionPost {
769        BacklinksApiDomainIntersectionPost {
770            targets,
771            ..Default::default()
772        }
773    }
774}
775
776/// Request for the Page Intersection endpoint.
777#[derive(Debug, Default, Serialize, Deserialize, Clone)]
778pub struct BacklinksApiPageIntersectionPost {
779    /// Targets to analyze (domains, subdomains, or webpages).
780    pub targets: Value,
781    /// Targets to exclude from the results (max 10).
782    #[serde(skip_serializing_if = "Option::is_none")]
783    pub exclude_targets: Option<Vec<String>>,
784    /// Which backlinks to include: `all`, `live`, or `lost`.
785    #[serde(skip_serializing_if = "Option::is_none")]
786    pub backlinks_status_type: Option<String>,
787    /// Result filtering conditions (max 8).
788    #[serde(skip_serializing_if = "Option::is_none")]
789    pub filters: Option<Vec<Value>>,
790    /// Sorting rules, e.g. `["rank,desc"]` (max 3).
791    #[serde(skip_serializing_if = "Option::is_none")]
792    pub order_by: Option<Vec<String>>,
793    /// Offset into the result set for pagination.
794    #[serde(skip_serializing_if = "Option::is_none")]
795    pub offset: Option<i32>,
796    /// Maximum number of returned elements.
797    #[serde(skip_serializing_if = "Option::is_none")]
798    pub limit: Option<i32>,
799    /// Maximum number of elements within internal arrays.
800    #[serde(skip_serializing_if = "Option::is_none")]
801    pub internal_list_limit: Option<i32>,
802    /// Whether to include the target's subdomains in the search.
803    #[serde(skip_serializing_if = "Option::is_none")]
804    pub include_subdomains: Option<bool>,
805    /// Whether to include indirect (redirect/canonical) links.
806    #[serde(skip_serializing_if = "Option::is_none")]
807    pub include_indirect_links: Option<bool>,
808    /// Whether to exclude backlinks from the target's own subdomains.
809    #[serde(skip_serializing_if = "Option::is_none")]
810    pub exclude_internal_backlinks: Option<bool>,
811    /// Intersection mode: `all` or `partial`.
812    #[serde(skip_serializing_if = "Option::is_none")]
813    pub intersection_mode: Option<String>,
814    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
815    #[serde(skip_serializing_if = "Option::is_none")]
816    pub rank_scale: Option<String>,
817    /// User-defined task identifier (max 255 characters).
818    #[serde(skip_serializing_if = "Option::is_none")]
819    pub tag: Option<String>,
820}
821
822impl BacklinksApiPageIntersectionPost {
823    /// Builds a request from a `targets` object keyed by id (e.g. `{"1": "https://domain.com/"}`).
824    pub fn new(targets: Value) -> BacklinksApiPageIntersectionPost {
825        BacklinksApiPageIntersectionPost {
826            targets,
827            ..Default::default()
828        }
829    }
830}
831
832/// Request for the Timeseries Summary endpoint.
833#[derive(Debug, Default, Serialize, Deserialize, Clone)]
834pub struct BacklinksApiTimeseriesSummaryPost {
835    /// Target the metrics refer to (domain, subdomain, or webpage).
836    pub target: String,
837    /// Start date of the range (`yyyy-mm-dd`).
838    #[serde(skip_serializing_if = "Option::is_none")]
839    pub date_from: Option<String>,
840    /// End date of the range (`yyyy-mm-dd`).
841    #[serde(skip_serializing_if = "Option::is_none")]
842    pub date_to: Option<String>,
843    /// Grouping interval: `day`, `week`, `month`, or `year`.
844    #[serde(skip_serializing_if = "Option::is_none")]
845    pub group_range: Option<String>,
846    /// Whether to include the target's subdomains in the search.
847    #[serde(skip_serializing_if = "Option::is_none")]
848    pub include_subdomains: Option<bool>,
849    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
850    #[serde(skip_serializing_if = "Option::is_none")]
851    pub rank_scale: Option<String>,
852    /// User-defined task identifier (max 255 characters).
853    #[serde(skip_serializing_if = "Option::is_none")]
854    pub tag: Option<String>,
855}
856
857impl BacklinksApiTimeseriesSummaryPost {
858    /// Builds a request for the given target.
859    pub fn new(target: &str) -> BacklinksApiTimeseriesSummaryPost {
860        BacklinksApiTimeseriesSummaryPost {
861            target: target.to_string(),
862            ..Default::default()
863        }
864    }
865}
866
867/// Request for the Timeseries New & Lost Summary endpoint.
868#[derive(Debug, Default, Serialize, Deserialize, Clone)]
869pub struct BacklinksApiTimeseriesNewLostSummaryPost {
870    /// Target the metrics refer to (domain, subdomain, or webpage).
871    pub target: String,
872    /// Start date of the range (`yyyy-mm-dd`).
873    #[serde(skip_serializing_if = "Option::is_none")]
874    pub date_from: Option<String>,
875    /// End date of the range (`yyyy-mm-dd`).
876    #[serde(skip_serializing_if = "Option::is_none")]
877    pub date_to: Option<String>,
878    /// Grouping interval: `day`, `week`, `month`, or `year`.
879    #[serde(skip_serializing_if = "Option::is_none")]
880    pub group_range: Option<String>,
881    /// Whether to include the target's subdomains in the search.
882    #[serde(skip_serializing_if = "Option::is_none")]
883    pub include_subdomains: Option<bool>,
884    /// User-defined task identifier (max 255 characters).
885    #[serde(skip_serializing_if = "Option::is_none")]
886    pub tag: Option<String>,
887}
888
889impl BacklinksApiTimeseriesNewLostSummaryPost {
890    /// Builds a request for the given target.
891    pub fn new(target: &str) -> BacklinksApiTimeseriesNewLostSummaryPost {
892        BacklinksApiTimeseriesNewLostSummaryPost {
893            target: target.to_string(),
894            ..Default::default()
895        }
896    }
897}
898
899/// Request for the Bulk Ranks endpoint.
900#[derive(Debug, Default, Serialize, Deserialize, Clone)]
901pub struct BacklinksApiBulkRanksPost {
902    /// Targets to analyze (domains, subdomains, or webpages).
903    pub targets: Vec<String>,
904    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
905    #[serde(skip_serializing_if = "Option::is_none")]
906    pub rank_scale: Option<String>,
907    /// User-defined task identifier (max 255 characters).
908    #[serde(skip_serializing_if = "Option::is_none")]
909    pub tag: Option<String>,
910}
911
912impl BacklinksApiBulkRanksPost {
913    /// Builds a request for the given targets (up to 1000).
914    pub fn new(targets: Vec<String>) -> BacklinksApiBulkRanksPost {
915        BacklinksApiBulkRanksPost {
916            targets,
917            ..Default::default()
918        }
919    }
920}
921
922/// Request for the Bulk Backlinks endpoint.
923#[derive(Debug, Default, Serialize, Deserialize, Clone)]
924pub struct BacklinksApiBulkBacklinksPost {
925    /// Targets to analyze (domains, subdomains, or webpages).
926    pub targets: Vec<String>,
927    /// User-defined task identifier (max 255 characters).
928    #[serde(skip_serializing_if = "Option::is_none")]
929    pub tag: Option<String>,
930}
931
932impl BacklinksApiBulkBacklinksPost {
933    /// Builds a request for the given targets (up to 1000).
934    pub fn new(targets: Vec<String>) -> BacklinksApiBulkBacklinksPost {
935        BacklinksApiBulkBacklinksPost {
936            targets,
937            ..Default::default()
938        }
939    }
940}
941
942/// Request for the Bulk Spam Score endpoint.
943#[derive(Debug, Default, Serialize, Deserialize, Clone)]
944pub struct BacklinksApiBulkSpamScorePost {
945    /// Targets to analyze (domains, subdomains, or webpages).
946    pub targets: Vec<String>,
947    /// User-defined task identifier (max 255 characters).
948    #[serde(skip_serializing_if = "Option::is_none")]
949    pub tag: Option<String>,
950}
951
952impl BacklinksApiBulkSpamScorePost {
953    /// Builds a request for the given targets (up to 1000).
954    pub fn new(targets: Vec<String>) -> BacklinksApiBulkSpamScorePost {
955        BacklinksApiBulkSpamScorePost {
956            targets,
957            ..Default::default()
958        }
959    }
960}
961
962/// Request for the Bulk New & Lost Backlinks endpoint.
963#[derive(Debug, Default, Serialize, Deserialize, Clone)]
964pub struct BacklinksApiBulkNewLostBacklinksPost {
965    /// Targets to analyze (domains, subdomains, or webpages).
966    pub targets: Vec<String>,
967    /// Start date of the range (`yyyy-mm-dd`).
968    #[serde(skip_serializing_if = "Option::is_none")]
969    pub date_from: Option<String>,
970    /// User-defined task identifier (max 255 characters).
971    #[serde(skip_serializing_if = "Option::is_none")]
972    pub tag: Option<String>,
973}
974
975impl BacklinksApiBulkNewLostBacklinksPost {
976    /// Builds a request for the given targets (up to 1000).
977    pub fn new(targets: Vec<String>) -> BacklinksApiBulkNewLostBacklinksPost {
978        BacklinksApiBulkNewLostBacklinksPost {
979            targets,
980            ..Default::default()
981        }
982    }
983}
984
985/// Request for the Bulk New & Lost Referring Domains endpoint.
986#[derive(Debug, Default, Serialize, Deserialize, Clone)]
987pub struct BacklinksApiBulkNewLostReferringDomainsPost {
988    /// Targets to analyze (domains, subdomains, or webpages).
989    pub targets: Vec<String>,
990    /// Start date of the range (`yyyy-mm-dd`).
991    #[serde(skip_serializing_if = "Option::is_none")]
992    pub date_from: Option<String>,
993    /// User-defined task identifier (max 255 characters).
994    #[serde(skip_serializing_if = "Option::is_none")]
995    pub tag: Option<String>,
996}
997
998impl BacklinksApiBulkNewLostReferringDomainsPost {
999    /// Builds a request for the given targets (up to 1000).
1000    pub fn new(targets: Vec<String>) -> BacklinksApiBulkNewLostReferringDomainsPost {
1001        BacklinksApiBulkNewLostReferringDomainsPost {
1002            targets,
1003            ..Default::default()
1004        }
1005    }
1006}
1007
1008/// Request for the Bulk Referring Domains endpoint.
1009#[derive(Debug, Default, Serialize, Deserialize, Clone)]
1010pub struct BacklinksApiBulkReferringDomainsPost {
1011    /// Targets to analyze (domains, subdomains, or webpages).
1012    pub targets: Vec<String>,
1013    /// User-defined task identifier (max 255 characters).
1014    #[serde(skip_serializing_if = "Option::is_none")]
1015    pub tag: Option<String>,
1016}
1017
1018impl BacklinksApiBulkReferringDomainsPost {
1019    /// Builds a request for the given targets (up to 1000).
1020    pub fn new(targets: Vec<String>) -> BacklinksApiBulkReferringDomainsPost {
1021        BacklinksApiBulkReferringDomainsPost {
1022            targets,
1023            ..Default::default()
1024        }
1025    }
1026}
1027
1028/// Request for the Bulk Pages Summary endpoint.
1029#[derive(Debug, Default, Serialize, Deserialize, Clone)]
1030pub struct BacklinksApiBulkPagesSummaryPost {
1031    /// Targets to analyze (domains, subdomains, or webpages).
1032    pub targets: Vec<String>,
1033    /// Whether to include the target's subdomains in the search.
1034    #[serde(skip_serializing_if = "Option::is_none")]
1035    pub include_subdomains: Option<bool>,
1036    /// Scale for rank values: `one_hundred` (0-100) or `one_thousand` (0-1000).
1037    #[serde(skip_serializing_if = "Option::is_none")]
1038    pub rank_scale: Option<String>,
1039    /// User-defined task identifier (max 255 characters).
1040    #[serde(skip_serializing_if = "Option::is_none")]
1041    pub tag: Option<String>,
1042}
1043
1044impl BacklinksApiBulkPagesSummaryPost {
1045    /// Builds a request for the given targets (up to 1000, max 100 different domains).
1046    pub fn new(targets: Vec<String>) -> BacklinksApiBulkPagesSummaryPost {
1047        BacklinksApiBulkPagesSummaryPost {
1048            targets,
1049            ..Default::default()
1050        }
1051    }
1052}
1053
1054/// Request for the Errors endpoint.
1055#[derive(Debug, Default, Serialize, Deserialize, Clone)]
1056pub struct BacklinksApiErrorsPost {
1057    /// Maximum number of returned elements.
1058    #[serde(skip_serializing_if = "Option::is_none")]
1059    pub limit: Option<i32>,
1060    /// Offset into the result set for pagination.
1061    #[serde(skip_serializing_if = "Option::is_none")]
1062    pub offset: Option<i32>,
1063    /// Restrict results to errors of the given API function.
1064    #[serde(skip_serializing_if = "Option::is_none")]
1065    pub filtered_function: Option<String>,
1066    /// Start of the datetime range (UTC).
1067    #[serde(skip_serializing_if = "Option::is_none")]
1068    pub datetime_from: Option<String>,
1069    /// End of the datetime range (UTC).
1070    #[serde(skip_serializing_if = "Option::is_none")]
1071    pub datetime_to: Option<String>,
1072}
1073
1074impl BacklinksApiErrorsPost {
1075    /// Builds an errors request with all fields unset.
1076    pub fn new() -> BacklinksApiErrorsPost {
1077        BacklinksApiErrorsPost::default()
1078    }
1079}
1080
1081/// Request for the ID List endpoint.
1082#[derive(Debug, Default, Serialize, Deserialize, Clone)]
1083pub struct BacklinksApiIdListPost {
1084    /// Start of the datetime range (UTC).
1085    pub datetime_from: String,
1086    /// End of the datetime range (UTC).
1087    pub datetime_to: String,
1088    /// Maximum number of returned elements.
1089    #[serde(skip_serializing_if = "Option::is_none")]
1090    pub limit: Option<i32>,
1091    /// Offset into the result set for pagination.
1092    #[serde(skip_serializing_if = "Option::is_none")]
1093    pub offset: Option<i32>,
1094    /// Sort order by task execution time: `asc` or `desc`.
1095    #[serde(skip_serializing_if = "Option::is_none")]
1096    pub sort: Option<String>,
1097    /// Whether to include task metadata in the response.
1098    #[serde(skip_serializing_if = "Option::is_none")]
1099    pub include_metadata: Option<bool>,
1100}
1101
1102impl BacklinksApiIdListPost {
1103    /// Builds a request for the given UTC datetime range (`yyyy-mm-dd hh-mm-ss +00:00`).
1104    pub fn new(datetime_from: &str, datetime_to: &str) -> BacklinksApiIdListPost {
1105        BacklinksApiIdListPost {
1106            datetime_from: datetime_from.to_string(),
1107            datetime_to: datetime_to.to_string(),
1108            ..Default::default()
1109        }
1110    }
1111}