UNPKG

laplace-api

Version:

Client library for Laplace API for the US stock market and BIST (Istanbul stock market) fundamental financial data.

312 lines (274 loc) 7.96 kB
import { PaginatedResponse } from './capital_increase'; import { Client } from './client'; import { Region, Locale } from './collections'; import { LaplaceHTTPError } from './errors'; export enum AssetType { Stock = 'stock', Forex = 'forex', Index = 'index', Etf = 'etf', Commodity = 'commodity', StockRights = 'stock_rights' } export enum AssetClass { Equity = 'equity', Crypto = 'crypto', } export enum HistoricalPricePeriod { OneDay = '1D', OneWeek = '1W', OneMonth = '1M', ThreeMonth = '3M', OneYear = '1Y', TwoYear = '2Y', ThreeYear = '3Y', FiveYear = '5Y', } export enum HistoricalPriceInterval { OneMinute = "1m", ThreeMinute = "3m", FiveMinute = "5m", FifteenMinute = "15m", ThirtyMinute = "30m", OneHour = "1h", TwoHour = "2h", OneDay = "1d", FiveDay = "5d", SevenDay = "7d", ThirtyDay = "30d", } export interface Stock { id: string; assetType: AssetType; name: string; symbol: string; sectorId: string; industryId: string; updatedDate: string; dailyChange?: number; active: boolean; } export interface LocaleString { [key: string]: string; } export interface StockDetail extends Stock { assetClass: AssetClass; description: string; localized_description: LocaleString; shortDescription: string; localizedShortDescription: LocaleString; region: string; markets?: Market[]; } export enum Market { Yildiz = "YILDIZ", Ana = "ANA", Alt = "ALT", YakinIzleme = "YAKIN_IZLEME", POIP = "POIP", Fon = "FON", Girisim = "GIRISIM", Emtia = "EMTIA", } export interface PriceDataPoint { d: number; c: number; h: number; l: number; o: number; } export interface StockPriceGraph { symbol: string; '1D': PriceDataPoint[]; '1W': PriceDataPoint[]; '1M': PriceDataPoint[]; '3M': PriceDataPoint[]; '1Y': PriceDataPoint[]; '2Y': PriceDataPoint[]; '3Y': PriceDataPoint[]; '5Y': PriceDataPoint[]; } export interface StockRestriction { id: number; title: string; description: string; symbol?: string; startDate: string; endDate: string; market?: string; } export interface TickRule { basePrice: number; additionalPrice: number; lowerPriceLimit: number; upperPriceLimit: number; rules: TickSizeRule[] | null; } export interface TickSizeRule { priceFrom: number; priceTo: number; tickSize: number; } export interface EarningsTranscriptListItem { symbol: string; year: number; quarter: number; date: string; fiscal_year: number; } export interface EarningsTranscriptWithSummary { symbol: string; year: number; quarter: number; date: string; content: string; summary?: string; has_summary: boolean; } export interface MarketState { id: number; marketSymbol?: string | null; state: string; lastTimestamp: string; stockSymbol?: string | null; } export interface GenerateChartImageRequest { symbol: string; period?: HistoricalPricePeriod; region: Region; resolution?: HistoricalPriceInterval; indicators?: string[]; chartType?: number; } export class StockClient extends Client { async getAllStocks(region: Region, page: number|null = null, pageSize: number|null = null): Promise<Stock[]> { return this.sendRequest<Stock[]>({ method: 'GET', url: '/api/v2/stock/all', params: { region, ...(page !== null ? { page } : {}), ...(pageSize !== null ? { pageSize } : {}), }, }); } async getStockDetailById(id: string, locale: Locale): Promise<StockDetail> { return this.sendRequest<StockDetail>({ method: 'GET', url: `/api/v1/stock/${id}`, params: { locale }, }); } async getStockDetailBySymbol(symbol: string, assetClass: AssetClass, region: Region, locale: Locale): Promise<StockDetail> { return this.sendRequest<StockDetail>({ method: 'GET', url: '/api/v1/stock/detail', params: { symbol, asset_class: assetClass, region, locale }, }); } async getHistoricalPrices(symbols: string[], region: Region, keys: HistoricalPricePeriod[]): Promise<StockPriceGraph[]> { return this.sendRequest<StockPriceGraph[]>({ method: 'GET', url: '/api/v1/stock/price', params: { symbols: symbols.join(','), region, keys: keys.join(','), }, }); } async getCustomHistoricalPrices(stock: string, region: Region, fromDate: string, toDate: string, interval: HistoricalPriceInterval, detail: boolean): Promise<PriceDataPoint[]> { this.validateCustomHistoricalPriceDate(fromDate); this.validateCustomHistoricalPriceDate(toDate); return this.sendRequest<PriceDataPoint[]>({ method: 'GET', url: '/api/v1/stock/price/interval', params: { stock, region, fromDate, toDate, interval, detail }, }); } validateCustomHistoricalPriceDate(date: string) { const pattern = /^\d{4}-\d{2}-\d{2}( \d{2}:\d{2}:\d{2})?$/; const matched = date.match(pattern); if (!matched) { throw new LaplaceHTTPError(400, "Invalid date format, allowed formats: YYYY-MM-DD, YYYY-MM-DD HH:MM:SS"); } } async getStockRestrictions(symbol: string, region: Region): Promise<StockRestriction[]> { return this.sendRequest<StockRestriction[]>({ method: 'GET', url: '/api/v1/stock/restrictions', params: { symbol, region }, }); } async getAllStockRestrictions(region: Region): Promise<StockRestriction[]> { return this.sendRequest<StockRestriction[]>({ method: 'GET', url: '/api/v1/stock/restrictions/all', params: { region }, }); } async getTickRules(symbol: string, region: Region): Promise<TickRule> { return this.sendRequest<TickRule>({ method: 'GET', url: '/api/v1/stock/rules', params: { symbol, region }, }); } async getEarningsTranscripts(symbol: string, region: Region): Promise<EarningsTranscriptListItem[]> { return this.sendRequest<EarningsTranscriptListItem[]>({ method: 'GET', url: '/api/v1/earnings/transcripts', params: { symbol, region }, }); } async getEarningsTranscript(symbol: string, year: number, quarter: number): Promise<EarningsTranscriptWithSummary> { return this.sendRequest<EarningsTranscriptWithSummary>({ method: 'GET', url: '/api/v1/earnings/transcript', params: { symbol, year, quarter }, }); } async getStockStateAll(page: number, size: number, region: Region): Promise<PaginatedResponse<MarketState>> { return this.sendRequest<PaginatedResponse<MarketState>>({ method: 'GET', url: '/api/v1/state/stock/all', params: { page, size, region }, }); } async getStockState(symbol: string): Promise<MarketState> { return this.sendRequest<MarketState>({ method: 'GET', url: `/api/v1/state/stock/${symbol}`, }); } async getStateAll(page: number, size: number, region: Region): Promise<PaginatedResponse<MarketState>> { return this.sendRequest<PaginatedResponse<MarketState>>({ method: 'GET', url: '/api/v1/state/all', params: { page, size, region }, }); } async getState(symbol: string): Promise<MarketState> { return this.sendRequest<MarketState>({ method: 'GET', url: `/api/v1/state/${symbol}`, }); } async getStockChartImage(request: GenerateChartImageRequest): Promise<Blob> { const params: Partial<GenerateChartImageRequest> = { symbol: request.symbol, region: request.region, }; if (request.period) params.period = request.period; if (request.resolution) params.resolution = request.resolution; if (request.indicators) params.indicators = request.indicators; if (request.chartType != null) params.chartType = request.chartType; const data = await this.sendRequest<ArrayBuffer>({ method: "GET", url: "/api/v1/stock/chart", params, responseType: "arraybuffer", }); return new Blob([data], { type: "image/png" }); } }