@invezgo/sdk 1.3.1 โ†’ 2.0.1

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.
Files changed (56) hide show
  1. package/README.md +318 -313
  2. package/dist/cache.d.ts +27 -0
  3. package/dist/cache.d.ts.map +1 -0
  4. package/dist/client.d.ts +15 -18
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/errors.d.ts +71 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/generated/resources.d.ts +3291 -0
  9. package/dist/generated/resources.d.ts.map +1 -0
  10. package/dist/generated/types.d.ts +3449 -0
  11. package/dist/generated/types.d.ts.map +1 -0
  12. package/dist/http.d.ts +66 -0
  13. package/dist/http.d.ts.map +1 -0
  14. package/dist/index.d.ts +9 -15
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +755 -1005
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +775 -0
  19. package/dist/index.mjs.map +1 -0
  20. package/package.json +66 -60
  21. package/dist/endpoints/ai.d.ts +0 -98
  22. package/dist/endpoints/ai.d.ts.map +0 -1
  23. package/dist/endpoints/alerts.d.ts +0 -49
  24. package/dist/endpoints/alerts.d.ts.map +0 -1
  25. package/dist/endpoints/analysis.d.ts +0 -369
  26. package/dist/endpoints/analysis.d.ts.map +0 -1
  27. package/dist/endpoints/health.d.ts +0 -24
  28. package/dist/endpoints/health.d.ts.map +0 -1
  29. package/dist/endpoints/journals.d.ts +0 -49
  30. package/dist/endpoints/journals.d.ts.map +0 -1
  31. package/dist/endpoints/membership.d.ts +0 -35
  32. package/dist/endpoints/membership.d.ts.map +0 -1
  33. package/dist/endpoints/portfolios.d.ts +0 -14
  34. package/dist/endpoints/portfolios.d.ts.map +0 -1
  35. package/dist/endpoints/posts.d.ts +0 -42
  36. package/dist/endpoints/posts.d.ts.map +0 -1
  37. package/dist/endpoints/profile.d.ts +0 -34
  38. package/dist/endpoints/profile.d.ts.map +0 -1
  39. package/dist/endpoints/recommendation.d.ts +0 -10
  40. package/dist/endpoints/recommendation.d.ts.map +0 -1
  41. package/dist/endpoints/screener.d.ts +0 -45
  42. package/dist/endpoints/screener.d.ts.map +0 -1
  43. package/dist/endpoints/search.d.ts +0 -18
  44. package/dist/endpoints/search.d.ts.map +0 -1
  45. package/dist/endpoints/trades.d.ts +0 -31
  46. package/dist/endpoints/trades.d.ts.map +0 -1
  47. package/dist/endpoints/usage.d.ts +0 -11
  48. package/dist/endpoints/usage.d.ts.map +0 -1
  49. package/dist/endpoints/watchlists.d.ts +0 -64
  50. package/dist/endpoints/watchlists.d.ts.map +0 -1
  51. package/dist/index.esm.js +0 -1054
  52. package/dist/index.esm.js.map +0 -1
  53. package/dist/invezgo.d.ts +0 -40
  54. package/dist/invezgo.d.ts.map +0 -1
  55. package/dist/types.d.ts +0 -574
  56. package/dist/types.d.ts.map +0 -1
