Skip to main content

bybit_api/models/
market.rs

1//! Market data models.
2
3use rust_decimal::Decimal;
4use serde::{Deserialize, Serialize};
5
6/// Server time response.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct ServerTime {
10    /// Server time in seconds
11    pub time_second: String,
12    /// Server time in nanoseconds
13    pub time_nano: String,
14}
15
16/// Instruments info response.
17#[derive(Debug, Clone, Serialize, Deserialize)]
18#[serde(rename_all = "camelCase")]
19pub struct InstrumentsInfo {
20    /// Category
21    pub category: String,
22    /// List of instruments
23    pub list: Vec<InstrumentInfo>,
24    /// Next page cursor
25    #[serde(default)]
26    pub next_page_cursor: String,
27}
28
29/// Single instrument info.
30#[derive(Debug, Clone, Serialize, Deserialize)]
31#[serde(rename_all = "camelCase")]
32pub struct InstrumentInfo {
33    /// Symbol name
34    pub symbol: String,
35    /// Contract type
36    #[serde(default)]
37    pub contract_type: String,
38    /// Trading status
39    pub status: String,
40    /// Base coin
41    #[serde(default)]
42    pub base_coin: String,
43    /// Quote coin
44    #[serde(default)]
45    pub quote_coin: String,
46    /// Settle coin
47    #[serde(default)]
48    pub settle_coin: String,
49    /// Launch time
50    #[serde(default)]
51    pub launch_time: String,
52    /// Delivery time
53    #[serde(default)]
54    pub delivery_time: String,
55    /// Delivery fee rate
56    #[serde(default)]
57    pub delivery_fee_rate: String,
58    /// Price scale
59    #[serde(default)]
60    pub price_scale: String,
61    /// Leverage filter
62    #[serde(default)]
63    pub leverage_filter: Option<LeverageFilter>,
64    /// Price filter
65    #[serde(default)]
66    pub price_filter: Option<PriceFilter>,
67    /// Lot size filter
68    #[serde(default)]
69    pub lot_size_filter: Option<LotSizeFilter>,
70}
71
72/// Leverage filter.
73#[derive(Debug, Clone, Serialize, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct LeverageFilter {
76    /// Min leverage
77    pub min_leverage: String,
78    /// Max leverage
79    pub max_leverage: String,
80    /// Leverage step
81    pub leverage_step: String,
82}
83
84/// Price filter.
85#[derive(Debug, Clone, Serialize, Deserialize)]
86#[serde(rename_all = "camelCase")]
87pub struct PriceFilter {
88    /// Min price
89    pub min_price: String,
90    /// Max price
91    pub max_price: String,
92    /// Tick size
93    pub tick_size: String,
94}
95
96/// Lot size filter.
97#[derive(Debug, Clone, Serialize, Deserialize)]
98#[serde(rename_all = "camelCase")]
99pub struct LotSizeFilter {
100    /// Max order qty
101    #[serde(default)]
102    pub max_order_qty: String,
103    /// Min order qty
104    #[serde(default)]
105    pub min_order_qty: String,
106    /// Qty step
107    #[serde(default)]
108    pub qty_step: String,
109    /// Post only max order qty
110    #[serde(default)]
111    pub post_only_max_order_qty: String,
112    /// Base precision
113    #[serde(default)]
114    pub base_precision: String,
115    /// Quote precision
116    #[serde(default)]
117    pub quote_precision: String,
118    /// Min order amt
119    #[serde(default)]
120    pub min_order_amt: String,
121    /// Max order amt
122    #[serde(default)]
123    pub max_order_amt: String,
124}
125
126/// Orderbook response.
127#[derive(Debug, Clone, Serialize, Deserialize)]
128#[serde(rename_all = "camelCase")]
129pub struct Orderbook {
130    /// Symbol
131    pub s: String,
132    /// Bids [price, size]
133    pub b: Vec<[String; 2]>,
134    /// Asks [price, size]
135    pub a: Vec<[String; 2]>,
136    /// Timestamp
137    pub ts: u64,
138    /// Update ID
139    pub u: u64,
140}
141
142/// Tickers response.
143#[derive(Debug, Clone, Serialize, Deserialize)]
144#[serde(rename_all = "camelCase")]
145pub struct Tickers {
146    /// Category
147    pub category: String,
148    /// List of tickers
149    pub list: Vec<Ticker>,
150}
151
152/// Single ticker.
153#[derive(Debug, Clone, Serialize, Deserialize)]
154#[serde(rename_all = "camelCase")]
155pub struct Ticker {
156    /// Symbol
157    pub symbol: String,
158    /// Last price
159    #[serde(default)]
160    pub last_price: String,
161    /// Index price
162    #[serde(default)]
163    pub index_price: String,
164    /// Mark price
165    #[serde(default)]
166    pub mark_price: String,
167    /// Previous 24h price
168    #[serde(default)]
169    pub prev_price_24h: String,
170    /// Price change 24h percentage
171    #[serde(default)]
172    pub price_24h_pcnt: String,
173    /// High price 24h
174    #[serde(default)]
175    pub high_price_24h: String,
176    /// Low price 24h
177    #[serde(default)]
178    pub low_price_24h: String,
179    /// Previous 1h price
180    #[serde(default)]
181    pub prev_price_1h: String,
182    /// Open interest
183    #[serde(default)]
184    pub open_interest: String,
185    /// Open interest value
186    #[serde(default)]
187    pub open_interest_value: String,
188    /// Turnover 24h
189    #[serde(default)]
190    pub turnover_24h: String,
191    /// Volume 24h
192    #[serde(default)]
193    pub volume_24h: String,
194    /// Funding rate
195    #[serde(default)]
196    pub funding_rate: String,
197    /// Next funding time
198    #[serde(default)]
199    pub next_funding_time: String,
200    /// Bid price
201    #[serde(default)]
202    pub bid_1_price: String,
203    /// Bid size
204    #[serde(default)]
205    pub bid_1_size: String,
206    /// Ask price
207    #[serde(default)]
208    pub ask_1_price: String,
209    /// Ask size
210    #[serde(default)]
211    pub ask_1_size: String,
212}
213
214/// Kline response.
215#[derive(Debug, Clone, Serialize, Deserialize)]
216#[serde(rename_all = "camelCase")]
217pub struct Klines {
218    /// Category
219    pub category: String,
220    /// Symbol
221    pub symbol: String,
222    /// List of klines [timestamp, open, high, low, close, volume, turnover]
223    pub list: Vec<Vec<String>>,
224}
225
226/// Parsed kline data.
227#[derive(Debug, Clone)]
228pub struct Kline {
229    /// Start time in milliseconds
230    pub start_time: u64,
231    /// Open price
232    pub open: Decimal,
233    /// High price
234    pub high: Decimal,
235    /// Low price
236    pub low: Decimal,
237    /// Close price
238    pub close: Decimal,
239    /// Volume
240    pub volume: Decimal,
241    /// Turnover
242    pub turnover: Decimal,
243}
244
245/// Funding rate history response.
246#[derive(Debug, Clone, Serialize, Deserialize)]
247#[serde(rename_all = "camelCase")]
248pub struct FundingHistory {
249    /// Category
250    pub category: String,
251    /// List of funding records
252    pub list: Vec<FundingRecord>,
253}
254
255/// Single funding record.
256#[derive(Debug, Clone, Serialize, Deserialize)]
257#[serde(rename_all = "camelCase")]
258pub struct FundingRecord {
259    /// Symbol
260    pub symbol: String,
261    /// Funding rate
262    pub funding_rate: String,
263    /// Funding rate timestamp
264    pub funding_rate_timestamp: String,
265}
266
267/// Recent trades response.
268#[derive(Debug, Clone, Serialize, Deserialize)]
269#[serde(rename_all = "camelCase")]
270pub struct RecentTrades {
271    /// Category
272    pub category: String,
273    /// List of trades
274    pub list: Vec<Trade>,
275}
276
277/// Single trade.
278#[derive(Debug, Clone, Serialize, Deserialize)]
279#[serde(rename_all = "camelCase")]
280pub struct Trade {
281    /// Exec ID
282    pub exec_id: String,
283    /// Symbol
284    pub symbol: String,
285    /// Price
286    pub price: String,
287    /// Size
288    pub size: String,
289    /// Side
290    pub side: String,
291    /// Time
292    pub time: String,
293    /// Is block trade
294    #[serde(default)]
295    pub is_block_trade: bool,
296}
297
298/// Open interest response.
299#[derive(Debug, Clone, Serialize, Deserialize)]
300#[serde(rename_all = "camelCase")]
301pub struct OpenInterest {
302    /// Category
303    pub category: String,
304    /// Symbol
305    pub symbol: String,
306    /// List of open interest data
307    pub list: Vec<OpenInterestRecord>,
308    /// Next page cursor
309    #[serde(default)]
310    pub next_page_cursor: String,
311}
312
313/// Single open interest record.
314#[derive(Debug, Clone, Serialize, Deserialize)]
315#[serde(rename_all = "camelCase")]
316pub struct OpenInterestRecord {
317    /// Open interest
318    pub open_interest: String,
319    /// Timestamp
320    pub timestamp: String,
321}
322
323/// Risk limit response.
324#[derive(Debug, Clone, Serialize, Deserialize)]
325#[serde(rename_all = "camelCase")]
326pub struct RiskLimits {
327    /// Category
328    pub category: String,
329    /// List of risk limits
330    pub list: Vec<RiskLimit>,
331}
332
333/// Single risk limit.
334#[derive(Debug, Clone, Serialize, Deserialize)]
335#[serde(rename_all = "camelCase")]
336pub struct RiskLimit {
337    /// ID
338    pub id: i32,
339    /// Symbol
340    pub symbol: String,
341    /// Risk limit value
342    pub risk_limit_value: String,
343    /// Maintenance margin
344    pub maintenance_margin: String,
345    /// Initial margin
346    pub initial_margin: String,
347    /// Max leverage
348    pub max_leverage: String,
349}
350
351/// ADL alert record.
352#[derive(Debug, Clone, Serialize, Deserialize)]
353#[serde(rename_all = "camelCase")]
354pub struct AdlAlertRecord {
355    #[serde(skip_serializing_if = "Option::is_none")]
356    pub coin: Option<String>,
357    #[serde(skip_serializing_if = "Option::is_none")]
358    pub symbol: Option<String>,
359    #[serde(skip_serializing_if = "Option::is_none")]
360    pub balance: Option<String>,
361    #[serde(skip_serializing_if = "Option::is_none")]
362    pub max_balance: Option<String>,
363    #[serde(skip_serializing_if = "Option::is_none")]
364    pub insurance_pnl_ratio: Option<String>,
365    #[serde(skip_serializing_if = "Option::is_none")]
366    pub pnl_ratio: Option<String>,
367    #[serde(skip_serializing_if = "Option::is_none")]
368    pub adl_trigger_threshold: Option<String>,
369    #[serde(skip_serializing_if = "Option::is_none")]
370    pub adl_stop_ratio: Option<String>,
371}
372
373/// ADL alert result wrapper.
374#[derive(Debug, Clone, Serialize, Deserialize)]
375#[serde(rename_all = "camelCase")]
376pub struct AdlAlertResult {
377    #[serde(skip_serializing_if = "Option::is_none")]
378    pub updated_time: Option<String>,
379    #[serde(skip_serializing_if = "Option::is_none")]
380    pub list: Option<Vec<AdlAlertRecord>>,
381}
382
383/// Response payload for the get ADL alert endpoint.
384pub type GetAdlAlertResponse = AdlAlertResult;
385
386/// Delivery price record.
387#[derive(Debug, Clone, Serialize, Deserialize)]
388#[serde(rename_all = "camelCase")]
389pub struct DeliveryPriceRecord {
390    #[serde(skip_serializing_if = "Option::is_none")]
391    pub symbol: Option<String>,
392    #[serde(skip_serializing_if = "Option::is_none")]
393    pub delivery_price: Option<String>,
394    #[serde(skip_serializing_if = "Option::is_none")]
395    pub delivery_time: Option<String>,
396}
397
398/// Delivery price result wrapper.
399#[derive(Debug, Clone, Serialize, Deserialize)]
400#[serde(rename_all = "camelCase")]
401pub struct DeliveryPriceResult {
402    #[serde(skip_serializing_if = "Option::is_none")]
403    pub category: Option<String>,
404    #[serde(skip_serializing_if = "Option::is_none")]
405    pub next_page_cursor: Option<String>,
406    #[serde(skip_serializing_if = "Option::is_none")]
407    pub list: Option<Vec<DeliveryPriceRecord>>,
408}
409
410/// Response payload for the get delivery price endpoint.
411pub type GetDeliveryPriceResponse = DeliveryPriceResult;
412
413/// Fee rate level record.
414#[derive(Debug, Clone, Serialize, Deserialize)]
415#[serde(rename_all = "camelCase")]
416pub struct FeeRateLevel {
417    #[serde(skip_serializing_if = "Option::is_none")]
418    pub level: Option<String>,
419    #[serde(skip_serializing_if = "Option::is_none")]
420    pub taker_fee_rate: Option<String>,
421    #[serde(skip_serializing_if = "Option::is_none")]
422    pub maker_fee_rate: Option<String>,
423    #[serde(skip_serializing_if = "Option::is_none")]
424    pub maker_rebate: Option<String>,
425}
426
427/// Fee group record.
428#[derive(Debug, Clone, Serialize, Deserialize)]
429#[serde(rename_all = "camelCase")]
430pub struct FeeGroup {
431    #[serde(skip_serializing_if = "Option::is_none")]
432    pub group_name: Option<String>,
433    #[serde(skip_serializing_if = "Option::is_none")]
434    pub weighting_factor: Option<i32>,
435    #[serde(skip_serializing_if = "Option::is_none")]
436    pub symbols_numbers: Option<i32>,
437    #[serde(skip_serializing_if = "Option::is_none")]
438    pub symbols: Option<Vec<String>>,
439    /// List of taker/maker fee rates by level. Wired to the already-defined
440    /// `FeeRateLevel` inner type.
441    #[serde(skip_serializing_if = "Option::is_none")]
442    pub fee_rates: Option<Vec<FeeRateLevel>>,
443    #[serde(skip_serializing_if = "Option::is_none")]
444    pub update_time: Option<String>,
445}
446
447/// Fee group info result wrapper.
448#[derive(Debug, Clone, Serialize, Deserialize)]
449#[serde(rename_all = "camelCase")]
450pub struct FeeGroupInfoResult {
451    #[serde(skip_serializing_if = "Option::is_none")]
452    pub list: Option<Vec<FeeGroup>>,
453}
454
455/// Response payload for the get fee group info endpoint.
456pub type GetFeeGroupInfoResponse = FeeGroupInfoResult;
457
458/// Historical volatility record.
459#[derive(Debug, Clone, Serialize, Deserialize)]
460#[serde(rename_all = "camelCase")]
461pub struct VolatilityRecord {
462    #[serde(skip_serializing_if = "Option::is_none")]
463    pub period: Option<i32>,
464    #[serde(skip_serializing_if = "Option::is_none")]
465    pub value: Option<String>,
466    #[serde(skip_serializing_if = "Option::is_none")]
467    pub time: Option<String>,
468}
469
470/// Response payload for the get historical volatility endpoint.
471///
472/// Bybit V5 returns the inner result as a flat list of volatility records.
473/// `client.rs` already unwraps the envelope, so this is just the inner body.
474pub type GetHistoricalVolatilityResponse = Vec<VolatilityRecord>;
475
476/// Index component item.
477#[derive(Debug, Clone, Serialize, Deserialize)]
478#[serde(rename_all = "camelCase")]
479pub struct IndexComponentItem {
480    #[serde(skip_serializing_if = "Option::is_none")]
481    pub exchange: Option<String>,
482    #[serde(skip_serializing_if = "Option::is_none")]
483    pub symbol: Option<String>,
484    #[serde(skip_serializing_if = "Option::is_none")]
485    pub price: Option<String>,
486    #[serde(skip_serializing_if = "Option::is_none")]
487    pub weight: Option<String>,
488}
489
490/// Index components result wrapper.
491#[derive(Debug, Clone, Serialize, Deserialize)]
492#[serde(rename_all = "camelCase")]
493pub struct IndexComponentsResult {
494    #[serde(skip_serializing_if = "Option::is_none")]
495    pub index_name: Option<String>,
496    #[serde(skip_serializing_if = "Option::is_none")]
497    pub index_price: Option<String>,
498    #[serde(skip_serializing_if = "Option::is_none")]
499    pub timestamp: Option<String>,
500    #[serde(skip_serializing_if = "Option::is_none")]
501    pub components: Option<Vec<IndexComponentItem>>,
502}
503
504/// Response payload for the index components endpoint.
505pub type IndexComponentsResponse = IndexComponentsResult;
506
507/// Insurance pool record.
508#[derive(Debug, Clone, Serialize, Deserialize)]
509#[serde(rename_all = "camelCase")]
510pub struct InsurancePoolRecord {
511    #[serde(skip_serializing_if = "Option::is_none")]
512    pub coin: Option<String>,
513    #[serde(skip_serializing_if = "Option::is_none")]
514    pub balance: Option<String>,
515    #[serde(skip_serializing_if = "Option::is_none")]
516    pub value: Option<String>,
517}
518
519/// Insurance result wrapper.
520#[derive(Debug, Clone, Serialize, Deserialize)]
521#[serde(rename_all = "camelCase")]
522pub struct InsuranceResult {
523    #[serde(skip_serializing_if = "Option::is_none")]
524    pub updated_time: Option<String>,
525    #[serde(skip_serializing_if = "Option::is_none")]
526    pub list: Option<Vec<InsurancePoolRecord>>,
527}
528
529/// Response payload for the insurance endpoint.
530pub type InsuranceResponse = InsuranceResult;
531
532/// Long/short ratio record.
533#[derive(Debug, Clone, Serialize, Deserialize)]
534#[serde(rename_all = "camelCase")]
535pub struct LongShortRatioRecord {
536    #[serde(skip_serializing_if = "Option::is_none")]
537    pub symbol: Option<String>,
538    #[serde(skip_serializing_if = "Option::is_none")]
539    pub buy_ratio: Option<String>,
540    #[serde(skip_serializing_if = "Option::is_none")]
541    pub sell_ratio: Option<String>,
542    #[serde(skip_serializing_if = "Option::is_none")]
543    pub timestamp: Option<String>,
544}
545
546/// Long/short ratio result wrapper.
547#[derive(Debug, Clone, Serialize, Deserialize)]
548#[serde(rename_all = "camelCase")]
549pub struct LongShortRatioResult {
550    #[serde(skip_serializing_if = "Option::is_none")]
551    pub list: Option<Vec<LongShortRatioRecord>>,
552    #[serde(skip_serializing_if = "Option::is_none")]
553    pub next_page_cursor: Option<String>,
554}
555
556/// Response payload for the long/short ratio endpoint.
557pub type LongShortRatioResponse = LongShortRatioResult;
558
559/// New delivery price record.
560#[derive(Debug, Clone, Serialize, Deserialize)]
561#[serde(rename_all = "camelCase")]
562pub struct NewDeliveryPriceRecord {
563    #[serde(skip_serializing_if = "Option::is_none")]
564    pub symbol: Option<String>,
565    #[serde(skip_serializing_if = "Option::is_none")]
566    pub delivery_price: Option<String>,
567    #[serde(skip_serializing_if = "Option::is_none")]
568    pub delivery_time: Option<String>,
569}
570
571/// New delivery price result wrapper.
572#[derive(Debug, Clone, Serialize, Deserialize)]
573#[serde(rename_all = "camelCase")]
574pub struct NewDeliveryPriceResult {
575    #[serde(skip_serializing_if = "Option::is_none")]
576    pub category: Option<String>,
577    #[serde(skip_serializing_if = "Option::is_none")]
578    pub list: Option<Vec<NewDeliveryPriceRecord>>,
579}
580
581/// Response payload for the new delivery price endpoint.
582pub type NewDeliveryPriceResponse = NewDeliveryPriceResult;
583
584/// Order price limit result wrapper.
585#[derive(Debug, Clone, Serialize, Deserialize)]
586#[serde(rename_all = "camelCase")]
587pub struct OrderPriceLimitResult {
588    #[serde(skip_serializing_if = "Option::is_none")]
589    pub category: Option<String>,
590    #[serde(skip_serializing_if = "Option::is_none")]
591    pub symbol: Option<String>,
592    #[serde(skip_serializing_if = "Option::is_none")]
593    pub buy_lmt: Option<String>,
594    #[serde(skip_serializing_if = "Option::is_none")]
595    pub sell_lmt: Option<String>,
596    #[serde(skip_serializing_if = "Option::is_none")]
597    pub ts: Option<String>,
598}
599
600pub type OrderPriceLimitResponse = OrderPriceLimitResult;
601
602#[derive(Debug, Clone, Serialize, Deserialize)]
603#[serde(rename_all = "camelCase")]
604pub struct RpiOrderbookResult {
605    #[serde(skip_serializing_if = "Option::is_none")]
606    pub s: Option<String>,
607    #[serde(skip_serializing_if = "Option::is_none")]
608    pub b: Option<Vec<Vec<String>>>,
609    #[serde(skip_serializing_if = "Option::is_none")]
610    pub a: Option<Vec<Vec<String>>>,
611    #[serde(skip_serializing_if = "Option::is_none")]
612    pub ts: Option<i64>,
613    #[serde(skip_serializing_if = "Option::is_none")]
614    pub u: Option<i64>,
615    #[serde(skip_serializing_if = "Option::is_none")]
616    pub seq: Option<i64>,
617    #[serde(skip_serializing_if = "Option::is_none")]
618    pub cts: Option<i64>,
619}
620
621pub type RpiOrderbookResponse = RpiOrderbookResult;
622
623#[derive(Debug, Clone, Serialize, Deserialize)]
624#[serde(rename_all = "camelCase")]
625pub struct IndexComponent {
626    #[serde(skip_serializing_if = "Option::is_none")]
627    pub exchange: Option<String>,
628    #[serde(skip_serializing_if = "Option::is_none")]
629    pub spot_pair: Option<String>,
630    #[serde(skip_serializing_if = "Option::is_none")]
631    pub equivalent_price: Option<String>,
632    #[serde(skip_serializing_if = "Option::is_none")]
633    pub multiplier: Option<String>,
634    #[serde(skip_serializing_if = "Option::is_none")]
635    pub price: Option<String>,
636    #[serde(skip_serializing_if = "Option::is_none")]
637    pub weight: Option<String>,
638}
639
640pub type GetIndexPriceComponentsResponse = IndexComponentsResult;
641
642#[derive(Debug, Clone, Serialize, Deserialize)]
643#[serde(rename_all = "camelCase")]
644pub struct IndexKlineEntry {
645    pub item: Vec<String>,
646}
647
648#[derive(Debug, Clone, Serialize, Deserialize)]
649#[serde(rename_all = "camelCase")]
650pub struct IndexPriceKlineResult {
651    pub category: String,
652    pub symbol: String,
653    pub list: Vec<IndexKlineEntry>,
654}
655
656pub type IndexPriceKlineResponse = IndexPriceKlineResult;
657
658#[derive(Debug, Clone, Serialize, Deserialize)]
659#[serde(rename_all = "camelCase")]
660pub struct LotSizeFilterLinear {
661    pub max_order_qty: String,
662    pub min_order_qty: String,
663    pub qty_step: String,
664    pub post_only_max_order_qty: String,
665    pub max_mkt_order_qty: String,
666    pub min_notional_value: String,
667}
668
669#[derive(Debug, Clone, Serialize, Deserialize)]
670#[serde(rename_all = "camelCase")]
671pub struct LotSizeFilterSpot {
672    pub base_precision: String,
673    pub quote_precision: String,
674    pub min_order_amt: String,
675    pub max_order_amt: String,
676    pub max_limit_order_qty: String,
677    pub max_market_order_qty: String,
678    pub post_only_max_limit_order_size: String,
679}
680
681#[derive(Debug, Clone, Serialize, Deserialize)]
682#[serde(rename_all = "camelCase")]
683pub struct RiskParameters {
684    pub price_limit_ratio_x: String,
685    pub price_limit_ratio_y: String,
686}
687
688#[derive(Debug, Clone, Serialize, Deserialize)]
689#[serde(rename_all = "camelCase")]
690pub struct InstrumentLinearInverse {
691    pub symbol: String,
692    pub contract_type: String,
693    pub status: String,
694    pub base_coin: String,
695    pub quote_coin: String,
696    pub launch_time: String,
697    pub delivery_time: String,
698    pub delivery_fee_rate: String,
699    pub price_scale: String,
700    pub leverage_filter: serde_json::Value,
701    pub price_filter: serde_json::Value,
702    pub lot_size_filter: LotSizeFilterLinear,
703    pub unified_margin_trade: bool,
704    pub funding_interval: i32,
705    pub settle_coin: String,
706    pub copy_trading: String,
707    pub upper_funding_rate: String,
708    pub lower_funding_rate: String,
709    pub is_pre_listing: bool,
710    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
711    // spec did not provide a matching inner type at generation time. Replace
712    // with a typed struct in a follow-up PR after consulting the V5 docs.
713    #[serde(skip_serializing_if = "Option::is_none")]
714    pub pre_listing_info: Option<serde_json::Value>,
715    pub risk_parameters: RiskParameters,
716}
717
718#[derive(Debug, Clone, Serialize, Deserialize)]
719#[serde(rename_all = "camelCase")]
720pub struct InstrumentSpot {
721    pub symbol: String,
722    pub base_coin: String,
723    pub quote_coin: String,
724    pub status: String,
725    pub margin_trading: String,
726    pub st_tag: String,
727    pub lot_size_filter: LotSizeFilterSpot,
728    pub price_filter: serde_json::Value,
729    pub risk_parameters: RiskParameters,
730}
731
732#[derive(Debug, Clone, Serialize, Deserialize)]
733#[serde(rename_all = "camelCase")]
734pub struct InstrumentOption {
735    pub symbol: String,
736    pub options_type: String,
737    pub status: String,
738    pub base_coin: String,
739    pub quote_coin: String,
740    pub settle_coin: String,
741    pub launch_time: String,
742    pub delivery_time: String,
743    pub price_filter: serde_json::Value,
744    pub lot_size_filter: serde_json::Value,
745}
746
747#[derive(Debug, Clone, Serialize, Deserialize)]
748#[serde(rename_all = "camelCase")]
749pub struct InstrumentsInfoResult {
750    pub category: String,
751    pub next_page_cursor: String,
752    pub list: Vec<serde_json::Value>,
753}
754
755pub type InstrumentsInfoResponse = InstrumentsInfoResult;
756
757#[derive(Debug, Clone, Serialize, Deserialize)]
758#[serde(rename_all = "camelCase")]
759pub struct InsuranceRecord {
760    #[serde(skip_serializing_if = "Option::is_none")]
761    pub coin: Option<String>,
762    #[serde(skip_serializing_if = "Option::is_none")]
763    pub symbols: Option<String>,
764    #[serde(skip_serializing_if = "Option::is_none")]
765    pub balance: Option<String>,
766    #[serde(skip_serializing_if = "Option::is_none")]
767    pub value: Option<String>,
768}
769
770pub type GetInsurancePoolResponse = InsuranceResult;
771
772#[derive(Debug, Clone, Serialize, Deserialize)]
773#[serde(rename_all = "camelCase")]
774pub struct KlineEntry {
775    pub items: Vec<String>,
776}
777
778#[derive(Debug, Clone, Serialize, Deserialize)]
779#[serde(rename_all = "camelCase")]
780pub struct KlineResult {
781    pub category: String,
782    pub symbol: String,
783    pub list: Vec<KlineEntry>,
784}
785
786pub type KlineResponse = KlineResult;
787
788pub type GetLongShortRatioResponse = LongShortRatioResult;
789
790#[derive(Debug, Clone, Serialize, Deserialize)]
791#[serde(rename_all = "camelCase")]
792pub struct MarkKlineEntry {
793    #[serde(skip_serializing_if = "Option::is_none")]
794    pub items: Option<Vec<String>>,
795}
796
797#[derive(Debug, Clone, Serialize, Deserialize)]
798#[serde(rename_all = "camelCase")]
799pub struct MarkPriceKlineResult {
800    #[serde(skip_serializing_if = "Option::is_none")]
801    pub category: Option<String>,
802    #[serde(skip_serializing_if = "Option::is_none")]
803    pub symbol: Option<String>,
804    #[serde(skip_serializing_if = "Option::is_none")]
805    pub list: Option<Vec<MarkKlineEntry>>,
806}
807
808pub type MarkPriceKlineResponse = MarkPriceKlineResult;
809
810pub type GetNewDeliveryPriceResponse = NewDeliveryPriceResult;
811
812#[derive(Debug, Clone, Serialize, Deserialize)]
813#[serde(rename_all = "camelCase")]
814pub struct OpenInterestResult {
815    #[serde(skip_serializing_if = "Option::is_none")]
816    pub category: Option<String>,
817    #[serde(skip_serializing_if = "Option::is_none")]
818    pub symbol: Option<String>,
819    #[serde(skip_serializing_if = "Option::is_none")]
820    pub list: Option<Vec<OpenInterestRecord>>,
821    #[serde(skip_serializing_if = "Option::is_none")]
822    pub next_page_cursor: Option<String>,
823}
824
825pub type OpenInterestResponse = OpenInterestResult;
826
827pub type GetOrderPriceLimitResponse = OrderPriceLimitResult;
828
829#[derive(Debug, Clone, Serialize, Deserialize)]
830#[serde(rename_all = "camelCase")]
831pub struct OrderbookLevel {
832    #[serde(skip_serializing_if = "Option::is_none")]
833    pub items: Option<Vec<String>>,
834}
835
836#[derive(Debug, Clone, Serialize, Deserialize)]
837#[serde(rename_all = "camelCase")]
838pub struct OrderbookResult {
839    #[serde(skip_serializing_if = "Option::is_none")]
840    pub s: Option<String>,
841    #[serde(skip_serializing_if = "Option::is_none")]
842    pub b: Option<Vec<OrderbookLevel>>,
843    #[serde(skip_serializing_if = "Option::is_none")]
844    pub a: Option<Vec<OrderbookLevel>>,
845    #[serde(skip_serializing_if = "Option::is_none")]
846    pub ts: Option<i64>,
847    #[serde(skip_serializing_if = "Option::is_none")]
848    pub u: Option<i64>,
849    #[serde(skip_serializing_if = "Option::is_none")]
850    pub seq: Option<i64>,
851    #[serde(skip_serializing_if = "Option::is_none")]
852    pub cts: Option<i64>,
853}
854
855pub type OrderbookResponse = OrderbookResult;
856
857#[derive(Debug, Clone, Serialize, Deserialize)]
858#[serde(rename_all = "camelCase")]
859pub struct PremiumIndexKlineEntry {
860    #[serde(skip_serializing_if = "Option::is_none")]
861    pub items: Option<Vec<String>>,
862}
863
864#[derive(Debug, Clone, Serialize, Deserialize)]
865#[serde(rename_all = "camelCase")]
866pub struct PremiumIndexKlineResult {
867    #[serde(skip_serializing_if = "Option::is_none")]
868    pub category: Option<String>,
869    #[serde(skip_serializing_if = "Option::is_none")]
870    pub symbol: Option<String>,
871    #[serde(skip_serializing_if = "Option::is_none")]
872    pub list: Option<Vec<PremiumIndexKlineEntry>>,
873}
874
875pub type PremiumIndexKlineResponse = PremiumIndexKlineResult;
876
877#[derive(Debug, Clone, Serialize, Deserialize)]
878#[serde(rename_all = "camelCase")]
879pub struct TradeRecord {
880    #[serde(skip_serializing_if = "Option::is_none")]
881    pub exec_id: Option<String>,
882    #[serde(skip_serializing_if = "Option::is_none")]
883    pub symbol: Option<String>,
884    #[serde(skip_serializing_if = "Option::is_none")]
885    pub price: Option<String>,
886    #[serde(skip_serializing_if = "Option::is_none")]
887    pub size: Option<String>,
888    #[serde(skip_serializing_if = "Option::is_none")]
889    pub side: Option<String>,
890    #[serde(skip_serializing_if = "Option::is_none")]
891    pub time: Option<String>,
892    #[serde(skip_serializing_if = "Option::is_none")]
893    pub is_block_trade: Option<bool>,
894    #[serde(rename = "isRPITrade", skip_serializing_if = "Option::is_none")]
895    pub is_rpi_trade: Option<bool>,
896    #[serde(skip_serializing_if = "Option::is_none")]
897    pub seq: Option<String>,
898    #[serde(rename = "mP", skip_serializing_if = "Option::is_none")]
899    pub m_p: Option<String>,
900    #[serde(rename = "iP", skip_serializing_if = "Option::is_none")]
901    pub i_p: Option<String>,
902    #[serde(rename = "mIv", skip_serializing_if = "Option::is_none")]
903    pub m_iv: Option<String>,
904    #[serde(skip_serializing_if = "Option::is_none")]
905    pub iv: Option<String>,
906}
907
908#[derive(Debug, Clone, Serialize, Deserialize)]
909#[serde(rename_all = "camelCase")]
910pub struct RecentTradeResult {
911    #[serde(skip_serializing_if = "Option::is_none")]
912    pub category: Option<String>,
913    #[serde(skip_serializing_if = "Option::is_none")]
914    pub list: Option<Vec<TradeRecord>>,
915}
916
917pub type RecentTradeResponse = RecentTradeResult;
918
919#[derive(Debug, Clone, Serialize, Deserialize)]
920#[serde(rename_all = "camelCase")]
921pub struct RiskLimitTier {
922    #[serde(skip_serializing_if = "Option::is_none")]
923    pub id: Option<i32>,
924    #[serde(skip_serializing_if = "Option::is_none")]
925    pub symbol: Option<String>,
926    #[serde(skip_serializing_if = "Option::is_none")]
927    pub risk_limit_value: Option<String>,
928    #[serde(skip_serializing_if = "Option::is_none")]
929    pub maintenance_margin: Option<String>,
930    #[serde(skip_serializing_if = "Option::is_none")]
931    pub initial_margin: Option<String>,
932    #[serde(skip_serializing_if = "Option::is_none")]
933    pub is_lowest_risk: Option<i32>,
934    #[serde(skip_serializing_if = "Option::is_none")]
935    pub max_leverage: Option<String>,
936    #[serde(skip_serializing_if = "Option::is_none")]
937    pub mm_deduction: Option<String>,
938}
939
940#[derive(Debug, Clone, Serialize, Deserialize)]
941#[serde(rename_all = "camelCase")]
942pub struct RiskLimitResult {
943    #[serde(skip_serializing_if = "Option::is_none")]
944    pub category: Option<String>,
945    #[serde(skip_serializing_if = "Option::is_none")]
946    pub list: Option<Vec<RiskLimitTier>>,
947    #[serde(skip_serializing_if = "Option::is_none")]
948    pub next_page_cursor: Option<String>,
949}
950
951pub type RiskLimitResponse = RiskLimitResult;
952
953#[derive(Debug, Clone, Serialize, Deserialize)]
954#[serde(rename_all = "camelCase")]
955pub struct RpiOrderbookLevel {
956    #[serde(skip_serializing_if = "Option::is_none")]
957    pub items: Option<Vec<String>>,
958}
959
960pub type GetRpiOrderbookResponse = RpiOrderbookResult;
961
962#[derive(Debug, Clone, Serialize, Deserialize)]
963#[serde(rename_all = "camelCase")]
964pub struct TickerLinearInverse {
965    #[serde(skip_serializing_if = "Option::is_none")]
966    pub symbol: Option<String>,
967    #[serde(skip_serializing_if = "Option::is_none")]
968    pub last_price: Option<String>,
969    #[serde(skip_serializing_if = "Option::is_none")]
970    pub index_price: Option<String>,
971    #[serde(skip_serializing_if = "Option::is_none")]
972    pub mark_price: Option<String>,
973    #[serde(skip_serializing_if = "Option::is_none")]
974    pub prev_price_24h: Option<String>,
975    #[serde(skip_serializing_if = "Option::is_none")]
976    pub price_24h_pcnt: Option<String>,
977    #[serde(skip_serializing_if = "Option::is_none")]
978    pub high_price_24h: Option<String>,
979    #[serde(skip_serializing_if = "Option::is_none")]
980    pub low_price_24h: Option<String>,
981    #[serde(skip_serializing_if = "Option::is_none")]
982    pub prev_price_1h: Option<String>,
983    #[serde(skip_serializing_if = "Option::is_none")]
984    pub open_interest: Option<String>,
985    #[serde(skip_serializing_if = "Option::is_none")]
986    pub open_interest_value: Option<String>,
987    #[serde(skip_serializing_if = "Option::is_none")]
988    pub turnover_24h: Option<String>,
989    #[serde(skip_serializing_if = "Option::is_none")]
990    pub volume_24h: Option<String>,
991    #[serde(skip_serializing_if = "Option::is_none")]
992    pub funding_rate: Option<String>,
993    #[serde(skip_serializing_if = "Option::is_none")]
994    pub next_funding_time: Option<String>,
995    #[serde(skip_serializing_if = "Option::is_none")]
996    pub bid1_price: Option<String>,
997    #[serde(skip_serializing_if = "Option::is_none")]
998    pub bid1_size: Option<String>,
999    #[serde(skip_serializing_if = "Option::is_none")]
1000    pub ask1_price: Option<String>,
1001    #[serde(skip_serializing_if = "Option::is_none")]
1002    pub ask1_size: Option<String>,
1003    #[serde(skip_serializing_if = "Option::is_none")]
1004    pub funding_interval_hour: Option<String>,
1005    #[serde(skip_serializing_if = "Option::is_none")]
1006    pub funding_cap: Option<String>,
1007}
1008
1009#[derive(Debug, Clone, Serialize, Deserialize)]
1010#[serde(rename_all = "camelCase")]
1011pub struct TickerSpot {
1012    #[serde(skip_serializing_if = "Option::is_none")]
1013    pub symbol: Option<String>,
1014    #[serde(skip_serializing_if = "Option::is_none")]
1015    pub bid1_price: Option<String>,
1016    #[serde(skip_serializing_if = "Option::is_none")]
1017    pub bid1_size: Option<String>,
1018    #[serde(skip_serializing_if = "Option::is_none")]
1019    pub ask1_price: Option<String>,
1020    #[serde(skip_serializing_if = "Option::is_none")]
1021    pub ask1_size: Option<String>,
1022    #[serde(skip_serializing_if = "Option::is_none")]
1023    pub last_price: Option<String>,
1024    #[serde(skip_serializing_if = "Option::is_none")]
1025    pub prev_price_24h: Option<String>,
1026    #[serde(skip_serializing_if = "Option::is_none")]
1027    pub price_24h_pcnt: Option<String>,
1028    #[serde(skip_serializing_if = "Option::is_none")]
1029    pub high_price_24h: Option<String>,
1030    #[serde(skip_serializing_if = "Option::is_none")]
1031    pub low_price_24h: Option<String>,
1032    #[serde(skip_serializing_if = "Option::is_none")]
1033    pub turnover_24h: Option<String>,
1034    #[serde(skip_serializing_if = "Option::is_none")]
1035    pub volume_24h: Option<String>,
1036    #[serde(skip_serializing_if = "Option::is_none")]
1037    pub usd_index_price: Option<String>,
1038}
1039
1040#[derive(Debug, Clone, Serialize, Deserialize)]
1041#[serde(rename_all = "camelCase")]
1042pub struct TickerOption {
1043    #[serde(skip_serializing_if = "Option::is_none")]
1044    pub symbol: Option<String>,
1045    #[serde(skip_serializing_if = "Option::is_none")]
1046    pub bid1_price: Option<String>,
1047    #[serde(skip_serializing_if = "Option::is_none")]
1048    pub bid1_size: Option<String>,
1049    #[serde(skip_serializing_if = "Option::is_none")]
1050    pub bid1_iv: Option<String>,
1051    #[serde(skip_serializing_if = "Option::is_none")]
1052    pub ask1_price: Option<String>,
1053    #[serde(skip_serializing_if = "Option::is_none")]
1054    pub ask1_size: Option<String>,
1055    #[serde(skip_serializing_if = "Option::is_none")]
1056    pub ask1_iv: Option<String>,
1057    #[serde(skip_serializing_if = "Option::is_none")]
1058    pub last_price: Option<String>,
1059    #[serde(skip_serializing_if = "Option::is_none")]
1060    pub high_price_24h: Option<String>,
1061    #[serde(skip_serializing_if = "Option::is_none")]
1062    pub low_price_24h: Option<String>,
1063    #[serde(skip_serializing_if = "Option::is_none")]
1064    pub mark_price: Option<String>,
1065    #[serde(skip_serializing_if = "Option::is_none")]
1066    pub index_price: Option<String>,
1067    #[serde(skip_serializing_if = "Option::is_none")]
1068    pub mark_iv: Option<String>,
1069    #[serde(skip_serializing_if = "Option::is_none")]
1070    pub open_interest: Option<String>,
1071    #[serde(skip_serializing_if = "Option::is_none")]
1072    pub turnover_24h: Option<String>,
1073    #[serde(skip_serializing_if = "Option::is_none")]
1074    pub volume_24h: Option<String>,
1075    #[serde(skip_serializing_if = "Option::is_none")]
1076    pub delta: Option<String>,
1077    #[serde(skip_serializing_if = "Option::is_none")]
1078    pub gamma: Option<String>,
1079    #[serde(skip_serializing_if = "Option::is_none")]
1080    pub vega: Option<String>,
1081    #[serde(skip_serializing_if = "Option::is_none")]
1082    pub theta: Option<String>,
1083}
1084
1085#[derive(Debug, Clone, Serialize, Deserialize)]
1086#[serde(rename_all = "camelCase")]
1087pub struct TickersResult {
1088    #[serde(skip_serializing_if = "Option::is_none")]
1089    pub category: Option<String>,
1090    #[serde(skip_serializing_if = "Option::is_none")]
1091    pub list: Option<Vec<serde_json::Value>>,
1092}
1093
1094pub type TickersResponse = serde_json::Value;
1095
1096#[derive(Debug, Clone, Serialize, Deserialize)]
1097#[serde(rename_all = "camelCase")]
1098pub struct ServerTimeResult {
1099    pub time_second: String,
1100    pub time_nano: String,
1101}
1102
1103pub type ServerTimeResponse = ServerTimeResult;