Changelog

Every update to pmxt, from the first commit to the latest release.

2.46.14

Patch

Fixed

  • Docs: Simplify the raw WebSocket Python example for watchAllOrderBooks() to use the hosted PMXT URL directly and drop the local relay override from that section.

2.46.13

Patch

Fixed

  • Docs: Replace the raw WebSocket curl examples for watchAllOrderBooks() with a direct Python WebSocket example for non-SDK users.

2.46.12

Patch

Fixed

  • Release: Recover npm package publishing after repeated provenance/transparency-log failures left registry versions split across 2.46.9 and 2.46.10.

2.46.11

Patch

Fixed

  • Release: Republish the curl WebSocket documentation patch after a transient npm provenance error interrupted the 2.46.10 npm package publish.

2.46.10

Patch

Fixed

  • Docs: Clarify raw curl WebSocket API key usage for watchAllOrderBooks(), including the common mistake of placing quote characters inside the apiKey query parameter.

2.46.9

Patch

Fixed

  • Docs: Make raw watchAllOrderBooks() WebSocket usage actionable with runnable curl examples, a raw Python WebSocket example for direct ws:// / wss:// connections, and clearer wire protocol guidance for non-SDK clients.

2.46.8

Patch

Fixed

  • Docs: Use "local server" terminology consistently across the docs, including generated llms.txt docs and WebSocket/server management pages.

2.46.7

Patch

Fixed

  • Docs: Add raw curl WebSocket examples for watchAllOrderBooks(), including all-venue and single-venue subscription payloads, local relay URL shape, and the curl version requirement for sending WebSocket frames from stdin.

2.46.6

Patch

Fixed

  • Docs: Clarify watchAllOrderBooks() venue defaults. SDK Router examples now show all-venue streams, venue-client examples show single-venue defaults, and raw WebSocket examples remain explicit about omitting args for all venues.

2.46.5

Patch

Fixed

  • SDK streaming: Default watchAllOrderBooks() / watch_all_order_books() to the instantiated venue for venue clients. Kalshi, Polymarket, Limitless, and Opinion now stream only their own venue unless an explicit venue list is provided, while Router continues to stream all venues by default.

2.46.4

Patch

Fixed

  • SDK streaming: Queue WebSocket data events in FIFO order in both the TypeScript and Python SDKs so bursty watchAllOrderBooks() / watch_all_order_books() streams are drained event-by-event instead of overwriting intermediate updates.
  • Python SDK streaming: Improve hosted WebSocket reliability by preferring IPv4 for api.pmxt.dev, retrying transient handshake failures, and clearing the connect timeout after the handshake so quiet periods do not close an otherwise healthy stream.

2.46.3

Patch

Fixed

  • Limitless: Preserve parent event context when normalizing grouped child markets. fetchEvents() and fetchMarkets({ query }) now return full grouped market titles such as World Cup, USA vs Paraguay, Jun 13, 2026 - USA while keeping outcome labels as USA / Not USA, improving cross-venue matching and avoiding ambiguous one-word market titles.

2.46.2

Patch

Fixed

  • CLI color UX: Add restrained semantic colors for human-readable help, auth status, local PMXT status, and hosted/local remediation guidance while keeping --json, non-TTY, and NO_COLOR output plain.

2.46.1

Patch

Fixed

  • CLI mode selection: Add explicit --local and --hosted flags. Commands now use hosted PMXT when an API key is configured and otherwise fall back to a local PMXT instance.
  • CLI auth guidance: Hosted auth errors now show both paths forward: configure a PMXT API key for hosted mode, or run the command with a local PMXT instance.
  • CLI local UX: Local mode now fails fast when pmxt-core is not installed and explains how to install it or switch to hosted PMXT.
  • CLI copy: Replace production CLI wording around local server management with "local PMXT instance" language.

2.46.0

Minor

Added

  • Cross Exchange: Add complement to the matched event and market cluster relation types in the core router types and TypeScript/Python SDK models, matching the hosted API's complement relation filter.

2.45.1

Patch

Fixed

  • CLI UX: Replace the raw oclif root command dump with a curated onboarding help screen focused on exchange-first commands, auth setup, and common workflows.
  • CLI defaults: Default standalone CLI API calls to hosted PMXT instead of localhost, keeping local runtime use explicit via --base-url or pmxt server.
  • CLI install: Remove the runtime dependency on pmxtjs from @pmxt/cli, keeping hosted CLI installs lightweight and avoiding SDK/core dependency warnings during global install.
  • CLI auth errors: Show actionable PMXT API key setup guidance on hosted 401/403 responses, including pmxt auth login, PMXT_API_KEY, and one-shot --pmxt-api-key usage.
  • CLI aliases: Keep duplicate fetch/v0 aliases working through the explicit alias layer while hiding them from command help output.
  • Core packaging: Move test/dev-only packages out of pmxt-core runtime dependencies so downstream installs do not pull Jest or tsx.

2.45.0

Minor

