Meta description: A production-focused C++ SDK for Jainam ProTrade Open API v2, covering authentication, portfolio APIs, orders, historical data, contract masters, CMake integration, and WebSocket feeds.
Developed by Sreenivasulu Malkari
C++ remains one of the most important languages in trading technology.
It is widely used in high-performance systems, low-latency applications, market-data infrastructure, execution engines, desktop trading software, and backend services where predictable performance and fine-grained control matter.
At the same time, integrating a broker API in C++ can be more involved than doing the same work in a scripting language. Developers have to manage HTTP requests, JSON parsing, authentication, checksums, build systems, dependencies, WebSocket connections, threading, error handling, and deployment.
That is why I built Jainam API C++: a dedicated C++ SDK for developers integrating with the Jainam ProTrade Open API v2.
The project provides a reusable foundation for authentication, account data, portfolio APIs, order management, contract downloads, historical data, live market feeds, and order-update WebSockets.
GitHub repository:
github.com/malkarisreenivasulu/jainam-api-cpp
Why I Built a Dedicated C++ SDK
C++ developers should not have to depend on examples written for Python or another language when building production trading infrastructure.
A proper C++ integration should have its own:
- CMake configuration
- dependency management
- examples
- tests
- release history
- API documentation
- WebSocket implementation
- security guidelines
- platform compatibility
- live-trading safeguards
Jainam API C++ was created as a standalone project so that developers can use it naturally in existing C++ applications.
The SDK is suitable for:
- trading gateways
- market-data applications
- portfolio systems
- order-management tools
- low-latency backend services
- desktop trading software
- alerting systems
- research platforms
- execution engines
- educational broker API projects
Why C++ Still Matters in Trading Systems
Trading applications often need to process a large number of events while maintaining low and predictable latency.
C++ gives developers direct control over:
- memory allocation
- threading
- networking
- object lifetime
- data structures
- serialization
- performance-critical code paths
That control makes C++ a natural fit for systems where timing and resource usage matter.
Typical trading components written in C++ include:
Market Data Feed Handler
Order Management System
Execution Engine
Risk Engine
Strategy Runtime
Exchange Gateway
Portfolio Service
Realtime Analytics
Not every broker application needs microsecond latency, but using C++ gives developers the flexibility to scale toward more demanding workloads if needed.
Installing Jainam API C++
The project uses CMake, making it straightforward to integrate into modern C++ applications.
Clone the repository:
git clone https://github.com/malkarisreenivasulu/jainam-api-cpp.git
cd jainam-api-cpp
Create a build directory:
cmake -S . -B build
Build the project:
cmake --build build
Run tests:
ctest --test-dir build --output-on-failure
For the exact compiler requirements and supported dependencies, refer to the beginner setup guide:
Version v0.1.0
The first public release is available here:
github.com/malkarisreenivasulu/jainam-api-cpp/releases/tag/v0.1.0
The v0.1.0 package includes support for:
- authentication
- account profile
- funds
- holdings
- positions
- orders
- trades
- margins
- historical data
- contract downloads
- market-data WebSockets
- order-update WebSockets
- CMake integration
- examples
- automated tests
- security documentation
- guarded live-trading methods
Authentication with Jainam ProTrade
The authentication flow begins by creating an application in the Jainam developer portal.
Jainam Developers:
https://protrade.jainam.in/developers
Your application will use values such as:
App Code
Callback URL
API Secret
The API secret should be stored securely.
Do not commit credentials to:
Git repositories
configuration files
example code
screenshots
logs
test fixtures
After login, Jainam redirects the user to the configured callback with an authorization code and user ID.
The documented checksum is based on:
SHA-256(userId + authCode + apiSecret)
The SDK handles the authentication exchange so that applications do not need to reimplement the protocol repeatedly.
Keep Authentication Data Private
Broker sessions and secrets should be treated with the same care as passwords.
Do not log:
API secrets
authorization codes
user sessions
access tokens
passwords
OTP values
full account responses
For local development, environment variables are usually preferable to hard-coded values.
For example:
export JAINAM_USER_ID="your-user-id"
export JAINAM_USER_SESSION="your-session"
In production environments, use a proper secrets-management solution.
Creating an API Client
A typical C++ application should create the Jainam client once authentication is complete.
The client can then be reused for account, portfolio, contract, and trading operations.
A simplified application structure might look like:
#include <iostream>
#include "jainam/client.hpp"
int main() {
// Initialize Jainam client using secure configuration.
// Perform read-only account request.
// Check errors explicitly.
return 0;
}
The exact interfaces and supported methods are documented in the API reference:
Start with Read-Only APIs
When testing a new broker integration, begin with endpoints that do not intentionally modify trading state.
Useful examples include:
Profile
Funds
Holdings
Positions
Order Book
Trade Book
These calls help verify:
- authentication
- session validity
- HTTP configuration
- JSON parsing
- network connectivity
- response handling
without intentionally submitting a new order.
Account and Portfolio APIs
A broker SDK becomes much more useful when it provides a consistent interface across all major account APIs.
Jainam API C++ includes support for account and portfolio data such as:
Profile
Funds
Holdings
Positions
Orders
Trades
Margins
These APIs can be used to build:
- portfolio dashboards
- reconciliation systems
- position monitors
- risk dashboards
- account reporting
- trade journals
Contract Masters Come Before Orders
One of the most important lessons in broker API integration is that the trading symbol alone is often not enough.
A broker may require a specific instrument ID.
That ID should come from the current contract master.
Never permanently hard-code an instrument identifier copied from:
- a blog post
- an old CSV file
- a screenshot
- another broker’s API
- a previous trading session
Instead, download and process the latest contract data.
A production application should verify:
Exchange
Segment
Trading Symbol
Instrument ID
Lot Size
Tick Size
Instrument Type
before constructing an order.
Building a Contract Index
Repeatedly scanning a contract CSV file is inefficient.
A better approach is to load contract data into an indexed structure during application startup.
Useful indexes might include:
exchange + symbol
instrument ID
ISIN
segment + symbol
In C++, this could be implemented using containers such as:
std::unordered_map
std::map
std::vector
For example:
std::unordered_map<std::string, Contract> by_symbol;
std::unordered_map<std::string, Contract> by_instrument_id;
This allows fast instrument resolution before an order is created.
Why Contract Validation Matters
A trading application should never assume that a familiar symbol automatically maps to the correct broker contract.
Before sending an order, verify that the instrument belongs to the expected:
Exchange
Market Segment
Product Type
Lot Size
This is especially important for derivatives, ETFs, indices, and similarly named securities.
Creating Orders Safely
Order creation should be explicit.
A typical order model contains fields such as:
Exchange
Instrument ID
Transaction Type
Quantity
Product
Order Type
Price
Validity
Order Tag
For example:
Order order;
order.exchange = "NSE";
order.instrument_id = "VERIFY_FROM_TODAYS_CONTRACT";
order.transaction_type = "BUY";
order.quantity = 1;
order.product = "LONGTERM";
order.order_type = "LIMIT";
order.price = "VERIFY_CURRENT_PRICE";
order.validity = "DAY";
order.order_tag = "jainam-api-cpp";
The exact types and interfaces may differ depending on the SDK version, so always check the current API reference.
Review Before Sending
A live trading system should validate an order before passing it to the broker.
Useful checks include:
Correct exchange?
Correct instrument?
Correct side?
Correct quantity?
Correct product?
Correct order type?
Correct limit price?
Correct market session?
Enough available limits?
Within configured risk limits?
The SDK includes guarded live-trading methods so that an accidental function call does not automatically become an unreviewed live order.
This is an accident-prevention feature, not a complete risk engine.
Build Independent Risk Controls
The broker SDK should not be your only line of defense.
Production applications should add their own independent trading controls.
Examples include:
Maximum Quantity
Reject orders above a configured quantity.
Maximum Order Value
Estimate order value and reject oversized transactions.
Position Limits
Prevent strategies from exceeding configured exposure.
Daily Loss Limits
Stop new order generation after predefined loss thresholds are reached.
Allowed Instrument Lists
Restrict trading to explicitly approved instruments.
Duplicate Order Protection
Detect repeated submissions caused by retries or application bugs.
Stale Market Data Checks
Do not generate new trading decisions when market data is outdated.
Kill Switch
Allow operators to immediately prevent new orders.
Avoid Dangerous Automatic Retries
Retries require special care in trading systems.
Suppose an application submits an order and the network connection fails before the broker’s response reaches the client.
The application does not know whether the broker received the request.
Automatically submitting the same order again could create a duplicate trade.
For state-changing operations, use:
Order tags
Request tracking
Reconciliation
Duplicate detection
Broker order-book checks
Read-only APIs are generally much safer to retry.
Historical Market Data
The SDK includes support for historical data APIs.
Historical candles can be used for:
- charting
- indicators
- strategy research
- volatility studies
- backtesting
- analytics
- market behavior research
A common application pipeline might look like:
Jainam Historical API
|
v
C++ Data Loader
|
v
Candle Store
|
+--> Indicators
+--> Research
+--> Backtest Engine
+--> Statistics
Historical data should always be validated before being used in research.
Check for:
Missing candles
Timestamp alignment
Session boundaries
Corporate actions
Instrument changes
Invalid values
Live Market Data with WebSockets
Trading applications usually need WebSockets for real-time market data.
Jainam API C++ includes a market WebSocket implementation for consuming live price and depth updates.
A scalable architecture might look like:
Jainam Market WebSocket
|
v
Feed Handler
|
v
Decoder
|
v
Queue
|
+-----+-----+
| |
v v
Strategy Storage
Engine
|
v
Risk Engine
|
v
Order Manager
The network handler should remain lightweight.
Do not run expensive strategy calculations directly inside a WebSocket receive callback.
Keep the WebSocket Callback Fast
A bad design might do this:
void on_message(const Message& msg) {
run_large_strategy();
query_database();
call_external_service();
send_order();
}
This can block future network processing.
A better approach is to enqueue the message:
void on_message(const Message& msg) {
queue.push(msg);
}
Then process the queue on another worker thread.
This separates networking from application logic and makes the system easier to reason about.
Order-Update WebSockets
Market prices are only part of a trading application.
You also need real-time updates about order state.
The C++ SDK includes support for order-update WebSockets so applications can react to events such as:
Order accepted
Order rejected
Order modified
Order cancelled
Partial fill
Complete fill
These events are useful for maintaining a local order state.
WebSockets Are Not the Final Source of Truth
Real-time WebSockets are important, but they should not be the only mechanism used to determine account state.
Applications should periodically reconcile against REST APIs such as:
Order Book
Trade Book
Positions
Holdings
Why?
Because:
Networks disconnect
Applications restart
Messages can arrive late
Subscriptions can fail
Processes can crash
Periodic reconciliation makes the application more robust.
Reconnection Strategy
A production WebSocket system should expect disconnects.
Use bounded exponential backoff.
For example:
1 second
2 seconds
4 seconds
8 seconds
16 seconds
30 seconds
30 seconds
Do not reconnect continuously in a tight loop.
Adding a small amount of random jitter can also prevent many clients from reconnecting simultaneously.
Restore Subscriptions
After reconnecting, the application should restore its previous market subscriptions.
That means subscription state should exist independently from the socket object.
For example:
std::unordered_set<std::string> subscriptions;
When the socket reconnects, iterate through the saved subscription set and restore the feed.
Detect Stale Data
An open WebSocket does not guarantee that useful market data is still arriving.
Track the timestamp of the most recent valid message.
Conceptually:
last_message = 10:15:05
now = 10:15:20
If the feed has been silent longer than expected, the application can:
Raise an alert
Pause strategy execution
Reconnect
Move into a safe state
This is a key operational safeguard for automated trading systems.
Threading and Concurrency
C++ gives developers powerful concurrency tools, but those tools should be used carefully.
A trading system might use separate threads for:
Market data
Order updates
REST requests
Strategy execution
Persistence
Monitoring
Risk checks
Modern C++ provides tools including:
std::thread
std::mutex
std::condition_variable
std::atomic
std::future
The exact architecture depends on the application.
The important principle is to avoid shared mutable state wherever possible.
Protect Shared State
If multiple threads access the same order book, position store, or connection object, synchronization is required.
For example:
std::mutex state_mutex;
Then protect shared updates:
{
std::lock_guard<std::mutex> lock(state_mutex);
// update shared state
}
Poorly synchronized state can create extremely difficult trading bugs.
Potential consequences include:
Duplicate orders
Incorrect positions
Corrupted state
Deadlocks
Race conditions
Stale values
Design a Clean Order Pipeline
A useful production architecture is:
Strategy
|
v
Order Intent
|
v
Risk Validation
|
v
Order Manager
|
v
Jainam API
|
v
Order Update Feed
|
v
Reconciliation
This is preferable to allowing strategy code to call the broker directly from many places.
A centralized order manager provides a single point where:
Risk controls
Logging
Retries
Order tags
Rate limits
Reconciliation
can be applied consistently.
Error Handling in C++
A financial application should never silently ignore errors.
Avoid code that discards return values without understanding whether the request succeeded.
Instead, handle expected failure categories explicitly.
Examples include:
Authentication failure
Network timeout
Connection refused
Invalid JSON
Invalid request
Broker rejection
Exchange rejection
WebSocket disconnect
Unexpected response
Internal application error
Different errors should lead to different behavior.
For example:
Temporary network error -> retry carefully
Authentication failure -> stop and re-authenticate
Invalid order -> reject locally
WebSocket disconnect -> reconnect with backoff
Stale feed -> suspend strategy
Logging Without Exposing Secrets
Logging is essential in trading infrastructure.
But sensitive values should never appear in normal application logs.
Do not log:
API secrets
sessions
authorization codes
passwords
OTP values
full authorization headers
personal account information
Prefer structured operational logs such as:
event=order_request
exchange=NSE
symbol=EXAMPLE
quantity=1
side=BUY
order_type=LIMIT
request_id=abc123
That provides useful debugging information without exposing credentials.
CMake Integration
One of the goals of Jainam API C++ is to fit naturally into modern C++ projects.
CMake makes it easier to:
Build locally
Run CI
Manage dependencies
Create examples
Run tests
Integrate with IDEs
Support Linux
Support macOS
A downstream project can integrate the SDK into its existing CMake structure rather than depending on manual compiler commands.
For detailed setup instructions, see:
Tested on Linux and macOS
The project has automated test coverage across supported environments.
Successful Linux and macOS CI runs are available in GitHub Actions:
Successful Linux and macOS tests
Automated testing helps verify:
Compilation
Dependencies
Core SDK behavior
Examples
Platform compatibility
without requiring live broker credentials.
Testing Without Real Orders
Automated test pipelines should never send real trades.
Jainam API C++ uses test infrastructure designed around controlled or fake responses rather than live trading credentials.
Good test data should contain values such as:
USER_TEST_001
SESSION_FAKE_001
INSTRUMENT_TEST
ORDER_TEST_001
Never commit:
Real user sessions
API secrets
Account numbers
Personal information
Real authorization responses
Security Documentation
Trading libraries handle highly sensitive information.
Security documentation is therefore an important part of the project.
Developers should consider:
Credential storage
Session handling
Logging
Configuration
Transport security
Source-control hygiene
CI secrets
Crash dumps
Debug output
A trading application can be technically correct while still being unsafe if credentials are handled carelessly.
Project Documentation
The repository includes dedicated documentation for different levels of users.
Main Repository
github.com/malkarisreenivasulu/jainam-api-cpp
C++ Blog Article
Beginner Setup Guide
API Reference
Release v0.1.0
github.com/malkarisreenivasulu/jainam-api-cpp/releases/tag/v0.1.0
Suggested Project Structure
A larger C++ trading application might use a layout such as:
src/
auth/
contracts/
market_data/
orders/
portfolio/
risk/
strategy/
storage/
include/
trading/
tests/
unit/
integration/
config/
docs/
CMakeLists.txt
Keeping these components separate prevents the broker API client from becoming tightly coupled with strategy logic.
A Practical C++ Trading Architecture
A more complete architecture might look like this:
+----------------------+
| Jainam ProTrade REST |
+----------+-----------+
|
v
+----------------------+
| Jainam API C++ Client|
+----------+-----------+
|
+----------------+----------------+
| |
v v
+----------------+ +----------------+
| Portfolio Data | | Order Manager |
+----------------+ +--------+-------+
|
v
+----------------+
| Risk Engine |
+--------+-------+
|
v
+----------------+
| Order Submission|
+----------------+
+----------------------+
| Market WebSocket |
+----------+-----------+
|
v
+----------------+
| Feed Handler |
+-------+--------+
|
v
+----------------+
| Event Queue |
+-------+--------+
|
+--------------+--------------+
| |
v v
+--------------+ +---------------+
| Strategy | | Persistence |
| Engine | | / Analytics |
+------+-------+ +---------------+
|
v
+--------------+
| Risk Engine |
+--------------+
The exact architecture will depend on your application, but separating concerns makes systems safer and easier to maintain.
Why C++ for Broker Integration?
C++ may require more setup than Python, but it also gives developers powerful advantages.
Performance
Compiled native code is well suited to processing high event rates.
Memory Control
Developers can choose precisely how objects and buffers are managed.
Strong Type System
Clear types can help prevent accidental mixing of values such as instrument IDs, quantities, and prices.
Mature Ecosystem
C++ has mature libraries for:
HTTP
WebSockets
JSON
Cryptography
Databases
Logging
Testing
Concurrency
Easy Integration with Existing Trading Infrastructure
Many existing financial systems, exchange gateways, and market-data platforms are already written in C++.
A native broker SDK can integrate directly into those environments.
When C++ Is the Right Choice
C++ is particularly attractive when you are building:
Long-running trading services
High-throughput market-data systems
Native desktop applications
Execution infrastructure
Realtime analytics
Low-latency services
Existing C++ trading platforms
For quick research notebooks, Python may be more convenient.
For browser applications, TypeScript may be a better fit.
For enterprise systems, Java or C# may be appropriate.
The language should match the architecture and operational requirements of the project.
Open a Jainam Account
If you need a Jainam account, you may use one of my referral links.
Jainam Premium
https://jplus.jainam.in/refer/feSFm58qRQBC
Jainam DIY
https://jplus.jainam.in/refer/aPY9Y2QeHnTy
Referral disclosure: I may receive a referral benefit if you register through these links. Please verify Jainam’s latest pricing, brokerage charges, features, eligibility requirements, and terms directly with Jainam before choosing a plan.
Part of the Jainam API SDK Family
Jainam API C++ is part of a broader effort to provide dedicated SDKs for developers using different programming languages.
The projects are kept separate so that each repository can follow the conventions of its own ecosystem.
Current projects include:
Jainam API Python
github.com/malkarisreenivasulu/jainam-api-python
Jainam API Go
github.com/malkarisreenivasulu/jainam-api-go
Jainam API C++
github.com/malkarisreenivasulu/jainam-api-cpp
Jainam Connect
The Jainam Connect landing repository provides a central place for discovering the language-specific projects:
github.com/malkarisreenivasulu/jainam-connect
About the Developer
Jainam API C++ was developed by Sreenivasulu Malkari.
I created the project to give C++ developers a focused and reusable way to work with the Jainam ProTrade Open API without relying on examples designed for another programming language.
The project is intended for:
- C++ developers
- backend engineers
- fintech programmers
- students
- algo-trading developers
- market-data developers
- system programmers
- developers learning broker integrations
You can find the project and my other work here:
Jainam API C++:
github.com/malkarisreenivasulu/jainam-api-cpp
GitHub profile:
github.com/malkarisreenivasulu
If the project helps you, consider starring the repository.
Contributions, bug reports, and tested improvements are welcome.
When reporting issues, always remove:
API credentials
Sessions
Authorization codes
Account information
Personally identifiable information
Final Thoughts
A broker API integration is much more than a collection of REST requests.
A reliable trading system needs to think about:
- authentication
- session security
- contract resolution
- order validation
- market-data streaming
- order updates
- reconnection
- reconciliation
- concurrency
- error handling
- logging
- monitoring
- testing
- risk controls
C++ gives developers the performance and control required to build these systems while integrating naturally with existing high-performance trading infrastructure.
Jainam API C++ provides a reusable starting point for developers who want to work with the Jainam ProTrade Open API from modern C++ applications.
If you are building a C++ market-data service, trading backend, portfolio system, execution tool, or learning project, you can start here:
github.com/malkarisreenivasulu/jainam-api-cpp
Developed by Sreenivasulu Malkari.
Disclaimer
Jainam API C++ is an independent software-development project developed by Sreenivasulu Malkari.
This article, source code, documentation, examples, and related software are provided for educational and software-development purposes only.
They do not constitute:
- investment advice
- financial advice
- trading advice
- a recommendation to buy or sell any security
- a guarantee of trading performance
Trading and automated trading involve financial risk.
Broker APIs, exchange specifications, market rules, contract data, margin requirements, trading hours, and pricing can change.
Before connecting any software to a live account:
- verify the latest Jainam documentation
- download the latest contract master
- verify all instrument identifiers
- test read-only APIs first
- validate all order parameters
- implement independent risk controls
- protect credentials
- monitor WebSocket connectivity
- reconcile orders and trades
- maintain a kill switch
- actively monitor all live systems
Use the SDK carefully and review all live-trading workflows before enabling real order submission.