nautilus_bybit/http/
query.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16//! Builder types for Bybit REST query parameters and filters.
17
18use derive_builder::Builder;
19use serde::{Deserialize, Serialize};
20
21use crate::common::enums::{
22    BybitAccountType, BybitExecType, BybitInstrumentStatus, BybitKlineInterval, BybitMarginMode,
23    BybitOptionType, BybitOrderSide, BybitOrderStatus, BybitOrderType, BybitPositionIdx,
24    BybitPositionMode, BybitProductType, BybitTimeInForce, BybitTpSlMode, BybitTriggerDirection,
25    BybitTriggerType,
26};
27
28/// Query parameters for `GET /v5/market/instruments-info`.
29///
30/// # References
31/// - <https://bybit-exchange.github.io/docs/v5/market/instruments-info>
32#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
33#[serde(rename_all = "camelCase")]
34#[builder(default)]
35#[builder(setter(into))]
36pub struct BybitInstrumentsInfoParams {
37    pub category: BybitProductType,
38    #[builder(setter(strip_option))]
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub symbol: Option<String>,
41    #[builder(setter(strip_option))]
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub status: Option<BybitInstrumentStatus>,
44    #[builder(setter(strip_option))]
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub base_coin: Option<String>,
47    #[builder(setter(strip_option))]
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub limit: Option<u32>,
50    #[builder(setter(strip_option))]
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub cursor: Option<String>,
53}
54
55/// Query parameters for `GET /v5/market/tickers`.
56///
57/// # References
58/// - <https://bybit-exchange.github.io/docs/v5/market/tickers>
59#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
60#[serde(rename_all = "camelCase")]
61pub struct BybitTickersParams {
62    pub category: BybitProductType,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub symbol: Option<String>,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub base_coin: Option<String>,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub exp_date: Option<String>,
69}
70
71/// Query parameters for `GET /v5/market/kline`.
72///
73/// # References
74/// - <https://bybit-exchange.github.io/docs/v5/market/kline>
75#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
76#[serde(rename_all = "camelCase")]
77#[builder(setter(into, strip_option), default)]
78pub struct BybitKlinesParams {
79    pub category: BybitProductType,
80    pub symbol: String,
81    pub interval: BybitKlineInterval,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub start: Option<i64>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub end: Option<i64>,
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub limit: Option<u32>,
88}
89
90impl Default for BybitKlinesParams {
91    fn default() -> Self {
92        Self {
93            category: BybitProductType::Linear,
94            symbol: String::new(),
95            interval: BybitKlineInterval::Minute1,
96            start: None,
97            end: None,
98            limit: None,
99        }
100    }
101}
102
103/// Query parameters for `GET /v5/market/recent-trade`.
104///
105/// # References
106/// - <https://bybit-exchange.github.io/docs/v5/market/recent-trade>
107#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
108#[serde(rename_all = "camelCase")]
109#[builder(setter(into, strip_option), default)]
110pub struct BybitTradesParams {
111    pub category: BybitProductType,
112    pub symbol: String,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub base_coin: Option<String>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub option_type: Option<BybitOptionType>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub limit: Option<u32>,
119}
120
121impl Default for BybitTradesParams {
122    fn default() -> Self {
123        Self {
124            category: BybitProductType::Linear,
125            symbol: String::new(),
126            base_coin: None,
127            option_type: None,
128            limit: None,
129        }
130    }
131}
132
133/// Query parameters for `GET /v5/asset/coin/query-info`.
134///
135/// # References
136/// - <https://bybit-exchange.github.io/docs/v5/asset/coin/query-info>
137#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
138#[serde(rename_all = "camelCase")]
139pub struct BybitCoinInfoParams {
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub coin: Option<String>,
142}
143
144/// Query parameters for `GET /v5/account/fee-rate`.
145///
146/// # References
147/// - <https://bybit-exchange.github.io/docs/v5/account/fee-rate>
148#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
149#[serde(rename_all = "camelCase")]
150#[builder(default)]
151#[builder(setter(into))]
152pub struct BybitFeeRateParams {
153    pub category: BybitProductType,
154    #[builder(setter(strip_option))]
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub symbol: Option<String>,
157    #[builder(setter(strip_option))]
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub base_coin: Option<String>,
160}
161
162/// Query parameters for `GET /v5/account/wallet-balance`.
163///
164/// # References
165/// - <https://bybit-exchange.github.io/docs/v5/account/wallet-balance>
166#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
167#[serde(rename_all = "camelCase")]
168pub struct BybitWalletBalanceParams {
169    pub account_type: BybitAccountType,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub coin: Option<String>,
172}
173
174/// Query parameters for `GET /v5/position/list`.
175///
176/// # References
177/// - <https://bybit-exchange.github.io/docs/v5/position/position>
178#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
179#[serde(rename_all = "camelCase")]
180pub struct BybitPositionListParams {
181    pub category: BybitProductType,
182    #[serde(skip_serializing_if = "Option::is_none")]
183    pub symbol: Option<String>,
184    #[serde(skip_serializing_if = "Option::is_none")]
185    pub base_coin: Option<String>,
186    #[serde(skip_serializing_if = "Option::is_none")]
187    pub settle_coin: Option<String>,
188    #[serde(skip_serializing_if = "Option::is_none")]
189    pub limit: Option<u32>,
190    #[serde(skip_serializing_if = "Option::is_none")]
191    pub cursor: Option<String>,
192}
193
194/// Body parameters for `POST /v5/account/set-margin-mode`.
195///
196/// # References
197/// - <https://bybit-exchange.github.io/docs/v5/account/set-margin-mode>
198#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
199#[serde(rename_all = "camelCase")]
200pub struct BybitSetMarginModeParams {
201    pub set_margin_mode: BybitMarginMode,
202}
203
204/// Body parameters for `POST /v5/position/set-leverage`.
205///
206/// # References
207/// - <https://bybit-exchange.github.io/docs/v5/position/leverage>
208#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
209#[serde(rename_all = "camelCase")]
210pub struct BybitSetLeverageParams {
211    pub category: BybitProductType,
212    pub symbol: String,
213    pub buy_leverage: String,
214    pub sell_leverage: String,
215}
216
217/// Body parameters for `POST /v5/position/switch-mode`.
218///
219/// # References
220/// - <https://bybit-exchange.github.io/docs/v5/position/position-mode>
221#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
222#[serde(rename_all = "camelCase")]
223pub struct BybitSwitchModeParams {
224    pub category: BybitProductType,
225    #[serde(skip_serializing_if = "Option::is_none")]
226    pub symbol: Option<String>,
227    #[serde(skip_serializing_if = "Option::is_none")]
228    pub coin: Option<String>,
229    pub mode: BybitPositionMode,
230}
231
232/// Body parameters for `POST /v5/position/trading-stop`.
233///
234/// # References
235/// - <https://bybit-exchange.github.io/docs/v5/position/trading-stop>
236#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
237#[serde(rename_all = "camelCase")]
238pub struct BybitSetTradingStopParams {
239    pub category: BybitProductType,
240    pub symbol: String,
241    pub position_idx: BybitPositionIdx,
242    #[serde(skip_serializing_if = "Option::is_none")]
243    pub take_profit: Option<String>,
244    #[serde(skip_serializing_if = "Option::is_none")]
245    pub stop_loss: Option<String>,
246    #[serde(skip_serializing_if = "Option::is_none")]
247    pub trailing_stop: Option<String>,
248    #[serde(skip_serializing_if = "Option::is_none")]
249    pub tp_trigger_by: Option<BybitTriggerType>,
250    #[serde(skip_serializing_if = "Option::is_none")]
251    pub sl_trigger_by: Option<BybitTriggerType>,
252    #[serde(skip_serializing_if = "Option::is_none")]
253    pub active_price: Option<String>,
254    pub tpsl_mode: BybitTpSlMode,
255    #[serde(skip_serializing_if = "Option::is_none")]
256    pub tp_size: Option<String>,
257    #[serde(skip_serializing_if = "Option::is_none")]
258    pub sl_size: Option<String>,
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub tp_limit_price: Option<String>,
261    #[serde(skip_serializing_if = "Option::is_none")]
262    pub sl_limit_price: Option<String>,
263    #[serde(skip_serializing_if = "Option::is_none")]
264    pub tp_order_type: Option<BybitOrderType>,
265    #[serde(skip_serializing_if = "Option::is_none")]
266    pub sl_order_type: Option<BybitOrderType>,
267}
268
269/// Order entry payload for `POST /v5/order/create-batch`.
270///
271/// # References
272/// - <https://bybit-exchange.github.io/docs/v5/order/batch-place>
273#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
274#[serde(rename_all = "camelCase")]
275pub struct BybitBatchPlaceOrderEntry {
276    pub symbol: String,
277    #[serde(skip_serializing_if = "Option::is_none")]
278    pub is_leverage: Option<i32>,
279    pub side: BybitOrderSide,
280    pub order_type: BybitOrderType,
281    pub qty: String,
282    #[serde(skip_serializing_if = "Option::is_none")]
283    pub price: Option<String>,
284    #[serde(skip_serializing_if = "Option::is_none")]
285    pub market_unit: Option<String>,
286    #[serde(skip_serializing_if = "Option::is_none")]
287    pub trigger_direction: Option<BybitTriggerDirection>,
288    #[serde(skip_serializing_if = "Option::is_none")]
289    pub order_filter: Option<String>,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub trigger_price: Option<String>,
292    #[serde(skip_serializing_if = "Option::is_none")]
293    pub trigger_by: Option<BybitTriggerType>,
294    #[serde(skip_serializing_if = "Option::is_none")]
295    pub order_iv: Option<String>,
296    #[serde(skip_serializing_if = "Option::is_none")]
297    pub time_in_force: Option<BybitTimeInForce>,
298    #[serde(skip_serializing_if = "Option::is_none")]
299    pub position_idx: Option<i32>,
300    #[serde(skip_serializing_if = "Option::is_none")]
301    #[builder(setter(strip_option))]
302    pub order_link_id: Option<String>,
303    #[serde(skip_serializing_if = "Option::is_none")]
304    pub take_profit: Option<String>,
305    #[serde(skip_serializing_if = "Option::is_none")]
306    pub stop_loss: Option<String>,
307    #[serde(skip_serializing_if = "Option::is_none")]
308    pub tp_trigger_by: Option<BybitTriggerType>,
309    #[serde(skip_serializing_if = "Option::is_none")]
310    pub sl_trigger_by: Option<BybitTriggerType>,
311    #[serde(skip_serializing_if = "Option::is_none")]
312    pub reduce_only: Option<bool>,
313    #[serde(skip_serializing_if = "Option::is_none")]
314    pub close_on_trigger: Option<bool>,
315    #[serde(skip_serializing_if = "Option::is_none")]
316    pub smp_type: Option<String>,
317    #[serde(skip_serializing_if = "Option::is_none")]
318    pub mmp: Option<bool>,
319    #[serde(skip_serializing_if = "Option::is_none")]
320    pub tpsl_mode: Option<BybitTpSlMode>,
321    #[serde(skip_serializing_if = "Option::is_none")]
322    pub tp_limit_price: Option<String>,
323    #[serde(skip_serializing_if = "Option::is_none")]
324    pub sl_limit_price: Option<String>,
325    #[serde(skip_serializing_if = "Option::is_none")]
326    pub tp_order_type: Option<BybitOrderType>,
327    #[serde(skip_serializing_if = "Option::is_none")]
328    pub sl_order_type: Option<BybitOrderType>,
329}
330
331/// Body parameters for `POST /v5/order/create-batch`.
332///
333/// # References
334/// - <https://bybit-exchange.github.io/docs/v5/order/batch-place>
335#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
336#[serde(rename_all = "camelCase")]
337pub struct BybitBatchPlaceOrderParams {
338    pub category: BybitProductType,
339    pub request: Vec<BybitBatchPlaceOrderEntry>,
340}
341
342/// Body parameters for `POST /v5/order/create`.
343///
344/// # References
345/// - <https://bybit-exchange.github.io/docs/v5/order/create-order>
346#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
347#[serde(rename_all = "camelCase")]
348pub struct BybitPlaceOrderParams {
349    #[serde(flatten)]
350    pub order: BybitBatchPlaceOrderEntry,
351    pub category: BybitProductType,
352    #[serde(skip_serializing_if = "Option::is_none")]
353    pub slippage_tolerance_type: Option<String>,
354    #[serde(skip_serializing_if = "Option::is_none")]
355    pub slippage_tolerance: Option<String>,
356}
357
358/// Amend entry for `POST /v5/order/amend-batch`.
359///
360/// # References
361/// - <https://bybit-exchange.github.io/docs/v5/order/batch-amend>
362#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
363#[serde(rename_all = "camelCase")]
364pub struct BybitBatchAmendOrderEntry {
365    pub symbol: String,
366    #[serde(skip_serializing_if = "Option::is_none")]
367    #[builder(setter(strip_option))]
368    pub order_id: Option<String>,
369    #[serde(skip_serializing_if = "Option::is_none")]
370    #[builder(setter(strip_option))]
371    pub order_link_id: Option<String>,
372    #[serde(skip_serializing_if = "Option::is_none")]
373    pub order_iv: Option<String>,
374    #[serde(skip_serializing_if = "Option::is_none")]
375    pub trigger_price: Option<String>,
376    #[serde(skip_serializing_if = "Option::is_none")]
377    pub qty: Option<String>,
378    #[serde(skip_serializing_if = "Option::is_none")]
379    pub price: Option<String>,
380    #[serde(skip_serializing_if = "Option::is_none")]
381    pub tpsl_mode: Option<BybitTpSlMode>,
382    #[serde(skip_serializing_if = "Option::is_none")]
383    pub take_profit: Option<String>,
384    #[serde(skip_serializing_if = "Option::is_none")]
385    pub stop_loss: Option<String>,
386    #[serde(skip_serializing_if = "Option::is_none")]
387    pub tp_trigger_by: Option<BybitTriggerType>,
388    #[serde(skip_serializing_if = "Option::is_none")]
389    pub sl_trigger_by: Option<BybitTriggerType>,
390    #[serde(skip_serializing_if = "Option::is_none")]
391    pub trigger_by: Option<BybitTriggerType>,
392    #[serde(skip_serializing_if = "Option::is_none")]
393    pub tp_limit_price: Option<String>,
394    #[serde(skip_serializing_if = "Option::is_none")]
395    pub sl_limit_price: Option<String>,
396}
397
398/// Body parameters for `POST /v5/order/amend-batch`.
399///
400/// # References
401/// - <https://bybit-exchange.github.io/docs/v5/order/batch-amend>
402#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
403#[serde(rename_all = "camelCase")]
404pub struct BybitBatchAmendOrderParams {
405    pub category: BybitProductType,
406    pub request: Vec<BybitBatchAmendOrderEntry>,
407}
408
409/// Body parameters for `POST /v5/order/amend`.
410///
411/// # References
412/// - <https://bybit-exchange.github.io/docs/v5/order/amend-order>
413#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
414#[serde(rename_all = "camelCase")]
415pub struct BybitAmendOrderParams {
416    #[serde(flatten)]
417    pub order: BybitBatchAmendOrderEntry,
418    pub category: BybitProductType,
419}
420
421/// Cancel entry for `POST /v5/order/cancel-batch`.
422///
423/// # References
424/// - <https://bybit-exchange.github.io/docs/v5/order/cancel-batch>
425#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
426#[serde(rename_all = "camelCase")]
427pub struct BybitBatchCancelOrderEntry {
428    pub symbol: String,
429    #[serde(skip_serializing_if = "Option::is_none")]
430    #[builder(setter(strip_option))]
431    pub order_id: Option<String>,
432    #[serde(skip_serializing_if = "Option::is_none")]
433    #[builder(setter(strip_option))]
434    pub order_link_id: Option<String>,
435    #[serde(skip_serializing_if = "Option::is_none")]
436    pub order_filter: Option<String>,
437}
438
439/// Body parameters for `POST /v5/order/cancel-batch`.
440///
441/// # References
442/// - <https://bybit-exchange.github.io/docs/v5/order/cancel-batch>
443#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
444#[serde(rename_all = "camelCase")]
445pub struct BybitBatchCancelOrderParams {
446    pub category: BybitProductType,
447    pub request: Vec<BybitBatchCancelOrderEntry>,
448}
449
450/// Body parameters for `POST /v5/order/cancel`.
451///
452/// # References
453/// - <https://bybit-exchange.github.io/docs/v5/order/cancel-order>
454#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
455#[serde(rename_all = "camelCase")]
456pub struct BybitCancelOrderParams {
457    #[serde(flatten)]
458    pub order: BybitBatchCancelOrderEntry,
459    pub category: BybitProductType,
460}
461
462/// Body parameters for `POST /v5/order/cancel-all`.
463///
464/// # References
465/// - <https://bybit-exchange.github.io/docs/v5/order/cancel-all>
466#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
467#[serde(rename_all = "camelCase")]
468pub struct BybitCancelAllOrdersParams {
469    pub category: BybitProductType,
470    #[serde(skip_serializing_if = "Option::is_none")]
471    #[builder(setter(strip_option))]
472    pub symbol: Option<String>,
473    #[serde(skip_serializing_if = "Option::is_none")]
474    pub base_coin: Option<String>,
475    #[serde(skip_serializing_if = "Option::is_none")]
476    pub settle_coin: Option<String>,
477    #[serde(skip_serializing_if = "Option::is_none")]
478    pub order_filter: Option<String>,
479    #[serde(skip_serializing_if = "Option::is_none")]
480    pub stop_order_type: Option<String>,
481}
482
483/// Query parameters for `GET /v5/order/realtime`.
484///
485/// # References
486/// - <https://bybit-exchange.github.io/docs/v5/order/realtime>
487#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
488#[serde(rename_all = "camelCase")]
489pub struct BybitOpenOrdersParams {
490    pub category: BybitProductType,
491    #[serde(skip_serializing_if = "Option::is_none")]
492    #[builder(setter(strip_option))]
493    pub symbol: Option<String>,
494    #[serde(skip_serializing_if = "Option::is_none")]
495    pub base_coin: Option<String>,
496    #[serde(skip_serializing_if = "Option::is_none")]
497    pub settle_coin: Option<String>,
498    #[serde(skip_serializing_if = "Option::is_none")]
499    #[builder(setter(strip_option))]
500    pub order_id: Option<String>,
501    #[serde(skip_serializing_if = "Option::is_none")]
502    #[builder(setter(strip_option))]
503    pub order_link_id: Option<String>,
504}
505
506/// Query parameters for `GET /v5/order/history`.
507///
508/// # References
509/// - <https://bybit-exchange.github.io/docs/v5/order/order-list>
510#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
511#[serde(rename_all = "camelCase")]
512pub struct BybitOrderHistoryParams {
513    pub category: BybitProductType,
514    #[serde(skip_serializing_if = "Option::is_none")]
515    #[builder(setter(strip_option))]
516    pub symbol: Option<String>,
517    #[serde(skip_serializing_if = "Option::is_none")]
518    pub base_coin: Option<String>,
519    #[serde(skip_serializing_if = "Option::is_none")]
520    pub settle_coin: Option<String>,
521    #[serde(skip_serializing_if = "Option::is_none")]
522    pub order_id: Option<String>,
523    #[serde(skip_serializing_if = "Option::is_none")]
524    pub order_link_id: Option<String>,
525    #[serde(skip_serializing_if = "Option::is_none")]
526    pub open_only: Option<i32>,
527    #[serde(skip_serializing_if = "Option::is_none")]
528    pub order_filter: Option<String>,
529    #[serde(skip_serializing_if = "Option::is_none")]
530    pub order_status: Option<BybitOrderStatus>,
531    #[serde(skip_serializing_if = "Option::is_none")]
532    pub start_time: Option<i64>,
533    #[serde(skip_serializing_if = "Option::is_none")]
534    #[serde(rename = "endTime")]
535    pub end_time: Option<i64>,
536    #[serde(skip_serializing_if = "Option::is_none")]
537    #[builder(setter(strip_option))]
538    pub limit: Option<u32>,
539    #[serde(skip_serializing_if = "Option::is_none")]
540    pub cursor: Option<String>,
541}
542
543/// Query parameters for `GET /v5/execution/list`.
544///
545/// # References
546/// - <https://bybit-exchange.github.io/docs/v5/order/execution-list>
547#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
548#[serde(rename_all = "camelCase")]
549pub struct BybitTradeHistoryParams {
550    pub category: BybitProductType,
551    #[serde(skip_serializing_if = "Option::is_none")]
552    pub symbol: Option<String>,
553    #[serde(skip_serializing_if = "Option::is_none")]
554    pub base_coin: Option<String>,
555    #[serde(skip_serializing_if = "Option::is_none")]
556    pub order_id: Option<String>,
557    #[serde(skip_serializing_if = "Option::is_none")]
558    pub order_link_id: Option<String>,
559    #[serde(skip_serializing_if = "Option::is_none")]
560    pub start_time: Option<i64>,
561    #[serde(skip_serializing_if = "Option::is_none")]
562    #[serde(rename = "endTime")]
563    pub end_time: Option<i64>,
564    #[serde(skip_serializing_if = "Option::is_none")]
565    pub exec_type: Option<BybitExecType>,
566    #[serde(skip_serializing_if = "Option::is_none")]
567    pub limit: Option<u32>,
568    #[serde(skip_serializing_if = "Option::is_none")]
569    pub cursor: Option<String>,
570}
571
572/// Body parameters for `POST /v5/user/update-sub-api`.
573///
574/// # References
575/// - <https://bybit-exchange.github.io/docs/v5/user/modify-sub-apikey>
576#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
577#[serde(rename_all = "camelCase")]
578pub struct BybitUpdateSubApiParams {
579    #[serde(skip_serializing_if = "Option::is_none")]
580    pub api_key: Option<String>,
581    #[serde(skip_serializing_if = "Option::is_none")]
582    pub read_only: Option<i32>,
583    #[serde(skip_serializing_if = "Option::is_none")]
584    pub ips: Option<String>,
585}