Added

  • CLI: Introduced the standalone @pmxt/cli package with the pmxt executable. It can be installed globally with npm install -g @pmxt/cli or run with npx @pmxt/cli.
  • CLI commands: Added command coverage for the documented PMXT API surface, including markets, events, order books, trades, balances, positions, order build/create/submit/cancel/get, router matches, data feeds, feed streaming, WebSocket watch commands, enterprise commands, and local server management.
  • CLI aliases: Added an explicit alias layer for exchange-first UX such as pmxt polymarket fetchMarkets --query Trump, direct camelCase method aliases such as pmxt fetchMarkets, and space-separated command groups such as pmxt order create and pmxt feed fetchTicker.
  • CLI auth: Added pmxt auth commands for PMXT API keys and exchange credentials. Commands support saved auth, environment variables, and one-shot flags so automation can avoid interactive prompts.
  • CLI packaging: Added a dedicated sdks/cli workspace, oclif command discovery, package validation, and npm package metadata for publishing @pmxt/cli.

Changed

  • TypeScript SDK: Decoupled the command-line interface from pmxtjs. Installing pmxtjs now provides the SDK only; installing @pmxt/cli provides the CLI.
  • Release workflow: Updated CI/CD versioning, dry-run publishing, npm publishing, local release scripts, and GitHub release notes to include @pmxt/cli alongside pmxt-core, pmxtjs, and the Python pmxt package.

Fixed

  • Package metadata: Normalized pmxt-core npm metadata so publish dry-runs no longer rely on npm auto-correcting repository and bin path fields.
  • Release dry run: Updated the local version-update dry-run helper to validate CLI package versioning, pmxtjs dependency pinning, Python __init__ versioning, and generated SDK version arguments.
  • CLI auth: pmxt auth status now dispatches correctly while preserving the existing pmxt auth:status command.

2.44.7

Patch

Fixed

  • SDK streaming: Remove TypeScript and Python REST fallbacks for watchOrderBook, watchOrderBooks, watchTrades, and unwatchOrderBook. Streaming methods now require the hosted /ws transport and fail fast if WebSocket transport is unavailable, preventing accidental 30s REST long-poll calls to /api/{exchange}/watch*.
  • Python SDK: Add regression coverage proving streaming methods use WebSocket transport and do not invoke HTTP fallbacks.

2.44.6

Patch

Fixed

  • Kalshi: Use enriched series titles to normalize contaminated broad-future event titles. Multi-market futures such as Champions League Winner and conference championship winner events no longer inherit current-matchup labels like PSG vs Arsenal or Cleveland vs New York as their PMXT event title, while true match events keep their matchup titles.
  • Kalshi: Add regression coverage for contaminated futures, already-sane futures, and true matchup events.

2.44.5

Patch

Fixed

  • Mock exchange: Respect limit in fetchOrderBook() and fetchTrades(), and expose the documented fetchOrderBooks() batch method.
  • Local sidecar: Expose documented /api/feeds, /v0/sql, and /ws surfaces from createApp()/local servers with clearer unsupported-capability and missing-environment errors.
  • Router: Resolve local mock market, outcome, and event IDs locally for /api/router match lookups instead of sending fixture IDs to the hosted catalog.

2.44.4

Patch

Fixed

  • Docs publishing: Preserve Cross Exchange directly after Events & Markets during release-time Mintlify regeneration instead of appending hosted groups near the bottom.

2.44.3

Patch

Fixed

  • Cross Exchange docs: Add Python, TypeScript, and curl examples for matched market and event cluster API reference pages.
  • Relation filters: Document valid matched-cluster relation values (identity, subset, superset, overlap, disjoint) and expose the single-relation enum in OpenAPI.

2.44.2

Patch

Fixed

  • Docs navigation: Move API Reference Cross Exchange directly after Events & Markets so matched-cluster endpoints sit next to catalog discovery.
  • Hosted docs sync: Insert synced Cross Exchange hosted routes after Events & Markets instead of appending them near the bottom of the sidebar.

2.44.1

Patch

Fixed

  • Docs navigation: Move hosted cross-exchange matching endpoints from the Enterprise sidebar group into the API Reference Cross Exchange group.
  • Hosted docs sync: Preserve the Cross Exchange / Enterprise split when hosted endpoint metadata is synced from hosted-pmxt.

2.44.0

Minor

Added

  • Router SDKs: Add cluster-first cross-venue matching methods to both TypeScript and Python SDKs: fetchMatchedMarketClusters / fetch_matched_market_clusters and fetchMatchedEventClusters / fetch_matched_event_clusters.
  • Matching docs: Document the new cluster-first market and event matching workflows with query-based and anchor-object examples.

Changed

  • Hosted docs: Promote the cluster-first matching endpoints in the generated docs while hiding the legacy pairwise matching routes from public navigation.
  • SDK responses: Preserve live bestBid / bestAsk fields on converted market outcomes so cluster responses include executable-price context.

2.43.25

Patch

Added

  • Polymarket: Expose initAuth() / init_auth() in both TypeScript and Python SDKs — previously only available in core. Fixes #505.

2.43.24

Patch

