pmxt-core 2.48.4 → 2.48.6

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.
@@ -756,6 +756,8 @@ class PredictionMarketExchange {
756
756
  // ResolutionDate filter
757
757
  if (criteria.resolutionDate) {
758
758
  const resDate = market.resolutionDate;
759
+ if (!resDate)
760
+ return false;
759
761
  if (criteria.resolutionDate.before && resDate >= criteria.resolutionDate.before) {
760
762
  return false;
761
763
  }
@@ -170,10 +170,10 @@ function applyFilters(markets, params) {
170
170
  if (status !== 'all') {
171
171
  const now = Date.now();
172
172
  if (status === 'active') {
173
- result = result.filter(m => m.resolutionDate.getTime() > now);
173
+ result = result.filter(m => !m.resolutionDate || m.resolutionDate.getTime() > now);
174
174
  }
175
175
  else {
176
- result = result.filter(m => m.resolutionDate.getTime() <= now);
176
+ result = result.filter(m => m.resolutionDate && m.resolutionDate.getTime() <= now);
177
177
  }
178
178
  }
179
179
  // Text search
@@ -198,7 +198,7 @@ function applyFilters(markets, params) {
198
198
  result.sort((a, b) => b.liquidity - a.liquidity);
199
199
  }
200
200
  else if (params?.sort === 'newest') {
201
- result.sort((a, b) => b.resolutionDate.getTime() - a.resolutionDate.getTime());
201
+ result.sort((a, b) => (b.resolutionDate?.getTime() ?? 0) - (a.resolutionDate?.getTime() ?? 0));
202
202
  }
203
203
  else {
204
204
  result.sort((a, b) => (b.volume || 0) - (a.volume || 0));
@@ -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-06-02T10:48:01.133Z
3
+ * Generated at: 2026-06-04T11:40:47.252Z
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-06-02T10:48:01.133Z
6
+ * Generated at: 2026-06-04T11:40:47.252Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.kalshiApiSpec = {
@@ -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-06-02T10:48:01.162Z
3
+ * Generated at: 2026-06-04T11:40:47.289Z
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-06-02T10:48:01.162Z
6
+ * Generated at: 2026-06-04T11:40:47.289Z
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-06-02T10:48:01.169Z
3
+ * Generated at: 2026-06-04T11:40:47.300Z
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-06-02T10:48:01.169Z
6
+ * Generated at: 2026-06-04T11:40:47.300Z
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-06-02T10:48:01.171Z
3
+ * Generated at: 2026-06-04T11:40:47.305Z
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-06-02T10:48:01.171Z
6
+ * Generated at: 2026-06-04T11:40:47.305Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.opinionApiSpec = {
@@ -41,10 +41,13 @@ class OpinionFetcher {
41
41
  async fetchRawMarkets(params) {
42
42
  try {
43
43
  if (params?.marketId) {
44
- const id = Number(params.marketId);
45
- if (Number.isNaN(id)) {
46
- throw new Error(`Invalid Opinion market ID: "${params.marketId}"`);
44
+ const idStr = String(params.marketId).trim();
45
+ if (!/^\d+$/.test(idStr)) {
46
+ const err = new Error(`Opinion market IDs must be integers, got: "${params.marketId}"`);
47
+ err.status = 400;
48
+ throw err;
47
49
  }
50
+ const id = Number(idStr);
48
51
  const market = await this.fetchRawMarketById(id);
49
52
  return market ? [market] : [];
50
53
  }
@@ -157,7 +157,7 @@ class OpinionNormalizer {
157
157
  normalizeTrade(raw, index) {
158
158
  return {
159
159
  id: raw.txHash || String(index),
160
- timestamp: (0, utils_1.toMillis)(raw.createdAt),
160
+ timestamp: (0, utils_1.toMillis)(raw.createdAt) ?? 0,
161
161
  price: (0, utils_1.parseNumStr)(raw.price),
162
162
  amount: (0, utils_1.parseNumStr)(raw.shares),
163
163
  side: raw.side === 'BUY' ? 'buy' : raw.side === 'SELL' ? 'sell' : 'unknown',
@@ -167,7 +167,7 @@ class OpinionNormalizer {
167
167
  normalizeUserTrade(raw, index) {
168
168
  return {
169
169
  id: raw.txHash || String(index),
170
- timestamp: (0, utils_1.toMillis)(raw.createdAt),
170
+ timestamp: (0, utils_1.toMillis)(raw.createdAt) ?? 0,
171
171
  price: (0, utils_1.parseNumStr)(raw.price),
172
172
  amount: (0, utils_1.parseNumStr)(raw.shares),
173
173
  side: raw.side === 'BUY' ? 'buy' : raw.side === 'SELL' ? 'sell' : 'unknown',
@@ -203,7 +203,7 @@ class OpinionNormalizer {
203
203
  status: (0, utils_1.mapOrderStatus)(raw.status),
204
204
  filled: filledShares,
205
205
  remaining: orderShares - filledShares,
206
- timestamp: (0, utils_1.toMillis)(raw.createdAt),
206
+ timestamp: (0, utils_1.toMillis)(raw.createdAt) ?? 0,
207
207
  };
208
208
  }
209
209
  // -- Price enrichment -----------------------------------------------------
@@ -265,19 +265,23 @@ class OpinionNormalizer {
265
265
  marketId,
266
266
  label: raw.yesLabel || 'Yes',
267
267
  price: 0.5,
268
+ metadata: { opinionMarketId: raw.marketId },
268
269
  };
269
270
  const noOutcome = {
270
271
  outcomeId: raw.noTokenId,
271
272
  marketId,
272
273
  label: raw.noLabel || 'No',
273
274
  price: 0.5,
275
+ metadata: { opinionMarketId: raw.marketId },
274
276
  };
275
277
  const market = {
276
278
  marketId,
277
279
  title: raw.marketTitle || '',
278
280
  description: raw.rules || '',
279
281
  outcomes: [yesOutcome, noOutcome],
280
- resolutionDate: new Date((0, utils_1.toMillis)(raw.cutoffAt)),
282
+ resolutionDate: (0, utils_1.toMillis)(raw.cutoffAt) !== null
283
+ ? new Date((0, utils_1.toMillis)(raw.cutoffAt))
284
+ : undefined,
281
285
  volume24h: (0, utils_1.parseNumStr)(raw.volume24h),
282
286
  volume: (0, utils_1.parseNumStr)(raw.volume),
283
287
  liquidity: 0,
@@ -302,12 +306,14 @@ class OpinionNormalizer {
302
306
  marketId,
303
307
  label: child.yesLabel || 'Yes',
304
308
  price: 0.5,
309
+ metadata: { opinionMarketId: child.marketId },
305
310
  };
306
311
  const noOutcome = {
307
312
  outcomeId: child.noTokenId,
308
313
  marketId,
309
314
  label: child.noLabel || 'No',
310
315
  price: 0.5,
316
+ metadata: { opinionMarketId: child.marketId },
311
317
  };
312
318
  const childTitle = child.marketTitle || '';
313
319
  const parentTitle = parent.marketTitle || '';
@@ -320,7 +326,9 @@ class OpinionNormalizer {
320
326
  title: combinedTitle,
321
327
  description: child.rules || '',
322
328
  outcomes: [yesOutcome, noOutcome],
323
- resolutionDate: new Date((0, utils_1.toMillis)(child.cutoffAt)),
329
+ resolutionDate: (0, utils_1.toMillis)(child.cutoffAt || parent.cutoffAt) !== null
330
+ ? new Date((0, utils_1.toMillis)(child.cutoffAt || parent.cutoffAt))
331
+ : undefined,
324
332
  volume24h,
325
333
  volume: (0, utils_1.parseNumStr)(child.volume),
326
334
  liquidity: 0,
@@ -19,5 +19,5 @@ export declare function mapSortToOpinion(sort?: string): number | undefined;
19
19
  export declare function mapIntervalToOpinion(interval: CandleInterval): string;
20
20
  export declare function mapOrderStatus(status: number): 'pending' | 'open' | 'filled' | 'canceled' | 'rejected';
21
21
  export declare function parseNumStr(value: string | undefined | null): number;
22
- export declare function toMillis(ts: number | undefined | null): number;
22
+ export declare function toMillis(ts: number | undefined | null): number | null;
23
23
  export declare function intervalToMs(interval: CandleInterval): number;
@@ -76,9 +76,11 @@ function parseNumStr(value) {
76
76
  }
77
77
  // Convert a raw timestamp to milliseconds.
78
78
  // If the value is under 10_000_000_000 it is assumed to be in seconds.
79
+ // Returns null when the input is missing/zero so callers can distinguish
80
+ // "no timestamp" from "epoch" instead of coercing both to 1970-01-01.
79
81
  function toMillis(ts) {
80
82
  if (!ts)
81
- return 0;
83
+ return null;
82
84
  return ts < 10_000_000_000 ? ts * 1000 : ts;
83
85
  }
84
86
  // Return the bucket size in milliseconds for a given CandleInterval
@@ -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-06-02T10:48:01.139Z
3
+ * Generated at: 2026-06-04T11:40:47.258Z
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-06-02T10:48:01.139Z
6
+ * Generated at: 2026-06-04T11:40:47.258Z
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-06-02T10:48:01.149Z
3
+ * Generated at: 2026-06-04T11:40:47.271Z
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-06-02T10:48:01.149Z
6
+ * Generated at: 2026-06-04T11:40:47.271Z
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-06-02T10:48:01.148Z
3
+ * Generated at: 2026-06-04T11:40:47.268Z
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-06-02T10:48:01.148Z
6
+ * Generated at: 2026-06-04T11:40:47.268Z
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-06-02T10:48:01.165Z
3
+ * Generated at: 2026-06-04T11:40:47.295Z
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-06-02T10:48:01.165Z
6
+ * Generated at: 2026-06-04T11:40:47.295Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.probableApiSpec = {
@@ -2655,7 +2655,9 @@ components:
2655
2655
  resolutionDate:
2656
2656
  type: string
2657
2657
  format: date-time
2658
- description: When the market is scheduled to resolve.
2658
+ description: >-
2659
+ When the market is scheduled to resolve. Optional because some venues do not publish a cutoff for every
2660
+ market (e.g. Opinion categorical children) — emit `undefined` rather than coercing to epoch.
2659
2661
  volume24h:
2660
2662
  type: number
2661
2663
  description: Trading volume over the past 24 hours (USD).
@@ -2728,7 +2730,6 @@ components:
2728
2730
  - title
2729
2731
  - description
2730
2732
  - outcomes
2731
- - resolutionDate
2732
2733
  - volume24h
2733
2734
  - liquidity
2734
2735
  - url
package/dist/types.d.ts CHANGED
@@ -55,8 +55,10 @@ export interface UnifiedMarket {
55
55
  slug?: string;
56
56
  /** The possible outcomes for this market. */
57
57
  outcomes: MarketOutcome[];
58
- /** When the market is scheduled to resolve. */
59
- resolutionDate: Date;
58
+ /** When the market is scheduled to resolve. Optional because some venues
59
+ * do not publish a cutoff for every market (e.g. Opinion categorical
60
+ * children) — emit `undefined` rather than coercing to epoch. */
61
+ resolutionDate?: Date;
60
62
  /** Trading volume over the past 24 hours (USD). */
61
63
  volume24h: number;
62
64
  volume?: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmxt-core",
3
- "version": "2.48.4",
3
+ "version": "2.48.6",
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.48.4,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.48.4,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.48.6,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.48.6,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",