BreezeDotNet 1.0.0
dotnet add package BreezeDotNet --version 1.0.0
NuGet\Install-Package BreezeDotNet -Version 1.0.0
<PackageReference Include="BreezeDotNet" Version="1.0.0" />
<PackageVersion Include="BreezeDotNet" Version="1.0.0" />
<PackageReference Include="BreezeDotNet" />
paket add BreezeDotNet --version 1.0.0
#r "nuget: BreezeDotNet, 1.0.0"
#:package BreezeDotNet@1.0.0
#addin nuget:?package=BreezeDotNet&version=1.0.0
#tool nuget:?package=BreezeDotNet&version=1.0.0
BreezeDotNet
Unofficial .NET SDK for ICICI Direct Breeze API
Supports REST APIs and WebSocket live market data.
Chapter 1 — Login & Session Management
This chapter explains how to:
- Initialize the Breeze client
- Generate the login URL
- Create a Breeze session
- Prepare the SDK for REST and WebSocket usage
1. Initialize BreezeClient
Create an instance of BreezeClient using your API key and secret.
using BreezeDotNet;
var breeze = new BreezeClient(
apiKey: "YOUR_API_KEY",
apiSecret: "YOUR_API_SECRET"
);
| Name | Description |
|---|---|
apiKey |
Breeze API key issued by ICICI Direct |
apiSecret |
Breeze API secret |
2. Get Breeze Login URL
Generate the login URL and open it in a browser for user authentication.
string loginUrl = breeze.GetBreezeLoginURL();
Console.WriteLine(loginUrl);
Typical usage:
Process.Start(new ProcessStartInfo(loginUrl)
{
UseShellExecute = true
});
What happens
- User logs in on ICICI Direct website
- Breeze redirects and provides an API Session Token
3. Generate Breeze Session
Use the API session token received after login to create a Breeze session.
var response = await breeze.GenerateBreezeSessionAsync(apiSession);
| Name | Description |
|---|---|
apiSession |
Session token received after Breeze login |
Return Type: BreezeResponse<CustomerDetailsData>
4. Sample Successful Response
{
"Status": 200,
"Error": null,
"Success": {
"session_token": "BASE64_ENCODED_TOKEN",
"idirect_userid": "AB12345"
}
}
What the SDK does internally
On successful login, the SDK:
Stores Breeze session token
Extracts WebSocket credentials automatically
Prepares the client for:
- REST API calls
- WebSocket streaming
You do not need to handle tokens manually.
5. Error Handling
If login fails:
{
"Status": 401,
"Error": "Invalid Session Token",
"Success": null
}
Always check:
if (response.Status != 200)
{
Console.WriteLine(response.Error);
}
Chapter 2 — Funds & Limits
This chapter explains how to fetch your available funds and margin summary after login.
Get Breeze Funds
Fetches your current fund balance / margin allocations from Breeze.
var fundsResponse = await breeze.GetBreezeFundsAsync();
if (fundsResponse.Status == 200 && fundsResponse.Success != null)
{
var f = fundsResponse.Success;
Console.WriteLine($"Bank Balance: {f.total_bank_balance}");
Console.WriteLine($"Allocated F&O: {f.allocated_fno}");
Console.WriteLine($"Unallocated: {f.unallocated_balance}");
}
else
{
Console.WriteLine($"Error: {fundsResponse.Error}");
}
Method
Task<BreezeResponse<FundsData>> GetBreezeFundsAsync()
Parameters
None.
Return Value
Returns: BreezeResponse<FundsData>
Status= HTTP-like status code (200 means success)Error= error string (null on success)Success= populatedFundsDataobject (null on failure)
Sample Success (FundsData)
Below is an example of the Success object (values masked):
{
"bank_account": "xxxxxxxxxxxxxx",
"total_bank_balance": "xxxxxxxxxx",
"allocated_equity": "xxxxxx",
"allocated_fno": "xxxxxxx",
"allocated_commodity": "xx.x",
"allocated_currency": "xx.x",
"block_by_trade_equity": "xx.x",
"block_by_trade_fno": "xx.xx",
"block_by_trade_commodity": "xx.x",
"block_by_trade_currency": "xx.x",
"block_by_trade_balance": "xx.xx",
"unallocated_balance": "xx.xx",
"receivable_amount": "xxx"
}
Chapter 3 — Quotes (Cash / Futures / Options)
This chapter explains how to fetch quote data from Breeze.
There are two ways to use quotes:
Low-level (most flexible) Use
GetQuotesAsync(QuotesRequest)where you explicitly pass exchange/product/expiry/right/strike.Convenience methods (easy) Use helpers like
GetQuotesCashAsync()/GetQuotesFuturesAsync()/GetLTP()etc.
3.1 GetQuotesAsync (Core Method)
This is the main quote API wrapper.
Method
Task<BreezeResponse<List<QuotesData>>> GetQuotesAsync(QuotesRequest request)
| Field | Meaning | Example |
|---|---|---|
StockCode |
Underlying symbol / scrip | NIFTY |
ExchangeCode |
Exchange code | NSE (cash), NFO (F&O) |
ProductType |
cash / futures / options |
cash |
ExpiryDate |
Required for futures/options (format dd-MMM-yyyy) |
24-Feb-2026 |
Right |
Options: call / put, Futures/Cash: usually others or * |
call |
StrikePrice |
Options strike (string), cash/futures usually "0" |
25200 |
Return Value
Returns BreezeResponse<List<QuotesData>>
Status = 200means successSuccesscontains one or moreQuotesDatarecords
3.2 Cash Quotes Example (NSE)
var req = new QuotesRequest
{
StockCode = "NIFTY",
ExchangeCode = "NSE",
ExpiryDate = "",
ProductType = "cash",
Right = "",
StrikePrice = ""
};
var cashQuotes = await breeze.GetQuotesAsync(req);
if (cashQuotes.Status == 200 && cashQuotes.Success != null && cashQuotes.Success.Count > 0)
{
var q = cashQuotes.Success[0];
Console.WriteLine($"NIFTY Cash LTP={q.LTP} Open={q.Open} High={q.High} Low={q.Low}");
}
else
{
Console.WriteLine($"Error: {cashQuotes.Error}");
}
Sample Success (Cash Quote):
{
"Status": 200,
"Error": null,
"Success": [
{
"exchange_code": "NSE",
"product_type": "",
"stock_code": "NIFTY",
"expiry_date": null,
"right": null,
"strike_price": 0.0,
"ltp": 25334.1,
"ltt": "01-Feb-2026 10:06:45",
"best_bid_price": 0.0,
"best_bid_quantity": "0",
"best_offer_price": 0.0,
"best_offer_quantity": "0",
"open": 25333.75,
"high": 25346.85,
"low": 25252.3,
"previous_close": 25320.65,
"ltp_percent_change": 0.0531186995594505,
"upper_circuit": 0.0,
"lower_circuit": 0.0,
"total_quantity_traded": "0",
"spot_price": null
}
]
}
3.3 Futures Quotes Example (NFO)
var futReq = new QuotesRequest
{
StockCode = "NIFTY",
ExchangeCode = "NFO",
ExpiryDate = "24-Feb-2026",
ProductType = "futures",
Right = "others",
StrikePrice = "0"
};
var futQuotes = await breeze.GetQuotesAsync(futReq);
if (futQuotes.Status == 200 && futQuotes.Success != null && futQuotes.Success.Count > 0)
{
var q = futQuotes.Success[0];
Console.WriteLine($"NIFTY Future LTP={q.LTP} Open={q.Open} High={q.High} Low={q.Low} Spot={q.SpotPrice}");
}
else
{
Console.WriteLine($"Error: {futQuotes.Error}");
}
Sample Success (Futures Quote):
{
"Status": 200,
"Error": null,
"Success": [
{
"exchange_code": "NFO",
"product_type": "Future",
"stock_code": "NIFTY",
"expiry_date": "24-Feb-2026",
"right": "*",
"strike_price": 0.0,
"ltp": 25446.9,
"ltt": "01-Feb-2026 10:35:04",
"best_bid_price": 25446.9,
"best_bid_quantity": "130",
"best_offer_price": 25450.0,
"best_offer_quantity": "390",
"open": 25425.0,
"high": 25450.0,
"low": 25333.0,
"previous_close": 25416.4,
"ltp_percent_change": 0.12,
"upper_circuit": 27958.0,
"lower_circuit": 22874.8,
"total_quantity_traded": "1120405",
"spot_price": "25374.4"
}
]
}
3.4 Convenience Methods (Recommended)
Instead of building QuotesRequest manually, you can use these helpers:
GetQuotesCashAsync(stockCode, exchangeCode="NSE")GetQuotesFuturesAsync(stockCode, expiryDate, exchangeCode="NFO")GetLTP(...)GetOpen(...)GetHigh(...)GetLow(...)
These call GetQuotesAsync() internally and return simplified output.
Common Errors
No active session
If you call quotes before login session:
InvalidOperationException: "No active session. Please generate a session first."
Always call:
GenerateBreezeSessionAsync(apiSession) first.
Chapter 4 — Order Placement (Cash / Futures / Options)
The SDK provides multiple order placement methods, each designed for a specific level of abstraction.
You should choose the method based on how much control vs convenience you want.
Order Placement Methods Overview
| Method | Recommended When |
|---|---|
PlaceOptionsOrderAsync |
You want full control over quantity (explicit quantity) |
PlaceOptionsOrderLotsAsync |
You want to place options using lots × lotSize |
PlaceOrderNFO |
You want the simplest way to place an NFO options order and just get orderId |
PlaceRegularOrderAsync |
You want maximum flexibility (cash, futures, options, any exchange) |
⚠️ All order placement methods require an active Breeze session. Call
GenerateBreezeSessionAsync()before placing any order.
4.1 Core Parameter Definitions (Important)
All order placement methods ultimately map to the same set of parameters. These are best understood via the generic method below.
Generic Order Method
Task<BreezeResponse<PlaceOrderData>> PlaceRegularOrderAsync(
string stockCode,
string exchangeCode,
string product,
string action,
string orderType,
string quantity,
string expiryDate,
string right,
string strikePrice,
string? price = null,
string? stoploss = null,
string validity = "day"
)
| Parameter | Meaning | Example |
|---|---|---|
stockCode |
Underlying symbol | NIFTY, BANKNIFTY, RELIANCE |
exchangeCode |
Exchange | NSE, NFO |
product |
Product type | cash, futures, options |
action |
Buy or Sell | buy, sell |
orderType |
Order type | market, limit, stoploss |
quantity |
Final quantity (string) | 65, 130 |
expiryDate |
Expiry date (dd-MMM-yyyy) |
03-Feb-2026 |
right |
Option type | call, put, others |
strikePrice |
Strike price (options) | 25200 |
price |
Limit price (for limit orders) | 75.5 |
stoploss |
Stop-loss trigger | 10 |
validity |
Order validity | day |
For cash & futures, use:
right = "others"strikePrice = "0"
4.2 PlaceOptionsOrderAsync (Direct Quantity)
Use this when:
- You already know the exact quantity
- You want explicit control
Method
Task<BreezeResponse<PlaceOrderData>> PlaceOptionsOrderAsync(
string stockCode,
string expiryDate,
string strikePrice,
string right,
string action,
string quantity,
string orderType = "market",
string? price = null,
string? stoploss = null,
string validity = "day",
string exchangeCode = "NFO"
)
Example — Market Order:
var response = await breeze.PlaceOptionsOrderAsync(
stockCode: "NIFTY",
expiryDate: "03-Feb-2026",
strikePrice: "25000",
right: "call",
action: "buy",
quantity: "65"
);
Console.WriteLine(response.Success?.OrderId);
Sample Success Response:
{
"Status": 200,
"Error": null,
"Success": {
"order_id": "202602012700062513",
"exchange_code": "NFO",
"stock_code": "NIFTY",
"product_type": "Options",
"action": "Buy",
"order_type": "Market",
"quantity": "65",
"average_price": "76.25",
"status": "Executed",
"order_datetime": "01-Feb-2026 15:17:12"
}
}
4.3 PlaceOptionsOrderLotsAsync (Lots × LotSize)
Use this when:
- You trade by lots
- You already know the lot size
Method
Task<BreezeResponse<PlaceOrderData>> PlaceOptionsOrderLotsAsync(
string stockCode,
string expiryDate,
string strikePrice,
string right,
string action,
int numberOfLots,
int lotSize,
string orderType = "market",
string? price = null,
string? stoploss = null,
string validity = "day",
string exchangeCode = "NFO"
)
Example — Market Order by Lots:
var response = await breeze.PlaceOptionsOrderLotsAsync(
stockCode: "NIFTY",
expiryDate: "03-Feb-2026",
strikePrice: "25200",
right: "call",
action: "buy",
numberOfLots: 1,
lotSize: 65
);
4.4 PlaceOrderNFO (Recommended for Most Users)
This is the simplest and safest method for NFO options trading.
✔ Handles quantity calculation ✔ Throws meaningful exceptions ✔ Returns only orderId (clean API)
Method
Task<string> PlaceOrderNFO(
string stockCode,
string expiryDate,
string strikePrice,
string right,
string action,
int numberOfLots,
int lotSize,
string orderType = "market",
string? price = null,
string? stoploss = null,
string validity = "day"
)
Example:
string orderId = await breeze.PlaceOrderNFO(
stockCode: "NIFTY",
expiryDate: "03-Feb-2026",
strikePrice: "25200",
right: "call",
action: "buy",
numberOfLots: 1,
lotSize: 65
);
Console.WriteLine($"Order placed. ID = {orderId}");
4.5 PlaceRegularOrderAsync (Advanced / Power Users)
Use this only when:
- You need full flexibility
- You are placing non-option orders
- You want complete control
Example — Cash Market Order:
var response = await breeze.PlaceRegularOrderAsync(
stockCode: "RELIANCE",
exchangeCode: "NSE",
product: "cash",
action: "buy",
orderType: "market",
quantity: "10",
expiryDate: "",
right: "others",
strikePrice: "0"
);
| If you are… | Use this |
|---|---|
| New SDK user | PlaceOrderNFO |
| Trading by lots | PlaceOptionsOrderLotsAsync |
| Trading exact quantity | PlaceOptionsOrderAsync |
| Advanced / special cases | PlaceRegularOrderAsync |
Chapter 5 — Order Details / Status / Average Price
This chapter covers how to:
- Fetch full order details using an
orderId - Get only the order status
- Get only the order average executed price
✅ All methods below require an active Breeze session. Call
GenerateBreezeSessionAsync()first.
5.1 GetOrderDetailAsync (Full Order Details)
Use this when you want the complete order record from Breeze, including:
- exchange order id
- status (Executed / Cancelled / Pending etc.)
- quantity, price, average price
- timestamps and metadata
Method
Task<BreezeResponse<List<OrderDetailData>>> GetOrderDetailAsync(
string exchangeCode,
string orderId
)
| Parameter | Meaning | Example |
|---|---|---|
exchangeCode |
Exchange where order was placed | NFO, NSE |
orderId |
Breeze order id returned from order placement | 202602023400006738 |
Example
var response = await breeze.GetOrderDetailAsync(
exchangeCode: "NFO",
orderId: "202602023400006738"
);
if (response.Status == 200 && response.Success != null && response.Success.Count > 0)
{
var od = response.Success[0];
Console.WriteLine($"Status={od.Status}, AvgPrice={od.AveragePrice}, Qty={od.Quantity}");
}
else
{
Console.WriteLine($"Failed. Status={response.Status}, Error={response.Error}");
}
Sample Success Response
{
"Status": 200,
"Error": null,
"Success": [
{
"order_id": "202602023400006738",
"exchange_order_id": "1000000068921179",
"exchange_code": "NFO",
"stock_code": "NIFTY",
"product_type": "Options",
"action": "Buy",
"order_type": "Market",
"stoploss": "0",
"quantity": "65",
"price": "23.55",
"validity": "Day",
"expiry_date": "03-Feb-2026",
"right": "Call",
"strike_price": 25200.0,
"average_price": "22.9",
"cancelled_quantity": "0",
"pending_quantity": "0",
"status": "Executed",
"order_datetime": "02-Feb-2026 10:12:00"
}
]
}
Note:
Successis a list, but typically it contains one record for the providedorderId.
5.2 GetOrderStatus (Convenience Method)
Use this when you only need the order status string, without parsing the full response.
Method
Task<string?> GetOrderStatus(
string exchangeCode,
string orderId
)
Returns:
"Executed","Cancelled","Pending", etc. (depends on Breeze)nullif the order is not found or request fails
Example
string? status = await breeze.GetOrderStatus(
exchangeCode: "NFO",
orderId: "202602023400006738"
);
Console.WriteLine($"Order Status: {status}");
5.3 GetAverageOrderPrice (Convenience Method)
Use this when you only need the average executed price.
Method
Task<decimal?> GetAverageOrderPrice(
string exchangeCode,
string orderId
)
Returns:
- Average executed price (as returned by Breeze), e.g.
22.9 nullif not available / request fails
Example
decimal? avgPrice = await breeze.GetAverageOrderPrice(
exchangeCode: "NFO",
orderId: "202602023400006738"
);
Console.WriteLine($"Average Price: {avgPrice}");
| If you want… | Use this |
|---|---|
| Full order record (all fields) | GetOrderDetailAsync() |
| Only order status | GetOrderStatus() |
| Only average executed price | GetAverageOrderPrice() |
Chapter 6 — Cancel Order & Modify Order
This chapter covers:
- Cancelling an order using
orderId - Verifying cancellation by calling
GetOrderDetailAsync()after cancel
✅ Requires an active Breeze session. Call
GenerateBreezeSessionAsync()first.
6.1 CancelOrderAsync
Cancels an existing order (market/limit/stoploss etc.) using Breeze order_id.
Method
Task<BreezeResponse<CancelOrderData>> CancelOrderAsync(
string exchangeCode,
string orderId
)
| Parameter | Meaning | Example |
|---|---|---|
exchangeCode |
Exchange where the order was placed | NFO, NSE |
orderId |
Breeze order id returned from order placement | 202602023400023434 |
Returns a BreezeResponse<CancelOrderData> containing:
Status = 200on successSuccess.order_idSuccess.message
Example
var response = await breeze.CancelOrderAsync(
exchangeCode: "NFO",
orderId: "202602023400023434"
);
if (response.Status == 200 && response.Success != null)
{
Console.WriteLine($"Cancelled Order ID: {response.Success.OrderId}");
Console.WriteLine($"Message: {response.Success.Message}");
}
else
{
Console.WriteLine($"Failed to cancel. Status={response.Status}, Error={response.Error}");
}
Sample Success Response:
{
"Status": 200,
"Error": null,
"Success": {
"order_id": "202602023400023434",
"message": "Order cancelled successfully"
}
}
Verify Cancellation (Recommended)
After cancelling, it’s a good idea to call GetOrderDetailAsync() to confirm the final status.
Example (Cancel → Then Fetch Order Details):
await breeze.CancelOrderAsync("NFO", "202602023400023434");
var details = await breeze.GetOrderDetailAsync("NFO", "202602023400023434");
if (details.Status == 200 && details.Success != null && details.Success.Count > 0)
{
var od = details.Success[0];
Console.WriteLine($"Post-cancel Status = {od.Status}");
Console.WriteLine($"CancelledQty={od.CancelledQuantity}, PendingQty={od.PendingQuantity}");
}
Sample Order Details After Cancel:
{
"Status": 200,
"Error": null,
"Success": [
{
"order_id": "202602023400023434",
"exchange_order_id": "1000000350968076",
"exchange_code": "NFO",
"stock_code": "NIFTY",
"product_type": "Options",
"action": "Buy",
"order_type": "Limit",
"quantity": "65",
"price": "1",
"average_price": "0",
"cancelled_quantity": "65",
"pending_quantity": "65",
"status": "Cancelled",
"order_datetime": "02-Feb-2026 14:45:11"
}
]
}
✅ The key fields to verify cancellation are:
status = "Cancelled"cancelled_quantity > 0
6.2 Modify Order
The SDK provides explicit, exchange-safe modify methods for different instrument types. Breeze APIs enforce different mandatory parameters for Equity, Options, and Futures orders, so the SDK exposes separate methods to avoid accidental misuse.
⚠️ Important
- Order modification is validated against exchange price bands at the time of modification.
- A price accepted during placement may still be rejected during modification if it is outside the current exchange-defined range.
- Modification uses HTTP PUT on the same
/orderendpoint.
6.2.1 Modify Equity Order
Use this method to modify NSE/BSE equity orders.
public async Task<string> ModifyEquityOrderAsync(
string orderId,
string exchangeCode, // "NSE" or "BSE"
string quantity,
string? price = null, // for LIMIT orders
string? orderType = null, // "limit" / "market" / "stoploss"
string? stoploss = null,
string? disclosedQuantity = null,
string? validity = null // "day" / "ioc"
)
Mandatory Parameters
| Parameter | Description |
|---|---|
orderId |
Order ID received during order placement |
exchangeCode |
"NSE" or "BSE" |
quantity |
Modified quantity (numeric string) |
Optional Parameters
| Parameter | Description |
|---|---|
price |
New limit price |
orderType |
"limit", "market", "stoploss" |
stoploss |
Stoploss trigger price |
disclosedQuantity |
Disclosed quantity |
validity |
"day" or "ioc" |
Returns: Order ID of the modified order
6.2.2 Modify Options Order
Use this method to modify Options orders in the NFO segment.
📌 For Options, Breeze mandates expiry_date, right, and strike_price during modification.
public async Task<string> ModifyOptionsOrderAsync(
string orderId,
string quantity,
string expiryDate, // "dd-MMM-yyyy"
string right, // "call" or "put"
string strikePrice, // e.g. "25600"
string? price = null,
string? orderType = null,
string? stoploss = null,
string? disclosedQuantity = null,
string? validity = null
)
Mandatory Parameters
| Parameter | Description |
|---|---|
orderId |
Order ID to be modified |
quantity |
Modified quantity |
expiryDate |
Option expiry date (dd-MMM-yyyy) |
right |
"call" or "put" |
strikePrice |
Strike price (numeric string) |
Optional Parameters: same as equity modify (price, orderType, stoploss, disclosedQuantity, validity)
Returns: Order ID of the modified order
Example:
var orderId = await breeze.ModifyOptionsOrderAsync(
orderId: "202602063400027376",
quantity: "65",
expiryDate: "10-Feb-2026",
right: "call",
strikePrice: "25600",
price: "70",
orderType: "limit"
);
6.2.3 Modify Futures Order (NFO)
Use this method to modify Futures orders in the NFO segment.
📌 Futures modification requires:
expiry_dateright = "others"strike_price = "0"
These are automatically handled by the SDK.
public async Task<string> ModifyFuturesOrderAsync(
string orderId,
string quantity,
string expiryDate, // "dd-MMM-yyyy"
string? price = null,
string? orderType = null,
string? stoploss = null,
string? disclosedQuantity = null,
string? validity = null
)
Mandatory Parameters
| Parameter | Description |
|---|---|
orderId |
Order ID |
quantity |
Modified quantity |
expiryDate |
Futures expiry date |
Optional Parameters: same as equity modify.
Returns: Order ID of the modified order
Example:
var orderId = await breeze.ModifyFuturesOrderAsync(
orderId: "202602061111222333",
quantity: "50",
expiryDate: "24-Feb-2026",
price: "125.75",
orderType: "limit"
);
Notes on Modify Order Behaviour
- Modify requests are validated at exchange level, not just at placement level.
- Price-band errors during modification are normal exchange behaviour, not SDK issues.
- Always verify the modified state using:
await GetOrderDetailAsync(exchangeCode, orderId);
Chapter 7 — Portfolio Positions / Demat Holdings
This chapter covers fetching open positions from Breeze and getting demat holdings as on date.
✅ Each item in the Success array represents one open position (one row per position). Examples: options positions, futures positions, etc.
✅ Requires an active Breeze session. Call
GenerateBreezeSessionAsync()first.
7.1 GetPortfolioPositionsAsync
Fetches the current portfolio positions (typically open positions).
Method
Task<BreezeResponse<List<PortfolioPositionData>>> GetPortfolioPositionsAsync()
Parameters
None.
Returns
A BreezeResponse<List<PortfolioPositionData>> containing:
Status = 200on successSuccess= list of open positions
Example
var posResp = await breeze.GetPortfolioPositionsAsync();
if (posResp.Status == 200 && posResp.Success != null)
{
Console.WriteLine($"Positions count = {posResp.Success.Count}");
foreach (var p in posResp.Success)
{
Console.WriteLine(
$"{p.ExchangeCode} {p.StockCode} {p.ExpiryDate} {p.StrikePrice} {p.Right} | " +
$"{p.Action} Qty={p.Quantity} Avg={p.AveragePrice} LTP={p.Ltp}"
);
}
}
else
{
Console.WriteLine($"GetPositions failed. Status={posResp.Status}, Error={posResp.Error}");
}
Sample Success Response
{
"Status": 200,
"Error": null,
"Success": [
{
"segment": "fno",
"product_type": "Options",
"exchange_code": "NFO",
"stock_code": "NIFTY",
"expiry_date": "03-Feb-2026",
"strike_price": "25200",
"right": "Call",
"action": "Buy",
"quantity": "65",
"average_price": "21.6",
"ltp": "21.45",
"underlying": "NIFTY"
}
]
}
Notes
If there are no open positions,
Successmay be an empty list (count = 0).Useful fields to display in your UI/log:
exchange_code,stock_code,expiry_date,strike_price,rightaction,quantity,average_price,ltpunderlying(for index options like NIFTY)
7.2 GetDematHoldingsAsync
This SDK method does not take any parameters
Method
public async Task<BreezeResponse<DematHoldingsData>> GetDematHoldingsAsync()
Sample response
{'stock_code': 'UNITEC',
'stock_ISIN': 'INE694A01020',
'quantity': '1',
'demat_total_bulk_quantity': '1',
'demat_avail_quantity': '0',
'blocked_quantity': '0',
'demat_allocated_quantity': '1'
}
Chapter 8 — Order Book / Order List / Trades Book / Trade Details
This chapter covers fetching the order list (order book) for a date range.
✅ Returns a list of orders/trades placed during the given period (for the specified exchange). ✅ Each element in Success = one order/trade record.
✅ Requires an active Breeze session. Call
GenerateBreezeSessionAsync()first.
8.1 GetOrderListAsync
Fetches order book entries between fromDate and toDate for a given exchange.
Method
Task<BreezeResponse<List<OrderDetailData>>> GetOrderListAsync(
string exchangeCode,
string fromDate,
string toDate
)
Parameters
exchangeCode"NFO"for F&O (options/futures)"NSE"for cash market orders (if placed)
fromDate- Date string in
dd-MMM-yyyy - Example:
"02-Feb-2026"
- Date string in
toDate- Date string in
dd-MMM-yyyy - Example:
"02-Feb-2026"
- Date string in
Note: Internally your SDK converts these to ISO for checksum/body.
Returns
A BreezeResponse<List<OrderDetailData>>:
Status = 200on successSuccess= list of orders (can be empty if no orders)
Example
var ob = await breeze.GetOrderListAsync(
exchangeCode: "NFO",
fromDate: "02-Feb-2026",
toDate: "02-Feb-2026"
);
if (ob.Status == 200 && ob.Success != null)
{
Console.WriteLine($"OrderBook records = {ob.Success.Count}");
foreach (var o in ob.Success)
{
Console.WriteLine(
$"{o.OrderDatetime} | {o.ExchangeCode} | {o.StockCode} | {o.Action} {o.OrderType} | " +
$"Qty={o.Quantity} Avg={o.AveragePrice} | Status={o.Status} | OrderId={o.OrderId}"
);
}
}
else
{
Console.WriteLine($"GetOrderList failed. Status={ob.Status}, Error={ob.Error}");
}
Sample Response (3 records)
{
"Status": 200,
"Error": null,
"Success": [
{
"order_id": "202602023400008313",
"exchange_order_id": "1000000099165574",
"exchange_code": "NFO",
"stock_code": "NIFTY",
"product_type": "Options",
"action": "Buy",
"order_type": "Market",
"quantity": "65",
"price": "21.6",
"average_price": "21.6",
"status": "Executed",
"order_datetime": "02-Feb-2026 10:34:28",
"expiry_date": "03-Feb-2026",
"right": "Call",
"strike_price": 25200.0,
"validity": "Day"
},
{
"order_id": "202602023400008023",
"exchange_order_id": "1000000094209809",
"exchange_code": "NFO",
"stock_code": "NIFTY",
"product_type": "Options",
"action": "Sell",
"order_type": "Market",
"quantity": "65",
"price": "21.1",
"average_price": "20.6",
"status": "Executed",
"order_datetime": "02-Feb-2026 10:30:40",
"expiry_date": "03-Feb-2026",
"right": "Call",
"strike_price": 25200.0,
"validity": "IoC"
},
{
"order_id": "202602023400006738",
"exchange_order_id": "1000000068921179",
"exchange_code": "NFO",
"stock_code": "NIFTY",
"product_type": "Options",
"action": "Buy",
"order_type": "Market",
"quantity": "65",
"price": "23.55",
"average_price": "22.9",
"status": "Executed",
"order_datetime": "02-Feb-2026 10:12:00",
"expiry_date": "03-Feb-2026",
"right": "Call",
"strike_price": 25200.0,
"validity": "Day"
}
]
}
Notes / Tips
For UI grids, most useful columns are:
order_datetime,order_id,exchange_code,stock_codeaction,order_type,quantity,average_price,status
Other notes:
"IoC"validity may appear for some orders.priceis still present even for Market orders (Breeze often fills it with last/avg).
8.2 GetTradeListAsync
This method retrieves list of trades for given exchange code and given date band.
Method
public async Task<BreezeResponse<List<TradeListData>>> GetTradeListAsync(
string exchangeCode,
string fromDate,
string toDate)
{
Parameters
exchangeCode"NFO"for F&O (options/futures)"NSE"for cash market orders (if placed)
fromDate- Date string in
dd-MMM-yyyy - Example:
"02-Feb-2026"
- Date string in
toDate- Date string in
dd-MMM-yyyy - Example:
"02-Feb-2026"
- Date string in
Returns
A BreezeResponse<List<OrderDetailData>>:
Status = 200on successSuccess= list of orders (can be empty if no orders)
Example
var response = Await _breeze.GetTradeListAsync(
exchangeCode:="NFO",
fromDate:="01-Feb-2026",
toDate:="01-Feb-2026"
)
Sample Response
"Status": 200,
"Error": null,
"Success": [
{
"book_type": "Trade-Book",
"trade_date": "01-Feb-2026",
"stock_code": "NIFTY",
"action": "Sell",
"quantity": "65",
"average_cost": "76.55",
"brokerage_amount": "31",
"product_type": "Options",
"exchange_code": "NFO",
"order_id": "20260201XXXXXXXXXXX",
"segment": null,
"settlement_code": null,
"dp_id": null,
"client_id": null,
"ltp": "0",
"eatm_withheld_amount": null,
"cash_withheld_amount": null,
"total_taxes": "12.68",
"order_type": null,
"expiry_date": "03-Feb-2026",
"right": "Call",
"strike_price": "25000"
},
{
"book_type": "Trade-Book",
"trade_date": "01-Feb-2026",
"stock_code": "NIFTY",
"action": "Buy",
"quantity": "65",
"average_cost": "76.25",
"brokerage_amount": "31",
"product_type": "Options",
"exchange_code": "NFO",
"order_id": "20260201XXXXXXXXXXXXXXX",
"segment": null,
"settlement_code": null,
"dp_id": null,
"client_id": null,
"ltp": "0",
"eatm_withheld_amount": null,
"cash_withheld_amount": null,
"total_taxes": "7.67",
"order_type": null,
"expiry_date": "03-Feb-2026",
"right": "Call",
"strike_price": "25000"
}
]
}
8.3 GetTradeDetailsAsync
This method retrieves details of trade for given order ID
Method
public async Task<BreezeResponse<List<TradeDetailsData>>> GetTradeDetailsAsync(
string exchangeCode,
string orderID)
Parameters
exchangeCode"NFO"for F&O (options/futures)"NSE"for cash market orders (if placed)
orderID- Order ID string`
Example
Dim res = Await _breeze.GetTradeDetailsAsync("NFO", "XXXXXXXXXXXXXX")
Sample Response
"Status": 200,
"Error": null,
"Success": [
{
"settlement_id": null,
"exchange_trade_id": "XXXXXXXXXXXXXX",
"executed_quantity": "65",
"action": "S",
"total_transaction_cost": "1268",
"brokerage_amount": "31",
"taxes": null,
"eatm_withheld_amount": null,
"cash_withheld_amount": null,
"execution_price": "76.55",
"stock_code": "NIFTY",
"exchange_code": "NFO",
"trade_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"exchange_trade_time": "01-Feb-2026 15:17:50"
}
]
}
Chapter 9 — Historical Data (CSV Rows)
This chapter covers fetching historical OHLC candle data and returning it in a CSV-friendly format, ready for logging, Excel import, or file storage.
✅ Supports cash, futures, and options ✅ Returns string[] (header + rows) ✅ Ideal for back-testing, charts, and analysis
9.1 GetHistoricalDataCSVRowsAsync
Fetches historical candle data and converts it into CSV rows.
Method
Task<string[]?> GetHistoricalDataCSVRowsAsync(
string interval,
string fromDate,
string toDate,
string stockCode,
string exchangeCode,
string productType,
string expiryDate,
string right,
string strikePrice
)
Parameters
intervalCandle interval. Common values:1minute5minute15minute30minuteday
fromDateStart datetime indd-MMM-yyyy HH:mm:ssExample:01-Feb-2026 09:15:00toDateEnd datetime indd-MMM-yyyy HH:mm:ssExample:01-Feb-2026 15:30:00stockCodeUnderlying symbol Examples:NIFTY,BANKNIFTY,RELIANCEexchangeCodeNSE→ CashNFO→ Futures / Options
productTypecashfuturesoptions
expiryDateRequired for futures & options Format:dd-MMM-yyyyExample:03-Feb-2026Leave empty for cashrightcallputothers(cash / futures)
strikePriceRequired for options Example:25200Use0for cash / futures
Return Value
string[]
- Index 0 → CSV header
- Index 1..n → candle rows
Returns null if:
- API call fails
- No data available
CSV Format
Datetime,Open,High,Low,Close,Volume,OpenInterest
Example
var rows = await breeze.GetHistoricalDataCSVRowsAsync(
interval: "5minute",
fromDate: "01-Feb-2026 09:15:00",
toDate: "01-Feb-2026 15:30:00",
stockCode: "NIFTY",
exchangeCode: "NFO",
productType: "options",
expiryDate: "03-Feb-2026",
right: "call",
strikePrice: "25200"
);
if (rows != null)
{
Console.WriteLine($"Historical rows received = {rows.Length - 1}");
foreach (var r in rows)
Console.WriteLine(r);
}
else
{
Console.WriteLine("No historical data received.");
}
Sample Output (Truncated):
Datetime,Open,High,Low,Close,Volume,OpenInterest
2026-02-01 09:15:00,293.9,293.9,237.6,257.7,1407770,2497430
2026-02-01 09:20:00,256.35,263.9,247.4,260.75,862875,2657720
2026-02-01 09:25:00,260.35,275.05,255.9,272.05,894400,2669030
2026-02-01 09:30:00,272.25,272.9,259.1,265.7,502970,2673515
2026-02-01 09:35:00,265.35,270.6,261.2,265.1,326300,2682290
...
Notes & Best Practices
The method internally calls
GetHistoricalDataand only transforms results.Ideal for:
- Saving to
.csvfiles - Excel imports
- Charting libraries
- Saving to
Large date ranges may return many rows—use sensible intervals.
Chapter 10 — Symbol Naming Logic (Derivatives)
The Breeze SDK internally builds standardized trading symbols for Futures and Options using exchange-approved naming rules.
This chapter explains how symbols are constructed, so users can:
- Understand token maps
- Debug trades
- Cross-verify symbols with broker terminals
- Avoid symbol-format mistakes
⚠️ Note: Users normally do not need to call this logic directly. It is used internally by the SDK.
10.1 General Symbol Structure
Futures
{UNDERLYING}{EXPIRY}{FUT}
Options
{UNDERLYING}{EXPIRY}{STRIKE}{CE | PE}
10.2 Step-by-Step Symbol Construction Rules
1️⃣ Underlying (Short Name)
All spaces are removed
Examples:
"NIFTY"→NIFTY"BANK NIFTY"→BANKNIFTY
2️⃣ Expiry Date Format
Converted to
ddMMMyyMonth is always uppercase
Examples:
24-Feb-2026→24FEB2628-Apr-2026→28APR26
3️⃣ Instrument Type
| Instrument | Code Used |
|---|---|
| Futures | FUT |
| Call Option | CE |
| Put Option | PE |
4️⃣ Strike Price (Options Only)
Decimal part (if any) is removed
Examples:
31250.0→3125030500→30500
10.3 Complete Examples
Example 1 — Put Option
NIFTY24FEB2631250PE
Breakup:
NIFTY→ Underlying24FEB26→ Expiry date31250→ Strike pricePE→ Put Option
Example 2 — Call Option
NIFTY28APR2630500CE
Breakup:
NIFTY→ Underlying28APR26→ Expiry date30500→ Strike priceCE→ Call Option
Example 3 — Futures Contract
NIFTY24FEB26FUT
Breakup:
NIFTY→ Underlying24FEB26→ Expiry dateFUT→ Futures contract
10.4 Why This Matters
Correct symbol formatting is critical for:
- Token mapping (Security Master)
- Order placement
- WebSocket subscriptions
- Historical data queries
The SDK guarantees exchange-correct symbols, so users can focus on trading logic rather than string formatting.
Chapter 11 — Symbol → Token Map (NFO Security Master)
For WebSocket streaming and some broker operations, Breeze requires an instrument token. ICICI provides these tokens via the Security Master file (compressed ZIP).
The SDK downloads and parses this file and exposes a ready-to-use lookup map using:
public async Task<Dictionary<string, (string Token, int LotSize)>> GetSymbolTokenMapAsync(bool forceRefresh = false)
This method is typically called once after login and then cached in memory.
11.1 What This Method Returns
The returned dictionary structure is:
- Key → Symbol (constructed symbol name as explained in Chapter 10)
- Value →
(Token, LotSize)
So each entry represents:
| Field | Meaning |
|---|---|
| Symbol | Exchange-style instrument symbol (e.g., NIFTY03FEB2625200CE, NIFTY24FEB26FUT) |
| Token | Instrument token used for WebSocket subscription (numeric string) |
| LotSize | Lot size for that instrument (used for quantity calculations in lots) |
11.2 Sample Mapping Structure
Example rows (as produced from the security master):
| Symbol | Token | LotSize |
|---|---|---|
| PHOMIL28APR26FUT | 66968 | 350 |
| PIDIND28APR26FUT | 66969 | 500 |
| PIIND28APR26FUT | 66970 | 175 |
| PUNBAN28APR26FUT | 66983 | 8000 |
| PNBHOU28APR26FUT | 66984 | 650 |
| PBFINT28APR26FUT | 66985 | 350 |
| POLI28APR26FUT | 66986 | 125 |
| POWGRI28APR26FUT | 66987 | 1900 |
| ABBPOW28APR26FUT | 66988 | 50 |
| PIRPHA28APR26FUT | 66998 | 2625 |
| PREENR28APR26FUT | 66999 | 575 |
| PREEST28APR26FUT | 67000 | 450 |
| RBLBAN28APR26FUT | 67001 | 3175 |
11.3 Usage Example
Step 1 — Load and cache the map (after login)
var symbolTokenMap = await breeze.GetSymbolTokenMapAsync();
Console.WriteLine($"NFO map loaded. Count = {symbolTokenMap.Count}");
Step 2 — Build a symbol (Chapter 10) and lookup Token/LotSize
string symbol = breeze.BuildSymbol("NIFTY", "03-Feb-2026", "CE", "25200");
if (symbolTokenMap.TryGetValue(symbol, out var info))
{
string token = info.Token;
int lotSize = info.LotSize;
Console.WriteLine($"Symbol={symbol} | Token={token} | LotSize={lotSize}");
}
else
{
Console.WriteLine($"Symbol not found in map: {symbol}");
}
11.4 Performance Notes
- The first call downloads and parses a large file, so it may take ~30–60 seconds the first time.
- Subsequent calls are returned from memory cache unless
forceRefresh = true.
Force re-download + rebuild:
var freshMap = await breeze.GetSymbolTokenMapAsync(forceRefresh: true);
11.5 Why This Map Is Important
This map enables:
- ✅ WebSocket subscriptions for Options/Futures tokens
- ✅ Lot-size lookup for order placement in lots
- ✅ Symbol-to-token validation and debugging
- ✅ Faster bot logic (no repeated downloads)
Chapter 12 — WebSocket (Live Market Data Streaming)
The BreezeDotNet SDK supports real-time market data streaming using WebSockets via the BreezeWebSocket class.
This chapter explains:
- How to create and connect a WebSocket
- How to subscribe to Index, Futures, and Options tokens
- How to handle tick events correctly
- How token formats (
4.1!,1.1!) work in practice - Common mistakes and best practices
12.1 Prerequisites
Before using WebSocket streaming, you must:
- Create
BreezeClient - Complete Breeze login
- Generate session using
GenerateBreezeSessionAsync()
var breeze = new BreezeClient(apiKey, apiSecret);
await breeze.GenerateBreezeSessionAsync(apiSession);
❌ If session is not active, the SDK throws:
InvalidOperationException: No active session. Please login first.
12.2 WebSocket Usage Flow (Must Follow This Order)
The correct sequence is mandatory:
- Create WebSocket
- Attach event handlers
- Connect
- Subscribe to tokens
_ws = _breeze.CreateWebSocket()
SetupWebSocketHandlers()
Await _ws.WsConnectAsync()
Await _ws.SubscribeAsync(...)
12.3 Creating the WebSocket
Private _ws As BreezeDotNet.BreezeWebSocket
_ws = _breeze.CreateWebSocket()
⚠️ Do not create multiple WebSocket instances. Create once and reuse.
12.4 Attaching Event Handlers
Private Sub SetupWebSocketHandlers()
AddHandler _ws.OnConnected,
Sub(sender, e)
UiLog("[WS] Connected")
End Sub
AddHandler _ws.OnDisconnected,
Sub(sender, reason)
UiLog("[WS] Disconnected: " & reason)
End Sub
AddHandler _ws.OnError,
Sub(sender, err)
UiLog("[WS] ERROR: " & err)
End Sub
AddHandler _ws.OnMessage,
Sub(sender, msg)
' Optional: keep OFF in production
' UiLog(msg)
End Sub
AddHandler _ws.OnTick, AddressOf Ws_OnTick
End Sub
12.5 Connecting to WebSocket
If Not _ws.IsConnected Then
Await _ws.WsConnectAsync()
Await Task.Delay(1000)
End If
12.6 Subscribing to Tokens
12.6.1 Index Subscription (Example: NIFTY 50)
Await _ws.SubscribeAsync(BreezeWebSocket.NIFTY_50_TOKEN)
Token used internally:
4.1!NIFTY 50
12.6.2 Option / Futures Subscription (Numeric Token)
Dim optionToken As String = "42546"
Dim stockToken As String = BreezeWebSocket.GetNSEToken(optionToken)
Await _ws.SubscribeAsync(stockToken)
Generated token:
4.1!42546
✔ Confirmed live in market ✔ Works for Options and Futures
12.7 Complete Example (WinForms Button)
Private Async Sub btnStartOptionTicks_Click(sender As Object, e As EventArgs) _
Handles btnStartOptionTicks.Click
Try
If Not _isLoggedIn Then
MessageBox.Show("Please login first.")
Exit Sub
End If
If _ws Is Nothing Then
_ws = _breeze.CreateWebSocket()
SetupWebSocketHandlers()
End If
If Not _ws.IsConnected Then
Await _ws.WsConnectAsync()
Await Task.Delay(1500)
End If
_subscribedOptionToken = "42546"
_subscribedOptionStockToken = $"4.1!{_subscribedOptionToken}"
Await _ws.SubscribeAsync(4, _subscribedOptionToken)
UiLog("[WS] Option streaming started for " & _subscribedOptionStockToken)
Catch ex As Exception
UiLog("[WS] ERROR: " & ex.Message)
End Try
End Sub
12.8 Tick Event Handling (Recommended Pattern)
Goal:
- ✔ Show only LTP
- ✔ Avoid UI flooding
- ✔ Separate Index vs Option ticks
Private Sub Ws_OnTick(sender As Object, tick As TickData)
If Me.InvokeRequired Then
Me.BeginInvoke(New Action(Of Object, TickData)(AddressOf Ws_OnTick), sender, tick)
Return
End If
If tick Is Nothing OrElse String.IsNullOrWhiteSpace(tick.Symbol) Then Exit Sub
' 1) NIFTY Index
If tick.Symbol.Trim().Equals(BreezeWebSocket.NIFTY_50_TOKEN, StringComparison.OrdinalIgnoreCase) Then
If tick.Last.HasValue Then
txtNiftyLTP.Text = tick.Last.Value.ToString("0.00")
End If
Exit Sub
End If
' 2) Option token (ONLY our subscribed one)
If tick.Symbol.Trim().Equals(_subscribedOptionStockToken, StringComparison.OrdinalIgnoreCase) Then
txtOptionTicks.Text = If(tick.Last.HasValue,
tick.Last.Value.ToString("0.00"),
"NA")
Exit Sub
End If
End Sub
12.9 WebSocket Token Format Explained
Breeze WebSocket token format:
X.Y!<token>
Meaning of X (Exchange)
| X | Exchange |
|---|---|
| 1 | BSE |
| 4 | NSE (used for Index, Options, Futures) |
| 13 | NDX |
| 6 | MCX |
✅ Live market confirmed: Options & Futures also stream using
4
Meaning of Y (Market Depth)
| Y | Meaning |
|---|---|
| 1 | Level-1 (normal ticks) |
| 2 | Level-2 (market depth) |
Examples
| Instrument | Token |
|---|---|
| NIFTY Index | 4.1!NIFTY 50 |
| BANKNIFTY | 4.1!NIFTY BANK |
| SENSEX | 1.1!SENSEX |
| Option Token | 4.1!42546 |
12.10 SDK Helper Methods
BreezeWebSocket.GetNSEToken("42546"); // 4.1!42546
BreezeWebSocket.GetNFOToken("42546"); // 4.1!42546
BreezeWebSocket.GetBSEToken("500325"); // 1.1!500325
🔒 SDK is intentionally opinionated Uses correct live-tested formats Prevents common broker token mistakes
12.11 Common Mistakes & Fixes
| Issue | Fix |
|---|---|
| No ticks | Market closed / wrong token |
| Index ticks but no options | Use 4.1!<token> |
| UI freeze | Use InvokeRequired |
| Log flooding | Disable OnMessage |
| Wrong LTP shown | Filter by symbol |
✅ Chapter Summary
- ✔ Live-tested token formats
- ✔ Clean tick handling
- ✔ Production-safe patterns
- ✔ No raw JSON dumping
- ✔ UI-friendly
Chapter 13 — Disclaimer & Risk Disclosure
13.1 General Disclaimer
This SDK (BreezeDotNet) is provided “as is”, without warranty of any kind, express or implied.
The author(s) and distributor(s) of this SDK:
- Make no guarantees regarding correctness, completeness, or reliability
- Are not responsible for any losses, damages, or consequences arising from the use of this SDK
- Do not provide trading, financial, or investment advice
Use of this SDK is entirely at your own risk.
13.2 Market & Trading Risk Disclosure
Trading in financial markets—including equities, derivatives, futures, and options—involves substantial risk and may result in partial or complete loss of capital.
By using this SDK, you acknowledge and agree that:
- Market prices may move rapidly and unpredictably
- Network delays, API downtime, broker issues, or exchange issues may occur
- Orders may be executed at prices different from expected
- WebSocket data may be delayed, incomplete, or temporarily unavailable
You are solely responsible for:
- Verifying all market data independently
- Validating order parameters before placement
- Monitoring open positions and risk exposure
13.3 No Broker Affiliation
This SDK is not affiliated with, endorsed by, or supported by:
- ICICI Securities
- ICICI Direct
- NSE, BSE, or any exchange
- Any financial institution or broker
Additional notes:
- All trademarks, names, and identifiers belong to their respective owners.
- This SDK is an independent, community-developed integration based on publicly available API documentation and observed behavior.
13.4 Educational & Experimental Use
This SDK is distributed primarily for educational, learning, and experimental purposes, including:
- Understanding broker APIs
- Studying market data streaming
- Building prototypes and test applications
- Learning automation patterns
If you choose to use this SDK for live trading, you do so knowingly and voluntarily, fully accepting all associated risks.
13.5 No Liability for Losses
Under no circumstances shall the author(s) be liable for:
- Trading losses
- Missed trades
- Incorrect executions
- Application crashes
- Data inconsistencies
- System failures
- Financial, legal, or regulatory consequences
This includes (but is not limited to) losses resulting from:
- Bugs or logic errors in the SDK
- Misuse or incorrect integration by the user
- Changes in broker APIs
- Exchange halts or suspensions
13.6 User Responsibility
By using this SDK, you agree that:
- You have sufficient knowledge of financial markets
- You understand the risks involved in automated trading
- You will test thoroughly in paper / demo / small capital environments
- You accept full responsibility for all outcomes
If you do not agree with these terms, do not use this SDK.
13.7 Recommendation (Strongly Advised)
Before using this SDK in a live trading environment:
- ✔ Test all functionality during market hours
- ✔ Start with minimal capital
- ✔ Implement your own safety checks
- ✔ Add logging and monitoring
- ✔ Use stop-loss and risk controls
13.8 Final Note
This SDK is provided in good faith to support learning and development within the trading and automation community.
Trade responsibly. Test thoroughly. Assume full risk.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Newtonsoft.Json (>= 13.0.4)
- SocketIOClient (>= 3.1.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 181 | 2/7/2026 |