### Install ssi-fcdata package Source: https://github.com/ssi-securities-corporation/node-fcdata/blob/master/ssi-fcdata/README.md Standard installation via npm or installation behind a proxy. ```javascript npm install ssi-fcdata ``` ```javascript npm config set strict-ssl false npm install --proxy http://:@: ssi-fcdata ``` -------------------------------- ### Complete SSI FCData Integration Example Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt This JavaScript snippet demonstrates a full integration flow. It includes obtaining an access token, setting up authenticated requests with Axios, querying historical securities data, and initializing a real-time data stream. Ensure you replace placeholder credentials with your actual ConsumerID and ConsumerSecret. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const config = { ConsumerID: "your-consumer-id", ConsumerSecret: "your-consumer-secret", ApiUrl: "https://fc-data.ssi.com.vn/", HubUrl: "wss://fc-datahub.ssi.com.vn/" }; const rq = axios.create({ baseURL: config.ApiUrl, timeout: 5000 }); // Step 1: Authenticate and get access token rq({ url: client.api.GET_ACCESS_TOKEN, method: 'post', data: { consumerID: config.ConsumerID, consumerSecret: config.ConsumerSecret } }).then(response => { if (response.data.status === 200) { const token = client.constants.AUTHORIZATION_SCHEME + " " + response.data.data.accessToken; // Step 2: Set up axios interceptor for authenticated requests axios.interceptors.request.use(function(axios_config) { axios_config.headers.Authorization = token; return axios_config; }); // Step 3: Query historical data rq({ url: client.api.GET_SECURITIES_LIST, method: 'get', params: { market: 'HOSE', pageIndex: 1, pageSize: 10 } }).then(res => { console.log("Securities:", res.data); }); // Step 4: Initialize real-time streaming client.initStream({ url: config.HubUrl, token: token }); client.bind(client.events.onData, function(message) { console.log("Real-time update:", message); }); client.bind(client.events.onConnected, function() { console.log("Stream connected"); client.switchChannel("X-QUOTE:ALL"); }); client.start(); } else { console.log("Auth failed:", response.data.message); } }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### GET api/v2/Market/IndexComponents Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve the component stocks of a specific market index. ```APIDOC ## GET api/v2/Market/IndexComponents ### Description Retrieve the component stocks of a specific market index. ### Method GET ### Endpoint api/v2/Market/IndexComponents ### Parameters #### Query Parameters - **lookupRequest.indexCode** (string) - Required - The index code (e.g., VN30, HNX30) - **lookupRequest.pageIndex** (integer) - Required - The page number - **lookupRequest.pageSize** (integer) - Required - The number of items per page ### Response #### Success Response (200) - **data** (array) - List of symbols included in the index ``` -------------------------------- ### Get Index Components Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Fetch the component stocks for a given market index code (e.g., VN30, HNX30). Ensure you have a valid access token. Pagination parameters are included. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const rq = axios.create({ baseURL: "https://fc-data.ssi.com.vn/", timeout: 5000 }); const access_token = "your-access-token"; const request = { indexCode: 'VN30', // Index code (VN30, HNX30, etc.) pageIndex: 1, pageSize: 1000 }; rq({ url: client.api.GET_INDEX_COMPONENTS, // "api/v2/Market/IndexComponents" method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token }, params: { 'lookupRequest.indexCode': request.indexCode, 'lookupRequest.pageIndex': request.pageIndex, 'lookupRequest.pageSize': request.pageSize } }).then(response => { console.log("Index components:", JSON.stringify(response.data, null, 2)); // Returns list of symbols in the index }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### GET api/v2/Market/Securities Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieves a list of securities filtered by market. ```APIDOC ## GET api/v2/Market/Securities ### Description List securities by market (e.g., HOSE, HNX, UPCOM). ### Method GET ### Endpoint api/v2/Market/Securities ### Parameters #### Query Parameters - **market** (string) - Required - The market exchange code. - **pageIndex** (integer) - Optional - Page number for pagination. - **pageSize** (integer) - Optional - Number of items per page. ``` -------------------------------- ### GET api/v2/Market/IndexList Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve all available market indices for a specific exchange. ```APIDOC ## GET api/v2/Market/IndexList ### Description Retrieve all available market indices for a specific exchange. ### Method GET ### Endpoint api/v2/Market/IndexList ### Parameters #### Query Parameters - **lookupRequest.exchange** (string) - Required - The exchange code (e.g., HOSE, HNX) - **lookupRequest.pageIndex** (integer) - Required - The page number - **lookupRequest.pageSize** (integer) - Required - The number of items per page ### Response #### Success Response (200) - **data** (array) - List of indices (e.g., VN30, VN100, VNINDEX) ``` -------------------------------- ### Query market data Source: https://github.com/ssi-securities-corporation/node-fcdata/blob/master/ssi-fcdata/README.md Perform a GET request to fetch market data using the Authorization header with the cached access token. ```js const client = require('ssi-fcdata') const axios = require('axios') const rq = axios.create({ baseURL: config.URL, timeout: 5000 }) var request = { market: 'HOSE', pageIndex: 4, pageSize: 100 } rq({ url: client.api.GET_SECURITIES_LIST, method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token // <----- Get from accessToken }, params: request }).then(response => { console.log(JSON.stringify(response.data)); }).catch(error => { console.log(error); }) ``` -------------------------------- ### Get Daily Index Data Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve historical daily data for market indices including open, high, low, close values. ```APIDOC ## GET /api/v2/Market/DailyIndex ### Description Retrieve historical daily data for market indices including open, high, low, close values. ### Method GET ### Endpoint /api/v2/Market/DailyIndex ### Parameters #### Query Parameters - **lookupRequest.indexId** (string) - Required - Index identifier (e.g., 'HNX30') - **lookupRequest.fromDate** (string) - Required - Start date in DD/MM/YYYY format (e.g., '27/01/2021') - **lookupRequest.toDate** (string) - Required - End date in DD/MM/YYYY format (e.g., '27/01/2021') - **lookupRequest.pageIndex** (integer) - Optional - Page number for pagination, defaults to 1 - **lookupRequest.pageSize** (integer) - Optional - Number of items per page, defaults to 1000 - **lookupRequest.ascending** (boolean) - Optional - Sort order, defaults to true ### Request Example ```javascript { "indexId": "HNX30", "fromDate": "27/01/2021", "toDate": "27/01/2021", "pageIndex": 1, "pageSize": 1000, "ascending": true } ``` ### Response #### Success Response (200) - **data** (array) - Array of daily index data objects - **tradingDate** (string) - Trading date - **open** (number) - Opening price - **high** (number) - Highest price - **low** (number) - Lowest price - **close** (number) - Closing price - **volume** (number) - Trading volume #### Response Example ```json { "data": [ { "tradingDate": "27/01/2021", "open": 100.50, "high": 102.00, "low": 99.80, "close": 101.50, "volume": 1500000 } ] } ``` ``` -------------------------------- ### Get Daily Stock Price Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve daily stock price data including trading volume and value for a specific symbol or market. ```APIDOC ## GET /api/v2/Market/DailyStockPrice ### Description Retrieve daily stock price data including trading volume and value for a specific symbol or market. ### Method GET ### Endpoint /api/v2/Market/DailyStockPrice ### Parameters #### Query Parameters - **lookupRequest.symbol** (string) - Required - Security symbol (e.g., 'VN30F1M') - **lookupRequest.market** (string) - Optional - Filter by market - **lookupRequest.fromDate** (string) - Required - Start date in DD/MM/YYYY format (e.g., '01/12/2021') - **lookupRequest.toDate** (string) - Required - End date in DD/MM/YYYY format (e.g., '04/12/2021') - **lookupRequest.pageIndex** (integer) - Optional - Page number for pagination, defaults to 1 - **lookupRequest.pageSize** (integer) - Optional - Number of items per page, defaults to 1000 ### Request Example ```javascript { "symbol": "VN30F1M", "market": "", "fromDate": "01/12/2021", "toDate": "04/12/2021", "pageIndex": 1, "pageSize": 1000 } ``` ### Response #### Success Response (200) - **data** (array) - Array of daily stock price data objects - **tradingDate** (string) - Trading date - **open** (number) - Opening price - **high** (number) - Highest price - **low** (number) - Lowest price - **close** (number) - Closing price - **volume** (number) - Trading volume - **value** (number) - Trading value #### Response Example ```json { "data": [ { "tradingDate": "01/12/2021", "open": 1500.00, "high": 1510.50, "low": 1495.00, "close": 1505.00, "volume": 500000, "value": 752500000 } ] } ``` ``` -------------------------------- ### Get Market Index List Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve a list of available market indices for a specified exchange (e.g., HOSE, HNX). Requires an access token for authentication. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const rq = axios.create({ baseURL: "https://fc-data.ssi.com.vn/", timeout: 5000 }); const access_token = "your-access-token"; const request = { exchange: 'HOSE', // HOSE or HNX pageIndex: 1, pageSize: 1000 }; rq({ url: client.api.GET_INDEX_LIST, // "api/v2/Market/IndexList" method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token }, params: { 'lookupRequest.exchange': request.exchange, 'lookupRequest.pageIndex': request.pageIndex, 'lookupRequest.pageSize': request.pageSize } }).then(response => { console.log("Index list:", JSON.stringify(response.data, null, 2)); // Returns indices like VN30, VN100, VNINDEX, etc. }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### GET api/v2/Market/DailyOhlc Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve daily Open-High-Low-Close candlestick data for a specific symbol over a date range. ```APIDOC ## GET api/v2/Market/DailyOhlc ### Description Retrieve daily Open-High-Low-Close candlestick data for a specific symbol over a date range. ### Method GET ### Endpoint api/v2/Market/DailyOhlc ### Parameters #### Query Parameters - **lookupRequest.symbol** (string) - Required - The security symbol - **lookupRequest.fromDate** (string) - Required - Start date in DD/MM/YYYY format - **lookupRequest.toDate** (string) - Required - End date in DD/MM/YYYY format - **lookupRequest.pageIndex** (integer) - Required - The page number - **lookupRequest.pageSize** (integer) - Required - The number of items per page - **lookupRequest.ascending** (boolean) - Required - Sort order ### Response #### Success Response (200) - **data** (array) - List containing open, high, low, close, and volume for each trading day ``` -------------------------------- ### GET api/v2/Market/IntradayOhlc Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve intraday OHLC candlestick data with minute-level granularity. ```APIDOC ## GET api/v2/Market/IntradayOhlc ### Description Retrieve intraday OHLC candlestick data with minute-level granularity. ### Method GET ### Endpoint api/v2/Market/IntradayOhlc ### Parameters #### Query Parameters - **lookupRequest.symbol** (string) - Required - The security symbol - **lookupRequest.fromDate** (string) - Required - Start date in DD/MM/YYYY format - **lookupRequest.toDate** (string) - Required - End date in DD/MM/YYYY format - **lookupRequest.pageIndex** (integer) - Required - The page number - **lookupRequest.pageSize** (integer) - Required - The number of items per page - **lookupRequest.ascending** (boolean) - Required - Sort order ### Response #### Success Response (200) - **data** (array) - List containing minute-level OHLC data ``` -------------------------------- ### Get SSI FCData Securities Details Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve detailed information for specific securities, optionally filtered by symbol, within a given market. Pagination is supported. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const rq = axios.create({ baseURL: "https://fc-data.ssi.com.vn/", timeout: 5000 }); const access_token = "your-access-token"; const request = { market: 'DER', // Market code symbol: 'VN30F1M', // Optional: specific symbol pageIndex: 1, pageSize: 1000 }; rq({ url: client.api.GET_SECURITIES_DETAILs, // "api/v2/Market/SecuritiesDetails" method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token }, params: { 'lookupRequest.market': request.market, 'lookupRequest.symbol': request.symbol, 'lookupRequest.pageIndex': request.pageIndex, 'lookupRequest.pageSize': request.pageSize } }).then(response => { console.log("Securities details:", JSON.stringify(response.data, null, 2)); }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### Get Intraday OHLC Data Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve intraday Open-High-Low-Close (OHLC) data with minute-level granularity for a specified security symbol and date range. Authentication is required. Note the 'ascending' parameter controls the sort order. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const rq = axios.create({ baseURL: "https://fc-data.ssi.com.vn/", timeout: 5000 }); const access_token = "your-access-token"; const request = { symbol: 'VN30F1M', // Security symbol fromDate: '15/11/2021', // DD/MM/YYYY format toDate: '15/12/2021', // DD/MM/YYYY format pageIndex: 1, pageSize: 1000, ascending: false // Latest data first }; rq({ url: client.api.GET_INTRADAY_OHLC, // "api/v2/Market/IntradayOhlc" method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token }, params: { 'lookupRequest.symbol': request.symbol, 'lookupRequest.fromDate': request.fromDate, 'lookupRequest.toDate': request.toDate, 'lookupRequest.pageIndex': request.pageIndex, 'lookupRequest.pageSize': request.pageSize, 'lookupRequest.ascending': request.ascending } }).then(response => { console.log("Intraday OHLC data:", JSON.stringify(response.data, null, 2)); // Returns minute-level OHLC data }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### Get Daily OHLC Data Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve daily Open-High-Low-Close (OHLC) data for a specific security symbol within a date range. Supports sorting by ascending or descending order. Requires authentication. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const rq = axios.create({ baseURL: "https://fc-data.ssi.com.vn/", timeout: 5000 }); const access_token = "your-access-token"; const request = { symbol: 'VN30F2112', // Security symbol fromDate: '06/12/2021', // DD/MM/YYYY format toDate: '16/12/2021', // DD/MM/YYYY format pageIndex: 1, pageSize: 1000, ascending: true // Sort order }; rq({ url: client.api.GET_DAILY_OHLC, // "api/v2/Market/DailyOhlc" method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token }, params: { 'lookupRequest.symbol': request.symbol, 'lookupRequest.fromDate': request.fromDate, 'lookupRequest.toDate': request.toDate, 'lookupRequest.pageIndex': request.pageIndex, 'lookupRequest.pageSize': request.pageSize, 'lookupRequest.ascending': request.ascending } }).then(response => { console.log("Daily OHLC data:", JSON.stringify(response.data, null, 2)); // Returns: open, high, low, close, volume for each trading day }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### Initialize and Connect Real-time Stream Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Sets up the WebSocket client and binds event handlers for real-time market data updates. ```javascript const client = require('ssi-fcdata'); const config = { stream_url: "wss://fc-datahub.ssi.com.vn/" }; // Initialize stream with token (obtained from GET_ACCESS_TOKEN) const access_token = "your-access-token"; client.initStream({ url: config.stream_url, token: client.constants.AUTHORIZATION_SCHEME + " " + access_token // "Bearer " }); // Bind event handlers before starting client.bind(client.events.onConnected, function() { console.log("Connected to streaming server"); // Subscribe to channels after connection established client.switchChannel("X-QUOTE:ALL"); }); client.bind(client.events.onData, function(message) { console.log("Received data:", message); // Process real-time market data updates }); client.bind(client.events.onError, function(error) { console.log("Stream error:", error); }); client.bind(client.events.onReconnecting, function() { console.log("Reconnecting to stream..."); }); client.bind(client.events.onReconnected, function() { console.log("Reconnected to stream"); // Re-subscribe to channels after reconnection client.switchChannel("X-QUOTE:ALL"); }); // Start the stream connection client.start(); ``` -------------------------------- ### Real-time Streaming - Initialize and Connect Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Initialize the WebSocket stream client for receiving real-time market data updates using SignalR protocol. ```APIDOC ## Real-time Streaming Initialization ### Description Initialize the WebSocket stream client for receiving real-time market data updates using SignalR protocol. ### Method Client-side initialization ### Endpoint `wss://fc-datahub.ssi.com.vn/` ### Parameters #### Initialization Configuration - **url** (string) - Required - The WebSocket stream URL. - **token** (string) - Required - Authorization token, typically in the format 'Bearer '. ### Request Example ```javascript const client = require('ssi-fcdata'); const config = { stream_url: "wss://fc-datahub.ssi.com.vn/" }; const access_token = "your-access-token"; client.initStream({ url: config.stream_url, token: client.constants.AUTHORIZATION_SCHEME + " " + access_token // "Bearer " }); ``` ### Event Handling Bind event handlers to manage connection status and data reception. #### Event Bindings - **onConnected**: Fired when the connection to the streaming server is established. - **onData**: Fired when new real-time data is received. - **onError**: Fired when an error occurs during streaming. - **onReconnecting**: Fired when the client is attempting to reconnect. - **onReconnected**: Fired when the client has successfully reconnected. ### Request Example (Event Binding) ```javascript client.bind(client.events.onConnected, function() { console.log("Connected to streaming server"); client.switchChannel("X-QUOTE:ALL"); // Subscribe to channels after connection }); client.bind(client.events.onData, function(message) { console.log("Received data:", message); }); client.bind(client.events.onError, function(error) { console.log("Stream error:", error); }); client.bind(client.events.onReconnecting, function() { console.log("Reconnecting to stream..."); }); client.bind(client.events.onReconnected, function() { console.log("Reconnected to stream"); client.switchChannel("X-QUOTE:ALL"); // Re-subscribe after reconnection }); // Start the stream connection client.start(); ``` ``` -------------------------------- ### Configure client credentials Source: https://github.com/ssi-securities-corporation/node-fcdata/blob/master/ssi-fcdata/README.md Define the configuration object with ConsumerID, ConsumerSecret, and service URLs. ```javascript //This is config for consumer have permission on all customer var config = { ConsumerID: "", ConsumerSecret: "", URL: "https://fc-data.ssi.com.vn/", stream_url: "wss://fc-data.ssi.com.vn/", }; ``` -------------------------------- ### Configure SSI FCData Client Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Configure the client with your API credentials (ConsumerID, ConsumerSecret) and endpoint URLs. An axios instance is created for API requests. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); // Configuration - get ConsumerID and ConsumerSecret from https://iboard.ssi.com.vn/support/api-service/management const config = { ConsumerID: "your-consumer-id", ConsumerSecret: "your-consumer-secret", URL: "https://fc-data.ssi.com.vn/", stream_url: "wss://fc-datahub.ssi.com.vn/" }; // Create axios instance for API requests const rq = axios.create({ baseURL: config.URL, timeout: 5000 }); ``` -------------------------------- ### Stream market data Source: https://github.com/ssi-securities-corporation/node-fcdata/blob/master/ssi-fcdata/README.md Initialize a WebSocket connection to subscribe to channels and receive real-time updates. ```js const client = require('ssi-fcdata') client.initStream({ url: config.stream_url, token: client.constants.AUTHORIZATION_SCHEME + " " + access_token, }); client.bind(client.events.onData, function(message){ console.log(message) }) client.bind(client.events.onConnected, function(){ client.switchChannel("X-QUOTE:ALL") }) client.start(); ``` -------------------------------- ### Retrieve access token Source: https://github.com/ssi-securities-corporation/node-fcdata/blob/master/ssi-fcdata/README.md Authenticate with the API to obtain an access token, which is valid for 8 hours. ```javascript const client = require('ssi-fcdata') const axios = require('axios') const rq = axios.create({ baseURL: config.URL, timeout: 5000 }) var access_token = ""; rq({ url: client.api.GET_ACCESS_TOKEN, method: 'post', data: { consumerID: config.ConsumerID, consumerSecret: config.ConsumerSecret } }).then(response => { if (response.data.status === 200) { access_token = response.data.data.accessToken; console.log(access_token) } else { console.log(response.data.message) } }, reason => { console.log(reason); }) ``` -------------------------------- ### Subscribe to Streaming Channels Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Manages channel subscriptions for targeted market data updates and demonstrates unbinding events. ```javascript const client = require('ssi-fcdata'); // After stream is initialized and connected... // Subscribe to all quote data client.switchChannel("X-QUOTE:ALL"); // Available channel patterns: // X-QUOTE:ALL - All quote updates // X-TRADE:ALL - All trade updates // X-QUOTE: - Quote updates for specific symbol // X-TRADE: - Trade updates for specific symbol // Example: Switch to specific symbol channel client.bind(client.events.onConnected, function() { // Subscribe to VN30 index quotes client.switchChannel("X-QUOTE:VN30"); }); // Unsubscribe from events when done client.unbind(client.events.onData); ``` -------------------------------- ### Retrieve Daily Index Data Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Fetches historical daily market index data using the GET_DAILY_INDEX API endpoint. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const rq = axios.create({ baseURL: "https://fc-data.ssi.com.vn/", timeout: 5000 }); const access_token = "your-access-token"; const request = { indexId: 'HNX30', // Index identifier fromDate: '27/01/2021', // DD/MM/YYYY format toDate: '27/01/2021', // DD/MM/YYYY format pageIndex: 1, pageSize: 1000, ascending: true }; rq({ url: client.api.GET_DAILY_INDEX, // "api/v2/Market/DailyIndex" method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token }, params: { 'lookupRequest.indexId': request.indexId, 'lookupRequest.fromDate': request.fromDate, 'lookupRequest.toDate': request.toDate, 'lookupRequest.pageIndex': request.pageIndex, 'lookupRequest.pageSize': request.pageSize, 'lookupRequest.ascending': request.ascending } }).then(response => { console.log("Daily index data:", JSON.stringify(response.data, null, 2)); }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### POST api/v2/Market/AccessToken Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Authenticates the consumer and returns an access token required for subsequent API calls. ```APIDOC ## POST api/v2/Market/AccessToken ### Description Obtain an authentication token using consumer credentials. ### Method POST ### Endpoint api/v2/Market/AccessToken ### Request Body - **consumerID** (string) - Required - The unique identifier for the consumer. - **consumerSecret** (string) - Required - The secret key for the consumer. ### Response #### Success Response (200) - **accessToken** (string) - The token used for authorization headers. ``` -------------------------------- ### Retrieve Daily Stock Price Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Fetches daily stock price data for a specific symbol or market using the GET_DAILY_STOCKPRICE API endpoint. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const rq = axios.create({ baseURL: "https://fc-data.ssi.com.vn/", timeout: 5000 }); const access_token = "your-access-token"; const request = { symbol: 'VN30F1M', // Security symbol market: '', // Optional: filter by market fromDate: '01/12/2021', // DD/MM/YYYY format toDate: '04/12/2021', // DD/MM/YYYY format pageIndex: 1, pageSize: 1000 }; rq({ url: client.api.GET_DAILY_STOCKPRICE, // "api/v2/Market/DailyStockPrice" method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token }, params: { 'lookupRequest.symbol': request.symbol, 'lookupRequest.market': request.market, 'lookupRequest.fromDate': request.fromDate, 'lookupRequest.toDate': request.toDate, 'lookupRequest.pageIndex': request.pageIndex, 'lookupRequest.pageSize': request.pageSize } }).then(response => { console.log("Daily stock price:", JSON.stringify(response.data, null, 2)); }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### Retrieve Securities List from SSI FCData Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Retrieve a paginated list of securities for a specified market (HOSE, HNX, UPCOM, DER). Requires an obtained access token for authentication. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const config = { URL: "https://fc-data.ssi.com.vn/" }; const rq = axios.create({ baseURL: config.URL, timeout: 5000 }); // Assumes access_token is already obtained const access_token = "your-access-token"; const request = { market: 'HOSE', // HOSE, HNX, UPCOM, or DER pageIndex: 1, pageSize: 100 }; rq({ url: client.api.GET_SECURITIES_LIST, // "api/v2/Market/Securities" method: 'get', headers: { [client.constants.AUTHORIZATION_HEADER]: client.constants.AUTHORIZATION_SCHEME + " " + access_token }, params: request }).then(response => { console.log("Securities list:", JSON.stringify(response.data, null, 2)); // Response includes: symbol, exchange, stockName, stockEnName, etc. }).catch(error => { console.log("Error:", error); }); ``` -------------------------------- ### Market Data Endpoints Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Reference for various market data retrieval endpoints. ```APIDOC ## Market Data Endpoints - **GET api/v2/Market/SecuritiesDetails** - Detailed security information - **GET api/v2/Market/IndexComponents** - Index component stocks - **GET api/v2/Market/IndexList** - Available market indices - **GET api/v2/Market/DailyOhlc** - Daily OHLC candlestick data - **GET api/v2/Market/IntradayOhlc** - Intraday OHLC data - **GET api/v2/Market/DailyIndex** - Historical index data - **GET api/v2/Market/DailyStockPrice** - Daily stock prices ``` -------------------------------- ### Streaming Channel Subscription Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Subscribe to specific data channels for receiving targeted market data updates. ```APIDOC ## Streaming Channel Subscription ### Description Subscribe to specific data channels for receiving targeted market data updates via the WebSocket stream. ### Method Client-side channel switching ### Endpoint N/A (This is a client-side operation after stream initialization) ### Usage Use the `client.switchChannel()` method after the stream has been initialized and connected. ### Available Channel Patterns - `X-QUOTE:ALL` - All quote updates - `X-TRADE:ALL` - All trade updates - `X-QUOTE:` - Quote updates for a specific symbol (e.g., `X-QUOTE:VN30`) - `X-TRADE:` - Trade updates for a specific symbol (e.g., `X-TRADE:AAPL`) ### Request Example (Subscribing to a channel) ```javascript // Assuming the stream is already initialized and connected // Subscribe to all quote data client.switchChannel("X-QUOTE:ALL"); // Example: Subscribe to quote updates for a specific symbol client.bind(client.events.onConnected, function() { client.switchChannel("X-QUOTE:VN30"); }); ``` ### Unsubscribing Event handlers can be unbound when no longer needed. ### Request Example (Unsubscribing from data events) ```javascript // Unsubscribe from 'onData' events client.unbind(client.events.onData); ``` ``` -------------------------------- ### Obtain Access Token for SSI FCData API Source: https://context7.com/ssi-securities-corporation/node-fcdata/llms.txt Obtain an access token required for API calls. The token is valid for 8 hours and should be cached. This uses a POST request to the token endpoint with consumer credentials. ```javascript const client = require('ssi-fcdata'); const axios = require('axios'); const config = { ConsumerID: "your-consumer-id", ConsumerSecret: "your-consumer-secret", URL: "https://fc-data.ssi.com.vn/" }; const rq = axios.create({ baseURL: config.URL, timeout: 5000 }); var access_token = ""; rq({ url: client.api.GET_ACCESS_TOKEN, // "api/v2/Market/AccessToken" method: 'post', data: { consumerID: config.ConsumerID, consumerSecret: config.ConsumerSecret } }).then(response => { if (response.data.status === 200) { access_token = response.data.data.accessToken; console.log("Access token obtained:", access_token); // Token is valid for 8 hours - cache it for subsequent requests } else { console.log("Authentication failed:", response.data.message); } }).catch(error => { console.log("Request error:", error); }); ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.