{"repo":"ccxt/binance-rs","free":true,"listed":false,"github":"https://github.com/ccxt/binance-rs","clone":"git clone https://github.com/ccxt/binance-rs.git","description":"Rust Library for the Binance API","language":"Rust","stars":859,"topics":["binance","binance-api","binance-exchange","binance-futures","cryptocurrency","cryptocurrency-exchanges","rust","trading"],"license":null,"category":"dev_tool","readme_excerpt":"# 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  <https://t.me/binance_api_english>\n\n## Usage\n\nAdd this to your Cargo.toml\n\n```toml\n[dependencies]\nbinance = { git = \"https://github.com/ccxt/binance-rs.git\" }\n```\n\n## Rust >= 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) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {}\", e),\n    }\n\n    // Order book at depth 500\n    match market.get_custom_depth(\"BNBETH\", 500) {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {}\", e),\n    }\n\n    // Latest price for ALL symbols\n    match market.get_all_prices() {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    // Latest price for ONE symbol\n    match market.get_price(\"BNBETH\") {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    // Current average price for ONE symbol\n    match market.get_average_price(\"BNBETH\") {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => 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) => println!(\"{:?}\", answer),\n        Err(e) => 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) => println!(\n            \"Bid Price: {}, Ask Price: {}\",\n            answer.bid_price, answer.ask_price\n        ),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    // 24hr ticker price change statistics\n    match market.get_24h_price_stats(\"BNBETH\") {\n        Ok(answer) => println!(\n            \"Open Price: {}, Higher Price: {}, Lower Price: {:?}\",\n            answer.open_price, answer.high_price, answer.low_price\n        ),\n        Err(e) => 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) => {   \n            match klines {\n                binance::model::KlineSummaries::AllKlineSummaries(klines) => {\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) => 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) => println!(\"{:?}\", answer.balances),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.get_open_orders(\"WTCETH\") {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.limit_buy(\"WTCETH\", 10, 0.014000) {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.market_buy(\"WTCETH\", 5) {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.limit_sell(\"WTCETH\", 10, 0.035000) {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.market_sell(\"WTCETH\", 5) {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.custom_order(\"WTCETH\", 9999, 0.0123, \"SELL\", \"LIMIT\", \"IOC\") {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    let order_id = 1_957_528;\n    match account.order_status(\"WTCETH\", order_id) {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.cancel_order(\"WTCETH\", order_id) {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.cancel_all_open_orders(\"WTCETH\") {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.get_balance(\"KNC\") {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => println!(\"Error: {:?}\", e),\n    }\n\n    match account.trade_history(\"WTCETH\") {\n        Ok(answer) => println!(\"{:?}\", answer),\n        Err(e) => 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) => {\n    println!(\"Can't put an order!\");\n\n    match err.0 {\n        BinanceLibErrorKind::BinanceError(response) => match response.code {\n            -1013_i16 => println!(\"Filter failure: LOT_SIZE!\"),\n            -2010_i16 => println!(\"Funds insufficient! {}\", response.msg),\n            _ => println!(\"Non-catched code {}: {}\", response.code, response.msg),\n        },\n        BinanceLibErrorKind::Msg(msg) => {\n            println!(\"Binancelib error msg: {}\", msg)\n        }\n        _ => 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, &config)\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(&listen_key) {\n            Ok(msg) => println!(\"Keepalive user data stream: {:?}\", msg),\n            Err(e) => println!(\"Error: {:?}\", e),\n        }\n\n        match user_stream.close(&listen_key) {\n            Ok(msg) => println!(\"Close user data stream: {:?}\", msg),\n            Err(e) => 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) => {\n\t\t    for balance in &account_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) => {\n\t\t    println!(\"Symbol: {}, Side: {}, Price: {}, Execution Type: {}\", trade.symbol, trade.side, trade.price, trade.execution_type);\n\t\t},\n\t\t_ => (),\n\t    };\n\t    Ok(())\n\t});\n\n\tweb_socket.connect(&listen_key).unwrap(); // check error\n\t    if let Err(e) = web_socket.event_loop(&keep_running) {\n\t\tmatch e {\n\t\t    err => {\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(tr","default_branch":"master","files":79,"tree":[".clippy.toml",".github/dependabot.yml",".github/workflows/rust.yml",".gitignore",".rustfmt.toml",".travis.yml","Cargo.toml","LICENSE","README.md","benches/websocket_benchmark.rs","examples/README.md","examples/binance_create_order_custom_params.rs","examples/binance_endpoints.rs","examples/binance_futures_endpoints.rs","examples/binance_futures_userstream.rs","examples/binance_futures_websockets.rs","examples/binance_save_all_trades.rs","examples/binance_websockets.rs","src/account.rs","src/api.rs","src/client.rs","src/config.rs","src/errors.rs","src/futures/account.rs","src/futures/general.rs","src/futures/market.rs","src/futures/mod.rs","src/futures/model.rs","src/futures/userstream.rs","src/futures/websockets.rs","src/general.rs","src/lib.rs","src/market.rs","src/model.rs","src/savings.rs","src/userstream.rs","src/util.rs","src/websockets.rs","tests/account_tests.rs","tests/futures_account_tests.rs","tests/futures_general_tests.rs","tests/futures_market_test.rs","tests/general_tests.rs","tests/market_tests.rs","tests/mocks/account/cancel_all_open_orders.json","tests/mocks/account/cancel_order.json","tests/mocks/account/get_account.json","tests/mocks/account/get_open_orders.json","tests/mocks/account/limit_buy.json","tests/mocks/account/limit_sell.json","tests/mocks/account/market_buy.json","tests/mocks/account/market_buy_using_quote_quantity.json","tests/mocks/account/market_sell.json","tests/mocks/account/market_sell_using_quote_quantity.json","tests/mocks/account/order_status.json","tests/mocks/account/stop_limit_buy.json","tests/mocks/account/stop_limit_sell.json","tests/mocks/account/trade_history.json","tests/mocks/futures/account/cancel_all_open_orders.json","tests/mocks/futures/account/change_initial_leverage.json","tests/mocks/futures/account/change_margin_type.json","tests/mocks/futures/account/change_position_margin.json","tests/mocks/futures/account/change_position_mode.json","tests/mocks/futures/account/get_income_history.json","tests/mocks/futures/account/stop_market_close_position_buy.json","tests/mocks/futures/account/stop_market_close_position_sell.json","tests/mocks/futures/market/open_interest_statistics.json","tests/mocks/general/exchange_info.json","tests/mocks/general/server_time.json","tests/mocks/market/get_24h_price_stats.json","tests/mocks/market/get_all_24h_price_stats.json","tests/mocks/market/get_all_book_tickers.json","tests/mocks/market/get_all_prices.json","tests/mocks/market/get_average_price.json","tests/mocks/market/get_book_ticker.json","tests/mocks/market/get_depth.json","tests/mocks/market/get_klines.json","tests/mocks/market/get_price.json","tests/util_tests.rs"],"storefront":"/r/ccxt","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/ccxt/binance-rs/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}