# The Fyers API Javascript client - v3

The official Javascript node client for communicating with the [Fyers API](https://myapi.fyers.in)

## Documentation

- [Javascript client documentation](https://myapi.fyers.in/docsv3)

## Requirements

- NodeJS v12.0.0+

## Installation

Install via [npm](...)

    npm install fyers-api-v3@latest

## Breaking changes - v3

`v3` is a **breaking** major release with multiple internal modification to improve user experience.<br>

Below are the breaking changes:

- websocket output format have changed completely

## Getting started with API

```javascript
var fyersModel= require("fyers-api-v3").fyersModel

var fyers= new fyersModel({"path":"path where you want to save logs","enableLogging":true})

fyers.setAppId("xxxxx-xxx")

fyers.setRedirectUrl("Redirect URL here")

var URL=fyers.generateAuthCode()

//use url to generate auth code
console.log(URL) 

var authcode="authcode generated above"

fyers.generate_access_token({"client_id":"APPID","secret_key":"secret","auth_code":authcode}).then((response)=>{
    if(response.s=='ok'){
        fyers.setAccessToken(response.access_token)
    }else{
        console.log("error generating access token",response)
    }
})

fyers.get_profile().then((response)=>{
        console.log(response)
    }).catch((err)=>{
        console.log(err)
    })
    
fyers.getQuotes(["NSE:SBIN-EQ","NSE:TCS-EQ"]).then((response)=>{
    console.log(response)
}).catch((err)=>{
    console.log(err)
})

fyers.getMarketDepth({"symbol":["NSE:SBIN-EQ","NSE:TCS-EQ"],"ohlcv_flag":1}).then((response)=>{
    console.log(response)
}).catch((err)=>{
    console.log(err)
})
```

## API promises

All API calls returns a promise which you can use to call methods like `.then(...)` and `.catch(...)`.

```javascript
FyersApiCall
  .then(function (v) {
    // On success
  })
  .catch(function (e) {
    // On rejected
  });
```

## Getting started order WebSocket

```javascript
var fyersOrderSocket= require("fyers-api-v3").fyersOrderSocket

var skt=new fyersOrderSocket("Acesstoken in format APPID:Accesstoken",
"path to where you want to save logs",
true/*flag to enable disable logging*/)

skt.on("error",function (errmsg) {
    console.log(errmsg)
})

skt.on('others',function (msg) {
    console.log(msg)
})

skt.on('connect',function () {
    skt.subscribe([skt.orderUpdates,skt.tradeUpdates,skt.positionUpdates,
    skt.edis,skt.pricealerts])
    console.log(skt.isConnected())
})

skt.on('close',function () {
    console.log('closed')
})

skt.on('orders',function (msg) {
    console.log("orders",msg)
    skt.close()
})

skt.on('trades',function (msg) {
    console.log('trades',msg)
})

skt.on('positions',function (msg) {
    console.log('positions',msg)
})

skt.connect()
```

## Getting started data WebSocket

```javascript
let DataSocket = require("fyers-api-v3").fyersDataSocket;

var skt= DataSocket.getInstance("Accesstoken in format APPID:AccessToken",
"path where to save logs",true/*flag to enable disable logging*/)

skt.on("connect",function(){
skt.subscribe(['NSE:IDEA-EQ',"NSE:SBIN-EQ"]) 
//subscribing for market depth data if need of market depth comes as a diffrent tick
skt.subscribe(['NSE:IDEA-EQ',"NSE:SBIN-EQ"],true) 
//to start lite mode to get fewer data like ltp change
skt.mode(skt.LiteMode) 
//to revert back to full mode
// skt.mode(skt.FullMode) 
})

skt.on("message",function(message){
	console.log({"TEST":message})
})

skt.on("error",function(message){
	console.log("erroris",message)
})

skt.on("close",function(){
    console.log("socket closed")
})
skt.connect()
```

## Auto re-connect WebSocket client

Optionally you can enable client side auto re-connection to automatically reconnect if the connection is dropped.

All you need to do is enable auto re-connection. For example

```javascript
// Enable auto reconnect mechanism with retry count as passed with max allowed upto 50.
skt.autoReconnect(6);
```

## Price Alerts

This includes following APIs: `createPriceAlert`, `getPriceAlert`, `modifyPriceAlert`, `deletePriceAlert`, `togglePriceAlert`

### Create Price Alert

```javascript
var data = {
    "agent": "fyers-api",
    "alert-type": 1,
    "name": "gold alert",
    "symbol": "NSE:GOLDBEES-EQ",
    "comparisonType": "LTP",
    "condition": "GT",
    "value": "9888",
    "notes": " iji"
}

fyers.createPriceAlert(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Get Price Alerts

```javascript
// Get all active alerts
fyers.getPriceAlert().then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})

