The official Java client for communicating with PaytmMoney Equity API.
PMClient is a set of REST-like APIs that expose many capabilities required to build a complete investment and trading platform. Execute orders in real time, manage user portfolio, stream live market data (WebSockets), and more, with the simple HTTP API collection.
PaytmMoney Technology Pvt Ltd (c) 2022. Licensed under the MIT License.
-
Download PMClient jar file and include it in your build path.
-
This jar will work only in springboot application.
-
To use pmclient jar in your springboot app, add the jar file in libs directory of your project and then add the following line in your build.gradle
implementation files('libs/pmclient-1.1.4.jar') -
For maven project, you can add this line in pom.xml
-
<dependency> <groupId>com.paytmmoney.equities</groupId> <artifactId>pmclient</artifactId> <version>1.1.4</version> <scope>system</scope> <systemPath>${basedir}/libs/pmclient-1.1.4.jar</systemPath> </dependency>
-
Include com.paytmmoney.equities.pmclient into build path from maven. Use version 1.1.4
-
To use pmclient in Android, you need to include jar file in the libs directory and add the following line in you module's gradle file
compile files('dist/pmclient-1.1.4.jar')
Create PMClient object to use SDK for any call Order or Account API.
//Initialize PMClient using apiKey and apiSecretKey.User needs to create an object of SDK, by passing apiKey and SecretKey
PMClient pmClient=new PMClient("your_apiKey","your_api_secret_key");
// Initialize PMClient using apiKey, apiSecretKey and jwt tokens if user has already generated.
PMClient pmClient=new PMClient("your_apiKey","your_api_secret_key","accessToken","publicAccessToken","readAccessToken");User need to generate session or set access token to use Api's
- A user can call the login method and get the login URL.
- A user manually executes a login url in the browser and fetches requestToken after authentication (validating username, password, OTP and passcode).
- A user can call the generate_sessions method after pass requestToken to generate a session (access_token/jwt token)
- Users can call the logout method to invalidate the session.
//Get login url. Use this url in browser to login user, after authenticating user you will get requestToken. Use the same to get accessToken.
//stateKey : Variable key which merchant/fintech company expects Paytm Money to return with Request Token. This can be string.
String url=pmClient.login("stateKey");
// Once requestToken is obtained user can generate accessToken by calling generateSession,
String session=pmClient.generateSession("request_token");After successfully generate session, All api use same session to call Paytmmoney Api's
pmClient.setAccessToken("your_access_token");
pmClient.setPublicAccessToken("your_public_access_token");
pmClient.setReadAccessToken("your_read_access_token");- Here user can place regular, cover and bracket orders.
- For cover order, user has to add trigger_price in argument
- For bracket order user has to add stoploss_value in argument.
- Prepare Order Body object and only fill params which is required for order
//sample regular order request object
OrderReqDto orderReqDto=OrderReqDto.builder().txnType("B").exchange("NSE").segment("E").product("I").securityId("371").quantity(100L).validity("DAY").orderType("LMT").price(2085D).source("N").offMktFlag("false").build();//sample bracket order request object
OrderReqDto orderReqDto=OrderReqDto.builder().source("N").txnType("B").exchange("NSE").segment("E").product("B").securityId("371").quantity(100L).validity("DAY").orderType("MKT").price(0D).stopLossValue(2d).profitValue(4d).build();//sample cover order request object
OrderReqDto orderReqDto=OrderReqDto.builder().source("N").txnType("B").exchange("NSE").segment("E").product("V").securityId("11483").quantity(100L).validity("DAY").orderType("MKT").price(0D).triggerPrice(1690D).build();//Place order either for regular, either for cover or for bracket order, only request body should be changed OrderResDto
OrderResDto orderResDto=pmClient.placeOrder(orderReqDto);- Here user can modify regular, cover and bracket orders
- For cover order in argument user has to add leg_no
- For bracket order in argument user has to add leg_no & algo_order_no
//sample regular modify order request object
OrderReqDto orderReqDto=OrderReqDto.builder().source("N").txnType("B").exchange("NSE").segment("E").product("I").securityId("371").quantity(120L).validity("DAY").orderType("LMT").price(2084D).offMktFlag("false").mktType("NL").orderNo(order.getOrderNo()).serialNo(order.getSerialNo()).groupId(order.getGroupId()).build();//sample bracket modify order request object
OrderReqDto orderReqDto=OrderReqDto.builder().source("N").txnType("B").exchange("NSE").segment("E").product("B").securityId("371").quantity(120L).validity("DAY").orderType("MKT").price(0D).offMktFlag("false").mktType("NL").orderNo(order.getOrderNo()).serialNo(order.getSerialNo()).groupId(order.getGroupId()).legNo(order.getLegNo()).algoOrderNo(order.getAlgoOrdNo()).build()//sample cover modify order request object
OrderReqDto orderReqDto=OrderReqDto.builder().source("N").txnType("B").exchange("NSE").segment("E").product("V").securityId("11483").quantity(120L).validity("DAY").orderType("MKT").price(0D).offMktFlag("false").mktType("NL").orderNo(order.getOrderNo()).serialNo(order.getSerialNo()).groupId(order.getGroupId()).legNo(order.getLegNo()).build()//Modify order either for regular, either for cover or for bracket order, only request body should be changed
OrderResDto orderResDto=pmClient.modifyOrder(OrderReqDto)- Here User can Cancel Orders
- For cover order in argument user has to add leg_no
- For bracket order in argument user has to add leg_no & algo_order_no
//sample regular cancel order request object
OrderReqDto orderReqDto=OrderReqDto.builder().source("N").txnType("B").exchange("NSE").segment("E").product("I").securityId("371").quantity(50L).validity("DAY").orderType("LMT").price(2084D).offMktFlag("false").mktType("NL").orderNo(order.getOrderNo()).serialNo(order.getSerialNo()).groupId(order.getGroupId()).build();//sample bracket cancel order request object
OrderReqDto orderReqDto=OrderReqDto.builder().source("N").txnType("B").exchange("NSE").segment("E").product("B").securityId("371").quantity(100L).validity("DAY").orderType("MKT").price(0D).offMktFlag("false").mktType("NL").orderNo(order.getOrderNo()).serialNo(order.getSerialNo()).groupId(order.getGroupId()).legNo(order.getLegNo()).algoOrderNo(order.getAlgoOrdNo()).build();//sample cover cancel order request object
OrderReqDto orderReqDto=OrderReqDto.builder().source("N").txnType("B").exchange("NSE").segment("E").product("V").securityId("11483").quantity(100L).validity("DAY").orderType("MKT").price(0D).offMktFlag("false").mktType("NL").orderNo(order.getOrderNo()).serialNo(order.getSerialNo()).groupId(order.getGroupId()).legNo(order.getLegNo()).build();//Cancel order either for regular, either for cover or for bracket order, only request body should be changed
OrderResDto orderResDto=pmClient.cancelOrder(OrderReqDto)- It will convert only regular order.
- The above details can be generated by TPIN APIs
ConvertOrderReqDto conertOrder=ConvertOrderReqDto.builder().source("N").txnType("B").exchange("NSE").mktType("NL").segment("E").productFrom("I").productTo("I").quantity(100L).source("N").build();OrderResDto orderResDto=pmClient.convertOrder(conertOrder);- Get all the positions
TradeDetailsDto tradeDetails=pmClient.getPosition();- Get position detail of specific stock
PositionDto position=pmClient.positionDetails(security_id,product,exchange);- it will give funds details
FundSummaryDto fundSummary=pmClient.getFundSummary();- Get value of the holdings
HoldingValueDto userHoldingValue=pmClient.getHoldingsValue();- Get holdings data of User
UserHoldingDto userHoldingData=pmClient.getHoldingsData();- GET Order Margin Cal
OrderMarginCalDto orderMargin=pmClient.getOrderMarginCalculator(source,exchange,segment,securityId,txnType,qty,price,product,triggerPrice);- Post Order Margin Cal
ScriptMarginCalResDto scriptMarginCalResDto=pmClient.postScriptMarginCalculator(scriptMarginCalReqDto);- Get security master
- User can filter by fileName
- To get the supported fileName API Doc for fileNames
//it returns response in csv format
String securityMaster=pmClient.getSecurityMaster("fileName");- Generate TPIN for eDIS
TpinGenerateResDto tpinGenerateResDto=pmClient.generateEdisTpin();- Validate for eDIS
EdisResDto edisResDto=pmClient.validateEdisTpin(edisValidateReqDto);- Get status for eDIS
EdisResDto edisResDto=pmClient.getEdisStatus(edisReqId);- To create a GTT order.
GTTOrderResDto gTTOrderResDto=pmClient.createGtt(gttOrderReqDto);- To get all GTT or get by pml_id or status.
GTTGetAllResDto gTTGetAllResDto=pmClient.getAllGtt(pmlId,status);- To get GTT by Id.
GTTOrderResDto gTTOrderResDto=pmClient.getGtt(id);- To update GTT by Id.
GTTOrderResDto gTTOrderResDto=pmClient.updateGtt(id, gttOrderReqDto);- To Delete GTT by Id.
GTTOrderResDto gTTOrderResDto=pmClient.deleteGtt(id);- To get expiry of the GTT.
GTTOrderResDto gTTOrderResDto=pmClient.getGttExpiry(pmlId)- To get the aggregate of the GTTs.
GTTAggregateResDto gTTAggregateResDto=pmClient.getGttAggregate()- To GTT by InstructionId.
GTTOrderResDto gTTOrderResDto=pmClient.getGttByInstructionId(id)- To create a GTT order.
GTTOrderV2ResDto gTTOrderV2ResDto=pmClient.createGttV2(gttOrderV2ReqDto);- To get all GTT or get by pml_id or status.
GTTGetAllV2ResDto gTTGetAllV2ResDto=pmClient.getAllGttV2(pmlId,status);- To get GTT by Id.
GTTOrderV2ResDto gTTOrderV2ResDto=pmClient.getGttV2(id);- To update GTT by Id.
GTTOrderV2ResDto gTTOrderV2ResDto=pmClient.updateGttV2(id, gttOrderV2ReqDto);- To GTT by InstructionId.
GTTOrderV2ResDto gTTOrderV2ResDto=pmClient.getGttByInstructionIdV2(id)- To Get Live Price Data via API
Object livePriceData=pmClient.getLiveMarketData("mode", preferences)- To Get Option Chain using type, symbol and expiry (in DD-MM-YYYY format)
Object optionChain=pmClient.getOptionChain("type", "symbol", "expiry")- To Get Option Chain Config using symbol
Object optionChainConfig=pmClient.getOptionChainConfig("symbol")- Get orders with apiKey filter
OrderBookDto orderBookDto = pmClient.getOrderBook();- Get all orders without apiKey filter
OrderBookDto orderBookDto = pmClient.getOrders();- Get Charges Info
ChargesInfoResDTO chargesInfoResDTO = pmClient.chargesInfo("brokerageProfileCode", "transactionType", "instrumentType", "productType", "exchange", qty, price);- To use websocket client in your project, add below method -
/**
* Demonstrates Broadcast connection, subscribing for preferences
*
* @param accessToken public access token
* @param preferences list of preferences to be subscribed
*/
public void tickerUsage(String accessToken, ArrayList<PreferenceDto> preferences) {
/** To get live price use websocket connection.
* It is recommended to use only one websocket connection at any point of time and make sure you stop connection, once user goes out of app.
*/
final WebSocketClient webSocketClient = new WebSocketClient(accessToken);
/** To use reconnect feature, comment above line and uncomment below line.
* Pass doReconnect param as true and in maxReconnectAttempt param, the no. of times you want to retry to create connection.
*/
// final WebSocketClient webSocketClient = new WebSocketClient(accessToken, true, 5);
/** Set onOpen listener to listen to connection open event.*/
webSocketClient.setOnOpenListener(new OnOpenListener() {
@Override
public void onOpen() {
/** Subscribe list of preferences.
* */
webSocketClient.subscribe(preferences);
}
});
/** Set onClose listener to listen to connection close event.*/
webSocketClient.setOnCloseListener(new OnCloseListener() {
@Override
public void onClose(String closeReason) {
System.out.println("Connection Closed: " + closeReason);
}
});
/** Set onError listener to listen to errors.*/
webSocketClient.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(Exception exception) {
System.out.println("Exception in WebSocketClient: " + exception.getMessage());
}
@Override
public void onError(ApplicationException applicationException) {
//handle here.
System.out.println("Exception in WebSocketClient: " + applicationException.message + " statusCode: " + applicationException.getCode());
}
@Override
public void onError(String errorMessage) {
System.out.println("Exception occurred for this session: " + errorMessage);
}
});
/** Set onMessage listener to listen to message arrival event.*/
webSocketClient.setOnMessageListener(new OnMessageListener() {
@Override
public void onMessage(ArrayList<Tick> response) {
for (Tick tick : response)
System.out.println("tick: " + tick);
}
});
/** create a websocket connection with broadcast server.*/
webSocketClient.connect();
/** To explicitly close websocket connection with server, call this method*/
// webSocketClient.closeConnection();
while (true) {
// to make sure this method never terminates, and we keep on getting live data
}
}- Call above added method using the code below -
ArrayList<PreferenceDto> preferenceList = new ArrayList<>();
/**
* PreferenceDto Format
*
actionType - 'ADD', 'REMOVE'
modeType - 'LTP', 'FULL', 'QUOTE'
scripType - 'ETF', 'FUTURE', 'INDEX', 'OPTION', 'EQUITY'
exchangeType - 'BSE', 'NSE'
scripId -
*/
// In this way, you can add as many preferences as you like in your list
preferenceList.add(new PreferenceDto(
"ADD",
"FULL",
"EQUITY",
"NSE",
"3456"));
tickerUsage("your_public_access_token", preferenceList);For more details, take a look at Example.java in sample/src directory.