borsajs 0.1.2 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +140 -1
- package/README.md +146 -0
- package/dist/providers/kap.d.ts +24 -3
- package/dist/providers/kap.d.ts.map +1 -1
- package/dist/providers/kap.js +180 -7
- package/dist/providers/kap.js.map +1 -1
- package/package.json +2 -2
- package/src/providers/kap.ts +216 -7
- package/test/demo.ts +67 -0
package/README.en.md
CHANGED
|
@@ -39,6 +39,8 @@ const cryptoList = await cryptoSymbols(); // → ['BTCTRY', 'ETHTRY', ...] (173
|
|
|
39
39
|
|
|
40
40
|
### Ticker (Stocks)
|
|
41
41
|
|
|
42
|
+
**Get real-time BIST stock prices and volume data in seconds.** The Ticker API provides instant access to current price, daily change, volume, and OHLC (Open-High-Low-Close) values for any stock. Perfect for technical analysis, portfolio tracking, or automated trading strategies.
|
|
43
|
+
|
|
42
44
|
```typescript
|
|
43
45
|
import { Ticker } from 'borsajs';
|
|
44
46
|
|
|
@@ -83,6 +85,8 @@ const history = await stock.getHistory({ period: '5d', interval: '1d' });
|
|
|
83
85
|
|
|
84
86
|
### FX (Forex & Commodities)
|
|
85
87
|
|
|
88
|
+
**Track live exchange rates and commodity prices effortlessly.** Access real-time data for major currencies (USD, EUR, GBP) and precious metals (gold, silver). Essential for currency arbitrage, gold investment strategies, or exchange rate monitoring.
|
|
89
|
+
|
|
86
90
|
```typescript
|
|
87
91
|
import { FX, fxSymbols } from 'borsajs';
|
|
88
92
|
|
|
@@ -107,6 +111,8 @@ const current = await usd.getCurrent();
|
|
|
107
111
|
|
|
108
112
|
### Crypto
|
|
109
113
|
|
|
114
|
+
**Live data from Turkey's largest crypto exchange, BtcTurk.** Access price, volume, and change information for 173 cryptocurrency pairs. The fastest way to track Bitcoin, Ethereum, and other cryptos in Turkish Lira.
|
|
115
|
+
|
|
110
116
|
```typescript
|
|
111
117
|
import { Crypto, cryptoSymbols } from 'borsajs';
|
|
112
118
|
|
|
@@ -136,6 +142,8 @@ const current = await btc.getCurrent();
|
|
|
136
142
|
|
|
137
143
|
### Index
|
|
138
144
|
|
|
145
|
+
**Monitor BIST indices in real-time.** Get current values and percentage changes for market and sector indices like XU100, XU030, XBANK. Essential for analyzing market trends and comparing sectoral performance.
|
|
146
|
+
|
|
139
147
|
```typescript
|
|
140
148
|
import { Index, indexSymbols } from 'borsajs';
|
|
141
149
|
|
|
@@ -163,6 +171,8 @@ const info = await xu100.getInfo();
|
|
|
163
171
|
|
|
164
172
|
### Fund (Investment Funds)
|
|
165
173
|
|
|
174
|
+
**Search and track Turkish investment funds from TEFAS.** Access fund prices, returns, and performance metrics. Compare funds and make informed investment decisions with official data.
|
|
175
|
+
|
|
166
176
|
```typescript
|
|
167
177
|
import { Fund, searchFunds } from 'borsajs';
|
|
168
178
|
|
|
@@ -186,6 +196,8 @@ const info = await fund.getInfo();
|
|
|
186
196
|
|
|
187
197
|
### Inflation
|
|
188
198
|
|
|
199
|
+
**Access official inflation data directly from TCMB (Central Bank).** Query monthly and annual CPI rates, or calculate inflation between any two dates. Critical for evaluating investments on a real return basis.
|
|
200
|
+
|
|
189
201
|
```typescript
|
|
190
202
|
import { Inflation } from 'borsajs';
|
|
191
203
|
|
|
@@ -218,8 +230,99 @@ const calc = await inflation.calculate(100000, '2020-01', '2024-01');
|
|
|
218
230
|
}
|
|
219
231
|
```
|
|
220
232
|
|
|
233
|
+
### KAP (Public Disclosure Platform)
|
|
234
|
+
|
|
235
|
+
**One-stop access to official company announcements and disclosures.** Query disclosures, expected report calendars, and corporate information for all 731 BIST companies. Make investment decisions based on official company statements.
|
|
236
|
+
|
|
237
|
+
**Features:**
|
|
238
|
+
- 🏢 **731 BIST Companies** - Complete list with details
|
|
239
|
+
- 📢 **Live Disclosures** - All company announcements
|
|
240
|
+
- 📅 **Disclosure Calendar** - Financial report dates
|
|
241
|
+
- 🏛️ **Corporate Info** - Sector, market, website
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
import { getKapProvider } from 'borsajs';
|
|
245
|
+
|
|
246
|
+
const kap = getKapProvider();
|
|
247
|
+
const companies = await kap.getCompanies();
|
|
248
|
+
const search = await kap.search('türk hava');
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Response (Companies):**
|
|
252
|
+
```json
|
|
253
|
+
[
|
|
254
|
+
{
|
|
255
|
+
"ticker": "THYAO",
|
|
256
|
+
"name": "TÜRK HAVA YOLLARI A.O.",
|
|
257
|
+
"city": "İSTANBUL"
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Response (Search):**
|
|
263
|
+
```json
|
|
264
|
+
[
|
|
265
|
+
{
|
|
266
|
+
"ticker": "THYAO",
|
|
267
|
+
"name": "TÜRK HAVA YOLLARI A.O.",
|
|
268
|
+
"city": "İSTANBUL"
|
|
269
|
+
}
|
|
270
|
+
]
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**KAP Disclosures:**
|
|
274
|
+
```typescript
|
|
275
|
+
const disclosures = await kap.getDisclosures('THYAO', 5);
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**Response (Disclosures):**
|
|
279
|
+
```json
|
|
280
|
+
[
|
|
281
|
+
{
|
|
282
|
+
"date": "29.12.2025 19:21:18",
|
|
283
|
+
"title": "Haber ve Söylentilere İlişkin Açıklama",
|
|
284
|
+
"disclosureIndex": 1530826,
|
|
285
|
+
"url": "https://www.kap.org.tr/tr/Bildirim/1530826"
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Expected Disclosure Calendar:**
|
|
291
|
+
```typescript
|
|
292
|
+
const calendar = await kap.getCalendar('THYAO');
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**Response (Calendar):**
|
|
296
|
+
```json
|
|
297
|
+
[
|
|
298
|
+
{
|
|
299
|
+
"startDate": "01.01.2026",
|
|
300
|
+
"endDate": "11.03.2026",
|
|
301
|
+
"subject": "Finansal Rapor",
|
|
302
|
+
"period": "Yıllık",
|
|
303
|
+
"year": "2025"
|
|
304
|
+
}
|
|
305
|
+
]
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**Company Details:**
|
|
309
|
+
```typescript
|
|
310
|
+
const details = await kap.getCompanyDetails('THYAO');
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Response (Company Details):**
|
|
314
|
+
```json
|
|
315
|
+
{
|
|
316
|
+
"sector": "ULAŞTIRMA VE DEPOLAMA",
|
|
317
|
+
"market": "YILDIZ PAZAR",
|
|
318
|
+
"website": "www.turkishairlines.com / http://investor.turkishairlines.com"
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
221
322
|
### Symbols
|
|
222
323
|
|
|
324
|
+
**Access all market symbols in a single call.** Get comprehensive lists of stocks, cryptocurrencies, currencies, and indices. Perfect starting point for automated data collection or screening algorithms.
|
|
325
|
+
|
|
223
326
|
```typescript
|
|
224
327
|
import { symbols, searchSymbols, cryptoSymbols, fxSymbols, indexSymbols } from 'borsajs';
|
|
225
328
|
|
|
@@ -239,17 +342,52 @@ console.log(indexSymbols); // → 19 indices
|
|
|
239
342
|
|
|
240
343
|
### VIOP (Derivatives)
|
|
241
344
|
|
|
345
|
+
**Track Turkish derivatives market (futures and options).** Access real-time data for stock futures, index futures, currency futures, and options contracts. Essential for hedging strategies and derivatives trading.
|
|
346
|
+
|
|
242
347
|
```typescript
|
|
243
348
|
import { VIOP } from 'borsajs';
|
|
244
349
|
|
|
245
350
|
const viop = new VIOP();
|
|
351
|
+
|
|
352
|
+
// Get all futures
|
|
246
353
|
const futures = await viop.getFutures();
|
|
354
|
+
|
|
355
|
+
// Stock futures
|
|
356
|
+
const stockFutures = await viop.getStockFutures();
|
|
357
|
+
|
|
358
|
+
// Index futures (XU100, XU030, etc.)
|
|
359
|
+
const indexFutures = await viop.getIndexFutures();
|
|
360
|
+
|
|
361
|
+
// Currency futures (USD, EUR)
|
|
362
|
+
const currencyFutures = await viop.getCurrencyFutures();
|
|
363
|
+
|
|
364
|
+
// Commodity futures (Gold)
|
|
365
|
+
const commodityFutures = await viop.getCommodityFutures();
|
|
366
|
+
|
|
367
|
+
// Options
|
|
247
368
|
const options = await viop.getOptions();
|
|
248
|
-
|
|
369
|
+
|
|
370
|
+
// Contracts for specific stock
|
|
371
|
+
const thyaoContracts = await viop.getBySymbol('THYAO');
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
**Response (Contract Data):**
|
|
375
|
+
```json
|
|
376
|
+
{
|
|
377
|
+
"code": "THYAO",
|
|
378
|
+
"contract": "THYAO0226",
|
|
379
|
+
"price": 275.5,
|
|
380
|
+
"change": 1.25,
|
|
381
|
+
"volumeTl": 15420000,
|
|
382
|
+
"volumeQty": 56000,
|
|
383
|
+
"category": "stock"
|
|
384
|
+
}
|
|
249
385
|
```
|
|
250
386
|
|
|
251
387
|
### Download (Multiple Tickers)
|
|
252
388
|
|
|
389
|
+
**Batch download historical data for multiple stocks at once.** Efficient way to collect OHLCV data for portfolio analysis or backtesting strategies. Get data for dozens of stocks in a single request.
|
|
390
|
+
|
|
253
391
|
```typescript
|
|
254
392
|
import { download, Tickers } from 'borsajs';
|
|
255
393
|
|
|
@@ -269,6 +407,7 @@ This library accesses publicly available data from the following sources:
|
|
|
269
407
|
| Crypto | BtcTurk | [btcturk.com](https://www.btcturk.com/) | Cryptocurrency data |
|
|
270
408
|
| Fund | TEFAS | [tefas.gov.tr](https://www.tefas.gov.tr/) | Investment fund data |
|
|
271
409
|
| Inflation | TCMB | [tcmb.gov.tr](https://www.tcmb.gov.tr/) | Inflation data |
|
|
410
|
+
| KAP | KAP | [kap.org.tr](https://www.kap.org.tr/) | Company information |
|
|
272
411
|
| VIOP | İş Yatırım | [isyatirim.com.tr](https://www.isyatirim.com.tr/) | Futures and options |
|
|
273
412
|
|
|
274
413
|
## ⚠️ Important Notices
|
package/README.md
CHANGED
|
@@ -39,6 +39,8 @@ const cryptoList = await cryptoSymbols(); // → ['BTCTRY', 'ETHTRY', ...] (173
|
|
|
39
39
|
|
|
40
40
|
### Ticker (Hisse Senedi)
|
|
41
41
|
|
|
42
|
+
**BIST hisselerinin anlık fiyat ve hacim verilerine saniyeler içinde ulaşın.** Ticker API, bir hisse senedinin güncel fiyatı, günlük değişimi, işlem hacmi ve OHLC (açılış-en yüksek-en düşük-kapanış) değerlerini kolayca almanızı sağlar. Teknik analiz, portföy takibi veya otomatik alım-satım stratejileri için ideal.
|
|
43
|
+
|
|
42
44
|
```typescript
|
|
43
45
|
import { Ticker } from 'borsajs';
|
|
44
46
|
|
|
@@ -65,6 +67,8 @@ const info = await stock.getInfo();
|
|
|
65
67
|
|
|
66
68
|
### FX (Döviz & Emtia)
|
|
67
69
|
|
|
70
|
+
**Döviz kurları ve emtia fiyatlarını canlı takip edin.** FX API ile USD, EUR gibi döviz kurlarının yanı sıra altın, gümüş ve ons fiyatlarına anında erişebilirsiniz. Kur takibi, döviz arbitrajı veya altın yatırım stratejileri için güvenilir veri kaynağı.
|
|
71
|
+
|
|
68
72
|
```typescript
|
|
69
73
|
import { FX, fxSymbols } from 'borsajs';
|
|
70
74
|
|
|
@@ -89,6 +93,8 @@ const current = await usd.getCurrent();
|
|
|
89
93
|
|
|
90
94
|
### Crypto (Kripto Para)
|
|
91
95
|
|
|
96
|
+
**Türkiye'nin en büyük kripto borsası BtcTurk'ten anlık veriler.** 173 kripto para çiftinin fiyat, hacim ve değişim bilgilerine erişin. Bitcoin, Ethereum ve diğer kripto paraların TRY karşılığını takip etmek için en hızlı yol.
|
|
97
|
+
|
|
92
98
|
```typescript
|
|
93
99
|
import { Crypto, cryptoSymbols } from 'borsajs';
|
|
94
100
|
|
|
@@ -118,6 +124,8 @@ const current = await btc.getCurrent();
|
|
|
118
124
|
|
|
119
125
|
### Index (Endeksler)
|
|
120
126
|
|
|
127
|
+
**BIST endekslerini gerçek zamanlı izleyin.** XU100, XU030, XBANK gibi sektör ve piyasa endekslerinin güncel değerleri ve yüzdesel değişimlerini alın. Piyasa trendlerini analiz etmek ve sektörel performansı karşılaştırmak için vazgeçilmez.
|
|
128
|
+
|
|
121
129
|
```typescript
|
|
122
130
|
import { Index, indexSymbols } from 'borsajs';
|
|
123
131
|
|
|
@@ -145,6 +153,8 @@ const info = await xu100.getInfo();
|
|
|
145
153
|
|
|
146
154
|
### Inflation (Enflasyon)
|
|
147
155
|
|
|
156
|
+
**TCMB'nin resmi enflasyon verilerine doğrudan erişin.** Aylık ve yıllık TÜFE oranlarını sorgulayın veya geçmiş tarihler arasında enflasyon hesaplayın. Yatırım kararlarınızı reel getiri bazında değerlendirmek için kritik.
|
|
157
|
+
|
|
148
158
|
```typescript
|
|
149
159
|
import { Inflation } from 'borsajs';
|
|
150
160
|
|
|
@@ -177,8 +187,143 @@ const calc = await inflation.calculate(100000, '2020-01', '2024-01');
|
|
|
177
187
|
}
|
|
178
188
|
```
|
|
179
189
|
|
|
190
|
+
### KAP (Kamu Aydınlatma Platformu)
|
|
191
|
+
|
|
192
|
+
**Şirketlerin resmi açıklamalarına ve bildirimlerine tek noktadan ulaşın.** KAP API ile 731 BIST şirketinin bildirimlerini, beklenen rapor takvimlerini ve kurumsal bilgilerini sorgulayabilirsiniz. Yatırım kararlarınızı şirketlerin resmi açıklamaları ışığında alın.
|
|
193
|
+
|
|
194
|
+
**Özellikler:**
|
|
195
|
+
- 🏢 **731 BIST şirketi** - Tüm halka açık şirketlerin listesi ve bilgileri
|
|
196
|
+
- 📢 **Anlık Bildirimler** - Şirketlerin KAP'a yaptığı tüm açıklamalar
|
|
197
|
+
- 📅 **Bildirim Takvimi** - Finansal rapor ve açıklama tarihleri
|
|
198
|
+
- 🏛️ **Kurumsal Bilgiler** - Sektör, pazar, web sitesi bilgileri
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
import { getKapProvider } from 'borsajs';
|
|
202
|
+
|
|
203
|
+
const kap = getKapProvider();
|
|
204
|
+
const companies = await kap.getCompanies();
|
|
205
|
+
const search = await kap.search('türk hava');
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Response (Companies):**
|
|
209
|
+
```json
|
|
210
|
+
[
|
|
211
|
+
{
|
|
212
|
+
"ticker": "THYAO",
|
|
213
|
+
"name": "TÜRK HAVA YOLLARI A.O.",
|
|
214
|
+
"city": "İSTANBUL"
|
|
215
|
+
}
|
|
216
|
+
]
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Response (Search):**
|
|
220
|
+
```json
|
|
221
|
+
[
|
|
222
|
+
{
|
|
223
|
+
"ticker": "THYAO",
|
|
224
|
+
"name": "TÜRK HAVA YOLLARI A.O.",
|
|
225
|
+
"city": "İSTANBUL"
|
|
226
|
+
}
|
|
227
|
+
]
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**KAP Bildirimleri:**
|
|
231
|
+
```typescript
|
|
232
|
+
const disclosures = await kap.getDisclosures('THYAO', 5);
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Response (Disclosures):**
|
|
236
|
+
```json
|
|
237
|
+
[
|
|
238
|
+
{
|
|
239
|
+
"date": "29.12.2025 19:21:18",
|
|
240
|
+
"title": "Haber ve Söylentilere İlişkin Açıklama",
|
|
241
|
+
"disclosureIndex": 1530826,
|
|
242
|
+
"url": "https://www.kap.org.tr/tr/Bildirim/1530826"
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Beklenen Bildirim Takvimi:**
|
|
248
|
+
```typescript
|
|
249
|
+
const calendar = await kap.getCalendar('THYAO');
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Response (Calendar):**
|
|
253
|
+
```json
|
|
254
|
+
[
|
|
255
|
+
{
|
|
256
|
+
"startDate": "01.01.2026",
|
|
257
|
+
"endDate": "11.03.2026",
|
|
258
|
+
"subject": "Finansal Rapor",
|
|
259
|
+
"period": "Yıllık",
|
|
260
|
+
"year": "2025"
|
|
261
|
+
}
|
|
262
|
+
]
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Şirket Detayları:**
|
|
266
|
+
```typescript
|
|
267
|
+
const details = await kap.getCompanyDetails('THYAO');
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Response (Company Details):**
|
|
271
|
+
```json
|
|
272
|
+
{
|
|
273
|
+
"sector": "ULAŞTIRMA VE DEPOLAMA",
|
|
274
|
+
"market": "YILDIZ PAZAR",
|
|
275
|
+
"website": "www.turkishairlines.com / http://investor.turkishairlines.com"
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### VIOP (Vadeli İşlem ve Opsiyon Piyasası)
|
|
280
|
+
|
|
281
|
+
**Türk türev piyasasını gerçek zamanlı takip edin.** Hisse senedi vadeli işlemleri, endeks vadeli işlemleri, döviz ve emtia kontratlarına anında erişin. Riskten korunma (hedging) stratejileri ve türev ürün ticareti için vazgeçilmez.
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
import { VIOP } from 'borsajs';
|
|
285
|
+
|
|
286
|
+
const viop = new VIOP();
|
|
287
|
+
|
|
288
|
+
// Tüm vadeli işlemleri al
|
|
289
|
+
const futures = await viop.getFutures();
|
|
290
|
+
|
|
291
|
+
// Hisse senedi vadeli işlemleri
|
|
292
|
+
const stockFutures = await viop.getStockFutures();
|
|
293
|
+
|
|
294
|
+
// Endeks vadeli işlemleri
|
|
295
|
+
const indexFutures = await viop.getIndexFutures();
|
|
296
|
+
|
|
297
|
+
// Döviz vadeli işlemleri
|
|
298
|
+
const currencyFutures = await viop.getCurrencyFutures();
|
|
299
|
+
|
|
300
|
+
// Emtia vadeli işlemleri
|
|
301
|
+
const commodityFutures = await viop.getCommodityFutures();
|
|
302
|
+
|
|
303
|
+
// Opsiyonlar
|
|
304
|
+
const options = await viop.getOptions();
|
|
305
|
+
|
|
306
|
+
// Belirli bir hisse için kontratlar
|
|
307
|
+
const thyaoContracts = await viop.getBySymbol('THYAO');
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**Response (Contract Data):**
|
|
311
|
+
```json
|
|
312
|
+
{
|
|
313
|
+
"code": "THYAO",
|
|
314
|
+
"contract": "THYAO0226",
|
|
315
|
+
"price": 275.5,
|
|
316
|
+
"change": 1.25,
|
|
317
|
+
"volumeTl": 15420000,
|
|
318
|
+
"volumeQty": 56000,
|
|
319
|
+
"category": "stock"
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
180
323
|
### Symbols (Sembol Listeleri)
|
|
181
324
|
|
|
325
|
+
**Tüm piyasa sembollerine tek çağrıda erişin.** Hisse senetleri, kripto paralar, dövizler ve endekslerin sembol listelerini alın. Otomatik veri çekme veya tarama algoritmaları için mükemmel başlangıç noktası.
|
|
326
|
+
|
|
182
327
|
```typescript
|
|
183
328
|
import { symbols, searchSymbols, cryptoSymbols, fxSymbols, indexSymbols } from 'borsajs';
|
|
184
329
|
|
|
@@ -208,6 +353,7 @@ Bu kütüphane aşağıdaki kamuya açık veri kaynaklarından yararlanmaktadır
|
|
|
208
353
|
| Crypto | BtcTurk | [btcturk.com](https://www.btcturk.com/) | Kripto para verileri |
|
|
209
354
|
| Fund | TEFAS | [tefas.gov.tr](https://www.tefas.gov.tr/) | Yatırım fonu verileri |
|
|
210
355
|
| Inflation | TCMB | [tcmb.gov.tr](https://www.tcmb.gov.tr/) | Enflasyon verileri |
|
|
356
|
+
| KAP | KAP | [kap.org.tr](https://www.kap.org.tr/) | Şirket bilgileri |
|
|
211
357
|
| VIOP | İş Yatırım | [isyatirim.com.tr](https://www.isyatirim.com.tr/) | Vadeli işlem ve opsiyon |
|
|
212
358
|
|
|
213
359
|
## ⚠️ Önemli Uyarılar
|
package/dist/providers/kap.d.ts
CHANGED
|
@@ -5,17 +5,38 @@ export interface Company {
|
|
|
5
5
|
city: string;
|
|
6
6
|
}
|
|
7
7
|
export interface Disclosure {
|
|
8
|
-
|
|
9
|
-
date: Date;
|
|
8
|
+
date: string;
|
|
10
9
|
title: string;
|
|
11
|
-
|
|
10
|
+
disclosureIndex: number;
|
|
12
11
|
url: string;
|
|
13
12
|
}
|
|
13
|
+
export interface CalendarEvent {
|
|
14
|
+
startDate: string;
|
|
15
|
+
endDate: string;
|
|
16
|
+
subject: string;
|
|
17
|
+
period: string;
|
|
18
|
+
year: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CompanyDetails {
|
|
21
|
+
sector?: string;
|
|
22
|
+
market?: string;
|
|
23
|
+
website?: string;
|
|
24
|
+
}
|
|
14
25
|
export declare class KapProvider extends BaseProvider {
|
|
15
26
|
private static readonly BASE_URL;
|
|
27
|
+
private static readonly DISCLOSURE_URL;
|
|
28
|
+
private static readonly CALENDAR_API_URL;
|
|
29
|
+
private static readonly COMPANY_INFO_URL;
|
|
30
|
+
private oidMap;
|
|
31
|
+
private oidCacheTime;
|
|
32
|
+
private readonly CACHE_DURATION;
|
|
16
33
|
constructor(options?: ProviderOptions);
|
|
17
34
|
getCompanies(): Promise<Company[]>;
|
|
18
35
|
search(query: string): Promise<Company[]>;
|
|
36
|
+
getMemberOid(symbol: string): Promise<string | null>;
|
|
37
|
+
getDisclosures(symbol: string, limit?: number): Promise<Disclosure[]>;
|
|
38
|
+
getCalendar(symbol: string): Promise<CalendarEvent[]>;
|
|
39
|
+
getCompanyDetails(symbol: string): Promise<CompanyDetails>;
|
|
19
40
|
}
|
|
20
41
|
export interface ContractData {
|
|
21
42
|
code: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kap.d.ts","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,OAAO;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACxE,MAAM,WAAW,UAAU;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,
|
|
1
|
+
{"version":3,"file":"kap.d.ts","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,OAAO;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACxE,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAClG,MAAM,WAAW,aAAa;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACrH,MAAM,WAAW,cAAc;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAAE;AAEvF,qBAAa,WAAY,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAoD;IAC1F,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAmE;IAC3G,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAiD;IACzF,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAY;gBAE/B,OAAO,CAAC,EAAE,eAAe;IAE/B,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAoClC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAMzC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuCpD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAyCzE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA2DrD,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAyCnE;AAED,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;CAAE;AAEvJ,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuE;gBAC3F,OAAO,CAAC,EAAE,eAAe;IAE/B,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyB3G,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAsBzF;AAGD,wBAAgB,cAAc,IAAI,WAAW,CAA2E;AAExH,wBAAgB,eAAe,IAAI,YAAY,CAA+E"}
|
package/dist/providers/kap.js
CHANGED
|
@@ -7,6 +7,12 @@ import { TTL } from '../cache.js';
|
|
|
7
7
|
import { APIError } from '../exceptions.js';
|
|
8
8
|
export class KapProvider extends BaseProvider {
|
|
9
9
|
static BASE_URL = 'https://www.kap.org.tr';
|
|
10
|
+
static DISCLOSURE_URL = 'https://www.kap.org.tr/tr/bildirim-sorgu-sonuc';
|
|
11
|
+
static CALENDAR_API_URL = 'https://kap.org.tr/tr/api/expected-disclosure-inquiry/company';
|
|
12
|
+
static COMPANY_INFO_URL = 'https://kap.org.tr/tr/sirket-bilgileri/ozet';
|
|
13
|
+
oidMap = null;
|
|
14
|
+
oidCacheTime = 0;
|
|
15
|
+
CACHE_DURATION = 86400000; // 24 hours in ms
|
|
10
16
|
constructor(options) { super(options); }
|
|
11
17
|
async getCompanies() {
|
|
12
18
|
const cacheKey = 'kap:companies';
|
|
@@ -14,14 +20,28 @@ export class KapProvider extends BaseProvider {
|
|
|
14
20
|
if (cached)
|
|
15
21
|
return cached;
|
|
16
22
|
try {
|
|
17
|
-
const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-
|
|
18
|
-
|
|
23
|
+
const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' });
|
|
24
|
+
// Parse from Next.js embedded JSON data
|
|
25
|
+
// Pattern: \\"mkkMemberOid\\":\\"xxx\\",\\"kapMemberTitle\\":\\"...\\",\\"relatedMemberTitle\\":\\"...\\",\\"stockCode\\":\\"TICKER\\"
|
|
26
|
+
const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",\\"kapMemberTitle\\":\\"([^\\]+)\\",\\"relatedMemberTitle\\":\\"[^\\]*\\",\\"stockCode\\":\\"([^\\]+)\\"/g;
|
|
19
27
|
const companies = [];
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
const matches = response.data.matchAll(pattern);
|
|
29
|
+
for (const match of matches) {
|
|
30
|
+
const name = match[2];
|
|
31
|
+
const stockCodes = match[3];
|
|
32
|
+
// Handle multiple tickers (e.g., "GARAN, TGB")
|
|
33
|
+
if (stockCodes.includes(',')) {
|
|
34
|
+
const tickers = stockCodes.split(',').map(t => t.trim());
|
|
35
|
+
for (const ticker of tickers) {
|
|
36
|
+
if (ticker) {
|
|
37
|
+
companies.push({ ticker, name, city: '' });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
companies.push({ ticker: stockCodes, name, city: '' });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
25
45
|
this.cacheSet(cacheKey, companies, TTL.COMPANY_LIST);
|
|
26
46
|
return companies;
|
|
27
47
|
}
|
|
@@ -34,6 +54,159 @@ export class KapProvider extends BaseProvider {
|
|
|
34
54
|
const q = query.toLowerCase();
|
|
35
55
|
return companies.filter(c => c.ticker.toLowerCase().includes(q) || c.name.toLowerCase().includes(q));
|
|
36
56
|
}
|
|
57
|
+
async getMemberOid(symbol) {
|
|
58
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
59
|
+
const currentTime = Date.now();
|
|
60
|
+
// Check cache
|
|
61
|
+
if (this.oidMap && (currentTime - this.oidCacheTime) < this.CACHE_DURATION) {
|
|
62
|
+
return this.oidMap.get(symbol) || null;
|
|
63
|
+
}
|
|
64
|
+
// Fetch BIST companies list from KAP
|
|
65
|
+
try {
|
|
66
|
+
const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' });
|
|
67
|
+
// Parse mkkMemberOid and stockCode pairs from Next.js data
|
|
68
|
+
const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",[^}]*\\"stockCode\\":\\"([^\\]+)\\"/g;
|
|
69
|
+
const matches = response.data.matchAll(pattern);
|
|
70
|
+
// Build mapping: stockCode -> mkkMemberOid
|
|
71
|
+
this.oidMap = new Map();
|
|
72
|
+
for (const match of matches) {
|
|
73
|
+
const oid = match[1];
|
|
74
|
+
const codesStr = match[2];
|
|
75
|
+
// Handle multiple codes per company (e.g., "GARAN, TGB")
|
|
76
|
+
for (const code of codesStr.split(',')) {
|
|
77
|
+
const trimmedCode = code.trim();
|
|
78
|
+
if (trimmedCode) {
|
|
79
|
+
this.oidMap.set(trimmedCode, oid);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
this.oidCacheTime = currentTime;
|
|
84
|
+
return this.oidMap.get(symbol) || null;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async getDisclosures(symbol, limit = 20) {
|
|
91
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
92
|
+
// Get KAP member OID for the symbol
|
|
93
|
+
const memberOid = await this.getMemberOid(symbol);
|
|
94
|
+
if (!memberOid) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
// Fetch disclosures from KAP
|
|
98
|
+
const discUrl = `${KapProvider.DISCLOSURE_URL}?member=${memberOid}`;
|
|
99
|
+
try {
|
|
100
|
+
const response = await this.get(discUrl, { responseType: 'text' });
|
|
101
|
+
// Parse disclosures from Next.js embedded data
|
|
102
|
+
// Pattern: publishDate\":\"29.12.2025 19:21:18\",\"disclosureIndex\":1530826...title\":\"...\"
|
|
103
|
+
const pattern = /publishDate\\":\\"([^\\]+)\\".*?disclosureIndex\\":(\d+).*?title\\":\\"([^\\]+)\\"/gs;
|
|
104
|
+
const matches = Array.from(response.data.matchAll(pattern));
|
|
105
|
+
const disclosures = [];
|
|
106
|
+
for (let i = 0; i < Math.min(matches.length, limit); i++) {
|
|
107
|
+
const match = matches[i];
|
|
108
|
+
const date = match[1];
|
|
109
|
+
const idx = parseInt(match[2]);
|
|
110
|
+
const title = match[3];
|
|
111
|
+
disclosures.push({
|
|
112
|
+
date,
|
|
113
|
+
title,
|
|
114
|
+
disclosureIndex: idx,
|
|
115
|
+
url: `https://www.kap.org.tr/tr/Bildirim/${idx}`
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return disclosures;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new APIError(`Failed to fetch disclosures for ${symbol}: ${error}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async getCalendar(symbol) {
|
|
125
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
126
|
+
// Get KAP member OID for the symbol
|
|
127
|
+
const memberOid = await this.getMemberOid(symbol);
|
|
128
|
+
if (!memberOid) {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
// Calculate date range: today to 6 months from now
|
|
132
|
+
const now = new Date();
|
|
133
|
+
const startDate = now.toISOString().split('T')[0];
|
|
134
|
+
const endDate = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
|
|
135
|
+
// Fetch expected disclosures from KAP API
|
|
136
|
+
const headers = {
|
|
137
|
+
'Accept': '*/*',
|
|
138
|
+
'Content-Type': 'application/json',
|
|
139
|
+
'Origin': 'https://kap.org.tr',
|
|
140
|
+
'Referer': 'https://kap.org.tr/tr/beklenen-bildirim-sorgu'
|
|
141
|
+
};
|
|
142
|
+
const payload = {
|
|
143
|
+
startDate,
|
|
144
|
+
endDate,
|
|
145
|
+
memberTypes: ['IGS'],
|
|
146
|
+
mkkMemberOidList: [memberOid],
|
|
147
|
+
disclosureClass: '',
|
|
148
|
+
subjects: [],
|
|
149
|
+
mainSector: '',
|
|
150
|
+
sector: '',
|
|
151
|
+
subSector: '',
|
|
152
|
+
market: '',
|
|
153
|
+
index: '',
|
|
154
|
+
year: '',
|
|
155
|
+
term: '',
|
|
156
|
+
ruleType: ''
|
|
157
|
+
};
|
|
158
|
+
try {
|
|
159
|
+
const response = await this.post(KapProvider.CALENDAR_API_URL, payload, { headers });
|
|
160
|
+
const events = [];
|
|
161
|
+
for (const item of response.data) {
|
|
162
|
+
events.push({
|
|
163
|
+
startDate: item.startDate || '',
|
|
164
|
+
endDate: item.endDate || '',
|
|
165
|
+
subject: item.subject || '',
|
|
166
|
+
period: item.ruleTypeTerm || '',
|
|
167
|
+
year: item.year || ''
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return events;
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
throw new APIError(`Failed to fetch calendar for ${symbol}: ${error}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async getCompanyDetails(symbol) {
|
|
177
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
178
|
+
// Get KAP member OID for the symbol
|
|
179
|
+
const memberOid = await this.getMemberOid(symbol);
|
|
180
|
+
if (!memberOid) {
|
|
181
|
+
return {};
|
|
182
|
+
}
|
|
183
|
+
// Fetch company info page
|
|
184
|
+
const url = `${KapProvider.COMPANY_INFO_URL}/${memberOid}`;
|
|
185
|
+
try {
|
|
186
|
+
const response = await this.get(url, { responseType: 'text' });
|
|
187
|
+
const html = response.data;
|
|
188
|
+
const result = {};
|
|
189
|
+
// Extract sector: href="/tr/Sektorler?sector=...">SECTOR_NAME</a>
|
|
190
|
+
const sectorMatch = html.match(/href="\/tr\/Sektorler\?sector=[^"]*">([^<]+)<\/a>/);
|
|
191
|
+
if (sectorMatch) {
|
|
192
|
+
result.sector = sectorMatch[1].trim();
|
|
193
|
+
}
|
|
194
|
+
// Extract market: href="/tr/Pazarlar?market=...">MARKET_NAME</a>
|
|
195
|
+
const marketMatch = html.match(/href="\/tr\/Pazarlar\?market=[^"]*">([^<]+)<\/a>/);
|
|
196
|
+
if (marketMatch) {
|
|
197
|
+
result.market = marketMatch[1].trim();
|
|
198
|
+
}
|
|
199
|
+
// Extract website: after "İnternet Adresi" label
|
|
200
|
+
const websiteMatch = html.match(/İnternet Adresi<\/h3><p[^>]*>([^<]+)<\/p>/);
|
|
201
|
+
if (websiteMatch) {
|
|
202
|
+
result.website = websiteMatch[1].trim();
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
return {};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
37
210
|
}
|
|
38
211
|
export class ViopProvider extends BaseProvider {
|
|
39
212
|
static BASE_URL = 'https://www.isyatirim.com.tr/tr-tr/analiz/Sayfalar/viop-akis.aspx';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kap.js","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kap.js","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "borsajs",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.5",
|
|
4
|
+
"description": "Türkiye financial markets data library, BIST stocks, KAP,VIOP, forex, crypto, investment funds, and more",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
package/src/providers/kap.ts
CHANGED
|
@@ -7,10 +7,19 @@ import { TTL } from '../cache.js';
|
|
|
7
7
|
import { APIError } from '../exceptions.js';
|
|
8
8
|
|
|
9
9
|
export interface Company { ticker: string; name: string; city: string; }
|
|
10
|
-
export interface Disclosure {
|
|
10
|
+
export interface Disclosure { date: string; title: string; disclosureIndex: number; url: string; }
|
|
11
|
+
export interface CalendarEvent { startDate: string; endDate: string; subject: string; period: string; year: string; }
|
|
12
|
+
export interface CompanyDetails { sector?: string; market?: string; website?: string; }
|
|
11
13
|
|
|
12
14
|
export class KapProvider extends BaseProvider {
|
|
13
15
|
private static readonly BASE_URL = 'https://www.kap.org.tr';
|
|
16
|
+
private static readonly DISCLOSURE_URL = 'https://www.kap.org.tr/tr/bildirim-sorgu-sonuc';
|
|
17
|
+
private static readonly CALENDAR_API_URL = 'https://kap.org.tr/tr/api/expected-disclosure-inquiry/company';
|
|
18
|
+
private static readonly COMPANY_INFO_URL = 'https://kap.org.tr/tr/sirket-bilgileri/ozet';
|
|
19
|
+
private oidMap: Map<string, string> | null = null;
|
|
20
|
+
private oidCacheTime: number = 0;
|
|
21
|
+
private readonly CACHE_DURATION = 86400000; // 24 hours in ms
|
|
22
|
+
|
|
14
23
|
constructor(options?: ProviderOptions) { super(options); }
|
|
15
24
|
|
|
16
25
|
async getCompanies(): Promise<Company[]> {
|
|
@@ -18,13 +27,32 @@ export class KapProvider extends BaseProvider {
|
|
|
18
27
|
const cached = this.cacheGet<Company[]>(cacheKey);
|
|
19
28
|
if (cached) return cached;
|
|
20
29
|
try {
|
|
21
|
-
const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-
|
|
22
|
-
|
|
30
|
+
const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' as const });
|
|
31
|
+
|
|
32
|
+
// Parse from Next.js embedded JSON data
|
|
33
|
+
// Pattern: \\"mkkMemberOid\\":\\"xxx\\",\\"kapMemberTitle\\":\\"...\\",\\"relatedMemberTitle\\":\\"...\\",\\"stockCode\\":\\"TICKER\\"
|
|
34
|
+
const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",\\"kapMemberTitle\\":\\"([^\\]+)\\",\\"relatedMemberTitle\\":\\"[^\\]*\\",\\"stockCode\\":\\"([^\\]+)\\"/g;
|
|
35
|
+
|
|
23
36
|
const companies: Company[] = [];
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
37
|
+
const matches = response.data.matchAll(pattern);
|
|
38
|
+
|
|
39
|
+
for (const match of matches) {
|
|
40
|
+
const name = match[2];
|
|
41
|
+
const stockCodes = match[3];
|
|
42
|
+
|
|
43
|
+
// Handle multiple tickers (e.g., "GARAN, TGB")
|
|
44
|
+
if (stockCodes.includes(',')) {
|
|
45
|
+
const tickers = stockCodes.split(',').map(t => t.trim());
|
|
46
|
+
for (const ticker of tickers) {
|
|
47
|
+
if (ticker) {
|
|
48
|
+
companies.push({ ticker, name, city: '' });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
companies.push({ ticker: stockCodes, name, city: '' });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
28
56
|
this.cacheSet(cacheKey, companies, TTL.COMPANY_LIST);
|
|
29
57
|
return companies;
|
|
30
58
|
} catch (error) { throw new APIError(`Failed to fetch companies: ${error}`); }
|
|
@@ -35,6 +63,187 @@ export class KapProvider extends BaseProvider {
|
|
|
35
63
|
const q = query.toLowerCase();
|
|
36
64
|
return companies.filter(c => c.ticker.toLowerCase().includes(q) || c.name.toLowerCase().includes(q));
|
|
37
65
|
}
|
|
66
|
+
|
|
67
|
+
async getMemberOid(symbol: string): Promise<string | null> {
|
|
68
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
69
|
+
const currentTime = Date.now();
|
|
70
|
+
|
|
71
|
+
// Check cache
|
|
72
|
+
if (this.oidMap && (currentTime - this.oidCacheTime) < this.CACHE_DURATION) {
|
|
73
|
+
return this.oidMap.get(symbol) || null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Fetch BIST companies list from KAP
|
|
77
|
+
try {
|
|
78
|
+
const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' as const });
|
|
79
|
+
|
|
80
|
+
// Parse mkkMemberOid and stockCode pairs from Next.js data
|
|
81
|
+
const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",[^}]*\\"stockCode\\":\\"([^\\]+)\\"/g;
|
|
82
|
+
const matches = response.data.matchAll(pattern);
|
|
83
|
+
|
|
84
|
+
// Build mapping: stockCode -> mkkMemberOid
|
|
85
|
+
this.oidMap = new Map();
|
|
86
|
+
for (const match of matches) {
|
|
87
|
+
const oid = match[1];
|
|
88
|
+
const codesStr = match[2];
|
|
89
|
+
|
|
90
|
+
// Handle multiple codes per company (e.g., "GARAN, TGB")
|
|
91
|
+
for (const code of codesStr.split(',')) {
|
|
92
|
+
const trimmedCode = code.trim();
|
|
93
|
+
if (trimmedCode) {
|
|
94
|
+
this.oidMap.set(trimmedCode, oid);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
this.oidCacheTime = currentTime;
|
|
100
|
+
return this.oidMap.get(symbol) || null;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async getDisclosures(symbol: string, limit: number = 20): Promise<Disclosure[]> {
|
|
107
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
108
|
+
|
|
109
|
+
// Get KAP member OID for the symbol
|
|
110
|
+
const memberOid = await this.getMemberOid(symbol);
|
|
111
|
+
if (!memberOid) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Fetch disclosures from KAP
|
|
116
|
+
const discUrl = `${KapProvider.DISCLOSURE_URL}?member=${memberOid}`;
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
const response = await this.get<string>(discUrl, { responseType: 'text' as const });
|
|
120
|
+
|
|
121
|
+
// Parse disclosures from Next.js embedded data
|
|
122
|
+
// Pattern: publishDate\":\"29.12.2025 19:21:18\",\"disclosureIndex\":1530826...title\":\"...\"
|
|
123
|
+
const pattern = /publishDate\\":\\"([^\\]+)\\".*?disclosureIndex\\":(\d+).*?title\\":\\"([^\\]+)\\"/gs;
|
|
124
|
+
const matches = Array.from(response.data.matchAll(pattern));
|
|
125
|
+
|
|
126
|
+
const disclosures: Disclosure[] = [];
|
|
127
|
+
for (let i = 0; i < Math.min(matches.length, limit); i++) {
|
|
128
|
+
const match = matches[i];
|
|
129
|
+
const date = match[1];
|
|
130
|
+
const idx = parseInt(match[2]);
|
|
131
|
+
const title = match[3];
|
|
132
|
+
|
|
133
|
+
disclosures.push({
|
|
134
|
+
date,
|
|
135
|
+
title,
|
|
136
|
+
disclosureIndex: idx,
|
|
137
|
+
url: `https://www.kap.org.tr/tr/Bildirim/${idx}`
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return disclosures;
|
|
142
|
+
} catch (error) {
|
|
143
|
+
throw new APIError(`Failed to fetch disclosures for ${symbol}: ${error}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async getCalendar(symbol: string): Promise<CalendarEvent[]> {
|
|
148
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
149
|
+
|
|
150
|
+
// Get KAP member OID for the symbol
|
|
151
|
+
const memberOid = await this.getMemberOid(symbol);
|
|
152
|
+
if (!memberOid) {
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Calculate date range: today to 6 months from now
|
|
157
|
+
const now = new Date();
|
|
158
|
+
const startDate = now.toISOString().split('T')[0];
|
|
159
|
+
const endDate = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
|
|
160
|
+
|
|
161
|
+
// Fetch expected disclosures from KAP API
|
|
162
|
+
const headers = {
|
|
163
|
+
'Accept': '*/*',
|
|
164
|
+
'Content-Type': 'application/json',
|
|
165
|
+
'Origin': 'https://kap.org.tr',
|
|
166
|
+
'Referer': 'https://kap.org.tr/tr/beklenen-bildirim-sorgu'
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const payload = {
|
|
170
|
+
startDate,
|
|
171
|
+
endDate,
|
|
172
|
+
memberTypes: ['IGS'],
|
|
173
|
+
mkkMemberOidList: [memberOid],
|
|
174
|
+
disclosureClass: '',
|
|
175
|
+
subjects: [],
|
|
176
|
+
mainSector: '',
|
|
177
|
+
sector: '',
|
|
178
|
+
subSector: '',
|
|
179
|
+
market: '',
|
|
180
|
+
index: '',
|
|
181
|
+
year: '',
|
|
182
|
+
term: '',
|
|
183
|
+
ruleType: ''
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
const response = await this.post<any[]>(KapProvider.CALENDAR_API_URL, payload, { headers });
|
|
188
|
+
|
|
189
|
+
const events: CalendarEvent[] = [];
|
|
190
|
+
for (const item of response.data) {
|
|
191
|
+
events.push({
|
|
192
|
+
startDate: item.startDate || '',
|
|
193
|
+
endDate: item.endDate || '',
|
|
194
|
+
subject: item.subject || '',
|
|
195
|
+
period: item.ruleTypeTerm || '',
|
|
196
|
+
year: item.year || ''
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return events;
|
|
201
|
+
} catch (error) {
|
|
202
|
+
throw new APIError(`Failed to fetch calendar for ${symbol}: ${error}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async getCompanyDetails(symbol: string): Promise<CompanyDetails> {
|
|
207
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
208
|
+
|
|
209
|
+
// Get KAP member OID for the symbol
|
|
210
|
+
const memberOid = await this.getMemberOid(symbol);
|
|
211
|
+
if (!memberOid) {
|
|
212
|
+
return {};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Fetch company info page
|
|
216
|
+
const url = `${KapProvider.COMPANY_INFO_URL}/${memberOid}`;
|
|
217
|
+
|
|
218
|
+
try {
|
|
219
|
+
const response = await this.get<string>(url, { responseType: 'text' as const });
|
|
220
|
+
const html = response.data;
|
|
221
|
+
|
|
222
|
+
const result: CompanyDetails = {};
|
|
223
|
+
|
|
224
|
+
// Extract sector: href="/tr/Sektorler?sector=...">SECTOR_NAME</a>
|
|
225
|
+
const sectorMatch = html.match(/href="\/tr\/Sektorler\?sector=[^"]*">([^<]+)<\/a>/);
|
|
226
|
+
if (sectorMatch) {
|
|
227
|
+
result.sector = sectorMatch[1].trim();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Extract market: href="/tr/Pazarlar?market=...">MARKET_NAME</a>
|
|
231
|
+
const marketMatch = html.match(/href="\/tr\/Pazarlar\?market=[^"]*">([^<]+)<\/a>/);
|
|
232
|
+
if (marketMatch) {
|
|
233
|
+
result.market = marketMatch[1].trim();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Extract website: after "İnternet Adresi" label
|
|
237
|
+
const websiteMatch = html.match(/İnternet Adresi<\/h3><p[^>]*>([^<]+)<\/p>/);
|
|
238
|
+
if (websiteMatch) {
|
|
239
|
+
result.website = websiteMatch[1].trim();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return result;
|
|
243
|
+
} catch (error) {
|
|
244
|
+
return {};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
38
247
|
}
|
|
39
248
|
|
|
40
249
|
export interface ContractData { code: string; contract: string; price: number; change: number; volumeTl: number; volumeQty: number; category: string; }
|
package/test/demo.ts
CHANGED
|
@@ -9,6 +9,8 @@ import { Index, indices } from '../src/index-class.js';
|
|
|
9
9
|
import { Inflation } from '../src/inflation.js';
|
|
10
10
|
import { Ticker } from '../src/ticker.js';
|
|
11
11
|
import { symbols, searchSymbols, cryptoSymbols, fxSymbols, indexSymbols } from '../src/market.js';
|
|
12
|
+
import { getKapProvider } from '../src/providers/kap.js';
|
|
13
|
+
import { VIOP } from '../src/viop.js';
|
|
12
14
|
|
|
13
15
|
async function testCrypto() {
|
|
14
16
|
console.log('\n🪙 CRYPTO (BtcTurk)');
|
|
@@ -117,6 +119,69 @@ async function testSymbols() {
|
|
|
117
119
|
} catch (error) { console.error('Error:', error); }
|
|
118
120
|
}
|
|
119
121
|
|
|
122
|
+
async function testKap() {
|
|
123
|
+
console.log('\n🏛️ KAP (Public Disclosure Platform)');
|
|
124
|
+
console.log('─'.repeat(60));
|
|
125
|
+
try {
|
|
126
|
+
const kap = getKapProvider();
|
|
127
|
+
const companies = await kap.getCompanies();
|
|
128
|
+
console.log(`Total Companies: ${companies.length}`);
|
|
129
|
+
console.log('Sample:', JSON.stringify(companies.slice(0, 3), null, 2));
|
|
130
|
+
|
|
131
|
+
const search = await kap.search('türk hava');
|
|
132
|
+
console.log('\nSearch "türk hava":', JSON.stringify(search, null, 2));
|
|
133
|
+
|
|
134
|
+
// Test disclosures
|
|
135
|
+
const disclosures = await kap.getDisclosures('THYAO', 5);
|
|
136
|
+
console.log(`\nRecent THYAO Disclosures (${disclosures.length}):`);
|
|
137
|
+
disclosures.forEach((d, i) => {
|
|
138
|
+
console.log(` ${i + 1}. [${d.date}] ${d.title}`);
|
|
139
|
+
console.log(` ${d.url}`);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Test calendar
|
|
143
|
+
const calendar = await kap.getCalendar('THYAO');
|
|
144
|
+
console.log(`\nTHYAO Expected Disclosures (${calendar.length}):`);
|
|
145
|
+
calendar.slice(0, 3).forEach((c, i) => {
|
|
146
|
+
console.log(` ${i + 1}. ${c.subject} (${c.period} ${c.year})`);
|
|
147
|
+
console.log(` ${c.startDate} - ${c.endDate}`);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// Test company details
|
|
151
|
+
const details = await kap.getCompanyDetails('THYAO');
|
|
152
|
+
console.log('\nTHYAO Company Details:', JSON.stringify(details, null, 2));
|
|
153
|
+
} catch (error) { console.error('Error:', error); }
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function testViop() {
|
|
157
|
+
console.log('\n📊 VIOP (Derivatives Market)');
|
|
158
|
+
console.log('─'.repeat(60));
|
|
159
|
+
try {
|
|
160
|
+
const viop = new VIOP();
|
|
161
|
+
|
|
162
|
+
// Test stock futures
|
|
163
|
+
const stockFutures = await viop.getStockFutures();
|
|
164
|
+
console.log(`Stock Futures: ${stockFutures.length} contracts`);
|
|
165
|
+
if (stockFutures.length > 0) {
|
|
166
|
+
console.log('Sample:', JSON.stringify(stockFutures.slice(0, 2), null, 2));
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Test index futures
|
|
170
|
+
const indexFutures = await viop.getIndexFutures();
|
|
171
|
+
console.log(`\nIndex Futures: ${indexFutures.length} contracts`);
|
|
172
|
+
if (indexFutures.length > 0) {
|
|
173
|
+
console.log('Sample:', JSON.stringify(indexFutures.slice(0, 2), null, 2));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Test by symbol
|
|
177
|
+
const thyaoContracts = await viop.getBySymbol('THYAO');
|
|
178
|
+
console.log(`\nTHYAO Contracts: ${thyaoContracts.length}`);
|
|
179
|
+
if (thyaoContracts.length > 0) {
|
|
180
|
+
console.log('First:', JSON.stringify(thyaoContracts[0], null, 2));
|
|
181
|
+
}
|
|
182
|
+
} catch (error) { console.error('Error:', error); }
|
|
183
|
+
}
|
|
184
|
+
|
|
120
185
|
async function main() {
|
|
121
186
|
console.log('🚀 borsajs API Test');
|
|
122
187
|
console.log('═'.repeat(60));
|
|
@@ -128,6 +193,8 @@ async function main() {
|
|
|
128
193
|
await testFund();
|
|
129
194
|
await testInflation();
|
|
130
195
|
await testSymbols();
|
|
196
|
+
await testKap();
|
|
197
|
+
await testViop();
|
|
131
198
|
|
|
132
199
|
console.log('\n' + '═'.repeat(60));
|
|
133
200
|
console.log('✅ All tests completed!');
|