@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.
- package/README.md +318 -313
- package/dist/cache.d.ts +27 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/client.d.ts +15 -18
- package/dist/client.d.ts.map +1 -1
- package/dist/errors.d.ts +71 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/generated/resources.d.ts +3291 -0
- package/dist/generated/resources.d.ts.map +1 -0
- package/dist/generated/types.d.ts +3449 -0
- package/dist/generated/types.d.ts.map +1 -0
- package/dist/http.d.ts +66 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/index.d.ts +9 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +755 -1005
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +775 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +66 -60
- package/dist/endpoints/ai.d.ts +0 -98
- package/dist/endpoints/ai.d.ts.map +0 -1
- package/dist/endpoints/alerts.d.ts +0 -49
- package/dist/endpoints/alerts.d.ts.map +0 -1
- package/dist/endpoints/analysis.d.ts +0 -369
- package/dist/endpoints/analysis.d.ts.map +0 -1
- package/dist/endpoints/health.d.ts +0 -24
- package/dist/endpoints/health.d.ts.map +0 -1
- package/dist/endpoints/journals.d.ts +0 -49
- package/dist/endpoints/journals.d.ts.map +0 -1
- package/dist/endpoints/membership.d.ts +0 -35
- package/dist/endpoints/membership.d.ts.map +0 -1
- package/dist/endpoints/portfolios.d.ts +0 -14
- package/dist/endpoints/portfolios.d.ts.map +0 -1
- package/dist/endpoints/posts.d.ts +0 -42
- package/dist/endpoints/posts.d.ts.map +0 -1
- package/dist/endpoints/profile.d.ts +0 -34
- package/dist/endpoints/profile.d.ts.map +0 -1
- package/dist/endpoints/recommendation.d.ts +0 -10
- package/dist/endpoints/recommendation.d.ts.map +0 -1
- package/dist/endpoints/screener.d.ts +0 -45
- package/dist/endpoints/screener.d.ts.map +0 -1
- package/dist/endpoints/search.d.ts +0 -18
- package/dist/endpoints/search.d.ts.map +0 -1
- package/dist/endpoints/trades.d.ts +0 -31
- package/dist/endpoints/trades.d.ts.map +0 -1
- package/dist/endpoints/usage.d.ts +0 -11
- package/dist/endpoints/usage.d.ts.map +0 -1
- package/dist/endpoints/watchlists.d.ts +0 -64
- package/dist/endpoints/watchlists.d.ts.map +0 -1
- package/dist/index.esm.js +0 -1054
- package/dist/index.esm.js.map +0 -1
- package/dist/invezgo.d.ts +0 -40
- package/dist/invezgo.d.ts.map +0 -1
- package/dist/types.d.ts +0 -574
- package/dist/types.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,313 +1,318 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
](https://www.npmjs.com/package/@invezgo/sdk)
|
|
4
|
+
[](https://nodejs.org)
|
|
5
|
+
[](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).
|