// Get archived alerts
var data = {"archive": "1"}
fyers.getPriceAlert(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Update Price Alert

```javascript
var data = {
    "alertId": "6249977",
    "agent": "fyers-api",
    "alert-type": 1,
    "name": "goldy bees",
    "symbol": "NSE:GOLDBEES-EQ",
    "comparisonType": "OPEN",
    "condition": "GT",
    "value": "10000.00676766767676676667"
}

fyers.modifyPriceAlert(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Delete Price Alert

```javascript
var data = {"alertId": "6131416", "agent": "fyers-api"}

fyers.deletePriceAlert(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Toggle Price Alert (Enable/Disable)

```javascript
var data = {"alertId": "3870991"}

fyers.togglePriceAlert(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

## Smart Orders

This includes following APIs: `createSmartOrderStep`, `createSmartOrderLimit`, `createSmartOrderTrail`, `createSmartOrderSIP`, `modifySmartOrder`, `cancelSmartOrder`, `pauseSmartOrder`, `resumeSmartOrder`, `getSmartOrderBookWithFilter`

Smart orders support different flow types: step, limit, trail, sip

### Create Smart Order - Step

```javascript
var data = {
    "symbol": "NSE:SBIN-EQ",
    "qty": 10,
    "type": 1,
    "side": 1,
    "productType": "INTRADAY",
    "limitPrice": 600.00,
    "stopPrice": 0,
    "validity": "DAY",
    "disclosedQty": 0,
    "offlineOrder": false
}

fyers.createSmartOrderStep(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Create Smart Order - Limit

```javascript
var data = {
    "symbol": "NSE:SBIN-EQ",
    "qty": 10,
    "type": 1,
    "side": 1,
    "productType": "INTRADAY",
    "limitPrice": 600.00,
    "stopPrice": 0,
    "validity": "DAY",
    "disclosedQty": 0,
    "offlineOrder": false
}

fyers.createSmartOrderLimit(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Create Smart Order - Trail

```javascript
var data = {
    "symbol": "NSE:SBIN-EQ",
    "qty": 10,
    "type": 1,
    "side": 1,
    "productType": "INTRADAY",
    "limitPrice": 600.00,
    "stopPrice": 0,
    "validity": "DAY",
    "disclosedQty": 0,
    "offlineOrder": false
}

fyers.createSmartOrderTrail(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Create Smart Order - SIP

```javascript
var data = {
    "symbol": "NSE:SBIN-EQ",
    "qty": 10,
    "type": 1,
    "side": 1,
    "productType": "CNC",
    "limitPrice": 600.00,
    "stopPrice": 0,
    "validity": "DAY",
    "disclosedQty": 0,
    "offlineOrder": false
}

fyers.createSmartOrderSIP(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Modify Smart Order

```javascript
var data = {
    "flowId": "123456789",
    "limitPrice": 610.00,
    "qty": 15
}

fyers.modifySmartOrder(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Cancel Smart Order

```javascript
var data = {"flowId": "123456789"}

fyers.cancelSmartOrder(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Pause Smart Order

```javascript
var data = {"flowId": "123456789"}

fyers.pauseSmartOrder(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Resume Smart Order

```javascript
var data = {"flowId": "123456789"}

fyers.resumeSmartOrder(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Get Smart Order Book with Filter

```javascript
// Get all smart orders
fyers.getSmartOrderBookWithFilter().then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})

// Get filtered smart orders
// Filter by side (1 for Buy, -1 for Sell)
var data = {"side": [1]}
fyers.getSmartOrderBookWithFilter(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})

// Filter by multiple parameters
var data = {
    "exchange": ["NSE"],
    "side": [1, -1],
    "flowtype": [1, 2],
    "product": ["CNC", "INTRADAY"],
    "messageType": [1, 2],
    "search": "SBIN",
    "sort_by": "CreatedTime",
    "ord_by": 1,
    "page_no": 1,
    "page_size": 15
}

fyers.getSmartOrderBookWithFilter(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

## Smart Exit Triggers

This includes following APIs: `createSmartExitTrigger`, `getSmartExitTrigger`, `updateSmartExitTrigger`, `activateDeactivateSmartExitTrigger`

### Create Smart Exit Trigger

```javascript
// Type 1: Only Alert (notification only, no auto-exit)
var data = {
    "name": "Alert Only Strategy",
    "type": 1,
    "profitRate": 5000,
    "lossRate": -2000
}

fyers.createSmartExitTrigger(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})

// Type 2: Exit with Alert (notification + immediate exit)
var data = {
    "name": "Auto Exit Strategy",
    "type": 2,
    "profitRate": 5000,
    "lossRate": -2000
}

fyers.createSmartExitTrigger(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})

// Type 3: Exit with Alert + Wait for Recovery (notification + delayed exit)
var data = {
    "name": "Recovery Exit Strategy",
    "type": 3,
    "profitRate": 10000,
    "lossRate": -3000,
    "waitTime": 5
}

fyers.createSmartExitTrigger(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Get Smart Exit Triggers

```javascript
// Get all smart exit triggers
fyers.getSmartExitTrigger().then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Update Smart Exit Trigger

```javascript
var data = {
    "flowId": "123456789",
    "triggerPrice": 610.00,
    "stopLoss": 600.00,
    "takeProfit": 630.00
}

fyers.updateSmartExitTrigger(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```

### Activate Smart Exit Trigger

```javascript
var data = {"flowId": "123456789"}

fyers.activateDeactivateSmartExitTrigger(data).then((response) => {
    console.log(response)
}).catch((error) => {
    console.log(error)
})
```
