sentisense 0.53.0 → 0.54.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/README.md +19 -4
- package/dist/cli.cjs +2 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +74 -7
- package/dist/index.d.ts +74 -7
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -170,7 +170,22 @@ Most methods resolve to the payload directly, but two families wrap it. The retu
|
|
|
170
170
|
|
|
171
171
|
**1. Tier-gated endpoints return a preview envelope.** The payload is in `data`, and `isPreview` tells you whether it was truncated for your tier. `totalCount` carries the untruncated size whenever the server knows it: on a truncated response, so you can render "showing N of M", and on a paged endpoint such as `politicians.getActivity`, where it is the full match count on every tier including PRO. A missing `totalCount` means "count `data` yourself", never "zero results".
|
|
172
172
|
|
|
173
|
-
Affected:
|
|
173
|
+
Affected: every method whose declared return type is `PreviewResponse<T>`. A test keeps this table in step with the source, so it is the full list rather than a sample.
|
|
174
|
+
|
|
175
|
+
| Namespace | Methods |
|
|
176
|
+
|-----------|---------|
|
|
177
|
+
| `analyst` | `consensus` `actions` `estimates` `marketActivity` `coverage` `profile` `calls` |
|
|
178
|
+
| `calendar` | `getEarnings` |
|
|
179
|
+
| `earnings` | `getSummaries` `getRecent` |
|
|
180
|
+
| `etfs` | `analystAggregate` `insiderAggregate` `sentimentAggregate` |
|
|
181
|
+
| `insider` | `getActivity` `getTrades` `getClusterBuys` |
|
|
182
|
+
| `insights` | `stock` `stockRange` `market` `latest` `user` |
|
|
183
|
+
| `institutional` | `getFlows` `getHolders` `getActivists` |
|
|
184
|
+
| `options` | `getOverview` |
|
|
185
|
+
| `politicians` | `getActivity` `getFilings` `getMembers` `getMember` |
|
|
186
|
+
| `stocks` | `getSentiment` `getKpis` `getOptionsSummary` `getOptionsHistory` |
|
|
187
|
+
|
|
188
|
+
The envelope itself is always an object, so test the payload rather than the response. Two of these declare a `data` that can be null: `stocks.getOptionsSummary`, for a ticker outside the covered options universe, and `options.getOverview`, before its first nightly build. Everywhere else `data` is an array or an object.
|
|
174
189
|
|
|
175
190
|
```typescript
|
|
176
191
|
const flows = await client.institutional.getFlows();
|
|
@@ -475,11 +490,11 @@ client.stocks.getOptionsHistory("NVDA", { window: "2y" }) // That name's daily
|
|
|
475
490
|
|
|
476
491
|
The radar carries two separately-ranked boards: `data.rows` for stocks and `data.etfRows` for ETFs. Keep them apart. Every reading behind a row's `interestScore` is a percentile of that ticker's own trailing history, so a ranking built across both boards compares numbers measured against different baselines. The aggregates split the same way, with the `etf`-prefixed fields describing the ETF board alone.
|
|
477
492
|
|
|
478
|
-
A row whose baseline is still building carries its raw readings with the percentiles and `interestScore` omitted, which means "not enough history yet" rather than "nothing interesting". `getOptionsSummary` reports an uncovered ticker as a `null`
|
|
493
|
+
A row whose baseline is still building carries its raw readings with the percentiles and `interestScore` omitted, which means "not enough history yet" rather than "nothing interesting". `getOptionsSummary` reports an uncovered ticker as a null payload inside the usual envelope, so the check is `result.data === null`: the response object itself is always truthy, and a bare `if (summary === null)` never fires. `getOptionsHistory` reports it as an empty `series` instead, so check the array's length rather than null-checking there.
|
|
479
494
|
|
|
480
495
|
### SentiSense Rating
|
|
481
496
|
|
|
482
|
-
Where a stock ranks against the other stocks rated that day, as a score, a letter and a percentile, plus the
|
|
497
|
+
Where a stock ranks against the other stocks rated that day, as a score, a letter and a percentile, plus the seven dimensions the rank is blended from. It is a relative research signal for informational and educational purposes, not financial, investment or trading advice, and not a recommendation about any security. Every response carries the wording to display alongside a grade in `disclaimer`. [Methodology](https://sentisense.ai/methodology/#sentisense-rating).
|
|
483
498
|
|
|
484
499
|
```typescript
|
|
485
500
|
const rating = await client.stocks.getRating("AAPL");
|
|
@@ -498,7 +513,7 @@ if (rating.rated) {
|
|
|
498
513
|
|
|
499
514
|
Having no grade is a normal 200, not a 404: ETFs and tickers outside the swept universe answer that way, and `reason` is one of `stale`, `not_rated_today`, `insufficient_dimensions` or `insufficient_coverage_weight`. Only a ticker that resolves to nothing we track rejects with `NotFoundError`.
|
|
500
515
|
|
|
501
|
-
`dimensions` always holds all
|
|
516
|
+
`dimensions` always holds all seven rows in a fixed order, including the ones with no data, which arrive with `present` false and a `null` percentile. Read `present` first and never substitute zero for a missing percentile: zero is the bottom of the cross-section, absence is not a position on it. Only the smart-money dimension carries `subLegs`.
|
|
502
517
|
|
|
503
518
|
**`score` is not `percentile`.** `percentile` is the rank of the blended signals against the day's rated set. `score = percentile - sum(riskAdjustments.map((a) => a.points))`, floored at 10 when fewer than five dimensions are available, and it is the number `letter` bands (A 90, B 70, C 30, D 10). `bucketLetter` is the band the percentile alone would give, so the two letters differ by exactly what the conditions cost. `riskAdjustments` itemises that cost, `penaltyPoints` totals it, and `riskConditions` names the active ones from the `RiskCondition` union: `thin_coverage`, `weak_dimension`, `unprofitable`, `no_fundamentals`, `high_leverage`, `unseasoned_listing`, `small_market_cap`, `thin_liquidity`, `extended_price`, `insider_selling` and `institutional_outflow`.
|
|
504
519
|
|
package/dist/cli.cjs
CHANGED
|
@@ -1324,7 +1324,7 @@ var flowsCommand = {
|
|
|
1324
1324
|
};
|
|
1325
1325
|
|
|
1326
1326
|
// src/version.ts
|
|
1327
|
-
var VERSION = "0.
|
|
1327
|
+
var VERSION = "0.54.0";
|
|
1328
1328
|
|
|
1329
1329
|
// src/resources/analyst.ts
|
|
1330
1330
|
var Analyst = class {
|
|
@@ -3452,6 +3452,7 @@ var optionsCommand = {
|
|
|
3452
3452
|
kind: "facts",
|
|
3453
3453
|
items: fields(
|
|
3454
3454
|
field("ATM IV", fixed(latest.atmIv, 4)),
|
|
3455
|
+
field("Exp move 1d", fixed(latest.expectedMove1d, 4)),
|
|
3455
3456
|
field("Skew 25d", signed(latest.skew25d, 4)),
|
|
3456
3457
|
field("Call vol", humanize(latest.callVol, 1)),
|
|
3457
3458
|
field("Put vol", humanize(latest.putVol, 1)),
|