package/README.md CHANGED
@@ -1,313 +1,318 @@
1
- <div align="center">
2
-
3
- # ๐Ÿ“ˆ Invezgo SDK - API Saham Indonesia Resmi untuk JavaScript & TypeScript
4
-
5
- ![API Saham Indonesia](https://img.shields.io/badge/API%20Saham%20Indonesia-Lengkap-blue)
6
- ![Official SDK](https://img.shields.io/badge/SDK-Resmi-green)
7
- ![TypeScript](https://img.shields.io/badge/TypeScript-Ready-3178C6)
8
- ![Node](https://img.shields.io/badge/Node-%3E%3D14-brightgreen)
9
-
10
- **SDK resmi untuk integrasi API Saham Indonesia yang lengkap, resmi, dan performance-oriented.**
11
-
12
- Dirancang untuk developer yang membangun aplikasi saham, dashboard analitik, screener, alert engine, watchlist, jurnal transaksi, dan backend service yang membutuhkan akses stabil ke **API Saham Indonesia** dari Invezgo.
13
-
14
- [๐ŸŒ Website Invezgo](https://invezgo.com) โ€ข [๐Ÿ“š Dokumentasi API](https://api.invezgo.com/documentation)
15
-
16
- </div>
17
-
18
- ---
19
-
20
- ## ๐Ÿš€ Mengapa Invezgo untuk API Saham Indonesia
21
-
22
- Jika Anda mencari **API Saham Indonesia** yang siap dipakai untuk production, `@invezgo/sdk` memberikan surface integrasi yang lebih rapi dibanding request manual. SDK ini dibuat untuk mempermudah integrasi **API Saham Indonesia resmi** ke aplikasi JavaScript dan TypeScript dengan kontrak yang konsisten, typing yang jelas, dan footprint runtime yang ringan.
23
-
24
- Keunggulan utamanya:
25
-
26
- - โœ… **Resmi**: mengikuti surface API resmi Invezgo
27
- - โœ… **Lengkap**: mencakup data saham, broker, index, screener, alert, watchlist, jurnal, portofolio, post, dan recommendation
28
- - โœ… **Cepat dan ringan**: memakai `fetch` native tanpa dependency runtime tambahan
29
- - โœ… **Developer-first**: mendukung TypeScript, DTO terstruktur, `CJS`, `ESM`, dan error handling yang jelas
30
- - โœ… **Production-ready**: cocok untuk backend service, internal tools, fintech product, dan dashboard monitoring
31
-
32
- ---
33
-
34
- ## ๐ŸŽฏ Cocok untuk Use Case Berikut
35
-
36
- - ๐Ÿ“Š Dashboard berbasis **API Saham Indonesia**
37
- - ๐Ÿค– Screener saham Indonesia dengan formula custom
38
- - ๐Ÿ”” Alert saham dan monitoring market behavior
39
- - ๐Ÿงพ Jurnal transaksi dan manajemen watchlist
40
- - ๐Ÿ’ผ Portofolio dan personal investment tools
41
- - ๐Ÿ—๏ธ Backend integration untuk aplikasi fintech dan wealth platform
42
- - ๐Ÿง  Research tooling untuk quant, trader, dan analis
43
-
44
- ---
45
-
46
- ## ๐Ÿ“ฆ Instalasi
47
-
48
- ```bash
49
- npm install @invezgo/sdk
50
- ```
51
-
52
- ---
53
-
54
- ## ๐Ÿ›’ Cara Mulai dan Berlangganan
55
-
56
- Sebelum menggunakan SDK ini, Anda perlu memiliki akses aktif ke **API Saham Indonesia** dari Invezgo.
57
-
58
- ### 1. Pilih paket langganan API
59
-
60
- Kunjungi halaman resmi API Saham Indonesia Invezgo untuk melihat paket yang tersedia dan memilih plan yang sesuai dengan kebutuhan aplikasi Anda:
61
-
62
- - Paket API Saham Indonesia: [https://invezgo.com/id/data-api-saham-indonesia](https://invezgo.com/id/data-api-saham-indonesia)
63
-
64
- ### 2. Login ke akun Invezgo
65
-
66
- Setelah memilih paket, login ke akun Invezgo Anda melalui website utama:
67
-
68
- - Website Invezgo: [https://invezgo.com](https://invezgo.com)
69
-
70
- ### 3. Generate API key
71
-
72
- Setelah langganan aktif, generate API key dari dashboard akun Invezgo Anda. API key inilah yang akan dipakai untuk autentikasi semua request ke **API Saham Indonesia**.
73
-
74
- ### 4. Install SDK
75
-
76
- Install package JavaScript/TypeScript resmi:
77
-
78
- ```bash
79
- npm install @invezgo/sdk
80
- ```
81
-
82
- ### 5. Simpan API key di environment variable
83
-
84
- Contoh yang direkomendasikan:
85
-
86
- ```bash
87
- INVEZGO_API_KEY=your_api_key_here
88
- ```
89
-
90
- ### 6. Mulai integrasi
91
-
92
- Gunakan API key tersebut untuk mengakses endpoint Invezgo melalui SDK:
93
-
94
- ```ts
95
- import Invezgo from '@invezgo/sdk';
96
-
97
- const client = new Invezgo({
98
- apiKey: process.env.INVEZGO_API_KEY!,
99
- });
100
- ```
101
-
102
- ---
103
-
104
- ## โšก Quick Start
105
-
106
- ```ts
107
- import Invezgo from '@invezgo/sdk';
108
-
109
- const client = new Invezgo({
110
- apiKey: process.env.INVEZGO_API_KEY!,
111
- });
112
-
113
- const stocks = await client.analysis.getStockList();
114
- const indexes = await client.analysis.getIndexList();
115
- const intraday = await client.analysis.getIntradayData('BBCA', 'RG');
116
-
117
- console.log(stocks[0]);
118
- console.log(indexes[0]);
119
- console.log(intraday.close);
120
- ```
121
-
122
- ---
123
-
124
- ## ๐Ÿงฉ Fitur Utama API Saham Indonesia di SDK Ini
125
-
126
- ### ๐Ÿ“ˆ Data pasar dan analysis yang lengkap
127
-
128
- Modul `analysis` mencakup endpoint penting untuk **API Saham Indonesia**, termasuk:
129
-
130
- - daftar saham dan broker BEI
131
- - daftar index IDX
132
- - top gainer, top loser, top foreign, top accumulation, dan top retail flow
133
- - chart saham dan index
134
- - intraday chart, intraday summary, dan order book
135
- - broker summary, broker stalker, inventory chart, momentum chart
136
- - shareholder data, shareholder relation, insider activity, dan corporate action calendar
137
- - financial statement dan key statistics
138
-
139
- ### ๐Ÿ›ก๏ธ SDK resmi yang lebih aman untuk production
140
-
141
- Menggunakan SDK resmi membantu mengurangi mismatch pada path, query params, payload, dan struktur response. Untuk tim yang membangun produk berbasis **API Saham Indonesia resmi**, pendekatan ini membuat proses development dan maintenance lebih efisien.
142
-
143
- ### โš™๏ธ Ringan dan fokus pada performa
144
-
145
- `Invezgo SDK` tidak membawa dependency runtime tambahan. Ini relevan untuk aplikasi yang sensitif terhadap startup time, cold start, footprint container, atau deployment serverless.
146
-
147
- ### ๐Ÿ‘จโ€๐Ÿ’ป Developer experience yang rapi
148
-
149
- - TypeScript-first
150
- - `InvezgoError` untuk error handling terstruktur
151
- - deklarasi tipe untuk DTO dan response utama
152
- - output build untuk `require` dan `import`
153
-
154
- ---
155
-
156
- ## ๐Ÿ—‚๏ธ Modul yang Tersedia
157
-
158
- - `alerts`
159
- - `analysis`
160
- - `watchlists`
161
- - `journals`
162
- - `portfolios`
163
- - `search`
164
- - `profile`
165
- - `membership`
166
- - `posts`
167
- - `recommendation`
168
- - `trades`
169
- - `screener`
170
- - `usage`
171
-
172
- ---
173
-
174
- ## ๐Ÿ’ก Contoh Integrasi API Saham Indonesia
175
-
176
- ### ๐Ÿ”” Alert saham
177
-
178
- ```ts
179
- await client.alerts.add({
180
- name: 'Breakout volume',
181
- formula: 'close > ema(20) and volume > sma(volume, 20)',
182
- category: ['COMPOSITE'],
183
- every: 'END_OF_DAY',
184
- send: 'IN_OUT',
185
- });
186
- ```
187
-
188
- ### ๐Ÿ“Š Analysis dan data intraday
189
-
190
- ```ts
191
- const topRetail = await client.analysis.getTopRitel('2026-03-10');
192
-
193
- const intraday = await client.analysis.getIntradayData('BBCA', 'RG');
194
-
195
- const calendar = await client.analysis.getCalendar({
196
- code: 'BBCA',
197
- page: 1,
198
- limit: 10,
199
- });
200
- ```
201
-
202
- ### ๐Ÿ‘€ Watchlist
203
-
204
- ```ts
205
- await client.watchlists.add({
206
- group: 'banking',
207
- code: 'BBCA',
208
- price: 9000,
209
- scope: ['private'],
210
- note: 'Area pantau',
211
- });
212
-
213
- await client.watchlists.updateGroup('group-id', {
214
- name: 'Big Caps',
215
- });
216
- ```
217
-
218
- ### ๐Ÿงพ Jurnal transaksi
219
-
220
- ```ts
221
- await client.journals.add({
222
- code: 'BBCA',
223
- broker: 'AK',
224
- date: '2026-03-10',
225
- lot: 10,
226
- fee: 15000,
227
- price: 9050,
228
- status: 'BUY',
229
- scope: ['private'],
230
- note: 'Entry bertahap',
231
- });
232
- ```
233
-
234
- ### ๐Ÿ”Ž Screener saham Indonesia
235
-
236
- ```ts
237
- const results = await client.screener.screen({
238
- formula: 'close > ema(20)',
239
- category: ['COMPOSITE', 'IDXFINANCE'],
240
- });
241
- ```
242
-
243
- ### ๐Ÿค Recommendation
244
-
245
- ```ts
246
- const recommendations = await client.recommendation.getUserRecommendations();
247
- ```
248
-
249
- ### ๐Ÿ“Š API Usage Statistics
250
-
251
- ```ts
252
- const usage = await client.usage.getApiUsage();
253
- console.log(`Remaining API calls: ${usage.remaining}/${usage.limit}`);
254
- ```
255
-
256
- ---
257
-
258
- ## ๐Ÿ—๏ธ Keunggulan untuk Tim Developer
259
-
260
- Saat membangun aplikasi di atas **API Saham Indonesia**, tim engineering biasanya membutuhkan kontrak yang jelas, integrasi yang ringan, dan surface yang mudah dipelihara. `Invezgo SDK` membantu menyederhanakan proses tersebut sehingga tim dapat fokus pada logic produk, bukan pada detail HTTP request yang berulang.
261
-
262
- Secara praktis, manfaatnya:
263
-
264
- - mengurangi boilerplate request manual
265
- - mengurangi risiko typo pada endpoint dan payload
266
- - mempercepat onboarding engineer baru
267
- - mempermudah review, testing, dan maintenance
268
-
269
- ---
270
-
271
- ## ๐Ÿ”„ Catatan Migrasi Versi 1.2.0
272
-
273
- - ditambahkan `client.usage` untuk memantau limit dan kuota penggunaan API key
274
- - ditambahkan endpoint analysis baru: `getMultiTimeChart`, `getShareholderHigh`, `getShareholderClassification`, dan `getShareholderClassifyTable`
275
- - tipe data fully typed untuk seluruh endpoint yang baru ditambahkan
276
-
277
- ## ๐Ÿ”„ Catatan Migrasi Versi 1.1.0
278
-
279
- - ditambahkan `client.alerts`
280
- - ditambahkan `client.recommendation`
281
- - ditambahkan endpoint analysis baru seperti index list, top retail flow, intraday summary, sector stalker, shareholder 1%, dan corporate action calendar
282
- - DTO `watchlists`, `journals`, `membership`, dan `screener` sudah mengikuti skema request terbaru
283
- - `client.ai` dan `client.health` dihapus karena tidak lagi tersedia pada kontrak API terbaru
284
-
285
- ---
286
-
287
- ## ๐Ÿ› ๏ธ Build
288
-
289
- ```bash
290
- npm run build
291
- ```
292
-
293
- ---
294
-
295
- ## ๐Ÿง  Tipe yang Diekspor
296
-
297
- SDK ini mengekspor tipe inti seperti:
298
-
299
- - `InvezgoConfig`
300
- - `Stock`, `Broker`, `StockIndex`
301
- - `TopChangeResponse`, `TopRetailResponse`
302
- - `IntradayStockData`, `IntradayIndexData`
303
- - `ShareholderRelationResponse`
304
- - `FinancialStatementResponse`, `KeyStatResponse`
305
- - DTO endpoint seperti `AlertDto`, `CreateWatchlistDto`, `AddJournalTransactionDto`, `ScreenDto`
306
-
307
- ---
308
-
309
- ## ๐Ÿ”— Referensi
310
-
311
- - ๐ŸŒ Website utama: [https://invezgo.com](https://invezgo.com)
312
- - ๐Ÿ“š Dokumentasi API: [https://api.invezgo.com/documentation](https://api.invezgo.com/documentation)
313
- - ๐Ÿงช Contoh tambahan: [`docs/EXAMPLES.md`](./docs/EXAMPLES.md)
1
+ # Invezgo JavaScript & TypeScript SDK
2
+
3
+ [![npm](https://img.shields.io/npm/v/@invezgo/sdk.svg)](https://www.npmjs.com/package/@invezgo/sdk)
4
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
+
7
+ SDK resmi untuk [Invezgo API](https://invezgo.com), penyedia data pasar modal Indonesia (BEI/IDX). SDK ini menyediakan akses bertipe ke seluruh endpoint Invezgo API, dilengkapi cache in-memory dan rotasi API key otomatis.
8
+
9
+ [Dokumentasi API](https://api.invezgo.com/documentation) ยท [Referensi SDK](docs/API.md) ยท [Changelog](CHANGELOG.md)
10
+
11
+ ## Daftar Isi
12
+
13
+ - [Persyaratan](#persyaratan)
14
+ - [Instalasi](#instalasi)
15
+ - [Penggunaan](#penggunaan)
16
+ - [Konfigurasi](#konfigurasi)
17
+ - [Memanggil Endpoint](#memanggil-endpoint)
18
+ - [Tipe Data](#tipe-data)
19
+ - [Caching](#caching)
20
+ - [Rotasi API Key](#rotasi-api-key)
21
+ - [Penanganan Error](#penanganan-error)
22
+ - [Pagination](#pagination)
23
+ - [Praktik yang Disarankan](#praktik-yang-disarankan)
24
+ - [Pengembangan](#pengembangan)
25
+ - [Dukungan](#dukungan)
26
+ - [Lisensi](#lisensi)
27
+
28
+ ## Persyaratan
29
+
30
+ - Node.js 18 atau lebih baru (menggunakan `fetch` bawaan)
31
+ - API key Invezgo, dapat dibuat di [halaman pengaturan API](https://invezgo.com/id/setting/api)
32
+
33
+ SDK ini tidak memiliki dependency runtime dan mendukung ESM maupun CommonJS.
34
+
35
+ ## Instalasi
36
+
37
+ ```bash
38
+ npm install @invezgo/sdk
39
+ ```
40
+
41
+ ## Penggunaan
42
+
43
+ ```ts
44
+ import { Invezgo } from '@invezgo/sdk';
45
+
46
+ const client = new Invezgo({ apiKey: process.env.INVEZGO_API_KEY! });
47
+
48
+ const stocks = await client.analysis.getStockList();
49
+ const info = await client.analysis.getInformation('BBCA');
50
+ const top = await client.analysis.getTopChange({ date: '2024-12-30' });
51
+
52
+ console.log(top.gain[0].code, top.gain[0].change);
53
+ ```
54
+
55
+ CommonJS:
56
+
57
+ ```js
58
+ const { Invezgo } = require('@invezgo/sdk');
59
+
60
+ const client = new Invezgo({ apiKey: process.env.INVEZGO_API_KEY });
61
+ ```
62
+
63
+ > **Penting:** gunakan SDK ini dari sisi server. Jangan menyertakan API key pada aplikasi browser atau mobile.
64
+
65
+ ## Konfigurasi
66
+
67
+ ```ts
68
+ const client = new Invezgo({
69
+ apiKey: process.env.INVEZGO_API_KEY!,
70
+ additionalApiKeys: [process.env.INVEZGO_API_KEY_2!],
71
+ timeout: 30_000,
72
+ cache: { ttl: 60, realtimeTtl: 5 },
73
+ });
74
+ ```
75
+
76
+ | Opsi | Tipe | Default | Keterangan |
77
+ |---|---|---|---|
78
+ | `apiKey` | `string` | wajib | API key utama. |
79
+ | `additionalApiKeys` | `string[]` | `[]` | API key cadangan, digunakan saat terjadi `429`. Lihat [Rotasi API Key](#rotasi-api-key). |
80
+ | `baseUrl` | `string` | `https://api.invezgo.com` | Base URL API. |
81
+ | `timeout` | `number` | `30000` | Timeout per request, dalam milidetik. |
82
+ | `cache` | `boolean \| CacheOptions` | `true` | Konfigurasi cache. `false` untuk menonaktifkan. |
83
+ | `cache.ttl` | `number` | `60` | TTL endpoint reguler, dalam detik. |
84
+ | `cache.realtimeTtl` | `number` | `5` | TTL endpoint realtime, dalam detik. |
85
+ | `cache.maxEntries` | `number` | `1000` | Jumlah maksimum entri cache. |
86
+ | `cache.maxBytes` | `number` | `33554432` | Ukuran maksimum cache (32 MiB). |
87
+ | `fetch` | `typeof fetch` | `globalThis.fetch` | Implementasi `fetch` alternatif, misalnya untuk proxy. |
88
+
89
+ Buat satu instance client dan gunakan kembali di seluruh aplikasi. Cache dan status rotasi API key disimpan per instance.
90
+
91
+ ## Memanggil Endpoint
92
+
93
+ Endpoint dikelompokkan berdasarkan resource:
94
+
95
+ | Resource | Cakupan |
96
+ |---|---|
97
+ | `analysis` | Daftar saham, broker, dan indeks; harga, chart, intraday, order book, running trade; broker summary; pemegang saham; laporan keuangan; kalender aksi korporasi; berita dan keterbukaan informasi |
98
+ | `batch` | Order book dan data intraday untuk beberapa saham dalam satu request |
99
+ | `search` | Pencarian saham dan pengguna |
100
+ | `screener` | Eksekusi screener dan pengelolaan preset |
101
+ | `usage` | Pemakaian dan sisa kuota API |
102
+ | `watchlists` | Watchlist dan grup watchlist |
103
+ | `journals` | Jurnal transaksi |
104
+ | `portfolios` | Portofolio |
105
+ | `alerts` | Alert berbasis formula |
106
+ | `posts` | Post, komentar, like, dan vote komunitas |
107
+ | `trades` | Realized trade |
108
+
109
+ Setiap method mengikuti pola berikut:
110
+
111
+ ```
112
+ client.<resource>.<method>(...pathParams, body?, params?, options?)
113
+ ```
114
+
115
+ | Argumen | Keterangan |
116
+ |---|---|
117
+ | `pathParams` | Parameter path sebagai argumen posisional, sesuai urutan di URL. |
118
+ | `body` | Request body untuk `POST`, `PUT`, `PATCH`, dan `DELETE`, bertipe `*Request`. |
119
+ | `params` | Query parameter dalam satu objek bertipe `<Nama>Params`. Nama field sama dengan nama di API. Wajib diisi jika endpoint memiliki query parameter wajib. |
120
+ | `options` | `{ signal?: AbortSignal }` untuk membatalkan request. |
121
+
122
+ ```ts
123
+ // Path parameter
124
+ await client.analysis.getBrokerStalker('YP', 'BBCA', {
125
+ from: '2024-12-01',
126
+ to: '2024-12-31',
127
+ investor: 'all',
128
+ market: 'RG',
129
+ });
130
+
131
+ // Request body
132
+ await client.screener.screen({ formula: 'close > prev AND volume > 1000000', category: ['SYARIAH'] });
133
+
134
+ // Beberapa saham sekaligus, dihitung sebagai satu request
135
+ await client.batch.getOrderBook('BBCA|BBRI|BMRI');
136
+
137
+ // Membatalkan request
138
+ const controller = new AbortController();
139
+ setTimeout(() => controller.abort(), 2_000);
140
+ await client.analysis.getOrderBook('BBCA', { market: 'RG' }, { signal: controller.signal });
141
+ ```
142
+
143
+ Daftar lengkap method, parameter, nilai default, dan tipe kembalian tersedia di [docs/API.md](docs/API.md).
144
+
145
+ ## Tipe Data
146
+
147
+ Seluruh model request, query parameter, dan response diekspor dari paket:
148
+
149
+ ```ts
150
+ import type { TopChangeParams, TopChangeResponse } from '@invezgo/sdk';
151
+
152
+ const params: TopChangeParams = {
153
+ date: '2024-12-30',
154
+ filter_column: 'change', // 'change' | 'value' | 'volume' | 'ratio'
155
+ filter_operator: '>',
156
+ filter_value: 5,
157
+ };
158
+
159
+ const top: TopChangeResponse = await client.analysis.getTopChange(params);
160
+ ```
161
+
162
+ Ketentuan tipe:
163
+
164
+ | Kasus | Representasi |
165
+ |---|---|
166
+ | Parameter enum | Literal union, misalnya `'BUY' \| 'SELL' \| 'ALL'` |
167
+ | Field nullable | `T \| null` |
168
+ | Field opsional | `field?: T` |
169
+ | Response array | Alias `XResponse = XItem[]` |
170
+ | Response yang dapat bernilai `null` | `Promise<X \| null>`, misalnya `getShareholderClassifyTable` |
171
+ | Angka yang dapat dikirim sebagai string | `number \| string` |
172
+
173
+ Response berbentuk union dapat dipersempit melalui field `type`:
174
+
175
+ ```ts
176
+ const graph = await client.analysis.getShareholderRelation({ code: 'BBCA' });
177
+
178
+ for (const node of graph.nodes) {
179
+ if (node.type === 'stock') {
180
+ console.log(node.code, node.company_name);
181
+ } else {
182
+ console.log(node.label);
183
+ }
184
+ }
185
+ ```
186
+
187
+ ## Caching
188
+
189
+ Cache in-memory aktif secara default untuk mengurangi pemakaian kuota dan latensi.
190
+
191
+ - Hanya request `GET` yang disimpan. Cache key terdiri dari path dan query string yang telah dinormalisasi.
192
+ - Cache menggunakan algoritma LRU dengan batas jumlah entri (`maxEntries`) dan total ukuran (`maxBytes`). Entri yang paling lama tidak digunakan akan dihapus saat salah satu batas terlampaui.
193
+ - Endpoint realtime (order book, running trade, intraday, chart, batch, dan sejenisnya) menggunakan `realtimeTtl`. Endpoint lainnya menggunakan `ttl`.
194
+ - Endpoint `usage` dan request selain `GET` tidak disimpan di cache.
195
+ - Setiap request `POST`, `PUT`, `PATCH`, atau `DELETE` yang berhasil akan menghapus cache data personal (`watchlists`, `journals`, `portfolios`, `trades`, `alerts`, `screener`).
196
+
197
+ ```ts
198
+ new Invezgo({ apiKey, cache: false }); // nonaktifkan cache
199
+ new Invezgo({ apiKey, cache: { realtimeTtl: 0 } }); // nonaktifkan cache untuk endpoint realtime
200
+ new Invezgo({ apiKey, cache: { ttl: 300 } }); // TTL endpoint reguler 5 menit
201
+
202
+ client.clearCache(); // hapus seluruh cache
203
+ ```
204
+
205
+ ## Rotasi API Key
206
+
207
+ Setiap API key memiliki batas request per menit untuk setiap endpoint dan kuota bulanan. Jika Anda memiliki lebih dari satu API key, tambahkan sebagai cadangan:
208
+
209
+ ```ts
210
+ const client = new Invezgo({
211
+ apiKey: process.env.INVEZGO_API_KEY!,
212
+ additionalApiKeys: [process.env.INVEZGO_API_KEY_2!, process.env.INVEZGO_API_KEY_3!],
213
+ });
214
+ ```
215
+
216
+ Ketika API mengembalikan `429 Too Many Requests`:
217
+
218
+ 1. Lama penundaan diambil dari header `Retry-After`. Jika tidak tersedia, digunakan `X-RateLimit-Reset`, kemudian 60 detik.
219
+ 2. Untuk batas per menit, API key ditangguhkan hanya pada endpoint tersebut. Untuk kuota bulanan, API key ditangguhkan pada seluruh endpoint.
220
+ 3. Request dikirim ulang menggunakan API key berikutnya yang tersedia.
221
+ 4. API key utama digunakan kembali setelah masa penangguhan berakhir.
222
+ 5. Jika seluruh API key sedang ditangguhkan, SDK melempar `RateLimitError` tanpa mengirim request.
223
+
224
+ Rotasi hanya dilakukan untuk status `429`. Untuk endpoint data personal seperti watchlist dan portofolio, gunakan API key dari akun yang sama.
225
+
226
+ Sisa kuota dapat diperiksa tanpa mengurangi kuota:
227
+
228
+ ```ts
229
+ const usage = await client.usage.getApiUsage();
230
+ console.log(usage.usage, usage.limit, usage.remaining, usage.expire);
231
+ ```
232
+
233
+ ## Penanganan Error
234
+
235
+ Seluruh error merupakan turunan `InvezgoError`.
236
+
237
+ | Class | Status HTTP | Penyebab |
238
+ |---|---|---|
239
+ | `ValidationError` | 400, 422 | Parameter atau body tidak valid |
240
+ | `AuthenticationError` | 401 | API key tidak valid atau kedaluwarsa |
241
+ | `PaymentRequiredError` | 402 | Endpoint tidak termasuk dalam paket langganan |
242
+ | `NotFoundError` | 404 | Data tidak ditemukan |
243
+ | `RateLimitError` | 429 | Batas request atau kuota tercapai pada seluruh API key |
244
+ | `ServerError` | 5xx | Kesalahan pada server |
245
+ | `TimeoutError` | โ€” | Request melebihi `timeout` |
246
+ | `ConnectionError` | โ€” | Kegagalan jaringan |
247
+
248
+ Properti yang tersedia: `status`, `message`, `error`, `requestId`, `path`, dan `body`. `RateLimitError` juga menyediakan `retryAfter` (detik), `limit`, `remaining`, `reset`, dan `quotaExceeded`.
249
+
250
+ ```ts
251
+ import { InvezgoError, RateLimitError, ValidationError } from '@invezgo/sdk';
252
+
253
+ try {
254
+ await client.analysis.getSummaryStock('BBCA', {
255
+ from: '2024-12-01',
256
+ to: '2024-12-31',
257
+ investor: 'all',
258
+ market: 'RG',
259
+ });
260
+ } catch (err) {
261
+ if (err instanceof RateLimitError) {
262
+ console.error(`Rate limit tercapai, coba lagi dalam ${err.retryAfter} detik`);
263
+ } else if (err instanceof ValidationError) {
264
+ console.error(`Parameter tidak valid: ${err.message}`);
265
+ } else if (err instanceof InvezgoError) {
266
+ console.error(err.status, err.message, err.requestId);
267
+ } else {
268
+ throw err;
269
+ }
270
+ }
271
+ ```
272
+
273
+ ## Pagination
274
+
275
+ Endpoint dengan pagination mengembalikan `page`, `totalPage`, dan `nextPage`. Nilai `nextPage` adalah `null` pada halaman terakhir.
276
+
277
+ ```ts
278
+ let page: number | null = 1;
279
+
280
+ while (page !== null) {
281
+ const res = await client.analysis.getNews({ page, limit: 50 });
282
+ for (const item of res.data) console.log(item.title);
283
+ page = res.nextPage;
284
+ }
285
+ ```
286
+
287
+ ## Praktik yang Disarankan
288
+
289
+ - Gunakan satu instance client untuk seluruh aplikasi.
290
+ - Simpan API key di environment variable atau secret manager.
291
+ - Gunakan format tanggal `YYYY-MM-DD`. Data end-of-day tersedia setelah pukul 18.00 WIB.
292
+ - Field waktu bersufiks `Z` menggunakan waktu WIB (UTC+7); jangan dikonversi ke zona waktu lain.
293
+ - Gunakan resource `batch` untuk mengambil data beberapa saham sekaligus.
294
+ - Saat menerima `RateLimitError`, tunggu sesuai `retryAfter` sebelum mencoba kembali.
295
+ - Untuk polling data realtime, sesuaikan `realtimeTtl` dengan interval polling.
296
+
297
+ Contoh lengkap tersedia di direktori [examples](examples/).
298
+
299
+ ## Pengembangan
300
+
301
+ File di `src/generated/` dan `docs/API.md` dihasilkan dari spesifikasi OpenAPI dan tidak boleh diubah secara manual.
302
+
303
+ ```bash
304
+ npm run generate # generate ulang kode dari OpenAPI
305
+ npm run typecheck # pemeriksaan tipe
306
+ npm test # build dan unit test
307
+ ```
308
+
309
+ ## Dukungan
310
+
311
+ Sertakan nilai `requestId` dari error saat menghubungi tim dukungan Invezgo.
312
+
313
+ - Website: [invezgo.com](https://invezgo.com)
314
+ - Dokumentasi API: [api.invezgo.com/documentation](https://api.invezgo.com/documentation)
315
+
316
+ ## Lisensi
317
+
318
+ Dirilis di bawah [MIT License](LICENSE).