Fixed

  • Build: Revert FetcherContext.callApi return type from Promise<unknown> back to Promise<any> — the unknown change broke all 33 exchange fetchers that access callApi return values without type narrowing.
  • Build: Revert Ticker.info, Market.info, FundingRate.info from Record<string, unknown> back to any in feeds types — broke Binance normalizer and Chainlink feed assignments.
  • Build: Fix Chainlink feed logger calls to pass structured context object instead of bare string.
  • Build: Revert ERROR_CODE_MAP constructor type from (...args: string[]) back to (...args: any[])RateLimitExceeded takes (string, number?, string?) which doesn't match string[].

2.43.22

Patch

Fixed

  • Build: Revert FetcherContext.callApi return type from Promise<unknown> back to Promise<any> — the unknown change broke all 33 exchange fetchers that access callApi return values without type narrowing. Internal interface, not user-facing.

2.43.21

Patch

Fixed

  • Auth guards: Replace non-null assertions with explicit credential guards in kalshi (#217), limitless (#222), smarkets (#220), polymarket (#203, #213), and polymarket fetcher (#209). Missing credentials now throw immediately with clear error messages.
  • Unhandled async: Add .catch() handlers to fire-and-forget connect()/ensureConnected() calls in Binance feed (#280, #288) and Chainlink feed (#293, #300). Add concurrency guard + .catch() to GoldSky subscriber poll interval (#255).
  • GoldSky type safety: Replace 8 unsafe any types with typed interfaces (GoldskyOrderFilledEvent, GoldskyTransfer, GoldskyGraphQlResponse). Fixes #348.
  • WebSocket safety: Catch JSON.parse in ws-client onmessage to prevent malformed frames from killing the connection (#276).
  • SDK timeouts: Add 30s timeout to fetchWithRetry() (#207), 5s timeout to server-manager health checks (#210, #214), 30s timeout to feed-client fetch calls (#218). Replace 2 unsafe any types in feed-client (#226).
  • Type safety (core): Replace unsafe any types in errors.ts (#224), args.ts (#228), models.ts (#232), interfaces.ts (#258), feeds/types.ts (#262), error-mapper.ts + 11 exchange error subclasses (#331), kalshi/normalizer.ts (#302), router/client.ts (#254).
  • Python SDK: Add ExecutionPriceResult to exports, return type annotations on status()/logs() (#180, #233). Typed List/Dict in server_manager.py and errors.py (#238, #241). Add outcome_id/market_id to UserTrade, make PaginatedResult.total optional (#169, #170, #171). Add page/similarity_threshold to MarketFetchParams, align fetchOHLCV timeframe default (#172, #177).
  • Order.status: Normalize spelling from 'cancelled' to 'canceled' across core types, 10 exchange normalizers, OpenAPI specs, both SDKs, and tests (#152).
  • Mock exchange: Replace non-null assertions with guard checks (#273).

2.43.20

Patch

Fixed

  • Kalshi: Non-null assertion guards on WebSocket resolver maps + 30s connection timeout. Fixes #230, #231.
  • Gemini Titan: Non-null assertion guards on resolver maps + 30s handshake timeout. Fixes #235, #236.
  • Opinion: Non-null assertion guards on resolver maps + 30s connection timeout. Fixes #239, #249.
  • Myriad: Non-null assertion guards on WebSocket resolver/rejecter maps. Fixes #240.
  • Polymarket: Non-null assertion guards, bounded pendingTrades (1000/asset), userCallbacks dedup + cap (100), 30s connection timeout on both channels. Fixes #243, #245, #247, #334, #380.
  • Polymarket US: Non-null assertion guards on WebSocket socket reference. Fixes #284.
  • Polymarket: Guard Map.get() on candle buckets in normalizer. Fixes #321.
  • Limitless: Non-null assertion guards on websocket resolvers/buffers + stale resolver cleanup on timeout + client orderClient/signer guards + normalizer param narrowing. Fixes #257, #290, #303, #372.
  • Kalshi/Limitless/GoldSky: Remove unsafe as casts on nullable fields — use type predicates, null guards, optional chaining. Fixes #336.
  • TypeScript SDK: Non-null guards on ws-client.ts send + 30s fetch timeout on router compareMarketPrices. Fixes #223, #281.
  • Chainlink/Binance feeds: Add 30s connection timeout to WebSocket establishConnection(). Fixes #252, #253.
  • Server: Replace console calls with structured logger in server/index.ts. Fixes #306, #308, #310, #311, #312.
  • TypeScript SDK: Replace console.warn with structured logger in SDK router. Fixes #396.
  • Utils: Non-null guards on market-utils.ts + max queue depth (1000) on throttler + watcher resolver safety. Fixes #269, #296, #329.

Performance

  • Kalshi: Replace O(n²) concat() with push() in fetcher pagination (3 loops, MAX_PAGES=1000). Fixes #343.
  • Opinion: Replace O(n²) spread with push() in fetcher pagination (MAX_PAGES=500). Fixes #347.
  • Smarkets: Replace O(n²) spread with push() in fetcher pagination + map building (MAX_PAGES=100). Fixes #355.