sentisense 0.1.0
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/LICENSE +21 -0
- package/README.md +138 -0
- package/dist/index.cjs +434 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +413 -0
- package/dist/index.d.ts +413 -0
- package/dist/index.mjs +401 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +58 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Compass AI Data Services, LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# sentisense
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/sentisense)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
Official JavaScript/TypeScript SDK for the [SentiSense](https://sentisense.ai) market intelligence API.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install sentisense
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import SentiSense from "sentisense";
|
|
18
|
+
|
|
19
|
+
// Public endpoints work without an API key
|
|
20
|
+
const client = new SentiSense();
|
|
21
|
+
const price = await client.stocks.getPrice("AAPL");
|
|
22
|
+
console.log(price);
|
|
23
|
+
|
|
24
|
+
// Use an API key for authenticated endpoints
|
|
25
|
+
const authed = new SentiSense({ apiKey: "ssk_YOUR_KEY" });
|
|
26
|
+
const flows = await authed.institutional.getFlows("2025-02-14");
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Features
|
|
30
|
+
|
|
31
|
+
- Full TypeScript support with detailed type definitions
|
|
32
|
+
- Works in Node.js 18+, Deno, Bun, and browsers
|
|
33
|
+
- Zero runtime dependencies (uses native `fetch`)
|
|
34
|
+
- Namespaced API resources (stocks, documents, institutional, etc.)
|
|
35
|
+
- Typed error hierarchy for clean error handling
|
|
36
|
+
|
|
37
|
+
## API Reference
|
|
38
|
+
|
|
39
|
+
### Stocks
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
client.stocks.list() // All ticker symbols
|
|
43
|
+
client.stocks.listDetailed() // All stocks with details
|
|
44
|
+
client.stocks.getPrice("AAPL") // Real-time price
|
|
45
|
+
client.stocks.getPrices(["AAPL", "NVDA"]) // Batch prices
|
|
46
|
+
client.stocks.getProfile("AAPL") // Company profile
|
|
47
|
+
client.stocks.getChart("AAPL", { timeframe: "6M" }) // OHLCV chart data
|
|
48
|
+
client.stocks.getMarketStatus() // Market open/closed
|
|
49
|
+
client.stocks.getFundamentals("AAPL") // Financial data
|
|
50
|
+
client.stocks.getShortInterest("GME") // Short interest
|
|
51
|
+
client.stocks.getAISummary("AAPL", { depth: "deep" }) // AI report (PRO)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Documents & News
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
client.documents.getByTicker("AAPL", { source: "news", days: 3 })
|
|
58
|
+
client.documents.search("NVDA earnings", { days: 7, limit: 20 })
|
|
59
|
+
client.documents.getStories({ limit: 10, expanded: true })
|
|
60
|
+
client.documents.getStory("cluster_abc123")
|
|
61
|
+
client.documents.getTheNews({ limit: 20 })
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Institutional Flows (13F)
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
client.institutional.getQuarters()
|
|
68
|
+
client.institutional.getFlows("2025-02-14", { limit: 20 })
|
|
69
|
+
client.institutional.getHolders("AAPL", "2025-02-14")
|
|
70
|
+
client.institutional.getActivists("2025-02-14")
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Entity Metrics
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
client.entityMetrics.getMentions("AAPL")
|
|
77
|
+
client.entityMetrics.getSentiment("AAPL")
|
|
78
|
+
client.entityMetrics.getAverageSentiment("AAPL")
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Knowledge Base
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
client.kb.getPopularEntities()
|
|
85
|
+
client.kb.getEntity("entity-id")
|
|
86
|
+
client.kb.getAllEntities()
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Market Mood
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
client.marketMood.get()
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Error Handling
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
import SentiSense, { AuthenticationError, RateLimitError } from "sentisense";
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
const summary = await client.stocks.getAISummary("AAPL");
|
|
102
|
+
} catch (error) {
|
|
103
|
+
if (error instanceof AuthenticationError) {
|
|
104
|
+
// 401 or 403 — invalid/missing API key or insufficient tier
|
|
105
|
+
} else if (error instanceof RateLimitError) {
|
|
106
|
+
// 429 — quota exceeded
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
| Error Class | HTTP Status | When |
|
|
112
|
+
|------------|-------------|------|
|
|
113
|
+
| `AuthenticationError` | 401, 403 | Invalid API key or insufficient tier |
|
|
114
|
+
| `NotFoundError` | 404 | Resource not found |
|
|
115
|
+
| `RateLimitError` | 429 | Quota exceeded |
|
|
116
|
+
| `APIError` | Other 4xx/5xx | General API error |
|
|
117
|
+
|
|
118
|
+
All errors extend `SentiSenseError` and include `status`, `code`, and `message` properties.
|
|
119
|
+
|
|
120
|
+
## Configuration
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
const client = new SentiSense({
|
|
124
|
+
apiKey: "ssk_YOUR_KEY", // Optional for public endpoints
|
|
125
|
+
baseUrl: "https://...", // Default: https://app.sentisense.ai
|
|
126
|
+
timeout: 30000, // Default: 30s (in milliseconds)
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Get an API Key
|
|
131
|
+
|
|
132
|
+
Generate your API key from the [Developer Console](https://app.sentisense.ai/settings/developer).
|
|
133
|
+
|
|
134
|
+
For full API documentation, see [sentisense.ai/docs/api](https://sentisense.ai/docs/api).
|
|
135
|
+
|
|
136
|
+
## License
|
|
137
|
+
|
|
138
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
APIError: () => APIError,
|
|
24
|
+
AuthenticationError: () => AuthenticationError,
|
|
25
|
+
NotFoundError: () => NotFoundError,
|
|
26
|
+
RateLimitError: () => RateLimitError,
|
|
27
|
+
SentiSense: () => SentiSense,
|
|
28
|
+
SentiSenseError: () => SentiSenseError,
|
|
29
|
+
VERSION: () => VERSION,
|
|
30
|
+
default: () => SentiSense
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(index_exports);
|
|
33
|
+
|
|
34
|
+
// src/errors.ts
|
|
35
|
+
var SentiSenseError = class extends Error {
|
|
36
|
+
constructor(message, status, code) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = "SentiSenseError";
|
|
39
|
+
this.status = status;
|
|
40
|
+
this.code = code;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
var AuthenticationError = class extends SentiSenseError {
|
|
44
|
+
constructor(message, status, code) {
|
|
45
|
+
super(message, status, code);
|
|
46
|
+
this.name = "AuthenticationError";
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var NotFoundError = class extends SentiSenseError {
|
|
50
|
+
constructor(message, code) {
|
|
51
|
+
super(message, 404, code);
|
|
52
|
+
this.name = "NotFoundError";
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var RateLimitError = class extends SentiSenseError {
|
|
56
|
+
constructor(message, code) {
|
|
57
|
+
super(message, 429, code);
|
|
58
|
+
this.name = "RateLimitError";
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
var APIError = class extends SentiSenseError {
|
|
62
|
+
constructor(message, status, code) {
|
|
63
|
+
super(message, status, code);
|
|
64
|
+
this.name = "APIError";
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// src/resources/documents.ts
|
|
69
|
+
var Documents = class {
|
|
70
|
+
constructor(client) {
|
|
71
|
+
this.client = client;
|
|
72
|
+
}
|
|
73
|
+
/** Get news articles for a stock. */
|
|
74
|
+
async getByTicker(ticker, options) {
|
|
75
|
+
return this.client.get(`/api/v1/documents/ticker/${encodeURIComponent(ticker)}`, options);
|
|
76
|
+
}
|
|
77
|
+
/** Get news articles for a stock within a date range. */
|
|
78
|
+
async getByTickerRange(ticker, options) {
|
|
79
|
+
return this.client.get(
|
|
80
|
+
`/api/v1/documents/ticker/${encodeURIComponent(ticker)}/range`,
|
|
81
|
+
options
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
/** Get documents for a KB entity. */
|
|
85
|
+
async getByEntity(entityId, options) {
|
|
86
|
+
return this.client.get(
|
|
87
|
+
`/api/v1/documents/entity/${encodeURIComponent(entityId)}`,
|
|
88
|
+
options
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
/** Smart search with natural language query parsing. */
|
|
92
|
+
async search(query, options) {
|
|
93
|
+
return this.client.get("/api/v1/documents/search", { query, ...options });
|
|
94
|
+
}
|
|
95
|
+
/** Get latest documents from a source type. */
|
|
96
|
+
async getBySource(source, options) {
|
|
97
|
+
return this.client.get(
|
|
98
|
+
`/api/v1/documents/source/${encodeURIComponent(source)}`,
|
|
99
|
+
options
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
/** Get AI-curated news story clusters. */
|
|
103
|
+
async getStories(options) {
|
|
104
|
+
return this.client.get("/api/v1/documents/stories", options);
|
|
105
|
+
}
|
|
106
|
+
/** Get detailed story with all source documents. Free users get preview. */
|
|
107
|
+
async getStory(clusterId, options) {
|
|
108
|
+
return this.client.get(
|
|
109
|
+
`/api/v1/documents/stories/${encodeURIComponent(clusterId)}`,
|
|
110
|
+
options
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
/** Get stories for a specific stock. */
|
|
114
|
+
async getStoriesByTicker(ticker, options) {
|
|
115
|
+
return this.client.get(
|
|
116
|
+
`/api/v1/documents/stories/ticker/${encodeURIComponent(ticker)}`,
|
|
117
|
+
options
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// src/resources/entityMetrics.ts
|
|
123
|
+
var EntityMetrics = class {
|
|
124
|
+
constructor(client) {
|
|
125
|
+
this.client = client;
|
|
126
|
+
}
|
|
127
|
+
/** Get mention data for a stock. */
|
|
128
|
+
async getMentions(symbol, options) {
|
|
129
|
+
return this.client.get(
|
|
130
|
+
`/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/mentions`,
|
|
131
|
+
options
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
/** Get mention counts broken down by source. */
|
|
135
|
+
async getMentionCountBySource(symbol, options) {
|
|
136
|
+
return this.client.get(
|
|
137
|
+
`/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/mentions/count/by-source`,
|
|
138
|
+
options
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
/** Get total mention count. */
|
|
142
|
+
async getMentionCount(symbol, options) {
|
|
143
|
+
return this.client.get(
|
|
144
|
+
`/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/mentions/count`,
|
|
145
|
+
options
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
/** Get sentiment data for a stock. */
|
|
149
|
+
async getSentiment(symbol, options) {
|
|
150
|
+
return this.client.get(
|
|
151
|
+
`/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/sentiment`,
|
|
152
|
+
options
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
/** Get sentiment broken down by source. */
|
|
156
|
+
async getSentimentBySource(symbol, options) {
|
|
157
|
+
return this.client.get(
|
|
158
|
+
`/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/sentiment/by-source`,
|
|
159
|
+
options
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
/** Get average sentiment score. */
|
|
163
|
+
async getAverageSentiment(symbol, options) {
|
|
164
|
+
return this.client.get(
|
|
165
|
+
`/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/sentiment/average`,
|
|
166
|
+
options
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// src/resources/institutional.ts
|
|
172
|
+
var Institutional = class {
|
|
173
|
+
constructor(client) {
|
|
174
|
+
this.client = client;
|
|
175
|
+
}
|
|
176
|
+
/** Get available 13F reporting quarters. */
|
|
177
|
+
async getQuarters() {
|
|
178
|
+
return this.client.get("/api/v1/institutional/quarters");
|
|
179
|
+
}
|
|
180
|
+
/** Get aggregate institutional activity per ticker for a quarter. */
|
|
181
|
+
async getFlows(reportDate, options) {
|
|
182
|
+
return this.client.get("/api/v1/institutional/flows", {
|
|
183
|
+
reportDate,
|
|
184
|
+
...options
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/** Get institutional holders for a specific stock. */
|
|
188
|
+
async getHolders(ticker, reportDate) {
|
|
189
|
+
return this.client.get(
|
|
190
|
+
`/api/v1/institutional/holders/${encodeURIComponent(ticker)}`,
|
|
191
|
+
{ reportDate }
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
/** Get activist investor positions (NEW or INCREASED). */
|
|
195
|
+
async getActivists(reportDate) {
|
|
196
|
+
return this.client.get("/api/v1/institutional/activist", { reportDate });
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// src/resources/kb.ts
|
|
201
|
+
var KB = class {
|
|
202
|
+
constructor(client) {
|
|
203
|
+
this.client = client;
|
|
204
|
+
}
|
|
205
|
+
/** Get popular entities for search suggestions. */
|
|
206
|
+
async getPopularEntities() {
|
|
207
|
+
return this.client.get("/api/v1/kb/entities/popular");
|
|
208
|
+
}
|
|
209
|
+
/** Get entity detail with metrics and relationships. */
|
|
210
|
+
async getEntity(entityId) {
|
|
211
|
+
return this.client.get(`/api/v1/kb/entities/${encodeURIComponent(entityId)}`);
|
|
212
|
+
}
|
|
213
|
+
/** Get all tracked entities. */
|
|
214
|
+
async getAllEntities() {
|
|
215
|
+
return this.client.get("/api/v1/kb/entities/all");
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
// src/resources/marketMood.ts
|
|
220
|
+
var MarketMoodResource = class {
|
|
221
|
+
constructor(client) {
|
|
222
|
+
this.client = client;
|
|
223
|
+
}
|
|
224
|
+
/** Get market mood data (scores, history, sectors). */
|
|
225
|
+
async get() {
|
|
226
|
+
return this.client.get("/api/v2/market-mood");
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
// src/resources/stocks.ts
|
|
231
|
+
var Stocks = class {
|
|
232
|
+
constructor(client) {
|
|
233
|
+
this.client = client;
|
|
234
|
+
}
|
|
235
|
+
/** List all available ticker symbols. */
|
|
236
|
+
async list() {
|
|
237
|
+
return this.client.get("/api/v1/stocks");
|
|
238
|
+
}
|
|
239
|
+
/** List all stocks with name, kbEntityId, urlSlug. */
|
|
240
|
+
async listDetailed() {
|
|
241
|
+
return this.client.get("/api/v1/stocks/detailed");
|
|
242
|
+
}
|
|
243
|
+
/** Get popular ticker symbols. */
|
|
244
|
+
async listPopular() {
|
|
245
|
+
return this.client.get("/api/v1/stocks/popular");
|
|
246
|
+
}
|
|
247
|
+
/** Get popular stocks with details. */
|
|
248
|
+
async listPopularDetailed() {
|
|
249
|
+
return this.client.get("/api/v1/stocks/popular/detailed");
|
|
250
|
+
}
|
|
251
|
+
/** Get real-time price for a single ticker. */
|
|
252
|
+
async getPrice(ticker) {
|
|
253
|
+
return this.client.get("/api/v1/stocks/price", { ticker });
|
|
254
|
+
}
|
|
255
|
+
/** Get real-time prices for multiple tickers. */
|
|
256
|
+
async getPrices(tickers) {
|
|
257
|
+
return this.client.get("/api/v1/stocks/prices", {
|
|
258
|
+
tickers: tickers.join(",")
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/** Get batch company logo URLs. */
|
|
262
|
+
async getImages(tickers, options) {
|
|
263
|
+
return this.client.get("/api/v1/stocks/images", {
|
|
264
|
+
tickers: tickers.join(","),
|
|
265
|
+
...options
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/** Get company profiles with branding, market cap, sector. */
|
|
269
|
+
async getDescriptions(tickers, options) {
|
|
270
|
+
return this.client.get("/api/v1/stocks/descriptions", {
|
|
271
|
+
tickers: tickers.join(","),
|
|
272
|
+
...options
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/** Get peer/similar stocks. */
|
|
276
|
+
async getSimilar(ticker, options) {
|
|
277
|
+
return this.client.get(`/api/v1/stocks/${encodeURIComponent(ticker)}/similar`, options);
|
|
278
|
+
}
|
|
279
|
+
/** Get company profile (CEO, sector, industry, market data). */
|
|
280
|
+
async getProfile(ticker, options) {
|
|
281
|
+
return this.client.get(`/api/v1/stocks/${encodeURIComponent(ticker)}/profile`, options);
|
|
282
|
+
}
|
|
283
|
+
/** Get related KB entities (people, products, partners). */
|
|
284
|
+
async getEntities(ticker) {
|
|
285
|
+
return this.client.get(`/api/v1/stocks/${encodeURIComponent(ticker)}/entities`);
|
|
286
|
+
}
|
|
287
|
+
/** Get AI-generated stock analysis report. Requires PRO tier. */
|
|
288
|
+
async getAISummary(ticker, options) {
|
|
289
|
+
return this.client.get(`/api/v1/stocks/${encodeURIComponent(ticker)}/ai-summary`, options);
|
|
290
|
+
}
|
|
291
|
+
/** Get sentiment/mention metrics breakdown by entity. */
|
|
292
|
+
async getMetricsBreakdown(ticker, metricType, options) {
|
|
293
|
+
return this.client.get(
|
|
294
|
+
`/api/v1/stocks/${encodeURIComponent(ticker)}/metrics/${encodeURIComponent(metricType)}/breakdown`,
|
|
295
|
+
options
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
/** Get historical OHLCV chart data. */
|
|
299
|
+
async getChart(ticker, options) {
|
|
300
|
+
return this.client.get("/api/v1/stocks/chart", { ticker, ...options });
|
|
301
|
+
}
|
|
302
|
+
/** Get current market open/closed/pre-market/after-hours status. */
|
|
303
|
+
async getMarketStatus() {
|
|
304
|
+
return this.client.get("/api/v1/stocks/market-status");
|
|
305
|
+
}
|
|
306
|
+
/** Get financial statement data. */
|
|
307
|
+
async getFundamentals(ticker, options) {
|
|
308
|
+
return this.client.get("/api/v1/stocks/fundamentals", { ticker, ...options });
|
|
309
|
+
}
|
|
310
|
+
/** Get available fiscal periods. */
|
|
311
|
+
async getFundamentalsPeriods(ticker) {
|
|
312
|
+
return this.client.get("/api/v1/stocks/fundamentals/periods", { ticker });
|
|
313
|
+
}
|
|
314
|
+
/** Get most recent fundamentals snapshot. */
|
|
315
|
+
async getCurrentFundamentals(ticker) {
|
|
316
|
+
return this.client.get("/api/v1/stocks/fundamentals/current", { ticker });
|
|
317
|
+
}
|
|
318
|
+
/** Get historical P/E, P/B, P/S ratios. */
|
|
319
|
+
async getHistoricalRatios(ticker) {
|
|
320
|
+
return this.client.get("/api/v1/stocks/fundamentals/historical/ratios", { ticker });
|
|
321
|
+
}
|
|
322
|
+
/** Get historical revenue data. */
|
|
323
|
+
async getHistoricalRevenue(ticker) {
|
|
324
|
+
return this.client.get("/api/v1/stocks/fundamentals/historical/revenue", { ticker });
|
|
325
|
+
}
|
|
326
|
+
/** Get short interest metrics (FINRA). */
|
|
327
|
+
async getShortInterest(ticker) {
|
|
328
|
+
return this.client.get("/api/v1/stocks/short-interest", { ticker });
|
|
329
|
+
}
|
|
330
|
+
/** Get float information. */
|
|
331
|
+
async getFloat(ticker) {
|
|
332
|
+
return this.client.get("/api/v1/stocks/float", { ticker });
|
|
333
|
+
}
|
|
334
|
+
/** Get short volume trading data. */
|
|
335
|
+
async getShortVolume(ticker) {
|
|
336
|
+
return this.client.get("/api/v1/stocks/short-volume", { ticker });
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
// src/version.ts
|
|
341
|
+
var VERSION = "0.1.0";
|
|
342
|
+
|
|
343
|
+
// src/client.ts
|
|
344
|
+
var DEFAULT_BASE_URL = "https://app.sentisense.ai";
|
|
345
|
+
var DEFAULT_TIMEOUT = 3e4;
|
|
346
|
+
var SentiSense = class {
|
|
347
|
+
constructor(options = {}) {
|
|
348
|
+
this.apiKey = options.apiKey;
|
|
349
|
+
this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
350
|
+
this.timeout = options.timeout ?? DEFAULT_TIMEOUT;
|
|
351
|
+
this.stocks = new Stocks(this);
|
|
352
|
+
this.documents = new Documents(this);
|
|
353
|
+
this.institutional = new Institutional(this);
|
|
354
|
+
this.entityMetrics = new EntityMetrics(this);
|
|
355
|
+
this.marketMood = new MarketMoodResource(this);
|
|
356
|
+
this.kb = new KB(this);
|
|
357
|
+
}
|
|
358
|
+
/** @internal */
|
|
359
|
+
async get(path, params) {
|
|
360
|
+
const url = this.buildUrl(path, params);
|
|
361
|
+
const headers = {};
|
|
362
|
+
if (this.apiKey) {
|
|
363
|
+
headers["X-SentiSense-API-Key"] = this.apiKey;
|
|
364
|
+
}
|
|
365
|
+
if (typeof process !== "undefined" && process.versions?.node) {
|
|
366
|
+
headers["User-Agent"] = `sentisense-node/${VERSION}`;
|
|
367
|
+
}
|
|
368
|
+
const controller = new AbortController();
|
|
369
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
370
|
+
try {
|
|
371
|
+
const response = await fetch(url, {
|
|
372
|
+
method: "GET",
|
|
373
|
+
headers,
|
|
374
|
+
signal: controller.signal
|
|
375
|
+
});
|
|
376
|
+
if (!response.ok) {
|
|
377
|
+
await this.handleErrorResponse(response);
|
|
378
|
+
}
|
|
379
|
+
return await response.json();
|
|
380
|
+
} catch (error) {
|
|
381
|
+
if (error instanceof SentiSenseError) throw error;
|
|
382
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
383
|
+
throw new SentiSenseError(`Request timed out after ${this.timeout}ms`);
|
|
384
|
+
}
|
|
385
|
+
throw new SentiSenseError(
|
|
386
|
+
error instanceof Error ? error.message : "Unknown error"
|
|
387
|
+
);
|
|
388
|
+
} finally {
|
|
389
|
+
clearTimeout(timer);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
buildUrl(path, params) {
|
|
393
|
+
const url = new URL(path, this.baseUrl);
|
|
394
|
+
if (params) {
|
|
395
|
+
for (const [key, value] of Object.entries(params)) {
|
|
396
|
+
if (value !== void 0 && value !== null) {
|
|
397
|
+
url.searchParams.set(key, String(value));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return url.toString();
|
|
402
|
+
}
|
|
403
|
+
async handleErrorResponse(response) {
|
|
404
|
+
let body = {};
|
|
405
|
+
try {
|
|
406
|
+
body = await response.json();
|
|
407
|
+
} catch {
|
|
408
|
+
}
|
|
409
|
+
const message = body.message ?? response.statusText ?? "API request failed";
|
|
410
|
+
const code = body.error;
|
|
411
|
+
switch (response.status) {
|
|
412
|
+
case 401:
|
|
413
|
+
case 403:
|
|
414
|
+
throw new AuthenticationError(message, response.status, code);
|
|
415
|
+
case 404:
|
|
416
|
+
throw new NotFoundError(message, code);
|
|
417
|
+
case 429:
|
|
418
|
+
throw new RateLimitError(message, code);
|
|
419
|
+
default:
|
|
420
|
+
throw new APIError(message, response.status, code);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
425
|
+
0 && (module.exports = {
|
|
426
|
+
APIError,
|
|
427
|
+
AuthenticationError,
|
|
428
|
+
NotFoundError,
|
|
429
|
+
RateLimitError,
|
|
430
|
+
SentiSense,
|
|
431
|
+
SentiSenseError,
|
|
432
|
+
VERSION
|
|
433
|
+
});
|
|
434
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/resources/documents.ts","../src/resources/entityMetrics.ts","../src/resources/institutional.ts","../src/resources/kb.ts","../src/resources/marketMood.ts","../src/resources/stocks.ts","../src/version.ts","../src/client.ts"],"sourcesContent":["export { SentiSense } from \"./client.js\";\nexport { SentiSense as default } from \"./client.js\";\n\nexport {\n SentiSenseError,\n AuthenticationError,\n NotFoundError,\n RateLimitError,\n APIError,\n} from \"./errors.js\";\n\nexport type {\n SentiSenseOptions,\n StockPrice,\n StockDetail,\n StockImage,\n StockProfile,\n StockEntity,\n ChartData,\n ChartDataPoint,\n MarketStatus,\n Fundamentals,\n FundamentalsPeriod,\n ShortInterest,\n FloatInfo,\n ShortVolume,\n AISummary,\n MetricsBreakdown,\n Document,\n DocumentSource,\n Story,\n StoryCluster,\n TheNewsResponse,\n Quarter,\n InstitutionalFlow,\n Holder,\n MentionData,\n MentionCount,\n SentimentData,\n MarketMood,\n KBEntity,\n} from \"./types.js\";\n\nexport { VERSION } from \"./version.js\";\n","export class SentiSenseError extends Error {\n status?: number;\n code?: string;\n\n constructor(message: string, status?: number, code?: string) {\n super(message);\n this.name = \"SentiSenseError\";\n this.status = status;\n this.code = code;\n }\n}\n\nexport class AuthenticationError extends SentiSenseError {\n constructor(message: string, status: number, code?: string) {\n super(message, status, code);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotFoundError extends SentiSenseError {\n constructor(message: string, code?: string) {\n super(message, 404, code);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class RateLimitError extends SentiSenseError {\n constructor(message: string, code?: string) {\n super(message, 429, code);\n this.name = \"RateLimitError\";\n }\n}\n\nexport class APIError extends SentiSenseError {\n constructor(message: string, status: number, code?: string) {\n super(message, status, code);\n this.name = \"APIError\";\n }\n}\n","import type { APIClient } from \"../client.js\";\nimport type {\n Document,\n DocumentSource,\n GetByEntityOptions,\n GetBySourceOptions,\n GetByTickerOptions,\n GetByTickerRangeOptions,\n GetStoriesByTickerOptions,\n GetStoriesOptions,\n GetStoryOptions,\n SearchDocumentsOptions,\n Story,\n} from \"../types.js\";\n\nexport class Documents {\n constructor(private client: APIClient) {}\n\n /** Get news articles for a stock. */\n async getByTicker(ticker: string, options?: GetByTickerOptions): Promise<Document[]> {\n return this.client.get(`/api/v1/documents/ticker/${encodeURIComponent(ticker)}`, options);\n }\n\n /** Get news articles for a stock within a date range. */\n async getByTickerRange(ticker: string, options: GetByTickerRangeOptions): Promise<Document[]> {\n return this.client.get(\n `/api/v1/documents/ticker/${encodeURIComponent(ticker)}/range`,\n options,\n );\n }\n\n /** Get documents for a KB entity. */\n async getByEntity(entityId: string, options?: GetByEntityOptions): Promise<Document[]> {\n return this.client.get(\n `/api/v1/documents/entity/${encodeURIComponent(entityId)}`,\n options,\n );\n }\n\n /** Smart search with natural language query parsing. */\n async search(query: string, options?: SearchDocumentsOptions): Promise<Document[]> {\n return this.client.get(\"/api/v1/documents/search\", { query, ...options });\n }\n\n /** Get latest documents from a source type. */\n async getBySource(source: DocumentSource, options?: GetBySourceOptions): Promise<Document[]> {\n return this.client.get(\n `/api/v1/documents/source/${encodeURIComponent(source)}`,\n options,\n );\n }\n\n /** Get AI-curated news story clusters. */\n async getStories(options?: GetStoriesOptions): Promise<Story[]> {\n return this.client.get(\"/api/v1/documents/stories\", options);\n }\n\n /** Get detailed story with all source documents. Free users get preview. */\n async getStory(clusterId: string, options?: GetStoryOptions): Promise<Story> {\n return this.client.get(\n `/api/v1/documents/stories/${encodeURIComponent(clusterId)}`,\n options,\n );\n }\n\n /** Get stories for a specific stock. */\n async getStoriesByTicker(\n ticker: string,\n options?: GetStoriesByTickerOptions,\n ): Promise<Story[]> {\n return this.client.get(\n `/api/v1/documents/stories/ticker/${encodeURIComponent(ticker)}`,\n options,\n );\n }\n\n}\n","import type { APIClient } from \"../client.js\";\nimport type {\n EntityMetricsDateRange,\n GetMentionCountOptions,\n GetMentionsOptions,\n GetSentimentBySourceOptions,\n MentionCount,\n MentionData,\n SentimentData,\n} from \"../types.js\";\n\nexport class EntityMetrics {\n constructor(private client: APIClient) {}\n\n /** Get mention data for a stock. */\n async getMentions(symbol: string, options?: GetMentionsOptions): Promise<MentionData> {\n return this.client.get(\n `/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/mentions`,\n options,\n );\n }\n\n /** Get mention counts broken down by source. */\n async getMentionCountBySource(\n symbol: string,\n options?: EntityMetricsDateRange,\n ): Promise<MentionCount> {\n return this.client.get(\n `/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/mentions/count/by-source`,\n options,\n );\n }\n\n /** Get total mention count. */\n async getMentionCount(symbol: string, options?: GetMentionCountOptions): Promise<MentionCount> {\n return this.client.get(\n `/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/mentions/count`,\n options,\n );\n }\n\n /** Get sentiment data for a stock. */\n async getSentiment(symbol: string, options?: EntityMetricsDateRange): Promise<SentimentData> {\n return this.client.get(\n `/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/sentiment`,\n options,\n );\n }\n\n /** Get sentiment broken down by source. */\n async getSentimentBySource(\n symbol: string,\n options?: GetSentimentBySourceOptions,\n ): Promise<SentimentData> {\n return this.client.get(\n `/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/sentiment/by-source`,\n options,\n );\n }\n\n /** Get average sentiment score. */\n async getAverageSentiment(\n symbol: string,\n options?: EntityMetricsDateRange,\n ): Promise<SentimentData> {\n return this.client.get(\n `/api/v1/entity-metrics/stocks/${encodeURIComponent(symbol)}/sentiment/average`,\n options,\n );\n }\n}\n","import type { APIClient } from \"../client.js\";\nimport type {\n GetFlowsOptions,\n Holder,\n InstitutionalFlow,\n Quarter,\n} from \"../types.js\";\n\nexport class Institutional {\n constructor(private client: APIClient) {}\n\n /** Get available 13F reporting quarters. */\n async getQuarters(): Promise<Quarter[]> {\n return this.client.get(\"/api/v1/institutional/quarters\");\n }\n\n /** Get aggregate institutional activity per ticker for a quarter. */\n async getFlows(reportDate: string, options?: GetFlowsOptions): Promise<InstitutionalFlow[]> {\n return this.client.get(\"/api/v1/institutional/flows\", {\n reportDate,\n ...options,\n });\n }\n\n /** Get institutional holders for a specific stock. */\n async getHolders(ticker: string, reportDate: string): Promise<Holder[]> {\n return this.client.get(\n `/api/v1/institutional/holders/${encodeURIComponent(ticker)}`,\n { reportDate },\n );\n }\n\n /** Get activist investor positions (NEW or INCREASED). */\n async getActivists(reportDate: string): Promise<Holder[]> {\n return this.client.get(\"/api/v1/institutional/activist\", { reportDate });\n }\n}\n","import type { APIClient } from \"../client.js\";\nimport type { KBEntity } from \"../types.js\";\n\nexport class KB {\n constructor(private client: APIClient) {}\n\n /** Get popular entities for search suggestions. */\n async getPopularEntities(): Promise<KBEntity[]> {\n return this.client.get(\"/api/v1/kb/entities/popular\");\n }\n\n /** Get entity detail with metrics and relationships. */\n async getEntity(entityId: string): Promise<KBEntity> {\n return this.client.get(`/api/v1/kb/entities/${encodeURIComponent(entityId)}`);\n }\n\n /** Get all tracked entities. */\n async getAllEntities(): Promise<KBEntity[]> {\n return this.client.get(\"/api/v1/kb/entities/all\");\n }\n}\n","import type { APIClient } from \"../client.js\";\nimport type { MarketMood } from \"../types.js\";\n\nexport class MarketMoodResource {\n constructor(private client: APIClient) {}\n\n /** Get market mood data (scores, history, sectors). */\n async get(): Promise<MarketMood> {\n return this.client.get(\"/api/v2/market-mood\");\n }\n}\n","import type { APIClient } from \"../client.js\";\nimport type {\n AISummary,\n ChartData,\n FloatInfo,\n Fundamentals,\n FundamentalsPeriod,\n GetAISummaryOptions,\n GetChartOptions,\n GetDescriptionsOptions,\n GetFundamentalsOptions,\n GetImagesOptions,\n GetMetricsBreakdownOptions,\n GetProfileOptions,\n GetSimilarOptions,\n MarketStatus,\n MetricsBreakdown,\n ShortInterest,\n ShortVolume,\n StockDetail,\n StockEntity,\n StockImage,\n StockPrice,\n StockProfile,\n} from \"../types.js\";\n\nexport class Stocks {\n constructor(private client: APIClient) {}\n\n /** List all available ticker symbols. */\n async list(): Promise<string[]> {\n return this.client.get(\"/api/v1/stocks\");\n }\n\n /** List all stocks with name, kbEntityId, urlSlug. */\n async listDetailed(): Promise<StockDetail[]> {\n return this.client.get(\"/api/v1/stocks/detailed\");\n }\n\n /** Get popular ticker symbols. */\n async listPopular(): Promise<string[]> {\n return this.client.get(\"/api/v1/stocks/popular\");\n }\n\n /** Get popular stocks with details. */\n async listPopularDetailed(): Promise<StockDetail[]> {\n return this.client.get(\"/api/v1/stocks/popular/detailed\");\n }\n\n /** Get real-time price for a single ticker. */\n async getPrice(ticker: string): Promise<StockPrice> {\n return this.client.get(\"/api/v1/stocks/price\", { ticker });\n }\n\n /** Get real-time prices for multiple tickers. */\n async getPrices(tickers: string[]): Promise<Record<string, StockPrice>> {\n return this.client.get(\"/api/v1/stocks/prices\", {\n tickers: tickers.join(\",\"),\n });\n }\n\n /** Get batch company logo URLs. */\n async getImages(\n tickers: string[],\n options?: GetImagesOptions,\n ): Promise<Record<string, StockImage>> {\n return this.client.get(\"/api/v1/stocks/images\", {\n tickers: tickers.join(\",\"),\n ...options,\n });\n }\n\n /** Get company profiles with branding, market cap, sector. */\n async getDescriptions(\n tickers: string[],\n options?: GetDescriptionsOptions,\n ): Promise<Record<string, StockProfile>> {\n return this.client.get(\"/api/v1/stocks/descriptions\", {\n tickers: tickers.join(\",\"),\n ...options,\n });\n }\n\n /** Get peer/similar stocks. */\n async getSimilar(ticker: string, options?: GetSimilarOptions): Promise<StockDetail[]> {\n return this.client.get(`/api/v1/stocks/${encodeURIComponent(ticker)}/similar`, options);\n }\n\n /** Get company profile (CEO, sector, industry, market data). */\n async getProfile(ticker: string, options?: GetProfileOptions): Promise<StockProfile> {\n return this.client.get(`/api/v1/stocks/${encodeURIComponent(ticker)}/profile`, options);\n }\n\n /** Get related KB entities (people, products, partners). */\n async getEntities(ticker: string): Promise<StockEntity[]> {\n return this.client.get(`/api/v1/stocks/${encodeURIComponent(ticker)}/entities`);\n }\n\n /** Get AI-generated stock analysis report. Requires PRO tier. */\n async getAISummary(ticker: string, options?: GetAISummaryOptions): Promise<AISummary> {\n return this.client.get(`/api/v1/stocks/${encodeURIComponent(ticker)}/ai-summary`, options);\n }\n\n /** Get sentiment/mention metrics breakdown by entity. */\n async getMetricsBreakdown(\n ticker: string,\n metricType: string,\n options?: GetMetricsBreakdownOptions,\n ): Promise<MetricsBreakdown> {\n return this.client.get(\n `/api/v1/stocks/${encodeURIComponent(ticker)}/metrics/${encodeURIComponent(metricType)}/breakdown`,\n options,\n );\n }\n\n /** Get historical OHLCV chart data. */\n async getChart(ticker: string, options?: GetChartOptions): Promise<ChartData> {\n return this.client.get(\"/api/v1/stocks/chart\", { ticker, ...options });\n }\n\n /** Get current market open/closed/pre-market/after-hours status. */\n async getMarketStatus(): Promise<MarketStatus> {\n return this.client.get(\"/api/v1/stocks/market-status\");\n }\n\n /** Get financial statement data. */\n async getFundamentals(ticker: string, options?: GetFundamentalsOptions): Promise<Fundamentals> {\n return this.client.get(\"/api/v1/stocks/fundamentals\", { ticker, ...options });\n }\n\n /** Get available fiscal periods. */\n async getFundamentalsPeriods(ticker: string): Promise<FundamentalsPeriod[]> {\n return this.client.get(\"/api/v1/stocks/fundamentals/periods\", { ticker });\n }\n\n /** Get most recent fundamentals snapshot. */\n async getCurrentFundamentals(ticker: string): Promise<Fundamentals> {\n return this.client.get(\"/api/v1/stocks/fundamentals/current\", { ticker });\n }\n\n /** Get historical P/E, P/B, P/S ratios. */\n async getHistoricalRatios(ticker: string): Promise<unknown> {\n return this.client.get(\"/api/v1/stocks/fundamentals/historical/ratios\", { ticker });\n }\n\n /** Get historical revenue data. */\n async getHistoricalRevenue(ticker: string): Promise<unknown> {\n return this.client.get(\"/api/v1/stocks/fundamentals/historical/revenue\", { ticker });\n }\n\n /** Get short interest metrics (FINRA). */\n async getShortInterest(ticker: string): Promise<ShortInterest> {\n return this.client.get(\"/api/v1/stocks/short-interest\", { ticker });\n }\n\n /** Get float information. */\n async getFloat(ticker: string): Promise<FloatInfo> {\n return this.client.get(\"/api/v1/stocks/float\", { ticker });\n }\n\n /** Get short volume trading data. */\n async getShortVolume(ticker: string): Promise<ShortVolume> {\n return this.client.get(\"/api/v1/stocks/short-volume\", { ticker });\n }\n}\n","export const VERSION = \"0.1.0\";\n","import {\n APIError,\n AuthenticationError,\n NotFoundError,\n RateLimitError,\n SentiSenseError,\n} from \"./errors.js\";\nimport { Documents } from \"./resources/documents.js\";\nimport { EntityMetrics } from \"./resources/entityMetrics.js\";\nimport { Institutional } from \"./resources/institutional.js\";\nimport { KB } from \"./resources/kb.js\";\nimport { MarketMoodResource } from \"./resources/marketMood.js\";\nimport { Stocks } from \"./resources/stocks.js\";\nimport type { SentiSenseOptions } from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\nconst DEFAULT_BASE_URL = \"https://app.sentisense.ai\";\nconst DEFAULT_TIMEOUT = 30_000;\n\n/** @internal HTTP interface exposed to resource classes. */\nexport interface APIClient {\n get<T = unknown>(path: string, params?: object): Promise<T>;\n}\n\nexport class SentiSense implements APIClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n\n readonly stocks: Stocks;\n readonly documents: Documents;\n readonly institutional: Institutional;\n readonly entityMetrics: EntityMetrics;\n readonly marketMood: MarketMoodResource;\n readonly kb: KB;\n\n constructor(options: SentiSenseOptions = {}) {\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n this.stocks = new Stocks(this);\n this.documents = new Documents(this);\n this.institutional = new Institutional(this);\n this.entityMetrics = new EntityMetrics(this);\n this.marketMood = new MarketMoodResource(this);\n this.kb = new KB(this);\n }\n\n /** @internal */\n async get<T = unknown>(path: string, params?: object): Promise<T> {\n const url = this.buildUrl(path, params);\n const headers: Record<string, string> = {};\n\n if (this.apiKey) {\n headers[\"X-SentiSense-API-Key\"] = this.apiKey;\n }\n\n // User-Agent is only set in Node.js (browsers disallow it)\n if (typeof process !== \"undefined\" && process.versions?.node) {\n headers[\"User-Agent\"] = `sentisense-node/${VERSION}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n return (await response.json()) as T;\n } catch (error) {\n if (error instanceof SentiSenseError) throw error;\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SentiSenseError(`Request timed out after ${this.timeout}ms`);\n }\n throw new SentiSenseError(\n error instanceof Error ? error.message : \"Unknown error\",\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n private buildUrl(path: string, params?: object): string {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params as Record<string, unknown>)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let body: { error?: string; message?: string } = {};\n try {\n body = await response.json();\n } catch {\n // Response may not be JSON\n }\n\n const message = body.message ?? response.statusText ?? \"API request failed\";\n const code = body.error;\n\n switch (response.status) {\n case 401:\n case 403:\n throw new AuthenticationError(message, response.status, code);\n case 404:\n throw new NotFoundError(message, code);\n case 429:\n throw new RateLimitError(message, code);\n default:\n throw new APIError(message, response.status, code);\n }\n }\n}\n"],"mappings":"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","names":[]}
|