BreezeDotNet 1.0.0

dotnet add package BreezeDotNet --version 1.0.0
                    
NuGet\Install-Package BreezeDotNet -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="BreezeDotNet" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="BreezeDotNet" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="BreezeDotNet" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add BreezeDotNet --version 1.0.0
                    
#r "nuget: BreezeDotNet, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package BreezeDotNet@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=BreezeDotNet&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=BreezeDotNet&version=1.0.0
                    
Install as a Cake Tool

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:

  1. Initialize the Breeze client
  2. Generate the login URL
  3. Create a Breeze session
  4. 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 = populated FundsData object (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:

  1. Low-level (most flexible) Use GetQuotesAsync(QuotesRequest) where you explicitly pass exchange/product/expiry/right/strike.

  2. 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 = 200 means success
  • Success contains one or more QuotesData records

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"
    }
  ]
}

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: Success is a list, but typically it contains one record for the provided orderId.


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)
  • null if 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
  • null if 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 = 200 on success
  • Success.order_id
  • Success.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"
  }
}

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 /order endpoint.

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_date
  • right = "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 = 200 on success
  • Success = 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, Success may be an empty list (count = 0).

  • Useful fields to display in your UI/log:

    • exchange_code, stock_code, expiry_date, strike_price, right
    • action, quantity, average_price, ltp
    • underlying (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"
  • toDate

    • Date string in dd-MMM-yyyy
    • Example: "02-Feb-2026"

Note: Internally your SDK converts these to ISO for checksum/body.

Returns

A BreezeResponse<List<OrderDetailData>>:

  • Status = 200 on success
  • Success = 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_code
  • action, order_type, quantity, average_price, status

Other notes:

  • "IoC" validity may appear for some orders.
  • price is 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"
  • toDate

    • Date string in dd-MMM-yyyy
    • Example: "02-Feb-2026"
Returns

A BreezeResponse<List<OrderDetailData>>:

  • Status = 200 on success
  • Success = 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
  • interval Candle interval. Common values:

    • 1minute
    • 5minute
    • 15minute
    • 30minute
    • day
  • fromDate Start datetime in dd-MMM-yyyy HH:mm:ss Example: 01-Feb-2026 09:15:00

  • toDate End datetime in dd-MMM-yyyy HH:mm:ss Example: 01-Feb-2026 15:30:00

  • stockCode Underlying symbol Examples: NIFTY, BANKNIFTY, RELIANCE

  • exchangeCode

    • NSE → Cash
    • NFO → Futures / Options
  • productType

    • cash
    • futures
    • options
  • expiryDate Required for futures & options Format: dd-MMM-yyyy Example: 03-Feb-2026 Leave empty for cash

  • right

    • call
    • put
    • others (cash / futures)
  • strikePrice Required for options Example: 25200 Use 0 for 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 GetHistoricalData and only transforms results.

  • Ideal for:

    • Saving to .csv files
    • Excel imports
    • Charting libraries
  • 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 ddMMMyy

  • Month is always uppercase

  • Examples:

    • 24-Feb-2026 → 24FEB26
    • 28-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 → 31250
    • 30500 → 30500

10.3 Complete Examples

Example 1 — Put Option

NIFTY24FEB2631250PE

Breakup:

  • NIFTY → Underlying
  • 24FEB26 → Expiry date
  • 31250 → Strike price
  • PE → Put Option

Example 2 — Call Option

NIFTY28APR2630500CE

Breakup:

  • NIFTY → Underlying
  • 28APR26 → Expiry date
  • 30500 → Strike price
  • CE → Call Option

Example 3 — Futures Contract

NIFTY24FEB26FUT

Breakup:

  • NIFTY → Underlying
  • 24FEB26 → Expiry date
  • FUT → 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:

  1. Create BreezeClient
  2. Complete Breeze login
  3. 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:

  1. Create WebSocket
  2. Attach event handlers
  3. Connect
  4. 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

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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