{"id":13408721,"url":"https://github.com/wisespace-io/binance-rs","last_synced_at":"2025-05-14T19:10:02.927Z","repository":{"id":26625280,"uuid":"108446035","full_name":"wisespace-io/binance-rs","owner":"wisespace-io","description":"Rust Library for the Binance API","archived":false,"fork":false,"pushed_at":"2024-07-13T21:13:31.000Z","size":2972,"stargazers_count":745,"open_issues_count":46,"forks_count":314,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-04-13T15:07:49.701Z","etag":null,"topics":["binance","binance-api","binance-exchange","binance-futures","cryptocurrency","cryptocurrency-exchanges","rust","trading"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wisespace-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-10-26T17:47:52.000Z","updated_at":"2025-04-11T06:32:28.000Z","dependencies_parsed_at":"2024-10-26T04:07:26.155Z","dependency_job_id":"f37077ed-ba48-4ab3-aef8-b96c9b3f113b","html_url":"https://github.com/wisespace-io/binance-rs","commit_stats":{"total_commits":348,"total_committers":59,"mean_commits":5.898305084745763,"dds":0.7413793103448276,"last_synced_commit":"fd227c80e5992dbc8182afa951f112806ed4e5f7"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisespace-io%2Fbinance-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisespace-io%2Fbinance-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisespace-io%2Fbinance-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wisespace-io%2Fbinance-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wisespace-io","download_url":"https://codeload.github.com/wisespace-io/binance-rs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254209859,"owners_count":22032897,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["binance","binance-api","binance-exchange","binance-futures","cryptocurrency","cryptocurrency-exchanges","rust","trading"],"created_at":"2024-07-30T20:00:54.801Z","updated_at":"2025-05-14T19:10:01.175Z","avatar_url":"https://github.com/wisespace-io.png","language":"Rust","funding_links":[],"categories":["Rust","🧑🏻‍💻 Developer"],"sub_categories":["Libraries \u0026 Frameworks"],"readme":"# binance-rs\n\nUnofficial Rust Library for the [Binance API](https://github.com/binance/binance-spot-api-docs) and [Binance Futures API (Under development with upcoming breaking changes)](https://binance-docs.github.io/apidocs/futures/en/#general-info)\n\n[![Crates.io](https://img.shields.io/crates/v/binance.svg)](https://crates.io/crates/binance)\n[![Build Status](https://travis-ci.org/wisespace-io/binance-rs.png?branch=master)](https://travis-ci.org/wisespace-io/binance-rs)\n[![CI](https://github.com/wisespace-io/binance-rs/workflows/Rust/badge.svg)](https://github.com/wisespace-io/binance-rs/actions?query=workflow%3ARust)\n[![MIT licensed](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE-MIT)\n[![Apache-2.0 licensed](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](./LICENSE-APACHE)\n\n[Documentation on docs.rs](https://docs.rs/crate/binance/)\n\n## Binance API Telegram\n\n  \u003chttps://t.me/binance_api_english\u003e\n\n## Risk Warning\n\nIt is a personal project, use at your own risk. I will not be responsible for your investment losses.\nCryptocurrency investment is subject to high market risk.\n\n## Usage\n\nAdd this to your Cargo.toml\n\n```toml\n[dependencies]\nbinance = { git = \"https://github.com/wisespace-io/binance-rs.git\" }\n```\n\n## Rust \u003e= 1.56.1\n\n```rust\nrustup install stable\n```\n\n### Table of Contents  \n- [MARKET DATA](#market-data)\n- [ACCOUNT DATA](#account-data)\n- [ERROR HANDLING](#error-handling)\n- [TESTNET AND API CLUSTERS](#testnet-and-api-clusters)\n- [USER STREAM CONFIGURATION](#user-stream-configuration)\n- [WEBSOCKETS](#websockets)\n  - [USER STREAM](#user-stream)\n  - [TRADES](#trades)\n  - [KLINE](#kline)\n  - [MULTIPLE STREAMS](#multiple-streams)\n\n### MARKET DATA\n\n```rust\nuse binance::api::*;\nuse binance::model::*;\nuse binance::market::*;\n\nfn main() {\n    let market: Market = Binance::new(None, None);\n\n    // Order book at default depth\n    match market.get_depth(\"BNBETH\") {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {}\", e),\n    }\n\n    // Order book at depth 500\n    match market.get_custom_depth(\"BNBETH\", 500) {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {}\", e),\n    }\n\n    // Latest price for ALL symbols\n    match market.get_all_prices() {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    // Latest price for ONE symbol\n    match market.get_price(\"BNBETH\") {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    // Current average price for ONE symbol\n    match market.get_average_price(\"BNBETH\") {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    // Best price/qty on the order book for ALL symbols\n    match market.get_all_book_tickers() {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    // Best price/qty on the order book for ONE symbol\n    match market.get_book_ticker(\"BNBETH\") {\n        Ok(answer) =\u003e println!(\n            \"Bid Price: {}, Ask Price: {}\",\n            answer.bid_price, answer.ask_price\n        ),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    // 24hr ticker price change statistics\n    match market.get_24h_price_stats(\"BNBETH\") {\n        Ok(answer) =\u003e println!(\n            \"Open Price: {}, Higher Price: {}, Lower Price: {:?}\",\n            answer.open_price, answer.high_price, answer.low_price\n        ),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    // last 10 5min klines (candlesticks) for a symbol:\n    match market.get_klines(\"BNBETH\", \"5m\", 10, None, None) {\n        Ok(klines) =\u003e {   \n            match klines {\n                binance::model::KlineSummaries::AllKlineSummaries(klines) =\u003e {\n                    let kline: KlineSummary = klines[0].clone(); // You need to iterate over the klines\n                    println!(\n                        \"Open: {}, High: {}, Low: {}\",\n                        kline.open, kline.high, kline.low\n                    )\n                }\n            }\n        },\n        Err(e) =\u003e println!(\"Error: {}\", e),\n    }\n}\n```\n\n### ACCOUNT DATA\n\n```rust\nuse binance::api::*;\nuse binance::account::*;\n\nfn main() {\n    let api_key = Some(\"YOUR_API_KEY\".into());\n    let secret_key = Some(\"YOUR_SECRET_KEY\".into());\n\n    let account: Account = Binance::new(api_key, secret_key);\n\n    match account.get_account() {\n        Ok(answer) =\u003e println!(\"{:?}\", answer.balances),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.get_open_orders(\"WTCETH\") {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.limit_buy(\"WTCETH\", 10, 0.014000) {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.market_buy(\"WTCETH\", 5) {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.limit_sell(\"WTCETH\", 10, 0.035000) {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.market_sell(\"WTCETH\", 5) {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.custom_order(\"WTCETH\", 9999, 0.0123, \"SELL\", \"LIMIT\", \"IOC\") {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    let order_id = 1_957_528;\n    match account.order_status(\"WTCETH\", order_id) {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.cancel_order(\"WTCETH\", order_id) {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.cancel_all_open_orders(\"WTCETH\") {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.get_balance(\"KNC\") {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n\n    match account.trade_history(\"WTCETH\") {\n        Ok(answer) =\u003e println!(\"{:?}\", answer),\n        Err(e) =\u003e println!(\"Error: {:?}\", e),\n    }\n}\n```\n\n### ERROR HANDLING\n\nProvides more detailed error information\n\nYou can check out the [Binance Error Codes](https://github.com/binance-exchange/binance-official-api-docs/blob/master/errors.md)\n\n```rust\nuse binance::errors::ErrorKind as BinanceLibErrorKind;\n\n[...]\n\nErr(err) =\u003e {\n    println!(\"Can't put an order!\");\n\n    match err.0 {\n        BinanceLibErrorKind::BinanceError(response) =\u003e match response.code {\n            -1013_i16 =\u003e println!(\"Filter failure: LOT_SIZE!\"),\n            -2010_i16 =\u003e println!(\"Funds insufficient! {}\", response.msg),\n            _ =\u003e println!(\"Non-catched code {}: {}\", response.code, response.msg),\n        },\n        BinanceLibErrorKind::Msg(msg) =\u003e {\n            println!(\"Binancelib error msg: {}\", msg)\n        }\n        _ =\u003e println!(\"Other errors: {}.\", err.0),\n    };\n}\n```\n\n### TESTNET AND API CLUSTERS\n\nYou can overwrite the default binance api urls if there are performance issues with the endpoints.\n\nYou can check out the [Binance API Clusters](https://github.com/binance/binance-spot-api-docs/blob/master/rest-api.md#general-api-information).\n\nThe same is applicable for Testnet and Binance.US support. See example below:\n\n```rust\nlet general: General = if use_testnet {\n    let config = Config::default().set_rest_api_endpoint(\"https://testnet.binance.vision\");\n                                  // .set_ws_endpoint(\"wss://testnet.binance.vision/ws\")\n                                  // .set_futures_rest_api_endpoint(\"https://testnet.binancefuture.com/api\")\n                                  // .set_futures_ws_endpoint(\"https://testnet.binancefuture.com/ws\")\n    Binance::new_with_config(None, None, \u0026config)\n} else {\n    Binance::new(None, None)\n};\n```\n\n### USER STREAM CONFIGURATION\n\n```rust\nuse binance::api::*;\nuse binance::userstream::*;\n\nfn main() {\n    let api_key_user = Some(\"YOUR_API_KEY\".into());\n    let user_stream: UserStream = Binance::new(api_key_user.clone(), None);\n\n    if let Ok(answer) = user_stream.start() {\n        println!(\"Data Stream Started ...\");\n        let listen_key = answer.listen_key;\n\n        match user_stream.keep_alive(\u0026listen_key) {\n            Ok(msg) =\u003e println!(\"Keepalive user data stream: {:?}\", msg),\n            Err(e) =\u003e println!(\"Error: {:?}\", e),\n        }\n\n        match user_stream.close(\u0026listen_key) {\n            Ok(msg) =\u003e println!(\"Close user data stream: {:?}\", msg),\n            Err(e) =\u003e println!(\"Error: {:?}\", e),\n        }\n    } else {\n        println!(\"Not able to start an User Stream (Check your API_KEY)\");\n    }\n}\n```\n\n#### USER STREAM\n\n```rust\nuse binance::api::*;\nuse binance::userstream::*;\nuse binance::websockets::*;\nuse std::sync::atomic::{AtomicBool};\n\nfn main() {\n    let api_key_user = Some(\"YOUR_KEY\".into());\n    let keep_running = AtomicBool::new(true); // Used to control the event loop\n    let user_stream: UserStream = Binance::new(api_key_user, None);\n\n    if let Ok(answer) = user_stream.start() {\n\tlet listen_key = answer.listen_key;\n\n\tlet mut web_socket = WebSockets::new(|event: WebsocketEvent| {\n\t    match event {\n\t\tWebsocketEvent::AccountUpdate(account_update) =\u003e {\n\t\t    for balance in \u0026account_update.balance {\n\t\t\tprintln!(\"Asset: {}, free: {}, locked: {}\", balance.asset, balance.free, balance.locked);\n\t\t    }\n\t\t},\n\t\tWebsocketEvent::OrderTrade(trade) =\u003e {\n\t\t    println!(\"Symbol: {}, Side: {}, Price: {}, Execution Type: {}\", trade.symbol, trade.side, trade.price, trade.execution_type);\n\t\t},\n\t\t_ =\u003e (),\n\t    };\n\t    Ok(())\n\t});\n\n\tweb_socket.connect(\u0026listen_key).unwrap(); // check error\n\t    if let Err(e) = web_socket.event_loop(\u0026keep_running) {\n\t\tmatch e {\n\t\t    err =\u003e {\n\t\t        println!(\"Error: {:?}\", err);\n\t\t    }\n\t\t}\n\t     }\n\t} else {\n\t    println!(\"Not able to start an User Stream (Check your API_KEY)\");\n\t}\n}\n```\n\n#### TRADES\n\n```rust\nuse binance::websockets::*;\nuse std::sync::atomic::{AtomicBool};\n\nfn main() {\n    let keep_running = AtomicBool::new(true); // Used to control the event loop\n    let agg_trade = format!(\"!ticker@arr\"); // All Symbols\n    let mut web_socket = WebSockets::new(|event: WebsocketEvent| {\n\tmatch event {\n        // 24hr rolling window ticker statistics for all symbols that changed in an array.\n\t    WebsocketEvent::DayTickerAll(ticker_events) =\u003e {\n\t        for tick_event in ticker_events {\n\t\t    if tick_event.symbol == \"BTCUSDT\" {\n\t\t\tlet btcusdt: f32 = tick_event.average_price.parse().unwrap();\n\t\t\tlet btcusdt_close: f32 = tick_event.current_close.parse().unwrap();\n\t\t\tprintln!(\"{} - {}\", btcusdt, btcusdt_close);\n\t\t    }\n\t\t}\n\t    },\n\t    _ =\u003e (),\n        };\n\n        Ok(())\n    });\n\n    web_socket.connect(\u0026agg_trade).unwrap(); // check error\n    if let Err(e) = web_socket.event_loop(\u0026keep_running) {\n\tmatch e {\n\t    err =\u003e {\n\t        println!(\"Error: {:?}\", err);\n\t    }\n\t}\n     }\n}\n```\n\n#### KLINE\n\n```rust\nuse binance::websockets::*;\nuse std::sync::atomic::{AtomicBool};\n\nfn main() {\n    let keep_running = AtomicBool::new(true); // Used to control the event loop\n    let kline = format!(\"{}\", \"ethbtc@kline_1m\");\n    let mut web_socket = WebSockets::new(|event: WebsocketEvent| {\n        match event {\n            WebsocketEvent::Kline(kline_event) =\u003e {\n                println!(\"Symbol: {}, high: {}, low: {}\", kline_event.kline.symbol, kline_event.kline.low, kline_event.kline.high);\n            },\n            _ =\u003e (),\n        };\n        Ok(())\n    });\n \n    web_socket.connect(\u0026kline).unwrap(); // check error\n    if let Err(e) = web_socket.event_loop(\u0026keep_running) {\n        match e {\n          err =\u003e {\n             println!(\"Error: {:?}\", err);\n          }\n        }\n     }\n     web_socket.disconnect().unwrap();\n}\n\n```\n\n#### MULTIPLE STREAMS\n\n```rust\nuse binance::websockets::*;\nuse std::sync::atomic::{AtomicBool};\n\nfn main() {\n    let endpoints = [\"ETHBTC\", \"BNBETH\"]\n        .map(|symbol| format!(\"{}@depth@100ms\", symbol.to_lowercase()));\n\n    let keep_running = AtomicBool::new(true);\n    let mut web_socket = WebSockets::new(|event: WebsocketEvent| {\n        if let WebsocketEvent::DepthOrderBook(depth_order_book) = event {\n            println!(\"{:?}\", depth_order_book);\n        }\n\n        Ok(())\n    });\n\n    web_socket.connect_multiple_streams(\u0026endpoints).unwrap(); // check error\n    if let Err(e) = web_socket.event_loop(\u0026keep_running) {\n        println!(\"Error: {:?}\", e);\n    }\n    web_socket.disconnect().unwrap();\n}\n\n```\n\n### Other Exchanges\n\nIf you use [Bitfinex](https://www.bitfinex.com/) check out my [Rust library for bitfinex API](https://github.com/wisespace-io/bitfinex-rs)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwisespace-io%2Fbinance-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwisespace-io%2Fbinance-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwisespace-io%2Fbinance-rs/lists"}