A rust wrapper for Bloomberg blpapi (based on the tafia/blpapi-rs crate by tafia). This is work in progress and plans to get on parity with the C++ API. Currently, the library is not implementing the async features.
Tested on Windows only (DesktopApi). Compiles on Linux and Windows. Tested version: 3.25.11
- Install C/C++ BLPAPI. (Download and extract the file from https://www.bloomberg.com/professional/support/api-library/)
- Set
BLPAPI_LIBenvironment variable a. On windows: \lib b. On linux: /Linux - Example: a. C:\blp\DAPI\blpapi_cpp_3.25.7.1 b. C:\blp\DAPI\blpapi_cpp_3.25.7.1\Linux
# Cargo.toml
[dependencies]
blpapi = { version = "0.0.1", features = [ "derive", "dates" ] }use blpapi::{
session::{Session, SessionBuilder},
session_options::SessionOptions,
Error, RefData,
};
#[derive(Debug, Default, RefData)]
struct Data {
crncy: String,
id_bb: String,
ticker: String,
market_sector: Option<String>,
px_last: f64,
ds002: String,
}
fn start_session() -> Result<Session, Error> {
let s_opt = SessionOptions::default();
let mut session = SessionBuilder::default().options(s_opt).build();
session.start()?;
Ok(session)
}
pub fn main() -> Result<(), Error> {
env_logger::init();
println!("creating session");
let mut session = start_session()?;
println!("{:#?}", session);
let securities = &[
"IBM US Equity",
"MSFT US Equity",
"3333 HK Equity",
"/cusip/912828GM6@BGN",
];
let data = session.ref_data_sync::<Data>(securities)?;
println!("{:#?}", data);
Ok(())
}...
{
"AAPL US Equity": Data {
crncy: "USD",
id_bb: "037833100",
ticker: "AAPL",
market_sector: Some(
"2",
),
px_last: 258.21,
crncy_adj_px_last: 258.21,
ds002: "APPLE INC",
},
}
use blpapi::{
Error, RefData, overrides,
session::{Session, SessionBuilder},
session_options::SessionOptions,
};
#[derive(Debug, Default, RefData)]
struct Data {
crncy: String,
id_bb: String,
ticker: String,
market_sector: Option<String>,
px_last: f64,
crncy_adj_px_last: f64,
ds002: String,
}
fn start_session() -> Result<Session, Error> {
let s_opt = SessionOptions::default();
let mut session = SessionBuilder::default().options(s_opt).build();
session.start()?;
Ok(session)
}
pub fn main() -> Result<(), Error> {
env_logger::init();
println!("creating session");
let mut session = start_session()?;
println!("{:#?}", session);
let securities = &[
// "IBM US Equity",
// "MSFT US Equity",
// "3333 HK Equity",
"AAPL US Equity",
];
let data = session.bdp::<Data>(securities, None)?;
// Without Override
println!("{:#?}", data);
let overrides = overrides!(EQY_FUND_CRNCY = "EUR");
let overrides = Some(overrides);
let data = session.bdp::<Data>(securities, overrides)?;
// With Overrides
println!("{:#?}", data);
Ok(())
}...
{
"AAPL US Equity": Data {
crncy: "USD",
id_bb: "037833100",
ticker: "AAPL",
market_sector: Some(
"2",
),
px_last: 258.21,
crncy_adj_px_last: 258.21,
ds002: "APPLE INC",
},
}
...
{
"AAPL US Equity": Data {
crncy: "USD",
id_bb: "037833100",
ticker: "AAPL",
market_sector: Some(
"2",
),
px_last: 258.21,
crncy_adj_px_last: 222.3265,
ds002: "APPLE INC",
},
}
use blpapi::{
Error, RefData,
session::{Session, SessionBuilder},
session_options::SessionOptions,
time_series::HistOptions,
};
#[derive(Debug, Default, RefData)]
struct Data {
px_last: f64,
volatitlity_30d: f64,
}
fn start_session() -> Result<Session, Error> {
let s_opt = SessionOptions::default();
let session = SessionBuilder::default().options(s_opt).build();
Ok(session)
}
pub fn main() -> Result<(), Error> {
env_logger::init();
println!("creating session");
let mut session = start_session()?;
session.start()?;
println!("{:#?}", session);
let tickers = &[
"IBM US Equity",
"MSFT US Equity",
"3333 HK Equity",
"/cusip/912828GM6@BGN",
];
let options = HistOptions::new("20191001", "20191010");
let data = session.bdh::<Data>(tickers, options)?;
for entry in data {
println!("{}: {:?} {:?}", entry.ticker, entry.date, entry.data);
}
Ok(())
}IBM US Equity: 2019-10-01 Data { px_last: 137.2189, volatitlity_30d: 0.0 }
IBM US Equity: 2019-10-02 Data { px_last: 135.3372, volatitlity_30d: 0.0 }
IBM US Equity: 2019-10-03 Data { px_last: 135.6524, volatitlity_30d: 0.0 }
IBM US Equity: 2019-10-04 Data { px_last: 136.5789, volatitlity_30d: 0.0 }
IBM US Equity: 2019-10-07 Data { px_last: 134.9456, volatitlity_30d: 0.0 }
IBM US Equity: 2019-10-08 Data { px_last: 132.1756, volatitlity_30d: 0.0 }
IBM US Equity: 2019-10-09 Data { px_last: 133.4078, volatitlity_30d: 0.0 }
IBM US Equity: 2019-10-10 Data { px_last: 134.8023, volatitlity_30d: 0.0 }
MSFT US Equity: 2019-10-01 Data { px_last: 137.07, volatitlity_30d: 0.0 }
MSFT US Equity: 2019-10-02 Data { px_last: 134.65, volatitlity_30d: 0.0 }
MSFT US Equity: 2019-10-03 Data { px_last: 136.28, volatitlity_30d: 0.0 }
MSFT US Equity: 2019-10-04 Data { px_last: 138.12, volatitlity_30d: 0.0 }
MSFT US Equity: 2019-10-07 Data { px_last: 137.12, volatitlity_30d: 0.0 }
MSFT US Equity: 2019-10-08 Data { px_last: 135.67, volatitlity_30d: 0.0 }
MSFT US Equity: 2019-10-09 Data { px_last: 138.24, volatitlity_30d: 0.0 }
MSFT US Equity: 2019-10-10 Data { px_last: 139.1, volatitlity_30d: 0.0 }
3333 HK Equity: 2019-10-02 Data { px_last: 16.88, volatitlity_30d: 0.0 }
3333 HK Equity: 2019-10-03 Data { px_last: 16.7, volatitlity_30d: 0.0 }
3333 HK Equity: 2019-10-04 Data { px_last: 17.58, volatitlity_30d: 0.0 }
3333 HK Equity: 2019-10-08 Data { px_last: 17.58, volatitlity_30d: 0.0 }
3333 HK Equity: 2019-10-09 Data { px_last: 17.5, volatitlity_30d: 0.0 }
3333 HK Equity: 2019-10-10 Data { px_last: 17.14, volatitlity_30d: 0.0 }use blpapi::{
Error,
session::{Session, SessionBuilder},
session_options::SessionOptions,
time_series::{HistIntradayOptions, TickTypes},
};
fn start_session() -> Result<Session, Error> {
let s_opt = SessionOptions::default();
let session = SessionBuilder::default().options(s_opt).build();
Ok(session)
}
pub fn main() -> Result<(), Error> {
env_logger::init();
println!("creating session");
let mut session = start_session()?;
session.start()?;
println!("{:#?}", session);
let ticker = String::from("BAYN GY Equity");
let start_dt = "20260123T090000";
let end_dt = "20260123T170000";
// Example
let value = true;
let options = HistIntradayOptions::new(start_dt, end_dt)
.cond_codes(value)
.exch_code(value)
.non_plottable_events(value)
.brkr_codes(value)
.rps_codes(value)
.trade_time(value)
.action_codes(value)
.show_yield(value)
.spread_price(value)
.upfront_price(value)
.indicator_codes(value)
.return_eids(value)
.bic_mic_codes(value)
.eq_ref_price(value)
.xdf_fields(value)
.trade_id(value);
let tick_types = vec![TickTypes::Trade, TickTypes::Ask];
let data = session.bdib(ticker, tick_types, options)?;
for entry in data {
println!("{}: {:?} {:?}", entry.ticker, entry.date, entry.data);
}
Ok(())
}BAYN GY Equity: 2026-01-23T11:44:06.000100 TickData { tick_type: "ASK", size: 695, value: 44.63, conditional_codes: "", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000166 TickData { tick_type: "ASK", size: 521, value: 44.63, conditional_codes: "", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000166 TickData { tick_type: "ASK", size: 390, value: 44.63, conditional_codes: "", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000166 TickData { tick_type: "ASK", size: 216, value: 44.63, conditional_codes: "", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000822 TickData { tick_type: "TRADE", size: 1741, value: 44.625, conditional_codes: "XR", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000822 TickData { tick_type: "TRADE", size: 84, value: 44.63, conditional_codes: "", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000822 TickData { tick_type: "TRADE", size: 1369, value: 44.63, conditional_codes: "XR", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000822 TickData { tick_type: "TRADE", size: 132, value: 44.63, conditional_codes: "", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000822 TickData { tick_type: "TRADE", size: 5274, value: 44.63, conditional_codes: "XR", exchange_code: "", eids: [] }
BAYN GY Equity: 2026-01-23T11:44:06.000822 TickData { tick_type: "ASK", size: 552, value: 44.635, conditional_codes: "", exchange_code: "", eids: [] }