Skip to main content

bybit_api/models/
user.rs

1use serde::{Deserialize, Serialize};
2
3use crate::models::common::RedactedString;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6#[serde(rename_all = "camelCase")]
7pub struct AffiliateSubItem {
8    #[serde(skip_serializing_if = "Option::is_none")]
9    pub sub_aff_id: Option<String>,
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub user_id: Option<String>,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub name: Option<String>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub email: Option<String>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub commissions_vol: Option<std::collections::HashMap<String, String>>,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub commissions_for_usdt: Option<String>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub became_aff_time: Option<String>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub start_date: Option<String>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub end_date: Option<String>,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
29#[serde(rename_all = "camelCase")]
30pub struct AffiliateSubListResult {
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub list: Option<Vec<AffiliateSubItem>>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub next_page_cursor: Option<String>,
35}
36
37pub type GetAffiliateSubListResponse = AffiliateSubListResult;
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
40#[serde(rename_all = "camelCase")]
41pub struct GatewayError {
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub ret_code: Option<i32>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub ret_msg: Option<String>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "camelCase")]
50pub struct AffiliateUserItem {
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub user_id: Option<String>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub register_time: Option<String>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub source: Option<String>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub remarks: Option<String>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub is_kyc: Option<bool>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub taker_vol_30_day: Option<String>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub maker_vol_30_day: Option<String>,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub trade_vol_30_day: Option<String>,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub tradfi_trade_vol_30_day: Option<String>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub commissions_30_day: Option<std::collections::HashMap<String, String>>,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub deposit_amount_30_day: Option<String>,
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub deposit_amount_365_day: Option<String>,
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub taker_vol_365_day: Option<String>,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub maker_vol_365_day: Option<String>,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub trade_vol_365_day: Option<String>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub tradfi_trade_vol_365_day: Option<String>,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub commissions_365_day: Option<std::collections::HashMap<String, String>>,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub taker_vol: Option<String>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub maker_vol: Option<String>,
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub trade_vol: Option<String>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub tradfi_trade_vol: Option<String>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub commissions_vol: Option<std::collections::HashMap<String, String>>,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub start_date: Option<String>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub end_date: Option<String>,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
102#[serde(rename_all = "camelCase")]
103pub struct AffiliateUserListResult {
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub list: Option<Vec<AffiliateUserItem>>,
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub next_page_cursor: Option<String>,
108}
109
110pub type GetAffiliateUserListResponse = AffiliateUserListResult;
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
113#[serde(rename_all = "camelCase")]
114pub struct AffiliateUserInfoResult {
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub uid: Option<String>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub vip_level: Option<String>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub taker_vol_30_day: Option<String>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub maker_vol_30_day: Option<String>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub trade_vol_30_day: Option<String>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub deposit_amount_30_day: Option<String>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub taker_vol_365_day: Option<String>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub maker_vol_365_day: Option<String>,
131    #[serde(skip_serializing_if = "Option::is_none")]
132    pub trade_vol_365_day: Option<String>,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub deposit_amount_365_day: Option<String>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub total_wallet_balance: Option<String>,
137    #[serde(rename = "KycLevel", skip_serializing_if = "Option::is_none")]
138    pub kyc_level: Option<i32>,
139    #[serde(skip_serializing_if = "Option::is_none")]
140    pub commissions_30_day: Option<std::collections::HashMap<String, String>>,
141    #[serde(skip_serializing_if = "Option::is_none")]
142    pub commissions_365_day: Option<std::collections::HashMap<String, String>>,
143    #[serde(skip_serializing_if = "Option::is_none")]
144    pub deposit_update_time: Option<String>,
145    #[serde(skip_serializing_if = "Option::is_none")]
146    pub vol_update_time: Option<String>,
147}
148
149pub type GetAffiliateUserInfoResponse = AffiliateUserInfoResult;
150
151pub type GetAffiliateCustomOpenInfoV5Response = AffiliateCustomOpenInfoResult;
152
153#[derive(Debug, Clone, Serialize, Deserialize)]
154#[serde(rename_all = "camelCase")]
155pub struct AffiliateCustomOpenInfoResult {
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub uid: Option<String>,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub vip_level: Option<String>,
160    #[serde(skip_serializing_if = "Option::is_none")]
161    pub taker_vol_30_day: Option<String>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub maker_vol_30_day: Option<String>,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    pub trade_vol_30_day: Option<String>,
166    #[serde(skip_serializing_if = "Option::is_none")]
167    pub deposit_amount_30_day: Option<String>,
168    #[serde(skip_serializing_if = "Option::is_none")]
169    pub taker_vol_365_day: Option<String>,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub maker_vol_365_day: Option<String>,
172    #[serde(skip_serializing_if = "Option::is_none")]
173    pub trade_vol_365_day: Option<String>,
174    #[serde(skip_serializing_if = "Option::is_none")]
175    pub deposit_amount_365_day: Option<String>,
176    #[serde(skip_serializing_if = "Option::is_none")]
177    pub total_wallet_balance: Option<String>,
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub deposit_update_time: Option<String>,
180    #[serde(skip_serializing_if = "Option::is_none")]
181    pub vol_update_time: Option<String>,
182    #[serde(rename = "KycLevel", skip_serializing_if = "Option::is_none")]
183    pub kyc_level: Option<i32>,
184    #[serde(skip_serializing_if = "Option::is_none")]
185    pub tradfi_trade_vol_30_day: Option<String>,
186    #[serde(skip_serializing_if = "Option::is_none")]
187    pub tradfi_trade_vol_365_day: Option<String>,
188    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
189    // spec did not provide a matching inner type at generation time. Replace
190    // with a typed struct in a follow-up PR after consulting the V5 docs.
191    #[serde(skip_serializing_if = "Option::is_none")]
192    pub commissions_30_day: Option<serde_json::Value>,
193    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
194    // spec did not provide a matching inner type at generation time. Replace
195    // with a typed struct in a follow-up PR after consulting the V5 docs.
196    #[serde(skip_serializing_if = "Option::is_none")]
197    pub commissions_365_day: Option<serde_json::Value>,
198    #[serde(skip_serializing_if = "Option::is_none")]
199    pub pay_send_amount_30_day: Option<String>,
200    #[serde(skip_serializing_if = "Option::is_none")]
201    pub pay_ftt: Option<String>,
202    #[serde(skip_serializing_if = "Option::is_none")]
203    pub card_ftt: Option<String>,
204}
205
206pub type ErrorResponse = serde_json::Value;
207
208#[derive(Debug, Clone, Serialize, Deserialize)]
209#[serde(rename_all = "camelCase")]
210pub struct CreateSubApiKeyParams {
211    pub subuid: i64,
212    pub read_only: i32,
213    #[serde(skip_serializing_if = "Option::is_none")]
214    pub ips: Option<String>,
215    pub permissions: serde_json::Value,
216    #[serde(skip_serializing_if = "Option::is_none")]
217    pub note: Option<String>,
218}
219
220pub type CreateSubApiKeyResponse = serde_json::Value;
221
222#[derive(Debug, Clone, Serialize, Deserialize)]
223#[serde(rename_all = "camelCase")]
224pub struct CreateSubMemberParams {
225    pub username: String,
226    #[serde(skip_serializing_if = "Option::is_none")]
227    pub password: Option<RedactedString>,
228    pub member_type: i32,
229    #[serde(skip_serializing_if = "Option::is_none")]
230    pub switch: Option<i32>,
231    #[serde(skip_serializing_if = "Option::is_none")]
232    pub is_uta: Option<bool>,
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub note: Option<String>,
235}
236
237pub type CreateSubMemberResponse = serde_json::Value;
238
239#[derive(Debug, Clone, Serialize, Deserialize)]
240#[serde(rename_all = "camelCase")]
241pub struct DeleteApiKeyParams {
242    #[serde(skip_serializing_if = "Option::is_none")]
243    pub apikey: Option<String>,
244}
245
246pub type DeleteApiKeyResponse = serde_json::Value;
247
248#[derive(Debug, Clone, Serialize, Deserialize)]
249#[serde(rename_all = "camelCase")]
250pub struct DeleteSubApiKeyParams {
251    pub subuid: i64,
252    #[serde(skip_serializing_if = "Option::is_none")]
253    pub apikey: Option<String>,
254}
255
256pub type DeleteSubApiKeyResponse = serde_json::Value;
257
258#[derive(Debug, Clone, Serialize, Deserialize)]
259#[serde(rename_all = "camelCase")]
260pub struct DeleteSubMemberV5Params {
261    pub subuid: i64,
262}
263
264pub type DeleteSubMemberV5Response = serde_json::Value;
265
266#[derive(Debug, Clone, Serialize, Deserialize)]
267#[serde(rename_all = "camelCase")]
268pub struct FrozenSubMemberParams {
269    pub subuid: i64,
270    pub frozen: i32,
271}
272
273pub type FrozenSubMemberResponse = serde_json::Value;
274
275pub type ListSubApiKeysV5Response = serde_json::Value;
276
277pub type QueryApiKeyResponse = serde_json::Value;
278
279pub type QueryEscrowSubMembersV5Response = serde_json::Value;
280
281pub type QueryReferralsResponse = serde_json::Value;
282
283#[derive(Debug, Clone, Serialize, Deserialize)]
284#[serde(rename_all = "camelCase")]
285pub struct ReferralRecord {
286    #[serde(skip_serializing_if = "Option::is_none")]
287    pub id: Option<i64>,
288    #[serde(skip_serializing_if = "Option::is_none")]
289    pub invitee_uid: Option<i64>,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub status: Option<i32>,
292    #[serde(skip_serializing_if = "Option::is_none")]
293    pub created_at: Option<i64>,
294    #[serde(skip_serializing_if = "Option::is_none")]
295    pub updated_at: Option<i64>,
296}
297
298pub type QuerySubMembersV5Response = serde_json::Value;
299
300pub type QuerySubMembersResponse = serde_json::Value;
301
302#[derive(Debug, Clone, Serialize, Deserialize)]
303#[serde(rename_all = "camelCase")]
304pub struct SignAgreementParams {
305    pub category: i32,
306    pub agree: bool,
307}
308
309pub type SignAgreementResponse = serde_json::Value;
310
311pub type UpdateAPIKeyResponse = serde_json::Value;
312
313pub type UpdateSubAPIKeyResponse = serde_json::Value;
314
315#[derive(Debug, Clone, Serialize, Deserialize)]
316#[serde(rename_all = "camelCase")]
317pub struct UpdateApiKeyParams {
318    #[serde(skip_serializing_if = "Option::is_none")]
319    pub read_only: Option<i32>,
320    #[serde(skip_serializing_if = "Option::is_none")]
321    pub ips: Option<String>,
322    #[serde(skip_serializing_if = "Option::is_none")]
323    pub permissions: Option<ApiKeyPermissions>,
324}
325
326#[derive(Debug, Clone, Serialize, Deserialize)]
327#[serde(rename_all = "camelCase")]
328pub struct UpdateApiKeyResponse {
329    #[serde(default)]
330    pub id: String,
331    #[serde(default)]
332    pub note: String,
333    #[serde(default)]
334    pub api_key: String,
335    #[serde(default)]
336    pub read_only: i32,
337    /// API secret. Wrapped in [`RedactedString`] so it never appears in
338    /// `Debug` / log output.
339    #[serde(default)]
340    pub secret: RedactedString,
341    #[serde(skip_serializing_if = "Option::is_none")]
342    pub permissions: Option<ApiKeyPermissions>,
343    #[serde(default)]
344    pub ips: Vec<String>,
345}
346
347#[derive(Debug, Clone, Serialize, Deserialize)]
348#[serde(rename_all = "camelCase")]
349pub struct UpdateSubApiKeyParams {
350    pub subuid: i64,
351    #[serde(skip_serializing_if = "Option::is_none")]
352    pub apikey: Option<String>,
353    pub read_only: i32,
354    #[serde(skip_serializing_if = "Option::is_none")]
355    pub ips: Option<String>,
356    #[serde(skip_serializing_if = "Option::is_none")]
357    pub permissions: Option<ApiKeyPermissions>,
358    #[serde(skip_serializing_if = "Option::is_none")]
359    pub note: Option<String>,
360}
361
362#[derive(Debug, Clone, Serialize, Deserialize)]
363#[serde(rename_all = "camelCase")]
364pub struct UpdateSubApiKeyResponse {
365    #[serde(default)]
366    pub id: String,
367    #[serde(default)]
368    pub note: String,
369    #[serde(default)]
370    pub api_key: String,
371    #[serde(default)]
372    pub read_only: i32,
373    /// API secret. Wrapped in [`RedactedString`] so it never appears in
374    /// `Debug` / log output.
375    #[serde(default)]
376    pub secret: RedactedString,
377    #[serde(skip_serializing_if = "Option::is_none")]
378    pub permissions: Option<ApiKeyPermissions>,
379    #[serde(default)]
380    pub ips: Vec<String>,
381}
382
383#[derive(Debug, Clone, Serialize, Deserialize)]
384pub struct ApiKeyPermissions {
385    #[serde(rename = "ContractTrade", skip_serializing_if = "Option::is_none")]
386    pub contract_trade: Option<Vec<String>>,
387    #[serde(rename = "Spot", skip_serializing_if = "Option::is_none")]
388    pub spot: Option<Vec<String>>,
389    #[serde(rename = "Wallet", skip_serializing_if = "Option::is_none")]
390    pub wallet: Option<Vec<String>>,
391    #[serde(rename = "Options", skip_serializing_if = "Option::is_none")]
392    pub options: Option<Vec<String>>,
393    #[serde(rename = "Derivatives", skip_serializing_if = "Option::is_none")]
394    pub derivatives: Option<Vec<String>>,
395    #[serde(rename = "CopyTrading", skip_serializing_if = "Option::is_none")]
396    pub copy_trading: Option<Vec<String>>,
397    #[serde(rename = "BlockTrade", skip_serializing_if = "Option::is_none")]
398    pub block_trade: Option<Vec<String>>,
399    #[serde(rename = "Exchange", skip_serializing_if = "Option::is_none")]
400    pub exchange: Option<Vec<String>>,
401    #[serde(rename = "NFT", skip_serializing_if = "Option::is_none")]
402    pub nft: Option<Vec<String>>,
403    #[serde(rename = "Affiliate", skip_serializing_if = "Option::is_none")]
404    pub affiliate: Option<Vec<String>>,
405}