Skip to content

JohnnyWic/bybit-rust-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bybit-api

Crates.io Documentation License: MIT

A production-grade Rust SDK for Bybit V5 API.

Features

  • Async-first: Built on tokio for high-performance async I/O
  • Type-safe: Strongly typed request/response models with serde
  • Zero-panic: No unwrap() or expect() in library code
  • Fund safety: Parameter validation before sending orders/withdrawals
  • Complete API coverage: REST API + WebSocket support
  • Production ready: Timeout protection, error handling, reconnection

Installation

Add to your Cargo.toml:

[dependencies]
bybit-api = "0.1"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

Quick Start

REST API

use bybit_api::{BybitClient, Category};

#[tokio::main]
async fn main() -> bybit_api::Result<()> {
    // Create client for testnet
    let client = BybitClient::testnet("your_api_key", "your_api_secret")?;

    // Get tickers (public endpoint)
    let tickers = client.get_tickers(Category::Linear, Some("BTCUSDT")).await?;
    println!("BTC Price: {}", tickers.list[0].last_price);

    // Get wallet balance (private endpoint)
    let balance = client.get_wallet_balance("UNIFIED").await?;
    println!("Total Equity: {}", balance.list[0].total_equity);

    Ok(())
}

Place Order

use bybit_api::{BybitClient, Category, Side};
use bybit_api::trade::PlaceOrderParams;

#[tokio::main]
async fn main() -> bybit_api::Result<()> {
    let client = BybitClient::testnet("your_api_key", "your_api_secret")?;

    // Place a market order
    let params = PlaceOrderParams::market(
        Category::Linear,
        "BTCUSDT",
        Side::Buy,
        "0.001",
    );

    let result = client.place_order(params).await?;
    println!("Order ID: {}", result.order_id);

    Ok(())
}

WebSocket

use bybit_api::websocket::BybitWebSocket;
use bybit_api::TESTNET_WS_PUBLIC_LINEAR;

#[tokio::main]
async fn main() -> bybit_api::Result<()> {
    // Create public WebSocket client
    let mut ws = BybitWebSocket::public(TESTNET_WS_PUBLIC_LINEAR);
    ws.connect().await?;

    // Subscribe to orderbook
    ws.subscribe(vec!["orderbook.50.BTCUSDT".to_string()], |msg| {
        println!("Received: {:?}", msg.topic);
    }).await?;

    // Keep connection alive
    tokio::time::sleep(tokio::time::Duration::from_secs(30)).await;
    ws.disconnect().await?;

    Ok(())
}

Environments

// Mainnet (production)
let client = BybitClient::with_credentials("key", "secret")?;

// Testnet
let client = BybitClient::testnet("key", "secret")?;

// Demo trading
let client = BybitClient::demo("key", "secret")?;

API Coverage

Market Data

  • get_server_time() - Server time
  • get_instruments_info() - Instruments info
  • get_orderbook() - Orderbook depth
  • get_tickers() - 24hr ticker
  • get_klines() - Kline/candlestick data
  • get_funding_history() - Funding rate history
  • get_recent_trades() - Recent trades
  • get_open_interest() - Open interest

Trading

  • place_order() - Place order
  • amend_order() - Amend order
  • cancel_order() - Cancel order
  • cancel_all_orders() - Cancel all orders
  • place_batch_order() - Batch place orders
  • get_open_orders() - Get open orders
  • get_order_history() - Order history

Position

  • get_positions() - Get positions
  • set_leverage() - Set leverage
  • set_trading_stop() - Set TP/SL
  • get_closed_pnl() - Closed PnL
  • get_executions() - Execution list

Account

  • get_wallet_balance() - Wallet balance
  • get_account_info() - Account info
  • get_fee_rate() - Fee rates
  • get_transaction_log() - Transaction log

Asset

  • get_coin_info() - Coin info
  • internal_transfer() - Internal transfer
  • get_deposit_address() - Deposit address
  • withdraw() - Withdraw (with validation)

WebSocket Topics

  • Public: orderbook, trade, ticker, kline
  • Private: position, order, wallet, execution

Error Handling

use bybit_api::{BybitClient, BybitError};

match client.place_order(params).await {
    Ok(result) => println!("Order placed: {}", result.order_id),
    Err(BybitError::Api { code, msg }) => {
        println!("API error {}: {}", code, msg);
        if code == 10006 {
            println!("Rate limited, please slow down");
        }
    }
    Err(BybitError::Timeout) => println!("Request timed out"),
    Err(e) => println!("Other error: {}", e),
}

Examples

See the examples directory for more:

  • market_ticker.rs - Fetch market data
  • place_order.rs - Place orders
  • get_positions.rs - Get positions
  • get_wallet_balance.rs - Get wallet balance
  • websocket_orderbook.rs - Subscribe to orderbook
  • websocket_private.rs - Private channel subscriptions

Run examples:

export BYBIT_API_KEY=your_key
export BYBIT_API_SECRET=your_secret
cargo run --example market_ticker

License

MIT License - see LICENSE for details.

Links

About

rust api

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Languages