pmxt-core 2.35.12 → 2.35.13

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.
@@ -443,7 +443,7 @@ export declare abstract class PredictionMarketExchange {
443
443
  *
444
444
  * @notes **CRITICAL**: Use `outcome.outcomeId` (TS) / `outcome.outcome_id` (Python), not the market ID.
445
445
  * @notes Polymarket: outcomeId is the CLOB Token ID. Kalshi: outcomeId is the Market Ticker.
446
- * @notes Resolution options: '1m' | '5m' | '15m' | '1h' | '6h' | '1d'
446
+ * @notes Common resolutions: '1m' | '5m' | '15m' | '1h' | '6h' | '1d'. Arbitrary intervals (e.g. '30s', '120s', '3h') accepted by venues that support them.
447
447
  */
448
448
  fetchOHLCV(id: string, params: OHLCVParams): Promise<PriceCandle[]>;
449
449
  /**
@@ -397,7 +397,7 @@ class PredictionMarketExchange {
397
397
  *
398
398
  * @notes **CRITICAL**: Use `outcome.outcomeId` (TS) / `outcome.outcome_id` (Python), not the market ID.
399
399
  * @notes Polymarket: outcomeId is the CLOB Token ID. Kalshi: outcomeId is the Market Ticker.
400
- * @notes Resolution options: '1m' | '5m' | '15m' | '1h' | '6h' | '1d'
400
+ * @notes Common resolutions: '1m' | '5m' | '15m' | '1h' | '6h' | '1d'. Arbitrary intervals (e.g. '30s', '120s', '3h') accepted by venues that support them.
401
401
  */
402
402
  async fetchOHLCV(id, params) {
403
403
  throw new Error("Method fetchOHLCV not implemented.");
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/kalshi/Kalshi.yaml
3
- * Generated at: 2026-04-27T16:01:06.024Z
3
+ * Generated at: 2026-04-28T07:43:16.639Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const kalshiApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.kalshiApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/kalshi/Kalshi.yaml
6
- * Generated at: 2026-04-27T16:01:06.024Z
6
+ * Generated at: 2026-04-28T07:43:16.639Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.kalshiApiSpec = {
@@ -7,8 +7,10 @@ export interface KalshiRawMarket {
7
7
  yes_bid?: number;
8
8
  subtitle?: string;
9
9
  yes_sub_title?: string;
10
- previous_price_dollars?: number;
11
- last_price_dollars?: number;
10
+ previous_price_dollars?: string;
11
+ last_price_dollars?: string;
12
+ yes_ask_dollars?: string;
13
+ yes_bid_dollars?: string;
12
14
  rules_primary?: string;
13
15
  rules_secondary?: string;
14
16
  expiration_time: string;
@@ -24,8 +24,19 @@ class KalshiNormalizer {
24
24
  normalizeRawMarket(event, market) {
25
25
  if (!market)
26
26
  return null;
27
+ // Kalshi API v2 migrated from cent integers to FixedPointDollars strings.
28
+ // Prefer the _dollars fields; fall back to deprecated cent fields.
27
29
  let price = 0;
28
- if (market.last_price) {
30
+ if (market.last_price_dollars != null) {
31
+ price = parseFloat(market.last_price_dollars);
32
+ }
33
+ else if (market.yes_ask_dollars != null && market.yes_bid_dollars != null) {
34
+ price = (parseFloat(market.yes_ask_dollars) + parseFloat(market.yes_bid_dollars)) / 2;
35
+ }
36
+ else if (market.yes_ask_dollars != null) {
37
+ price = parseFloat(market.yes_ask_dollars);
38
+ }
39
+ else if (market.last_price) {
29
40
  price = (0, price_1.fromKalshiCents)(market.last_price);
30
41
  }
31
42
  else if (market.yes_ask && market.yes_bid) {
@@ -36,8 +47,8 @@ class KalshiNormalizer {
36
47
  }
37
48
  const candidateName = this.deriveOutcomeLabel(market);
38
49
  let priceChange = 0;
39
- if (market.previous_price_dollars !== undefined && market.last_price_dollars !== undefined) {
40
- priceChange = market.last_price_dollars - market.previous_price_dollars;
50
+ if (market.previous_price_dollars != null && market.last_price_dollars != null) {
51
+ priceChange = parseFloat(market.last_price_dollars) - parseFloat(market.previous_price_dollars);
41
52
  }
42
53
  const outcomes = [
43
54
  {
@@ -1,3 +1,2 @@
1
- import { UnifiedMarket, CandleInterval } from "../../types";
2
- export declare function mapMarketToUnified(event: any, market: any): UnifiedMarket | null;
1
+ import { CandleInterval } from "../../types";
3
2
  export declare function mapIntervalToKalshi(interval: CandleInterval): number;
@@ -1,89 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mapMarketToUnified = mapMarketToUnified;
4
3
  exports.mapIntervalToKalshi = mapIntervalToKalshi;
5
- const market_utils_1 = require("../../utils/market-utils");
6
- const price_1 = require("./price");
7
- function mapMarketToUnified(event, market) {
8
- if (!market)
9
- return null;
10
- // Calculate price
11
- let price = 0.5;
12
- if (market.last_price) {
13
- price = (0, price_1.fromKalshiCents)(market.last_price);
14
- }
15
- else if (market.yes_ask && market.yes_bid) {
16
- price = ((0, price_1.fromKalshiCents)(market.yes_ask) + (0, price_1.fromKalshiCents)(market.yes_bid)) / 2;
17
- }
18
- else if (market.yes_ask) {
19
- price = (0, price_1.fromKalshiCents)(market.yes_ask);
20
- }
21
- // Extract candidate name. Prefer explicit outcome subtitle and ignore
22
- // structural labels such as ":: Democratic".
23
- const cleanLabel = (value) => {
24
- if (typeof value !== "string")
25
- return null;
26
- const trimmed = value.trim();
27
- if (!trimmed || trimmed.startsWith("::"))
28
- return null;
29
- return trimmed;
30
- };
31
- const candidateName = cleanLabel(market.yes_sub_title) ?? cleanLabel(market.subtitle);
32
- // Calculate 24h change
33
- let priceChange = 0;
34
- if (market.previous_price_dollars !== undefined &&
35
- market.last_price_dollars !== undefined) {
36
- priceChange = market.last_price_dollars - market.previous_price_dollars;
37
- }
38
- const outcomes = [
39
- {
40
- outcomeId: market.ticker,
41
- marketId: market.ticker,
42
- label: candidateName || "Yes",
43
- price: price,
44
- priceChange24h: priceChange,
45
- },
46
- {
47
- outcomeId: `${market.ticker}-NO`,
48
- marketId: market.ticker,
49
- label: candidateName ? `Not ${candidateName}` : "No",
50
- price: (0, price_1.invertKalshiUnified)(price),
51
- priceChange24h: -priceChange, // Inverse change for No? simplified assumption
52
- },
53
- ];
54
- // Combine category and tags into a unified tags array
55
- const unifiedTags = [];
56
- // Add category first (if it exists)
57
- if (event.category) {
58
- unifiedTags.push(event.category);
59
- }
60
- // Add tags (if they exist and avoid duplicates)
61
- if (event.tags && Array.isArray(event.tags)) {
62
- for (const tag of event.tags) {
63
- if (!unifiedTags.includes(tag)) {
64
- unifiedTags.push(tag);
65
- }
66
- }
67
- }
68
- const um = {
69
- id: market.ticker,
70
- marketId: market.ticker,
71
- eventId: event.event_ticker,
72
- title: event.title,
73
- description: market.rules_primary || market.rules_secondary || "",
74
- outcomes: outcomes,
75
- resolutionDate: new Date(market.expiration_time),
76
- volume24h: parseFloat(market.volume_24h_fp ?? '') || Number(market.volume_24h || market.volume || 0),
77
- volume: parseFloat(market.volume_fp ?? '') || Number(market.volume || 0),
78
- liquidity: Number(market.liquidity || 0),
79
- openInterest: parseFloat(market.open_interest_fp ?? '') || Number(market.open_interest || 0),
80
- url: `https://kalshi.com/events/${event.event_ticker}`,
81
- category: event.category,
82
- tags: unifiedTags,
83
- };
84
- (0, market_utils_1.addBinaryOutcomes)(um);
85
- return um;
86
- }
87
4
  function mapIntervalToKalshi(interval) {
88
5
  const mapping = {
89
6
  "1m": 1,
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/limitless/Limitless.yaml
3
- * Generated at: 2026-04-27T16:01:06.056Z
3
+ * Generated at: 2026-04-28T07:43:16.667Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const limitlessApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.limitlessApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/limitless/Limitless.yaml
6
- * Generated at: 2026-04-27T16:01:06.056Z
6
+ * Generated at: 2026-04-28T07:43:16.667Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.limitlessApiSpec = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/myriad/myriad.yaml
3
- * Generated at: 2026-04-27T16:01:06.068Z
3
+ * Generated at: 2026-04-28T07:43:16.677Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const myriadApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.myriadApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/myriad/myriad.yaml
6
- * Generated at: 2026-04-27T16:01:06.068Z
6
+ * Generated at: 2026-04-28T07:43:16.677Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.myriadApiSpec = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/opinion/opinion-openapi.yaml
3
- * Generated at: 2026-04-27T16:01:06.072Z
3
+ * Generated at: 2026-04-28T07:43:16.681Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const opinionApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.opinionApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/opinion/opinion-openapi.yaml
6
- * Generated at: 2026-04-27T16:01:06.072Z
6
+ * Generated at: 2026-04-28T07:43:16.681Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.opinionApiSpec = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/PolymarketClobAPI.yaml
3
- * Generated at: 2026-04-27T16:01:06.030Z
3
+ * Generated at: 2026-04-28T07:43:16.644Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const polymarketClobSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.polymarketClobSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/PolymarketClobAPI.yaml
6
- * Generated at: 2026-04-27T16:01:06.030Z
6
+ * Generated at: 2026-04-28T07:43:16.644Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.polymarketClobSpec = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/Polymarket_Data_API.yaml
3
- * Generated at: 2026-04-27T16:01:06.040Z
3
+ * Generated at: 2026-04-28T07:43:16.653Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const polymarketDataSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.polymarketDataSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/Polymarket_Data_API.yaml
6
- * Generated at: 2026-04-27T16:01:06.040Z
6
+ * Generated at: 2026-04-28T07:43:16.653Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.polymarketDataSpec = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/PolymarketGammaAPI.yaml
3
- * Generated at: 2026-04-27T16:01:06.038Z
3
+ * Generated at: 2026-04-28T07:43:16.652Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const polymarketGammaSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.polymarketGammaSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/PolymarketGammaAPI.yaml
6
- * Generated at: 2026-04-27T16:01:06.038Z
6
+ * Generated at: 2026-04-28T07:43:16.652Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.polymarketGammaSpec = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/probable/probable.yaml
3
- * Generated at: 2026-04-27T16:01:06.061Z
3
+ * Generated at: 2026-04-28T07:43:16.672Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const probableApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.probableApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/probable/probable.yaml
6
- * Generated at: 2026-04-27T16:01:06.061Z
6
+ * Generated at: 2026-04-28T07:43:16.672Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.probableApiSpec = {
@@ -583,13 +583,6 @@ paths:
583
583
  required: false
584
584
  schema:
585
585
  type: string
586
- enum:
587
- - 1m
588
- - 5m
589
- - 15m
590
- - 1h
591
- - 6h
592
- - 1d
593
586
  description: Required for candle aggregation
594
587
  - in: query
595
588
  name: start
@@ -2691,13 +2684,6 @@ components:
2691
2684
  properties:
2692
2685
  resolution:
2693
2686
  type: string
2694
- enum:
2695
- - 1m
2696
- - 5m
2697
- - 15m
2698
- - 1h
2699
- - 6h
2700
- - 1d
2701
2687
  description: Optional for backward compatibility
2702
2688
  start:
2703
2689
  type: string
@@ -2715,13 +2701,6 @@ components:
2715
2701
  properties:
2716
2702
  resolution:
2717
2703
  type: string
2718
- enum:
2719
- - 1m
2720
- - 5m
2721
- - 15m
2722
- - 1h
2723
- - 6h
2724
- - 1d
2725
2704
  description: Required for candle aggregation
2726
2705
  start:
2727
2706
  type: string
package/dist/types.d.ts CHANGED
@@ -86,7 +86,14 @@ export interface UnifiedMarket {
86
86
  /** Convenience accessor for the DOWN outcome on a binary market. */
87
87
  down?: MarketOutcome;
88
88
  }
89
- export type CandleInterval = '1m' | '5m' | '15m' | '1h' | '6h' | '1d';
89
+ /**
90
+ * Candle interval for OHLCV data.
91
+ *
92
+ * Common values: `'1m'`, `'5m'`, `'15m'`, `'1h'`, `'6h'`, `'1d'`.
93
+ * Arbitrary intervals matching `^[0-9]+[smhd]$` (e.g. `'30s'`, `'2m'`,
94
+ * `'120s'`, `'3h'`) are accepted by venues that support them.
95
+ */
96
+ export type CandleInterval = string;
90
97
  export interface PriceCandle {
91
98
  /** Unix timestamp in milliseconds marking the start of the candle. */
92
99
  timestamp: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmxt-core",
3
- "version": "2.35.12",
3
+ "version": "2.35.13",
4
4
  "description": "pmxt is a unified prediction market data API. The ccxt for prediction markets.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,8 +29,8 @@
29
29
  "test": "jest -c jest.config.js",
30
30
  "server": "tsx watch src/server/index.ts",
31
31
  "server:prod": "node dist/server/index.js",
32
- "generate:sdk:python": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g python -o ../sdks/python/generated --package-name pmxt_internal --additional-properties=projectName=pmxt-internal,packageVersion=2.35.12,library=urllib3",
33
- "generate:sdk:typescript": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g typescript-fetch -o ../sdks/typescript/generated --additional-properties=npmName=pmxtjs,npmVersion=2.35.12,supportsES6=true,typescriptThreePlus=true && node ../sdks/typescript/scripts/fix-generated.js",
32
+ "generate:sdk:python": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g python -o ../sdks/python/generated --package-name pmxt_internal --additional-properties=projectName=pmxt-internal,packageVersion=2.35.13,library=urllib3",
33
+ "generate:sdk:typescript": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g typescript-fetch -o ../sdks/typescript/generated --additional-properties=npmName=pmxtjs,npmVersion=2.35.13,supportsES6=true,typescriptThreePlus=true && node ../sdks/typescript/scripts/fix-generated.js",
34
34
  "fetch:openapi": "node scripts/fetch-openapi-specs.js",
35
35
  "extract:jsdoc": "node ../scripts/extract-jsdoc.js",
36
36
  "generate:docs": "npm run extract:jsdoc && node ../scripts/generate-api-docs.js",